Compare commits

...

10 Commits

Author SHA1 Message Date
David
1d305aad33
Merge f2a05b096f into f32dd80c24 2025-12-15 03:16:08 +09:00
Dr.Lt.Data
f32dd80c24 update DB
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
2025-12-15 03:16:01 +09:00
David
f2a05b096f
Merge pull request #2 from Comfy-Org/main
Catch up with official fork
2025-12-13 20:51:26 +08:00
David
9b6b0676e1 - Themed model manager and snapshot manager
- fixed incorrect id in gui builder
2025-12-13 20:46:31 +08:00
David
5e2ca4fe1a - Took gui building out and put into its own .js
- Applied theme to Nodes Manager
- Made theme respect user theme colors
2025-12-11 16:23:11 +08:00
David
975642c9bf
Merge pull request #1 from Comfy-Org/main
Bring up to date with official
2025-12-11 12:26:59 +08:00
David
76fd32f146 Matched buttons and drop downs to match style of ComfyUI interface while keeping the colours the same as OG ComfyUI Manager 2025-12-05 13:47:30 +08:00
David
3ae99bc761 Removed this.close() I added before finding z-index issue. 2025-12-05 12:46:40 +08:00
David
1dde3c3ef0 - Added layout formatting to components of the Manager dialog box
- Pulled name from select and put it into a label (eg "DB: Channel" now has a label of DB and a dropdown with channel, etc)
- Fixed incorrect z-index
2025-12-05 12:38:54 +08:00
David
457c93cd19 Started changing UI to match the rest of ComfyUI
Completed Main Container
2025-12-04 11:58:22 +08:00
18 changed files with 14938 additions and 13694 deletions

View File

@ -4904,6 +4904,16 @@
"install_type": "git-clone",
"description": "This extension helps generate images through NAI."
},
{
"author": "bedovyy",
"title": "ComfyUI-LLM-Helper",
"reference": "https://github.com/bedovyy/ComfyUI-LLM-Helper",
"files": [
"https://github.com/bedovyy/ComfyUI-LLM-Helper"
],
"install_type": "git-clone",
"description": "A collection of helper nodes for working with LLM APIs in ComfyUI, intended to complement other LLM custom nodes."
},
{
"author": "Off-Live",
"title": "ComfyUI-off-suite",
@ -29487,6 +29497,16 @@
"install_type": "git-clone",
"description": "The ListHelper collection is a comprehensive set of custom nodes for ComfyUI that provides powerful list manipulation capabilities. This collection includes audio processing, text splitting, and number generation tools for enhanced workflow automation."
},
{
"author": "dseditor",
"title": "Comfy-MCP",
"reference": "https://github.com/dseditor/Comfy-MCP",
"files": [
"https://github.com/dseditor/Comfy-MCP"
],
"install_type": "git-clone",
"description": "Simple MCP Server for ComfyUI text to image Workflow - ComfyUI Node Integration , Based on lalanikarim/comfy-mcp-server work"
},
{
"author": "Leon",
"title": "Leon's Utility and API Integration Nodes",
@ -32035,6 +32055,16 @@
"install_type": "git-clone",
"description": "A versatile and highly customizable node for ComfyUI to add camera-style watermarks and frames to your images. Whether you want to emulate the classic Leica look, add EXIF data, or create professional-looking framed images, this plugin has you covered."
},
{
"author": "karas17",
"title": "comfyui_GLM_TTS",
"reference": "https://github.com/karas17/comfyui_GLM_TTS",
"files": [
"https://github.com/karas17/comfyui_GLM_TTS"
],
"install_type": "git-clone",
"description": "ComfyUI nodes for GLM-TTS, a high-quality text-to-speech system supporting zero-shot voice cloning."
},
{
"author": "shinyakidoguchi301",
"title": "shinyakidoguchi301/LoRA Tag Loader for ComfyUI",
@ -35568,6 +35598,16 @@
"install_type": "git-clone",
"description": "This custom ComfyUI node, Find Perfect Resolution, calculates an optimal output resolution for an input image while preserving its aspect ratio and ensuring dimensions are divisible by a specified value. It is designed to work seamlessly in ComfyUI workflows, particularly for resizing images with nodes like 'Resize Image v2'."
},
{
"author": "ashtar1984",
"title": "ComfyUI-SwitchPathLazy",
"reference": "https://github.com/ashtar1984/ComfyUI-SwitchPathLazy",
"files": [
"https://github.com/ashtar1984/ComfyUI-SwitchPathLazy"
],
"install_type": "git-clone",
"description": "Efficient lazy path switch for ComfyUI. Skips execution of the inactive branch entirely using native lazy evaluation. Includes live status display."
},
{
"author": "cybernaut4",
"title": "Arkl1te's Toolkit",
@ -35819,16 +35859,6 @@
"install_type": "git-clone",
"description": "Multi-frame reference conditioning nodes for Wan2.2 A14B I2V models."
},
{
"author": "wallen0322",
"title": "ComfyUI-TTM-WAN22",
"reference": "https://github.com/wallen0322/ComfyUI-TTM-WAN22",
"files": [
"https://github.com/wallen0322/ComfyUI-TTM-WAN22"
],
"install_type": "git-clone",
"description": "TTM (Time-to-Move) node for ComfyUI enabling motion-controlled video generation with Wan2.2 models using dual-clock denoising for independent background and object animation control."
},
{
"author": "wallen0322",
"title": "ComfyUI-AE-Animation",
@ -38479,7 +38509,166 @@
"install_type": "git-clone",
"description": "The official Draw Things extension for ComfyUI. Sends image-generation requests to Draw Things over gRPC. Supports Bridge Mode for DT+ cloud and local model execution."
},
{
"author": "g7b2",
"title": "ComfyUI-Artist-Tester",
"reference": "https://github.com/g7b2/ComfyUI-Artist-Tester",
"files": [
"https://github.com/g7b2/ComfyUI-Artist-Tester"
],
"install_type": "git-clone",
"description": "A dedicated suite of custom nodes for batch testing artists, styles, and prompts in ComfyUI, solving the caching problem with anti-cache logic and dynamic filename generation."
},
{
"author": "ubisoft",
"title": "ComfyUI-Chord",
"reference": "https://github.com/ubisoft/ComfyUI-Chord",
"files": [
"https://github.com/ubisoft/ComfyUI-Chord"
],
"install_type": "git-clone",
"description": "Custom nodes for the paper: Chord: Chain of Rendering Decomposition for PBR Material Estimation from Generated Texture Images"
},
{
"author": "Deathspike",
"title": "ComfyUI-MyOriginalWaifu",
"reference": "https://github.com/Deathspike/ComfyUI-MyOriginalWaifu",
"files": [
"https://github.com/Deathspike/ComfyUI-MyOriginalWaifu"
],
"install_type": "git-clone",
"description": "My Original Waifu is a tag-based prompt-transformation engine for ComfyUI designed for creators who want their original characters to feel consistent, expressive, and faithfully rendered across every scene. Instead of manually adjusting tags each time you generate an image, you define the essence of your waifu, her look, her outfits, the way she appears in different contexts, and the engine transforms your prompt to match those intentions. It stays out of the way and simply follows your rules with clarity and consistency. Your Waifu. Your Rules. Your Perfect Prompt."
},
{
"author": "LeonQ8",
"title": "ComfyUI-Dynamic-Lora-Scheduler",
"reference": "https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler",
"files": [
"https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler"
],
"install_type": "git-clone",
"description": "Dynamically balance weights of multiple LoRAs over generation steps for ComfyUI."
},
{
"author": "sebagallo",
"title": "comfyui-sg-llama-cpp",
"reference": "https://github.com/sebagallo/comfyui-sg-llama-cpp",
"files": [
"https://github.com/sebagallo/comfyui-sg-llama-cpp"
],
"install_type": "git-clone",
"description": "llama-cpp-python wrapper, with support for vision models. It allows the user to generate text responses from prompts using llama.cpp."
},
{
"author": "hubo502",
"title": "ComfyUI-Env-Loader",
"reference": "https://github.com/hubo502/ComfyUI-Env-Loader",
"files": [
"https://github.com/hubo502/ComfyUI-Env-Loader"
],
"install_type": "git-clone",
"description": "ComfyUI custom node set that reads .env files at startup and provides dropdown selection or dynamic multi-port output for environment variable access in workflows. (Description by CC)"
},
{
"author": "fabbarix",
"title": "comfyui-promptstore",
"reference": "https://github.com/fabbarix/comfyui-promptstore",
"files": [
"https://github.com/fabbarix/comfyui-promptstore"
],
"install_type": "git-clone",
"description": "Custom node system for ComfyUI enabling efficient prompt management with YAML-based datastore, categories, selection interface, and dynamic text interpolation for creating complex prompts."
},
{
"author": "ARM64-EC",
"title": "ComfyUI-LongCatPlugin",
"reference": "https://github.com/ARM64-EC/ComfyUI-LongCatPlugin",
"files": [
"https://github.com/ARM64-EC/ComfyUI-LongCatPlugin"
],
"install_type": "git-clone",
"description": "ComfyUI nodes wrapping LongCat image generation and editing pipelines with text-to-image and multi-image edit flows using diffusers framework. (Description by CC)"
},
{
"author": "NOLABEL-VFX",
"title": "ComfyUI-NL_Nodes",
"reference": "https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes",
"files": [
"https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes"
],
"install_type": "git-clone",
"description": "Custom ComfyUI nodes by NOLABEL for studio workflows, featuring Shot Path Builder that generates standardized, sanitized file and folder names with versioning for renders."
},
{
"author": "pantaleone-ai",
"title": "Comfy-Firefly",
"reference": "https://github.com/pantaleone-ai/Comfy-Firefly",
"files": [
"https://github.com/pantaleone-ai/Comfy-Firefly"
],
"install_type": "git-clone",
"description": "Custom ComfyUI node for generating images using Adobe Firefly Services API v3 with automatic authentication and standard tensor output."
},
{
"author": "febogallo",
"title": "ComfyUI-Freepik",
"reference": "https://github.com/febogallo/ComfyUI-Freepik",
"files": [
"https://github.com/febogallo/ComfyUI-Freepik"
],
"install_type": "git-clone",
"description": "Integrates Freepik's AI capabilities into ComfyUI workflows with features for photorealistic generation, upscaling, and background removal, plus smart caching and cost management. (Description by CC)"
},
{
"author": "thnikk",
"title": "comfyui-thnikk-utils",
"reference": "https://github.com/thnikk/comfyui-thnikk-utils",
"files": [
"https://github.com/thnikk/comfyui-thnikk-utils"
],
"install_type": "git-clone",
"description": "Nodes to clean up your workflow."
},
{
"author": "XYMikky12138",
"title": "ComfyUI-MIKKY-Mask-Editor",
"reference": "https://github.com/XYMikky12138/ComfyUI-MIKKY-Mask-Editor",
"files": [
"https://github.com/XYMikky12138/ComfyUI-MIKKY-Mask-Editor"
],
"install_type": "git-clone",
"description": "A powerful frame-by-frame video mask editor for ComfyUI with painting, auto BBox, hole filling, blur/feathering, and video slicing features."
},
{
"author": "SiegeKeebsOffical",
"title": "comfyui-lmstudio",
"reference": "https://github.com/SiegeKeebsOffical/comfyui-lmstudio",
"files": [
"https://github.com/SiegeKeebsOffical/comfyui-lmstudio"
],
"install_type": "git-clone",
"description": "Custom ComfyUI nodes designed to interface with a separate LM Studio instance for language model operations."
},
{
"author": "bombdefuser-124",
"title": "Newbie-Teacache-ComfyUI",
"reference": "https://github.com/bombdefuser-124/Newbie-Teacache-ComfyUI",
"files": [
"https://github.com/bombdefuser-124/Newbie-Teacache-ComfyUI"
],
"install_type": "git-clone",
"description": "TeaCache optimization nodes for ComfyUI's NewBie implementation, featuring patched loader and coefficient calculator for faster inference with configurable quality. (Description by CC)"
},
{
"author": "maxczc",
"title": "comfyui-sora-node",
"reference": "https://github.com/maxczc/comfyui-sora-node",
"files": [
"https://github.com/maxczc/comfyui-sora-node"
],
"install_type": "git-clone",
"description": "Comprehensive set of ComfyUI custom nodes for interacting with a Sora-compatible REST API, supporting text-to-video, image-to-video, and video-to-video generation."
},

View File

@ -395,6 +395,7 @@
"1hew_AudioDuration",
"1hew_DetectGuideLine",
"1hew_DetectYolo",
"1hew_GetFileCount",
"1hew_ImageAddLabel",
"1hew_ImageBBoxOverlayByMask",
"1hew_ImageBatchExtract",
@ -421,6 +422,7 @@
"1hew_ImagePingPong",
"1hew_ImagePlot",
"1hew_ImageResizeFluxKontext",
"1hew_ImageResizeJimeng",
"1hew_ImageResizeQwenImage",
"1hew_ImageResizeUniversal",
"1hew_ImageRotateWithMask",
@ -437,6 +439,8 @@
"1hew_ListCustomInt",
"1hew_ListCustomSeed",
"1hew_ListCustomString",
"1hew_LoadImageFromFolder",
"1hew_LoadVideoFromFolder",
"1hew_MaskBatchMathOps",
"1hew_MaskBatchRange",
"1hew_MaskBatchSplit",
@ -446,6 +450,7 @@
"1hew_MaskListToBatch",
"1hew_MaskMathOps",
"1hew_MaskPasteByBBoxMask",
"1hew_MaskRepeat",
"1hew_MultiImageBatch",
"1hew_MultiImageStitch",
"1hew_MultiMaskBatch",
@ -1888,6 +1893,21 @@
"title_aux": "NormalMapLightEstimator"
}
],
"https://github.com/ARM64-EC/ComfyUI-LongCatPlugin": [
[
"LoadLongCatModel",
"LongCatCLIPLoader",
"LongCatImageResizer",
"LongCatSampler",
"LongCatSizePicker",
"LongCatVAELoader",
"TextEncodeLongCatImage",
"TextEncodeLongCatImageEdit"
],
{
"title_aux": "ComfyUI-LongCatPlugin"
}
],
"https://github.com/ARZUMATA/ComfyUI-ARZUMATA": [
[
"CachingCLIPTextEncode",
@ -5595,6 +5615,15 @@
"title_aux": "Pipeline Parallel ComfyUI"
}
],
"https://github.com/Deathspike/ComfyUI-MyOriginalWaifu": [
[
"MyOriginalWaifu",
"MyOriginalWaifuCLIP"
],
{
"title_aux": "ComfyUI-MyOriginalWaifu"
}
],
"https://github.com/DebugPadawan/DebugPadawans-ComfyUI-Essentials": [
[
"DebugPadawan_ConditionalString",
@ -11468,6 +11497,29 @@
"title_aux": "ComfyUI-VariationLab"
}
],
"https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler": [
[
"AdaptiveLoraScheduler",
"LoadWanVideoClipTextEncoder",
"LoadWanVideoT5TextEncoder",
"WanVideoBlockSwap",
"WanVideoExtraModelSelect",
"WanVideoLoraBlockEdit",
"WanVideoLoraSelect",
"WanVideoLoraSelectByName",
"WanVideoLoraSelectMulti",
"WanVideoModelLoader",
"WanVideoSetLoRAs",
"WanVideoTinyVAELoader",
"WanVideoTorchCompileSettings",
"WanVideoVACEModelSelect",
"WanVideoVAELoader",
"WanVideoVRAMManagement"
],
{
"title_aux": "ComfyUI-Dynamic-Lora-Scheduler"
}
],
"https://github.com/Lerc/canvas_tab": [
[
"Canvas_Tab",
@ -11834,6 +11886,14 @@
"title_aux": "ComfyUI-LTXVideo"
}
],
"https://github.com/Limbicnation/ComfyUI-PromptGenerator": [
[
"PromptGenerator"
],
{
"title_aux": "ComfyUI-PromptGenerator"
}
],
"https://github.com/Limbicnation/ComfyUI-RandomSeedGenerator": [
[
"AdvancedSeedGenerator"
@ -12569,6 +12629,7 @@
"Wan22FirstLastImageToVideoMXD",
"Wan22ImageToVideoMXD",
"Wan2_2EmptyLatentImageMXD",
"ZImageTurboEmptyLatentImage",
"wan22EmptyHunyuanLatentVideoMXD"
],
{
@ -12702,7 +12763,13 @@
],
"https://github.com/Merserk/ComfyUI-Flow-Assistor": [
[
"AddDelay",
"AnyPassthrough1to6",
"AnyPassthrough6to1",
"BypassControl",
"CLIPTextEncodePromptEnrichment",
"CameraAngleControl",
"DisplayText",
"ImageResolutionFitNode",
"MultiplicationNode",
"PromptQueue",
@ -13429,6 +13496,14 @@
"title_aux": "Image Captioning and Tagging Assistor Nodes"
}
],
"https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes": [
[
"ShotPathBuilder"
],
{
"title_aux": "ComfyUI-NL_Nodes"
}
],
"https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix": [
[
"RTXRemixCloseProject",
@ -15520,6 +15595,7 @@
"SK_CheckpointLoader",
"SK_CheckpointLoaderSimple",
"SK_LoraLoader",
"SK_PowerLoraLoader",
"SK_UNETLoader",
"SK_VAELoader",
"SK_unCLIPCheckpointLoader"
@ -16757,6 +16833,21 @@
"title_aux": "Lazy Pony Prompter"
}
],
"https://github.com/SiegeKeebsOffical/comfyui-lmstudio": [
[
"LMStudioConnectivityV2",
"LMStudioGenerate",
"LMStudioGenerateAdvance",
"LMStudioGenerateV2",
"LMStudioOptionsV2",
"LMStudioSequentialPrompt",
"LMStudioSequentialPromptAdvanced",
"LMStudioVision"
],
{
"title_aux": "comfyui-lmstudio"
}
],
"https://github.com/Siempreflaco/ComfyUI-NCNodes": [
[
"Load3DMesh",
@ -19951,6 +20042,14 @@
"title_aux": "ComfyUI XWAVE Nodes"
}
],
"https://github.com/XYMikky12138/ComfyUI-MIKKY-Mask-Editor": [
[
"MIKKYMaskEditorNode"
],
{
"title_aux": "ComfyUI-MIKKY-Mask-Editor"
}
],
"https://github.com/XchanBik/ComfyUI_SimpleBridgeNode": [
[
"LoraTextLoader",
@ -23080,6 +23179,15 @@
"title_aux": "Hunyuan-Multi-Lora-Loader"
}
],
"https://github.com/ashtar1984/ComfyUI-SwitchPathLazy": [
[
"SwitchPathLazy",
"SwitchPathRev"
],
{
"title_aux": "ComfyUI-SwitchPathLazy"
}
],
"https://github.com/ashtar1984/comfyui-find-perfect-resolution": [
[
"FindPerfectResolution"
@ -23672,6 +23780,15 @@
"title_aux": "ColorMatrixGPU Node for ComfyUI"
}
],
"https://github.com/bedovyy/ComfyUI-LLM-Helper": [
[
"LLMHelper_GetModels",
"LLMHelper_PostModelsUnload"
],
{
"title_aux": "ComfyUI-LLM-Helper"
}
],
"https://github.com/bedovyy/ComfyUI_NAIDGenerator": [
[
"AnlasTrackerNAID",
@ -24537,6 +24654,15 @@
"title_aux": "ComfyUI-OpenSoraPlan"
}
],
"https://github.com/bombdefuser-124/Newbie-Teacache-ComfyUI": [
[
"TeaCacheCoefficientCalculator",
"TeaCache_Newbie"
],
{
"title_aux": "Newbie-Teacache-ComfyUI"
}
],
"https://github.com/bombless/comfyUI-RememberingUtils": [
[
"RememberLastSeed",
@ -25142,7 +25268,6 @@
"IO_getFilePath",
"IO_image_select",
"IO_input_any",
"IO_inputbasic",
"IO_load_anyimage",
"IO_node_Script",
"IO_save_image",
@ -25192,6 +25317,8 @@
"Mask_transform_sum",
"Model_Preset_Unpack",
"Model_Preset_pack",
"Scheduler_CondNoise",
"Scheduler_MixScheduler",
"Stack_CN_union",
"Stack_CN_union3",
"Stack_ControlNet",
@ -25238,6 +25365,7 @@
"basicIn_Seed",
"basicIn_color",
"basicIn_float",
"basicIn_input",
"basicIn_int",
"basicIn_string",
"basic_KSampler_variant_seed",
@ -25308,8 +25436,9 @@
"excel_search_data",
"excel_write_data",
"excel_write_data_easy",
"flow_GetNodeInfo",
"flow_QueueTrigger",
"flow_Translate_Node_DD",
"flow_Translate_Node_office",
"flow_ValueReceiver",
"flow_ValueSender",
"flow_auto_pixel",
@ -25369,7 +25498,6 @@
"pre_sample_data",
"sampler_DynamicTileMerge",
"sampler_DynamicTileSplit",
"sampler_SeedVariance",
"sampler_enhance",
"sch_Prompt",
"sch_Value",
@ -25377,6 +25505,9 @@
"sch_mask",
"sch_split_text",
"sch_text",
"scheduler_ModelAligned",
"scheduler_manual_sigmas",
"scheduler_sigmas2Graph",
"stack_Mask2color",
"sum_Ksampler",
"sum_create_chx",
@ -25391,6 +25522,7 @@
"sum_stack_Wan",
"sum_stack_image",
"text_Splitter",
"text_StrMatrix",
"text_batch_combine",
"text_filter",
"text_loadText",
@ -27803,6 +27935,7 @@
"SamplerLCMUpscale",
"SamplerLMS",
"SamplerSASolver",
"SamplerSEEDS2",
"SamplingPercentToSigma",
"SaveAnimatedPNG",
"SaveAnimatedWEBP",
@ -29702,6 +29835,8 @@
"VaceStrengthTester",
"WVAOptionsNode",
"WVAPipeSimple",
"WanMaskToLatentSpace",
"WanNoiseMaskToLatentSpace",
"WanVacePhantomDual",
"WanVacePhantomDualV2",
"WanVacePhantomExperimental",
@ -29733,6 +29868,14 @@
"title_aux": "primitive-types"
}
],
"https://github.com/dseditor/Comfy-MCP": [
[
"MCPConfigGenerator"
],
{
"title_aux": "Comfy-MCP"
}
],
"https://github.com/dseditor/ComfyUI-ListHelper": [
[
"AudioListCombine",
@ -30500,6 +30643,15 @@
"title_aux": "ComfyUI-EZ-AF-Nodes"
}
],
"https://github.com/fabbarix/comfyui-promptstore": [
[
"Prompt Selector",
"Prompt Template"
],
{
"title_aux": "comfyui-promptstore"
}
],
"https://github.com/facefusion/facefusion-comfyui": [
[
"SwapFaceImage",
@ -30776,6 +30928,17 @@
"title_aux": "Fearnworks Nodes"
}
],
"https://github.com/febogallo/ComfyUI-Freepik": [
[
"FreepikMystic",
"FreepikRemoveBackground",
"FreepikUpscalerCreative",
"FreepikUpscalerPrecision"
],
{
"title_aux": "ComfyUI-Freepik"
}
],
"https://github.com/feffy380/comfyui-chroma-cache": [
[
"ChromaCache"
@ -31680,6 +31843,16 @@
"title_aux": "ComfyUI Load From URL"
}
],
"https://github.com/g7b2/ComfyUI-Artist-Tester": [
[
"ArtistListIterator",
"ArtistPromptComposer",
"SaveImageWithArtistTag"
],
{
"title_aux": "ComfyUI-Artist-Tester"
}
],
"https://github.com/gabe-init/ComfyUI-11labs": [
[
"ElevenLabsNode"
@ -32550,8 +32723,10 @@
],
"https://github.com/grmchn/ComfyUI-ProportionChanger": [
[
"PoseDataToPoseKeypoint",
"PoseJSONToPoseKeypoint",
"PoseKeypointPreview",
"PoseKeypointResize",
"ProportionChangerDWPoseDetector",
"ProportionChangerDWPoseRender",
"ProportionChangerInterpolator",
@ -32683,9 +32858,14 @@
],
"https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes": [
[
"FilmARSizeSelector"
"FilmARSizeSelector",
"GeminiImagePromptBuilder"
],
{
"author": "HackAfterDark",
"description": "A node to generate image prompts or images using the Google Gemini API, with support for multiple images and presets.",
"nickname": "Gemini Prompter",
"title": "Gemini Image Prompt Builder",
"title_aux": "AfterDark Film AR Selector"
}
],
@ -33237,6 +33417,7 @@
"WWAA_ImageSwitcher",
"WWAA_ImageToTextFile",
"WWAA_IndexGridLayoutNode",
"WWAA_JPEGPreview",
"WWAA_JSONPromptBuilder",
"WWAA_LineCount",
"WWAA_MetadataSaver",
@ -33348,7 +33529,8 @@
"KeypointConverter",
"KeypointPrinter",
"LoadPoseKeypoints",
"PoseInterpolation"
"PoseInterpolation",
"PoseResize"
],
{
"title_aux": "ComfyUI_DWposeDeluxe"
@ -33435,6 +33617,15 @@
"title_aux": "Multiple LoRA Loader for ComfyUI"
}
],
"https://github.com/hubo502/ComfyUI-Env-Loader": [
[
"EnvKeySelector",
"EnvKeys"
],
{
"title_aux": "ComfyUI-Env-Loader"
}
],
"https://github.com/huchenlei/ComfyUI-IC-Light-Native": [
[
"ICLightApply",
@ -33630,6 +33821,7 @@
"SetValuesFromPanel",
"image_to_sha256",
"move_file",
"rename_file",
"sort_list_string",
"steg_alpha_embed",
"steg_alpha_extract",
@ -33739,7 +33931,8 @@
"ROCMQuantizedModelOptimizer",
"ROCMSamplerPerformanceMonitor",
"ROCMVAEPerformanceMonitor",
"ROCmDiffusionLoader"
"ROCmDiffusionLoader",
"ROCmGGUFLoader"
],
{
"title_aux": "RocM Ninodes"
@ -36148,6 +36341,16 @@
"title_aux": "ComfyUI Camera Watermark"
}
],
"https://github.com/karas17/comfyui_GLM_TTS": [
[
"GLMTTSASR",
"GLMTTSLoader",
"GLMTTSSampler"
],
{
"title_aux": "comfyui_GLM_TTS"
}
],
"https://github.com/karthikg-09/ComfyUI-Vton-Mask": [
[
"ComfyUIVtonMaskGenerator",
@ -36698,6 +36901,7 @@
"GetLatentSizeAndCount",
"GetLatentsFromBatchIndexed",
"GetMaskSizeAndCount",
"GetTrackRange",
"GradientToFloat",
"GrowMaskWithBlur",
"HunyuanVideoBlockLoraSelect",
@ -36785,6 +36989,7 @@
"SetShakkerLabsUnionControlNetType",
"ShuffleImageBatch",
"SigmasToFloat",
"SimpleCalculatorKJ",
"SkipLayerGuidanceWanVideo",
"Sleep",
"SomethingToString",
@ -37132,10 +37337,12 @@
"WanVideoRoPEFunction",
"WanVideoSLG",
"WanVideoSampler",
"WanVideoSamplerExtraArgs",
"WanVideoSamplerFromSettings",
"WanVideoSamplerSettings",
"WanVideoSamplerv2",
"WanVideoScheduler",
"WanVideoSchedulerSA_ODE",
"WanVideoSchedulerv2",
"WanVideoSetBlockSwap",
"WanVideoSetLoRAs",
"WanVideoSetRadialAttention",
@ -40563,6 +40770,16 @@
"title_aux": "OllamaTools for ComfyUI"
}
],
"https://github.com/maxczc/comfyui-sora-node": [
[
"SoraImageToVideo",
"SoraTextToVideo",
"SoraVideoToVideo"
],
{
"title_aux": "comfyui-sora-node"
}
],
"https://github.com/maxmad62/ComfyUI-DiscordWebhookWithInput": [
[
"DiscordPostViaWebhook",
@ -43287,6 +43504,14 @@
"title_aux": "sd-perturbed-attention"
}
],
"https://github.com/pantaleone-ai/Comfy-Firefly": [
[
"AdobeFireflyTextToImage"
],
{
"title_aux": "Comfy-Firefly"
}
],
"https://github.com/pants007/comfy-pants": [
[
"CLIPTextEncodeAIO",
@ -46239,6 +46464,17 @@
"title_aux": "SRL's nodes"
}
],
"https://github.com/sebagallo/comfyui-sg-llama-cpp": [
[
"LlamaCPPEngine",
"LlamaCPPMemoryCleanup",
"LlamaCPPModelLoader",
"LlamaCPPOptions"
],
{
"title_aux": "comfyui-sg-llama-cpp"
}
],
"https://github.com/sebord/ComfyUI-LMCQ": [
[
"LmcqCodeDecryptionLoader",
@ -48472,7 +48708,8 @@
],
"https://github.com/synthetai/ComfyUI-JM-Gemini-API": [
[
"JMGeminiImageGenerator"
"JMGeminiImageGenerator",
"JMGeminiVideoGenerator"
],
{
"title_aux": "ComfyUI-JM-Gemini-API"
@ -48906,10 +49143,14 @@
[
"CLIPTokenCounter",
"DivergentGeminiNode",
"KoboldCppApiNode",
"GeminiBatchProcess",
"ImageInfo",
"LoraStrengthXYPlot",
"MusiQNode",
"SaveImageEnhancedNode"
"PreviewText",
"PromptCombiner",
"SaveImageEnhancedNode",
"StringToList"
],
{
"title_aux": "Divergent Nodes"
@ -49036,6 +49277,24 @@
"title_aux": "ComfyUI Multimedia Utilities"
}
],
"https://github.com/thnikk/comfyui-thnikk-utils": [
[
"CharacterPresetNode",
"DetailerNode",
"DetailerPipeNode",
"FullPipeIn",
"FullPipeLoader",
"FullPipeOut",
"ModelPresetNode",
"MultiStringConditioning",
"SeedWithOverride",
"StylePresetNode",
"WildcardNode"
],
{
"title_aux": "comfyui-thnikk-utils"
}
],
"https://github.com/thoddnn/ComfyUI-MLX": [
[
"MLXClipTextEncoder",
@ -49765,6 +50024,16 @@
"title_aux": "ComfyUI-Fans"
}
],
"https://github.com/ubisoft/ComfyUI-Chord": [
[
"ChordLoadModel",
"ChordMaterialEstimation",
"ChordNormalToHeight"
],
{
"title_aux": "ComfyUI-Chord"
}
],
"https://github.com/ucloud/comfyui-plugin": [
[
"ModelVerse Image Packer",
@ -50486,15 +50755,6 @@
"title_aux": "ComfyUI-SageAttention3"
}
],
"https://github.com/wallen0322/ComfyUI-TTM-WAN22": [
[
"WanTTMConditioning",
"WanTTMSamplerComplete"
],
{
"title_aux": "ComfyUI-TTM-WAN22"
}
],
"https://github.com/wallen0322/ComfyUI-Wan22FMLF": [
[
"WanAdvancedExtractLastFrames",
@ -51951,6 +52211,7 @@
"AdvancedImageSelector",
"DynamicThreshold",
"ImageBatchSelector",
"ImageBlendMaskFitCover",
"ImageBlendResize",
"ImageIC",
"ImageICAdvanced",
@ -52006,6 +52267,7 @@
],
"https://github.com/yichengup/ComfyUI-YCNodes_Toolkit": [
[
"YCLiveLoadImagesMulti",
"YCSwitch",
"YC_ShowText",
"ycBBoxBridge",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

227
js/comfyui-gui-builder.js Normal file
View File

@ -0,0 +1,227 @@
import { $el } from "../../scripts/ui.js";
function normalizeContent(content) {
const tmp = document.createElement('div');
if (typeof content === 'string') {
tmp.innerHTML = content;
return Array.from(tmp.childNodes);
}
if (content instanceof Node) {
return content;
}
return content;
}
export function createSettingsCombo(label, content) {
const settingItem = $el("div.setting-item", {}, [
$el("div.flex.flex-row.items-center.gap-2",[
$el("div.form-label.flex.grow.items-center", [
$el("span.text-muted", { textContent: label },)
]),
$el("div.form-input.flex.justify-end",
[content]
)
]
)
]);
return settingItem;
}
export function buildGuiFrame(dialogId, title, iconClass, content, owner) {
const dialog_mask = $el("div.p-dialog-mask.p-overlay-mask.p-overlay-mask-enter", {
parent: document.body,
style: {
position: "fixed",
height: "100%",
width: "100%",
left: "0px",
top: "0px",
display: "flex",
justifyContent: "center",
alignItems: "center",
pointerEvents: "auto",
zIndex: "1000"
},
onclick: (e) => {
if (e.target === dialog_mask) {
owner.close();
}
}
// data-pc-section="mask"
});
const header_actions = $el("div.p-dialog-header-actions", {
// [TODO]
// data-pc-section="headeractions"
}
);
const close_button = $el("button.p-button.p-component.p-button-icon-only.p-button-secondary.p-button-rounded.p-button-text.p-dialog-close-button", {
parent: header_actions,
type: "button",
ariaLabel: "Close",
onclick: () => owner.close(),
// "data-pc-name": "pcclosebutton",
// "data-p-disabled": "false",
// "data-p-severity": "secondary",
// "data-pc-group-section": "headericon",
// "data-pc-extend": "button",
// "data-pc-section": "root",
// [FIXME] Not sure how to do most of the SVG using $el
innerHTML: '<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="p-icon p-button-icon" aria-hidden="true"><path d="M8.01186 7.00933L12.27 2.75116C12.341 2.68501 12.398 2.60524 12.4375 2.51661C12.4769 2.42798 12.4982 2.3323 12.4999 2.23529C12.5016 2.13827 12.4838 2.0419 12.4474 1.95194C12.4111 1.86197 12.357 1.78024 12.2884 1.71163C12.2198 1.64302 12.138 1.58893 12.0481 1.55259C11.9581 1.51625 11.8617 1.4984 11.7647 1.50011C11.6677 1.50182 11.572 1.52306 11.4834 1.56255C11.3948 1.60204 11.315 1.65898 11.2488 1.72997L6.99067 5.98814L2.7325 1.72997C2.59553 1.60234 2.41437 1.53286 2.22718 1.53616C2.03999 1.53946 1.8614 1.61529 1.72901 1.74767C1.59663 1.88006 1.5208 2.05865 1.5175 2.24584C1.5142 2.43303 1.58368 2.61419 1.71131 2.75116L5.96948 7.00933L1.71131 11.2675C1.576 11.403 1.5 11.5866 1.5 11.7781C1.5 11.9696 1.576 12.1532 1.71131 12.2887C1.84679 12.424 2.03043 12.5 2.2219 12.5C2.41338 12.5 2.59702 12.424 2.7325 12.2887L6.99067 8.03052L11.2488 12.2887C11.3843 12.424 11.568 12.5 11.7594 12.5C11.9509 12.5 12.1346 12.424 12.27 12.2887C12.4053 12.1532 12.4813 11.9696 12.4813 11.7781C12.4813 11.5866 12.4053 11.403 12.27 11.2675L8.01186 7.00933Z" fill="currentColor"></path></svg><span class="p-button-label" data-pc-section="label">&nbsp;</span><!---->'
}
);
const dialog_header = $el("div.p-dialog-header",
[
$el("div", [
$el("div",
{
id: "frame-title-container",
},
[
$el("h2.px-4", [
$el(iconClass, {
style: {
"font-size": "1.25rem",
"margin-right": ".5rem"
}
}),
$el("span", { textContent: title })
])
]
)
]),
header_actions
]
);
const contentFrame = $el("div.p-dialog-content", {}, normalizeContent(content));
const manager_dialog = $el("div.p-dialog.p-component.global-dialog", {
id: dialogId,
parent: dialog_mask,
style: {
'display': 'flex',
'flex-direction': 'column',
'pointer-events': 'auto',
'margin': '0px',
},
role: 'dialog',
ariaModal: 'true',
// [TODO]
// ariaLabbelledby: 'cm-title',
// maximized: 'false',
// data-pc-name: 'dialog',
// data-pc-section: 'root',
// data-pd-focustrap: 'true'
},
[ dialog_header, contentFrame ]
);
const hidden_accessible = $el("span.p-hidden-accessible.p-hidden-focusable", {
parent: manager_dialog,
tabindex: "0",
role: "presentation",
ariaHidden: "true",
"data-p-hidden-accessible": "true",
"data-p-hidden-focusable": "true",
"data-pc-section": "firstfocusableelement"
});
return dialog_mask;
}
export function buildGuiFrameCustomHeader(dialogId, customHeader, content, owner) {
const dialog_mask = $el("div.p-dialog-mask.p-overlay-mask.p-overlay-mask-enter", {
parent: document.body,
style: {
position: "fixed",
height: "100%",
width: "100%",
left: "0px",
top: "0px",
display: "flex",
justifyContent: "center",
alignItems: "center",
pointerEvents: "auto",
zIndex: "1000"
},
onclick: (e) => {
if (e.target === dialog_mask) {
owner.close();
}
}
// data-pc-section="mask"
});
const header_actions = $el("div.p-dialog-header-actions", {
// [TODO]
// data-pc-section="headeractions"
}
);
const close_button = $el("button.p-button.p-component.p-button-icon-only.p-button-secondary.p-button-rounded.p-button-text.p-dialog-close-button", {
parent: header_actions,
type: "button",
ariaLabel: "Close",
onclick: () => owner.close(),
// "data-pc-name": "pcclosebutton",
// "data-p-disabled": "false",
// "data-p-severity": "secondary",
// "data-pc-group-section": "headericon",
// "data-pc-extend": "button",
// "data-pc-section": "root",
// [FIXME] Not sure how to do most of the SVG using $el
innerHTML: '<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="p-icon p-button-icon" aria-hidden="true"><path d="M8.01186 7.00933L12.27 2.75116C12.341 2.68501 12.398 2.60524 12.4375 2.51661C12.4769 2.42798 12.4982 2.3323 12.4999 2.23529C12.5016 2.13827 12.4838 2.0419 12.4474 1.95194C12.4111 1.86197 12.357 1.78024 12.2884 1.71163C12.2198 1.64302 12.138 1.58893 12.0481 1.55259C11.9581 1.51625 11.8617 1.4984 11.7647 1.50011C11.6677 1.50182 11.572 1.52306 11.4834 1.56255C11.3948 1.60204 11.315 1.65898 11.2488 1.72997L6.99067 5.98814L2.7325 1.72997C2.59553 1.60234 2.41437 1.53286 2.22718 1.53616C2.03999 1.53946 1.8614 1.61529 1.72901 1.74767C1.59663 1.88006 1.5208 2.05865 1.5175 2.24584C1.5142 2.43303 1.58368 2.61419 1.71131 2.75116L5.96948 7.00933L1.71131 11.2675C1.576 11.403 1.5 11.5866 1.5 11.7781C1.5 11.9696 1.576 12.1532 1.71131 12.2887C1.84679 12.424 2.03043 12.5 2.2219 12.5C2.41338 12.5 2.59702 12.424 2.7325 12.2887L6.99067 8.03052L11.2488 12.2887C11.3843 12.424 11.568 12.5 11.7594 12.5C11.9509 12.5 12.1346 12.424 12.27 12.2887C12.4053 12.1532 12.4813 11.9696 12.4813 11.7781C12.4813 11.5866 12.4053 11.403 12.27 11.2675L8.01186 7.00933Z" fill="currentColor"></path></svg><span class="p-button-label" data-pc-section="label">&nbsp;</span><!---->'
}
);
const _customHeader = normalizeContent(customHeader);
const dialog_header = $el("div.p-dialog-header",
[
$el("div", [
$el("div",
{
id: "frame-title-container",
},
Array.isArray(_customHeader) ? _customHeader : [_customHeader]
)
]),
header_actions
]
);
const contentFrame = $el("div.p-dialog-content", {}, normalizeContent(content));
const manager_dialog = $el("div.p-dialog.p-component.global-dialog", {
id: dialogId,
parent: dialog_mask,
style: {
'display': 'flex',
'flex-direction': 'column',
'pointer-events': 'auto',
'margin': '0px',
},
role: 'dialog',
ariaModal: 'true',
// [TODO]
// ariaLabbelledby: 'cm-title',
// maximized: 'false',
// data-pc-name: 'dialog',
// data-pc-section: 'root',
// data-pd-focustrap: 'true'
},
[ dialog_header, contentFrame ]
);
const hidden_accessible = $el("span.p-hidden-accessible.p-hidden-focusable", {
parent: manager_dialog,
tabindex: "0",
role: "presentation",
ariaHidden: "true",
"data-p-hidden-accessible": "true",
"data-p-hidden-focusable": "true",
"data-pc-section": "firstfocusableelement"
});
return dialog_mask;
}

View File

@ -20,6 +20,7 @@ import { ComponentBuilderDialog, getPureName, load_components, set_component_pol
import { CustomNodesManager } from "./custom-nodes-manager.js";
import { ModelManager } from "./model-manager.js";
import { SnapshotManager } from "./snapshot.js";
import { buildGuiFrame, createSettingsCombo } from "./comfyui-gui-builder.js";
let manager_version = await getVersion();
@ -44,12 +45,16 @@ docStyle.innerHTML = `
#cm-manager-dialog {
width: 1000px;
height: 455px;
height: auto;
box-sizing: content-box;
z-index: 1000;
overflow-y: auto;
}
#cm-manager-dialog br {
margin-bottom: 1em;
}
.cb-widget {
width: 400px;
height: 25px;
@ -80,6 +85,7 @@ docStyle.innerHTML = `
}
.cm-menu-container {
padding : calc(var(--spacing)*2);
column-gap: 20px;
display: flex;
flex-wrap: wrap;
@ -140,8 +146,8 @@ docStyle.innerHTML = `
}
.cm-notice-board {
width: 290px;
height: 230px;
width: auto;
height: 280px;
overflow: auto;
color: var(--input-text);
border: 1px solid var(--descrip-text);
@ -238,68 +244,50 @@ var is_updating = false;
// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts
const style = `
#workflowgallery-button {
width: 310px;
height: 27px;
height: 50px;
padding: 0px !important;
position: relative;
overflow: hidden;
font-size: 17px !important;
}
#cm-nodeinfo-button {
width: 310px;
height: 27px;
padding: 0px !important;
position: relative;
overflow: hidden;
font-size: 17px !important;
}
#cm-manual-button {
width: 310px;
height: 27px;
position: relative;
overflow: hidden;
}
.cm-button {
width: 310px;
height: 30px;
width: auto;
position: relative;
overflow: hidden;
font-size: 17px !important;
background-color: var(--comfy-menu-secondary-bg);
border-color: var(--border-color);
color: color: var(--input-text);
}
.cm-button:hover {
filter: brightness(125%);
}
.cm-button-red {
width: 310px;
height: 30px;
position: relative;
overflow: hidden;
font-size: 17px !important;
background-color: #500000 !important;
border-color: #88181b !important;
color: white !important;
}
.cm-button-red:hover {
background-color: #88181b !important;
}
.cm-button-orange {
width: 310px;
height: 30px;
position: relative;
overflow: hidden;
font-size: 17px !important;
font-weight: bold;
background-color: orange !important;
color: black !important;
}
.cm-experimental-button {
width: 290px;
height: 30px;
position: relative;
overflow: hidden;
font-size: 17px !important;
width: 100%;
}
.cm-experimental {
width: 310px;
border: 1px solid #555;
border-radius: 5px;
padding: 10px;
@ -326,8 +314,14 @@ const style = `
.cm-menu-combo {
cursor: pointer;
width: 310px;
box-sizing: border-box;
padding: 0.5em 0.5em;
border: 1px solid var(--border-color);
border-radius: 6px;
background: var(--comfy-menu-secondary-bg);
}
.cm-menu-combo:hover {
filter: brightness(125%);
}
.cm-small-button {
@ -831,7 +825,7 @@ class ManagerMenuDialog extends ComfyDialog {
const isElectron = 'electronAPI' in window;
update_comfyui_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Update ComfyUI",
style: {
@ -842,7 +836,7 @@ class ManagerMenuDialog extends ComfyDialog {
});
switch_comfyui_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Switch ComfyUI",
style: {
@ -853,7 +847,7 @@ class ManagerMenuDialog extends ComfyDialog {
});
restart_stop_button =
$el("button.cm-button-red", {
$el("button.p-button.p-component.cm-button-red", {
type: "button",
textContent: "Restart",
onclick: () => restartOrStop()
@ -861,7 +855,7 @@ class ManagerMenuDialog extends ComfyDialog {
if(isElectron) {
update_all_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Update All Custom Nodes",
onclick:
@ -870,7 +864,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
else {
update_all_button =
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Update All",
onclick:
@ -880,7 +874,7 @@ class ManagerMenuDialog extends ComfyDialog {
const res =
[
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Custom Nodes Manager",
onclick:
@ -892,7 +886,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Install Missing Custom Nodes",
onclick:
@ -904,7 +898,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Custom Nodes In Workflow",
onclick:
@ -916,8 +910,8 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("br", {}, []),
$el("button.cm-button", {
$el("div", {}, []),
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Model Manager",
onclick:
@ -929,7 +923,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
type: "button",
textContent: "Install via Git URL",
onclick: async () => {
@ -941,13 +935,13 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("br", {}, []),
$el("div", {}, []),
update_all_button,
update_comfyui_button,
switch_comfyui_button,
// fetch_updates_button,
$el("br", {}, []),
$el("div", {}, []),
restart_stop_button,
];
@ -960,12 +954,13 @@ class ManagerMenuDialog extends ComfyDialog {
let self = this;
// db mode
this.datasrc_combo = document.createElement("select");
this.datasrc_combo.setAttribute("title", "Configure where to retrieve node/model information. If set to 'local,' the channel is ignored, and if set to 'channel (remote),' it fetches the latest information each time the list is opened.");
this.datasrc_combo.className = "cm-menu-combo";
this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'DB: Channel (1day cache)' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'DB: Channel (remote)' }, []));
this.datasrc_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled ";
this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'Channel (1day cache)' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'Local' }, []));
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'Channel (remote)' }, []));
api.fetchApi('/manager/db_mode')
.then(response => response.text())
@ -975,14 +970,16 @@ class ManagerMenuDialog extends ComfyDialog {
api.fetchApi(`/manager/db_mode?value=${event.target.value}`);
});
const dbRetrievalSetttingItem = createSettingsCombo("DB", this.datasrc_combo);
// preview method
let preview_combo = document.createElement("select");
preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process.");
preview_combo.className = "cm-menu-combo";
preview_combo.appendChild($el('option', { value: 'auto', text: 'Preview method: Auto' }, []));
preview_combo.appendChild($el('option', { value: 'taesd', text: 'Preview method: TAESD (slow)' }, []));
preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Preview method: Latent2RGB (fast)' }, []));
preview_combo.appendChild($el('option', { value: 'none', text: 'Preview method: None (very fast)' }, []));
preview_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
preview_combo.appendChild($el('option', { value: 'auto', text: 'Auto' }, []));
preview_combo.appendChild($el('option', { value: 'taesd', text: 'TAESD (slow)' }, []));
preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Latent2RGB (fast)' }, []));
preview_combo.appendChild($el('option', { value: 'none', text: 'None (very fast)' }, []));
api.fetchApi('/manager/preview_method')
.then(response => response.text())
@ -992,10 +989,12 @@ class ManagerMenuDialog extends ComfyDialog {
api.fetchApi(`/manager/preview_method?value=${event.target.value}`);
});
const previewSetttingItem = createSettingsCombo("Preview method", preview_combo);
// channel
let channel_combo = document.createElement("select");
channel_combo.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list.");
channel_combo.className = "cm-menu-combo";
channel_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
api.fetchApi('/manager/channel_url_list')
.then(response => response.json())
.then(async data => {
@ -1004,7 +1003,7 @@ class ManagerMenuDialog extends ComfyDialog {
for (let i in urls) {
if (urls[i] != '') {
let name_url = urls[i].split('::');
channel_combo.appendChild($el('option', { value: name_url[0], text: `Channel: ${name_url[0]}` }, []));
channel_combo.appendChild($el('option', { value: name_url[0], text: `${name_url[0]}` }, []));
}
}
@ -1019,11 +1018,13 @@ class ManagerMenuDialog extends ComfyDialog {
}
});
const channelSetttingItem = createSettingsCombo("Channel", channel_combo);
// share
let share_combo = document.createElement("select");
share_combo.setAttribute("title", "Hide the share button in the main menu or set the default action upon clicking it. Additionally, configure the default share site when sharing via the context menu's share button.");
share_combo.className = "cm-menu-combo";
share_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
const share_options = [
['none', 'None'],
['openart', 'OpenArt AI'],
@ -1034,7 +1035,7 @@ class ManagerMenuDialog extends ComfyDialog {
['all', 'All'],
];
for (const option of share_options) {
share_combo.appendChild($el('option', { value: option[0], text: `Share: ${option[1]}` }, []));
share_combo.appendChild($el('option', { value: option[0], text: `${option[1]}` }, []));
}
api.fetchApi('/manager/share_option')
@ -1056,12 +1057,14 @@ class ManagerMenuDialog extends ComfyDialog {
}
});
const shareSetttingItem = createSettingsCombo("Share", share_combo);
let component_policy_combo = document.createElement("select");
component_policy_combo.setAttribute("title", "When loading the workflow, configure which version of the component to use.");
component_policy_combo.className = "cm-menu-combo";
component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Component: Use workflow version' }, []));
component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Component: Use higher version' }, []));
component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Component: Use my version' }, []));
component_policy_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Use workflow version' }, []));
component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Use higher version' }, []));
component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Use my version' }, []));
api.fetchApi('/manager/policy/component')
.then(response => response.text())
.then(data => {
@ -1074,15 +1077,14 @@ class ManagerMenuDialog extends ComfyDialog {
set_component_policy(event.target.value);
});
update_policy_combo = document.createElement("select");
const componentSetttingItem = createSettingsCombo("Component", component_policy_combo);
if(isElectron)
update_policy_combo.style.display = 'none';
update_policy_combo = document.createElement("select");
update_policy_combo.setAttribute("title", "Sets the policy to be applied when performing an update.");
update_policy_combo.className = "cm-menu-combo";
update_policy_combo.appendChild($el('option', { value: 'stable-comfyui', text: 'Update: ComfyUI Stable Version' }, []));
update_policy_combo.appendChild($el('option', { value: 'nightly-comfyui', text: 'Update: ComfyUI Nightly Version' }, []));
update_policy_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
update_policy_combo.appendChild($el('option', { value: 'stable-comfyui', text: 'ComfyUI Stable Version' }, []));
update_policy_combo.appendChild($el('option', { value: 'nightly-comfyui', text: 'ComfyUI Nightly Version' }, []));
api.fetchApi('/manager/policy/update')
.then(response => response.text())
.then(data => {
@ -1093,20 +1095,22 @@ class ManagerMenuDialog extends ComfyDialog {
api.fetchApi(`/manager/policy/update?value=${event.target.value}`);
});
return [
$el("br", {}, []),
this.datasrc_combo,
channel_combo,
preview_combo,
share_combo,
component_policy_combo,
update_policy_combo,
$el("br", {}, []),
const updateSetttingItem = createSettingsCombo("Update", update_policy_combo);
if(isElectron)
updateSetttingItem.style.display = 'none';
$el("br", {}, []),
$el("filedset.cm-experimental", {}, [
return [
dbRetrievalSetttingItem,
channelSetttingItem,
previewSetttingItem,
shareSetttingItem,
componentSetttingItem,
updateSetttingItem,
//[TODO] replace mt-2 with wrapper div with flex column gap
$el("filedset.cm-experimental.mt-auto", {}, [
$el("legend.cm-experimental-legend", {}, ["EXPERIMENTAL"]),
$el("button.cm-experimental-button", {
$el("button.p-button.p-component.cm-button.cm-experimental-button", {
type: "button",
textContent: "Snapshot Manager",
onclick:
@ -1116,7 +1120,7 @@ class ManagerMenuDialog extends ComfyDialog {
SnapshotManager.instance.show();
}
}),
$el("button.cm-experimental-button", {
$el("button.p-button.p-component.cm-button.cm-experimental-button.mt-2", {
type: "button",
textContent: "Install PIP packages",
onclick:
@ -1134,7 +1138,7 @@ class ManagerMenuDialog extends ComfyDialog {
createControlsRight() {
const elts = [
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
id: 'cm-manual-button',
type: "button",
textContent: "Community Manual",
@ -1185,11 +1189,11 @@ class ManagerMenuDialog extends ComfyDialog {
})
]),
$el("button", {
$el("button.p-button.p-component.cm-button", {
id: 'workflowgallery-button',
type: "button",
style: {
...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {})
// ...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {})
},
onclick: (e) => {
const last_visited_site = localStorage.getItem("wg_last_visited")
@ -1212,7 +1216,7 @@ class ManagerMenuDialog extends ComfyDialog {
}, [
$el("p", {
id: 'workflowgallery-button-last-visited-label',
textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : ''})`,
textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : 'none selected'})`,
style: {
'text-align': 'center',
'color': 'var(--input-text)',
@ -1228,13 +1232,12 @@ class ManagerMenuDialog extends ComfyDialog {
})
]),
$el("button.cm-button", {
$el("button.p-button.p-component.cm-button", {
id: 'cm-nodeinfo-button',
type: "button",
textContent: "Nodes Info",
onclick: () => { window.open("https://ltdrdata.github.io/", "comfyui-node-info"); }
}),
$el("br", {}, []),
];
var textarea = document.createElement("div");
@ -1249,31 +1252,23 @@ class ManagerMenuDialog extends ComfyDialog {
constructor() {
super();
const close_button = $el("button", { id: "cm-close-button", type: "button", textContent: "Close", onclick: () => this.close() });
const content = $el("div.cm-menu-container",
[
$el("div.cm-menu-column.gap-2", [...this.createControlsLeft()]),
$el("div.cm-menu-column.gap-2", [...this.createControlsMid()]),
$el("div.cm-menu-column.gap-2", [...this.createControlsRight()])
]
);
const content =
$el("div.comfy-modal-content",
[
$el("tr.cm-title", {}, [
$el("font", {size:6, color:"white"}, [`ComfyUI Manager ${manager_version}`])]
),
$el("br", {}, []),
$el("div.cm-menu-container",
[
$el("div.cm-menu-column", [...this.createControlsLeft()]),
$el("div.cm-menu-column", [...this.createControlsMid()]),
$el("div.cm-menu-column", [...this.createControlsRight()])
]),
const frame = buildGuiFrame(
'cm-manager-dialog', // dialog id
`ComfyUI Manager ${manager_version}`, // dialog title
"i.mdi.mdi-puzzle", // dialog icon class to show before title
content, // dialog content element
this
); // send this so we can attach close functions
$el("br", {}, []),
close_button,
]
);
content.style.width = '100%';
content.style.height = '100%';
this.element = $el("div.comfy-modal", { id:'cm-manager-dialog', parent: document.body }, [ content ]);
this.element = frame;
}
get isVisible() {
@ -1281,7 +1276,7 @@ class ManagerMenuDialog extends ComfyDialog {
}
show() {
this.element.style.display = "block";
this.element.style.display = "flex";
}
toggleVisibility() {

View File

@ -1,8 +1,9 @@
.cn-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
z-index: 1099;
width: 80%;
height: 80%;
width: 80vw;
height: 75vh;
min-height: 30em;
display: flex;
flex-direction: column;
gap: 10px;
@ -10,6 +11,7 @@
font-family: arial, sans-serif;
text-underline-offset: 3px;
outline: none;
margin: calc(var(--spacing)*2);
}
.cn-manager .cn-flex-auto {
@ -17,17 +19,21 @@
}
.cn-manager button {
width: auto;
position: relative;
overflow: hidden;
font-size: 16px;
color: var(--input-text);
background-color: var(--comfy-input-bg);
border-radius: 8px;
border-color: var(--border-color);
border-style: solid;
margin: 0;
padding: 4px 8px;
min-width: 100px;
}
.cn-manager button:hover {
filter: brightness(125%);
}
.cn-manager button:disabled,
.cn-manager input:disabled,
.cn-manager select:disabled {
@ -40,8 +46,13 @@
.cn-manager .cn-manager-restart {
display: none;
background-color: #500000;
color: white;
background-color: #500000 !important;
border-color: #88181b !important;
color: white !important;
}
.cn-manager .cn-manager-restart:hover {
background-color: #88181b !important;
}
.cn-manager .cn-manager-stop {
@ -79,7 +90,6 @@
flex-wrap: wrap;
gap: 5px;
align-items: center;
padding: 0 5px;
}
.cn-manager-header label {
@ -91,16 +101,32 @@
.cn-manager-filter {
height: 28px;
line-height: 28px;
cursor: pointer;
padding: 0.5em 0.5em;
border: 1px solid var(--border-color);
border-radius: 6px;
background: var(--comfy-input-bg);
}
.cn-manager-filter:hover {
filter: brightness(125%);
}
.cn-manager-keywords {
height: 28px;
line-height: 28px;
padding: 0 5px 0 26px;
background: var(--comfy-input-bg);
background-size: 16px;
background-position: 5px center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20pointer-events%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23888%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20d%3D%22m21%2021-4.486-4.494M19%2010.5a8.5%208.5%200%201%201-17%200%208.5%208.5%200%200%201%2017%200%22%2F%3E%3C%2Fsvg%3E");
border: 1px solid var(--border-color);
border-radius: 6px;
outline-color: transparent;
}
.cn-manager-status {
@ -588,6 +614,10 @@
height: 100%;
}
.cn-install-buttons button {
padding: 4px 8px;
}
.cn-selected-buttons {
display: flex;
gap: 5px;

View File

@ -1,6 +1,7 @@
import { app } from "../../scripts/app.js";
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { api } from "../../scripts/api.js";
import { buildGuiFrameCustomHeader, createSettingsCombo } from "./comfyui-gui-builder.js";
import {
manager_instance, rebootAPI, install_via_git_url,
@ -18,32 +19,19 @@ loadCss("./custom-nodes-manager.css");
const gridId = "node";
const pageHtml = `
<div class="cn-manager-header">
<label>Filter
<select class="cn-manager-filter"></select>
</label>
<input class="cn-manager-keywords" type="search" placeholder="Search" />
<div class="cn-manager-status"></div>
<div class="cn-flex-auto"></div>
<div class="cn-manager-channel"></div>
</div>
<div class="cn-manager-grid"></div>
<div class="cn-manager-selection"></div>
<div class="cn-manager-message"></div>
<div class="cn-manager-footer">
<button class="cn-manager-back">
<svg class="arrow-icon" width="14" height="14" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 8H18M2 8L8 2M2 8L8 14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Back
</button>
<button class="cn-manager-restart">Restart</button>
<button class="cn-manager-stop">Stop</button>
<div class="cn-flex-auto"></div>
<button class="cn-manager-used-in-workflow">Used In Workflow</button>
<button class="cn-manager-check-update">Check Update</button>
<button class="cn-manager-check-missing">Check Missing</button>
<button class="cn-manager-install-url">Install via Git URL</button>
<div class="cn-manager cn-manager-dark">
<div class="cn-manager-grid"></div>
<div class="cn-manager-selection"></div>
<div class="cn-manager-message"></div>
<div class="cn-manager-footer">
<button class="cn-manager-restart p-button p-component">Restart</button>
<button class="cn-manager-stop p-button p-component">Stop</button>
<div class="cn-flex-auto"></div>
<button class="cn-manager-used-in-workflow p-button p-component">Used In Workflow</button>
<button class="cn-manager-check-update p-button p-component">Check Update</button>
<button class="cn-manager-check-missing p-button p-component">Check Missing</button>
<button class="cn-manager-install-url p-button p-component">Install via Git URL</button>
</div>
</div>
`;
@ -89,11 +77,26 @@ export class CustomNodesManager {
}
init() {
this.element = $el("div", {
parent: document.body,
className: "comfy-modal cn-manager"
});
this.element.innerHTML = pageHtml;
const header = $el("div.cn-manager-header.px-2", {}, [
// $el("label", {}, [
// $el("span", { textContent: "Filter" }),
// $el("select.cn-manager-filter")
// ]),
createSettingsCombo("Filter", $el("select.cn-manager-filter")),
$el("input.cn-manager-keywords.p-inputtext.p-component", { type: "search", placeholder: "Search" }),
$el("div.cn-manager-status"),
$el("div.cn-flex-auto"),
$el("div.cn-manager-channel")
]);
const frame = buildGuiFrameCustomHeader(
'cn-manager-dialog', // dialog id
header, // custom header element
pageHtml, // dialog content element
this
); // send this so we can attach close functions
this.element = frame;
this.element.setAttribute("tabindex", 0);
this.element.focus();
@ -372,7 +375,7 @@ export class CustomNodesManager {
return list.map(id => {
const bt = buttons[id];
return `<button class="cn-btn-${id}" group="${action}" mode="${bt.mode}">${bt.label}</button>`;
return `<button class="cn-btn-${id} p-button p-component" group="${action}" mode="${bt.mode}">${bt.label}</button>`;
}).join("");
}
@ -655,7 +658,6 @@ export class CustomNodesManager {
}
renderGrid() {
// update theme
const globalStyle = window.getComputedStyle(document.body);
this.colorVars = {

View File

@ -1,13 +1,15 @@
.cmm-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
z-index: 1099;
width: 80%;
height: 80%;
width: 80vw;
height: 75vh;
min-height: 30em;
display: flex;
flex-direction: column;
gap: 10px;
color: var(--fg-color);
font-family: arial, sans-serif;
margin: calc(var(--spacing)*2);
}
.cmm-manager .cmm-flex-auto {
@ -18,14 +20,15 @@
font-size: 16px;
color: var(--input-text);
background-color: var(--comfy-input-bg);
border-radius: 8px;
border-color: var(--border-color);
border-style: solid;
margin: 0;
padding: 4px 8px;
min-width: 100px;
}
.cmm-manager button:hover {
filter: brightness(125%);
}
.cmm-manager button:disabled,
.cmm-manager input:disabled,
.cmm-manager select:disabled {
@ -38,7 +41,7 @@
.cmm-manager .cmm-manager-refresh {
display: none;
background-color: #000080;
background-color: #000080 !important;
color: white;
}
@ -53,7 +56,6 @@
flex-wrap: wrap;
gap: 5px;
align-items: center;
padding: 0 5px;
}
.cmm-manager-header label {
@ -67,16 +69,34 @@
.cmm-manager-filter {
height: 28px;
line-height: 28px;
cursor: pointer;
padding: 0.5em 0.5em;
border: 1px solid var(--border-color);
border-radius: 6px;
background: var(--comfy-input-bg);
}
.cmm-manager-type:hover,
.cmm-manager-base:hover,
.cmm-manager-filter:hover {
filter: brightness(125%);
}
.cmm-manager-keywords {
height: 28px;
line-height: 28px;
padding: 0 5px 0 26px;
background: var(--comfy-input-bg);
background-size: 16px;
background-position: 5px center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20pointer-events%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23888%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20d%3D%22m21%2021-4.486-4.494M19%2010.5a8.5%208.5%200%201%201-17%200%208.5%208.5%200%200%201%2017%200%22%2F%3E%3C%2Fsvg%3E");
border: 1px solid var(--border-color);
border-radius: 6px;
outline-color: transparent;
}
.cmm-manager-status {
@ -148,6 +168,10 @@
color: white;
}
.cmm-btn-install {
padding: 4px 8px;
}
.cmm-btn-download {
width: 18px;
height: 18px;

View File

@ -9,39 +9,22 @@ import { api } from "../../scripts/api.js";
// https://cenfun.github.io/turbogrid/api.html
import TG from "./turbogrid.esm.js";
import { buildGuiFrameCustomHeader, createSettingsCombo } from "./comfyui-gui-builder.js";
loadCss("./model-manager.css");
const gridId = "model";
const pageHtml = `
<div class="cmm-manager-header">
<label>Filter
<select class="cmm-manager-filter"></select>
</label>
<label>Type
<select class="cmm-manager-type"></select>
</label>
<label>Base
<select class="cmm-manager-base"></select>
</label>
<input class="cmm-manager-keywords" type="search" placeholder="Search" />
<div class="cmm-manager-status"></div>
<div class="cmm-flex-auto"></div>
</div>
<div class="cmm-manager-grid"></div>
<div class="cmm-manager-selection"></div>
<div class="cmm-manager-message"></div>
<div class="cmm-manager-footer">
<button class="cmm-manager-back">
<svg class="arrow-icon" width="14" height="14" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 8H18M2 8L8 2M2 8L8 14" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
Back
</button>
<button class="cmm-manager-refresh">Refresh</button>
<button class="cmm-manager-stop">Stop</button>
<div class="cmm-flex-auto"></div>
<div class="cmm-manager cmm-manager-dark">
<div class="cmm-manager-grid"></div>
<div class="cmm-manager-selection"></div>
<div class="cmm-manager-message"></div>
<div class="cmm-manager-footer">
<button class="cmm-manager-refresh p-button p-component">Refresh</button>
<button class="cmm-manager-stop p-button p-component">Stop</button>
<div class="cmm-flex-auto"></div>
</div>
</div>
`;
@ -64,11 +47,23 @@ export class ModelManager {
}
init() {
this.element = $el("div", {
parent: document.body,
className: "comfy-modal cmm-manager"
});
this.element.innerHTML = pageHtml;
const header = $el("div.cmm-manager-header", {}, [
createSettingsCombo("Filter", $el("select.cmm-manager-filter")),
createSettingsCombo("Type", $el("select.cmm-manager-type")),
createSettingsCombo("Base", $el("select.cmm-manager-base")),
$el("input.cmm-manager-keywords.p-inputtext.p-component", { type: "search", placeholder: "Search" }),
$el("div.cmm-manager-status"),
$el("div.cmm-flex-auto")
]);
const frame = buildGuiFrameCustomHeader(
'cmm-manager-dialog', // dialog id
header, // custom header element
pageHtml, // dialog content element
this
); // send this so we can attach close functions
this.element = frame;
this.initFilter();
this.bindEvents();
this.initGrid();
@ -347,7 +342,7 @@ export class ModelManager {
if (installed === "True") {
return `<div class="cmm-icon-passed">${icons.passed}</div>`;
}
return `<button class="cmm-btn-install" mode="install">Install</button>`;
return `<button class="cmm-btn-install p-button p-component" mode="install">Install</button>`;
}
}, {
id: 'url',
@ -420,7 +415,7 @@ export class ModelManager {
}
this.selectedModels = selectedList;
this.showSelection(`<span>Selected <b>${selectedList.length}</b> models <button class="cmm-btn-install" mode="install">Install</button>`);
this.showSelection(`<span>Selected <b>${selectedList.length}</b> models <button class="cmm-btn-install p-button p-component" mode="install">Install</button>`);
}
focusInstall(item) {

65
js/snapshot.css Normal file
View File

@ -0,0 +1,65 @@
.snapshot-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
z-index: 1099;
width: 80vw;
height: 75vh;
min-height: 30em;
display: flex;
flex-direction: column;
gap: 10px;
color: var(--fg-color);
font-family: arial, sans-serif;
text-underline-offset: 3px;
outline: none;
margin: calc(var(--spacing)*2);
}
.snapshot-manager button {
width: auto;
position: relative;
overflow: hidden;
font-size: 16px;
color: var(--input-text);
background-color: var(--comfy-input-bg);
border-color: var(--border-color);
margin: 0;
min-width: 100px;
padding: 4px 8px;
}
.snapshot-manager .snapshot-restore-btn {
background-color: #00158f !important;
border-color: #2025b9 !important;
color: white !important;
}
.snapshot-manager .snapshot-remove-btn {
background-color: #970000 !important;
border-color: #be2127 !important;
color: white !important;
}
.snapshot-manager button:hover {
filter: brightness(125%);
}
.snapshot-manager .data-btns {
display: flex;
flex-direction: column;
gap: calc(var(--spacing)*2);
padding: calc(var(--spacing)*2);
align-items: center;
justify-content: center;
height: 100%;
}
.snapshot-footer {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
}
.snapshot-manager .cn-flex-auto {
flex: auto;
}

View File

@ -1,8 +1,10 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { manager_instance, rebootAPI, show_message, handle403Response } from "./common.js";
import { manager_instance, rebootAPI, show_message, handle403Response, loadCss } from "./common.js";
import { buildGuiFrame } from "./comfyui-gui-builder.js";
loadCss("./snapshot.css");
async function restore_snapshot(target) {
if(SnapshotManager.instance) {
@ -27,7 +29,7 @@ async function restore_snapshot(target) {
}
finally {
await SnapshotManager.instance.invalidateControl();
SnapshotManager.instance.updateMessage("<BR>To apply the snapshot, please <button id='cm-reboot-button2' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button2');
SnapshotManager.instance.updateMessage("<BR>To apply the snapshot, please <button id='cm-reboot-button2' class='p-button p-component'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button2');
}
}
}
@ -88,6 +90,8 @@ export class SnapshotManager extends ComfyDialog {
message_box = null;
data = null;
content = $el("div.snapshot-manager");
clear() {
this.restore_buttons = [];
this.message_box = null;
@ -96,9 +100,18 @@ export class SnapshotManager extends ComfyDialog {
constructor(app, manager_dialog) {
super();
this.manager_dialog = manager_dialog;
// this.manager_dialog = manager_dialog;
this.search_keyword = '';
this.element = $el("div.comfy-modal", { parent: document.body }, []);
const frame = buildGuiFrame(
'snapshot-manager-dialog', // dialog id
'Snapshot Manager', // title
'i.mdi.mdi-puzzle', // icon class
this.content, // dialog content element
this
); // send this so we can attach close functions
this.element = frame;
}
async remove_item() {
@ -109,7 +122,7 @@ export class SnapshotManager extends ComfyDialog {
createControls() {
return [
$el("button.cm-small-button", {
$el("button.p-button.p-component", {
type: "button",
textContent: "Close",
onclick: () => { this.close(); }
@ -132,8 +145,8 @@ export class SnapshotManager extends ComfyDialog {
this.clear();
this.data = (await getSnapshotList()).items;
while (this.element.children.length) {
this.element.removeChild(this.element.children[0]);
while (this.content.children.length) {
this.content.removeChild(this.content.children[0]);
}
await this.createGrid();
@ -204,20 +217,21 @@ export class SnapshotManager extends ComfyDialog {
data2.innerHTML = `&nbsp;${data}`;
var data_button = document.createElement('td');
data_button.style.textAlign = "center";
data_button.className = "data-btns";
var restoreBtn = document.createElement('button');
restoreBtn.className = "snapshot-restore-btn p-button p-component";
restoreBtn.innerHTML = 'Restore';
restoreBtn.style.width = "100px";
restoreBtn.style.backgroundColor = 'blue';
restoreBtn.addEventListener('click', function() {
restore_snapshot(data);
});
var removeBtn = document.createElement('button');
removeBtn.className = "snapshot-remove-btn p-button p-component";
removeBtn.innerHTML = 'Remove';
removeBtn.style.width = "100px";
removeBtn.style.backgroundColor = 'red';
removeBtn.addEventListener('click', function() {
remove_snapshot(data);
@ -241,13 +255,14 @@ export class SnapshotManager extends ComfyDialog {
let self = this;
const panel = document.createElement('div');
panel.style.width = "100%";
panel.style.height = "100%";
panel.appendChild(grid);
function handleResize() {
const parentHeight = self.element.clientHeight;
const gridHeight = parentHeight - 200;
grid.style.height = gridHeight + "px";
// grid.style.height = gridHeight + "px";
}
window.addEventListener("resize", handleResize);
@ -256,25 +271,17 @@ export class SnapshotManager extends ComfyDialog {
grid.style.width = "100%";
grid.style.height = "100%";
grid.style.overflowY = "scroll";
this.element.style.height = "85%";
this.element.style.width = "80%";
this.element.appendChild(panel);
this.content.appendChild(panel);
handleResize();
}
async createBottomControls() {
var close_button = document.createElement("button");
close_button.className = "cm-small-button";
close_button.innerHTML = "Close";
close_button.onclick = () => { this.close(); }
close_button.style.display = "inline-block";
var save_button = document.createElement("button");
save_button.className = "cm-small-button";
save_button.className = "p-button p-component";
save_button.innerHTML = "Save snapshot";
save_button.onclick = () => { save_current_snapshot(); }
save_button.style.display = "inline-block";
save_button.style.horizontalAlign = "right";
save_button.style.width = "170px";
@ -282,15 +289,19 @@ export class SnapshotManager extends ComfyDialog {
this.message_box.style.height = '60px';
this.message_box.style.verticalAlign = 'middle';
this.element.appendChild(this.message_box);
this.element.appendChild(close_button);
this.element.appendChild(save_button);
const footer = $el("div.snapshot-footer");
const spacer = $el("div.cn-flex-auto");
footer.appendChild(spacer);
footer.appendChild(save_button);
this.content.appendChild(this.message_box);
this.content.appendChild(footer);
}
async show() {
try {
this.invalidateControl();
this.element.style.display = "block";
this.element.style.display = "flex";
this.element.style.zIndex = 1099;
}
catch(exception) {

View File

@ -1,5 +1,35 @@
{
"custom_nodes": [
{
"author": "saltchicken",
"title": "ComfyUI-Identity-Mixer",
"reference": "https://github.com/saltchicken/ComfyUI-Identity-Mixer",
"files": [
"https://github.com/saltchicken/ComfyUI-Identity-Mixer"
],
"install_type": "git-clone",
"description": "Mixes multiple identity LoRAs with normalized strength."
},
{
"author": "saltchicken",
"title": "ComfyUI-Prompter",
"reference": "https://github.com/saltchicken/ComfyUI-Prompter",
"files": [
"https://github.com/saltchicken/ComfyUI-Prompter"
],
"install_type": "git-clone",
"description": "ComfyUI custom node providing customizable prompt generation capabilities. (Description by CC)"
},
{
"author": "JBKing514",
"title": "[WIP] map_comfyui",
"reference": "https://github.com/JBKing514/map_comfyui",
"files": [
"https://github.com/JBKing514/map_comfyui"
],
"install_type": "git-clone",
"description": "A custom node implementing the Manifold Alignment Protocol (MAP) within ComfyUI, transforming diffusion sampling into a measurable and visualizable geometric process. (Description by CC)\nNOTE: The files in the repo are not organized."
},
{
"author": "Nynxz",
"title": "ComfyUI_DiffsynthPause",
@ -50,16 +80,6 @@
"install_type": "git-clone",
"description": "ComfyUI custom node that splits multi-line prompts by line, enabling batch image generation with each line triggering one execution and supporting custom prompt boxes. (Description by CC)\nNOTE: The files in the repo are not organized."
},
{
"author": "ashtar1984",
"title": "comfyui-switch-bypass-mute-by-group",
"reference": "https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group",
"files": [
"https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group"
],
"install_type": "git-clone",
"description": "ComfyUI custom node for group-based node switching, bypassing, and muting control. (Description by CC)"
},
{
"author": "rookiestar28",
"title": "ComfyUI_Security_Audit",

View File

@ -375,6 +375,7 @@
"PD_Image_centerCrop",
"PD_JoinStringMultiLine",
"PD_LoadImageMetadata",
"PD_LoadImageWithMeta",
"PD_LoadImagesFromDir",
"PD_LoadImagesFromZip",
"PD_LoadTextsFromDir",
@ -404,6 +405,7 @@
"PD_Zip_Simple",
"PD_del_word",
"PD_empty_word",
"PD_if",
"PD_image_coversaver",
"PD_image_ratio_size",
"PD_image_to_text_v1",
@ -857,6 +859,7 @@
],
"https://github.com/AlexYez/comfyui-timesaver": [
[
"ModelScanner",
"TS Cube to Equirectangular",
"TS Equirectangular to Cube",
"TS Files Downloader",
@ -869,7 +872,6 @@
"TS_Color_Grade",
"TS_DeflickerNode",
"TS_FilePathLoader",
"TS_FilmEmulation",
"TS_FilmGrain",
"TS_Film_Emulation",
"TS_Free_Video_Memory",
@ -2197,6 +2199,14 @@
"title_aux": "comfyui-codeformer [WIP]"
}
],
"https://github.com/JBKing514/map_comfyui": [
[
"MAP_Pro_Suite"
],
{
"title_aux": "[WIP] map_comfyui"
}
],
"https://github.com/JHBOY-ha/ComfyUI-jh-essential": [
[
"EndTimer",
@ -2591,6 +2601,8 @@
"LunaExpressionPromptBuilder",
"LunaExpressionSlicerSaver",
"LunaGGUFConverter",
"LunaKSampler",
"LunaKSamplerAdvanced",
"LunaLoRARandomizer",
"LunaLoRAStacker",
"LunaLoRATriggerInjector",
@ -2617,7 +2629,6 @@
"LunaZImageEncoder",
"LunaZImageProcessor",
"Luna_Advanced_Upscaler",
"Luna_Detailer",
"Luna_SimpleUpscaler",
"Luna_UltimateSDUpscale"
],
@ -3270,7 +3281,6 @@
"DeepSeek_Node",
"Delay_node",
"Delete_folder_Node",
"DongShowTextNode",
"Dong_Pixelate_Node",
"Dong_Text_Node",
"DownloadNode",
@ -3279,12 +3289,14 @@
"FolderIteratorNODE",
"GLM_Node",
"GetImageListFromFloderNode",
"GetImageListFromFloderNode2",
"GetRefModelImageListNode",
"Get_cookies_Node",
"Get_json_value_Node",
"Get_video_Node",
"HashCalculationsNode",
"HuggingFaceUploadNode",
"IFEXISTTEXTNODE",
"IMG2URLNode",
"INTNODE",
"Image2GIFNode",
@ -3293,8 +3305,10 @@
"LibLib_upload_Node",
"LogicToolsNode",
"LoraIterator",
"Notice_Node",
"PromptConcatNode",
"Qwen3VL_235_Node",
"Qwen3VL_30_Node",
"QwenVL_Node",
"RandomNumbersNode",
"RenameNode",
"ResolutionNode",
@ -3306,11 +3320,11 @@
"Wan21_post_Node",
"ZIPwith7zNode",
"bailian_model_select_Node",
"checkvram_node",
"cogvideox_flash_get_Node",
"cogvideox_flash_post_Node",
"cogview_3_flash_Node",
"doubaoNode",
"douyin_remove_watermark_Node",
"file_analysis_Node",
"file_extract_Node",
"find_files_by_extension_Node",
@ -3319,11 +3333,16 @@
"image_iterator",
"img2url_v2_Node",
"img_understanding_Node",
"kie_base64_upload_node",
"kie_nano_get_node",
"kie_nano_post_node",
"klingai_video_Node",
"path_join_Node",
"save_img_NODE",
"save_img_v2_NODE",
"set_api_Node",
"suchuang_get_node",
"suchuang_nano_post_node",
"text_replace_node"
],
{
@ -3596,21 +3615,27 @@
"CADAnalysisViewer",
"CADBoundingBox",
"CADCheckOverlappingFaces",
"CADCurvature",
"CADCurvePlotter",
"CADEdgeAnalysis",
"CADEdgeDetailAnalyzer",
"CADEdgeViewer",
"CADEdgeViewerVTK",
"CADExtractFaces",
"CADFaceAnalysis",
"CADFixDegenerateFaces",
"CADGetFilename",
"CADHealShape",
"CADHierarchyTree",
"CADMergeVertices",
"CADPrimitiveReconstruction",
"CADProjectFacesXY",
"CADROISelector",
"CADRaytracerBVH",
"CADRecodeInference",
"CADSave",
"CADSewFaces",
"CADSplineViewer",
"CADSplitComponents",
"CADTransform",
"CAD_Convert_Format",
@ -3649,6 +3674,7 @@
"Point2CADSegmentation",
"Point2CADSurfaceFitting",
"Point2CADSurfaceFittingOCC",
"Point2CADToWireframeInfo",
"Point2CADTopologyExtraction",
"PointCloudSegmentation",
"PreviewCADBatch",
@ -5713,14 +5739,6 @@
"title_aux": "ComfyUI_MoreComfy"
}
],
"https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group": [
[
"SwitchBypassMute"
],
{
"title_aux": "comfyui-switch-bypass-mute-by-group"
}
],
"https://github.com/avocadori/ComfyUI-AudioAmplitudeConverter": [
[
"NormalizeAmpToFloatNode"
@ -6829,6 +6847,7 @@
"SamplerLCMUpscale",
"SamplerLMS",
"SamplerSASolver",
"SamplerSEEDS2",
"SamplingPercentToSigma",
"SaveAnimatedPNG",
"SaveAnimatedWEBP",
@ -8109,9 +8128,11 @@
"https://github.com/grokuku/ComfyUI-Holaf": [
[
"HolafBypasser",
"HolafGroupBypasser",
"HolafImageComparer",
"HolafInstagramResize",
"HolafKSampler",
"HolafLoadImageVideo",
"HolafLutGenerator",
"HolafLutSaver",
"HolafMaskToBoolean",
@ -8120,6 +8141,8 @@
"HolafRemote",
"HolafResolutionPreset",
"HolafSaveImage",
"HolafShortcut",
"HolafShortcutUser",
"HolafTiledKSampler",
"UpscaleImageHolaf"
],
@ -9818,6 +9841,11 @@
"DiffusersTokenizerLoader",
"DiffusersTransformerLoader",
"DiffusersVAELoader",
"LoadLoraOnly",
"LoraLayersOperation",
"LoraStatViewer",
"MergeLoraToTransformer",
"SaveLora",
"TextEncodeDiffusersLongCat",
"TextEncodeDiffusersLongCatCached",
"TextEncodeDiffusersLongCatImageEdit"
@ -11487,6 +11515,23 @@
"title_aux": "ComfyUI Sahib Nodes"
}
],
"https://github.com/saltchicken/ComfyUI-Identity-Mixer": [
[
"IdentityLoraMixer",
"IdentityLoraMixerStack"
],
{
"title_aux": "ComfyUI-Identity-Mixer"
}
],
"https://github.com/saltchicken/ComfyUI-Prompter": [
[
"CustomizablePromptGenerator"
],
{
"title_aux": "ComfyUI-Prompter"
}
],
"https://github.com/saulchiu/comfy_saul_plugin": [
[
"Blend Images",
@ -11722,9 +11767,11 @@
"https://github.com/silveroxides/ComfyUI_SamplingUtils": [
[
"GetJsonKeyValue",
"ImageBlendByMask",
"Image_Color_Noise",
"ModifyMask",
"SamplingParameters",
"SystemMessagePresets",
"TextEncodeFlux2SystemPrompt",
"TextEncodeZITSystemPrompt"
],
@ -13407,6 +13454,7 @@
"https://github.com/zyd232/ComfyUI-zyd232-Nodes": [
[
"zyd232 ImagesPixelsCompare",
"zyd232 MaskBatchBlend",
"zyd232_SavePreviewImages"
],
{

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,25 @@
{
"custom_nodes": [
{
"author": "ashtar1984",
"title": "comfyui-switch-bypass-mute-by-group [REMOVED]",
"reference": "https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group",
"files": [
"https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group"
],
"install_type": "git-clone",
"description": "ComfyUI custom node for group-based node switching, bypassing, and muting control. (Description by CC)"
},
{
"author": "wallen0322",
"title": "ComfyUI-TTM-WAN22 [REMOVED]",
"reference": "https://github.com/wallen0322/ComfyUI-TTM-WAN22",
"files": [
"https://github.com/wallen0322/ComfyUI-TTM-WAN22"
],
"install_type": "git-clone",
"description": "TTM (Time-to-Move) node for ComfyUI enabling motion-controlled video generation with Wan2.2 models using dual-clock denoising for independent background and object animation control."
},
{
"author": "cdanielp",
"title": "COMFYUI_PROMPTMODELS [REMOVED]",

View File

@ -1,5 +1,86 @@
{
"custom_nodes": [
{
"author": "ubisoft",
"title": "ComfyUI-Chord",
"reference": "https://github.com/ubisoft/ComfyUI-Chord",
"files": [
"https://github.com/ubisoft/ComfyUI-Chord"
],
"install_type": "git-clone",
"description": "Custom nodes for the paper: Chord: Chain of Rendering Decomposition for PBR Material Estimation from Generated Texture Images"
},
{
"author": "g7b2",
"title": "ComfyUI-Artist-Tester",
"reference": "https://github.com/g7b2/ComfyUI-Artist-Tester",
"files": [
"https://github.com/g7b2/ComfyUI-Artist-Tester"
],
"install_type": "git-clone",
"description": "A dedicated suite of custom nodes for batch testing artists, styles, and prompts in ComfyUI, solving the caching problem with anti-cache logic and dynamic filename generation."
},
{
"author": "dseditor",
"title": "Comfy-MCP",
"reference": "https://github.com/dseditor/Comfy-MCP",
"files": [
"https://github.com/dseditor/Comfy-MCP"
],
"install_type": "git-clone",
"description": "Simple MCP Server for ComfyUI text to image Workflow - ComfyUI Node Integration , Based on lalanikarim/comfy-mcp-server work"
},
{
"author": "ashtar1984",
"title": "ComfyUI-SwitchPathLazy",
"reference": "https://github.com/ashtar1984/ComfyUI-SwitchPathLazy",
"files": [
"https://github.com/ashtar1984/ComfyUI-SwitchPathLazy"
],
"install_type": "git-clone",
"description": "Efficient lazy path switch for ComfyUI. Skips execution of the inactive branch entirely using native lazy evaluation. Includes live status display."
},
{
"author": "Deathspike",
"title": "ComfyUI-MyOriginalWaifu",
"reference": "https://github.com/Deathspike/ComfyUI-MyOriginalWaifu",
"files": [
"https://github.com/Deathspike/ComfyUI-MyOriginalWaifu"
],
"install_type": "git-clone",
"description": "My Original Waifu is a tag-based prompt-transformation engine for ComfyUI designed for creators who want their original characters to feel consistent, expressive, and faithfully rendered across every scene. Instead of manually adjusting tags each time you generate an image, you define the essence of your waifu, her look, her outfits, the way she appears in different contexts, and the engine transforms your prompt to match those intentions. It stays out of the way and simply follows your rules with clarity and consistency. Your Waifu. Your Rules. Your Perfect Prompt."
},
{
"author": "LeonQ8",
"title": "ComfyUI-Dynamic-Lora-Scheduler",
"reference": "https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler",
"files": [
"https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler"
],
"install_type": "git-clone",
"description": "Dynamically balance weights of multiple LoRAs over generation steps for ComfyUI."
},
{
"author": "sebagallo",
"title": "comfyui-sg-llama-cpp",
"reference": "https://github.com/sebagallo/comfyui-sg-llama-cpp",
"files": [
"https://github.com/sebagallo/comfyui-sg-llama-cpp"
],
"install_type": "git-clone",
"description": "llama-cpp-python wrapper, with support for vision models. It allows the user to generate text responses from prompts using llama.cpp."
},
{
"author": "Limbicnation",
"title": "ComfyUI-PromptGenerator",
"id": "comfyui-prompt-generator",
"reference": "https://github.com/Limbicnation/ComfyUI-PromptGenerator",
"files": [
"https://github.com/Limbicnation/ComfyUI-PromptGenerator"
],
"install_type": "git-clone",
"description": "Generate Stable Diffusion prompts using Qwen3-8B via Ollama with 7 style presets (cinematic, anime, photorealistic, fantasy, abstract, cyberpunk, sci-fi)"
},
{
"author": "TuonoMindCode",
"title": "ComfyUI-Resolution-Suggest-Downscale",
@ -458,14 +539,134 @@
"description": "A ComfyUI model loader that uses the fastsafetensors library to perform very fast, zero-copy loading from storage to VRAM."
},
{
"author": "KANAsho34636",
"title": "ComfyUI-NaturalSort-ImageLoader",
"reference": "https://github.com/KANAsho34636/ComfyUI-NaturalSort-ImageLoader",
"author": "maxczc",
"title": "comfyui-sora-node",
"reference": "https://github.com/maxczc/comfyui-sora-node",
"files": [
"https://github.com/KANAsho34636/ComfyUI-NaturalSort-ImageLoader"
"https://github.com/maxczc/comfyui-sora-node"
],
"install_type": "git-clone",
"description": "Custom image loader node supporting natural number sorting with multiple sort modes (natural, lexicographic, modification time, creation time, reverse natural). (Description by CC)"
"description": "Comprehensive set of ComfyUI custom nodes for interacting with a Sora-compatible REST API, supporting text-to-video, image-to-video, and video-to-video generation."
},
{
"author": "bombdefuser-124",
"title": "Newbie-Teacache-ComfyUI",
"reference": "https://github.com/bombdefuser-124/Newbie-Teacache-ComfyUI",
"files": [
"https://github.com/bombdefuser-124/Newbie-Teacache-ComfyUI"
],
"install_type": "git-clone",
"description": "TeaCache optimization nodes for ComfyUI's NewBie implementation, featuring patched loader and coefficient calculator for faster inference with configurable quality. (Description by CC)"
},
{
"author": "SiegeKeebsOffical",
"title": "comfyui-lmstudio",
"reference": "https://github.com/SiegeKeebsOffical/comfyui-lmstudio",
"files": [
"https://github.com/SiegeKeebsOffical/comfyui-lmstudio"
],
"install_type": "git-clone",
"description": "Custom ComfyUI nodes designed to interface with a separate LM Studio instance for language model operations."
},
{
"author": "XYMikky12138",
"title": "ComfyUI-MIKKY-Mask-Editor",
"reference": "https://github.com/XYMikky12138/ComfyUI-MIKKY-Mask-Editor",
"files": [
"https://github.com/XYMikky12138/ComfyUI-MIKKY-Mask-Editor"
],
"install_type": "git-clone",
"description": "A powerful frame-by-frame video mask editor for ComfyUI with painting, auto BBox, hole filling, blur/feathering, and video slicing features."
},
{
"author": "thnikk",
"title": "comfyui-thnikk-utils",
"reference": "https://github.com/thnikk/comfyui-thnikk-utils",
"files": [
"https://github.com/thnikk/comfyui-thnikk-utils"
],
"install_type": "git-clone",
"description": "Nodes to clean up your workflow."
},
{
"author": "bedovyy",
"title": "ComfyUI-LLM-Helper",
"reference": "https://github.com/bedovyy/ComfyUI-LLM-Helper",
"files": [
"https://github.com/bedovyy/ComfyUI-LLM-Helper"
],
"install_type": "git-clone",
"description": "A collection of helper nodes for working with LLM APIs in ComfyUI, intended to complement other LLM custom nodes."
},
{
"author": "febogallo",
"title": "ComfyUI-Freepik",
"reference": "https://github.com/febogallo/ComfyUI-Freepik",
"files": [
"https://github.com/febogallo/ComfyUI-Freepik"
],
"install_type": "git-clone",
"description": "Integrates Freepik's AI capabilities into ComfyUI workflows with features for photorealistic generation, upscaling, and background removal, plus smart caching and cost management. (Description by CC)"
},
{
"author": "karas17",
"title": "comfyui_GLM_TTS",
"reference": "https://github.com/karas17/comfyui_GLM_TTS",
"files": [
"https://github.com/karas17/comfyui_GLM_TTS"
],
"install_type": "git-clone",
"description": "ComfyUI nodes for GLM-TTS, a high-quality text-to-speech system supporting zero-shot voice cloning."
},
{
"author": "pantaleone-ai",
"title": "Comfy-Firefly",
"reference": "https://github.com/pantaleone-ai/Comfy-Firefly",
"files": [
"https://github.com/pantaleone-ai/Comfy-Firefly"
],
"install_type": "git-clone",
"description": "Custom ComfyUI node for generating images using Adobe Firefly Services API v3 with automatic authentication and standard tensor output."
},
{
"author": "NOLABEL-VFX",
"title": "ComfyUI-NL_Nodes",
"reference": "https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes",
"files": [
"https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes"
],
"install_type": "git-clone",
"description": "Custom ComfyUI nodes by NOLABEL for studio workflows, featuring Shot Path Builder that generates standardized, sanitized file and folder names with versioning for renders."
},
{
"author": "ARM64-EC",
"title": "ComfyUI-LongCatPlugin",
"reference": "https://github.com/ARM64-EC/ComfyUI-LongCatPlugin",
"files": [
"https://github.com/ARM64-EC/ComfyUI-LongCatPlugin"
],
"install_type": "git-clone",
"description": "ComfyUI nodes wrapping LongCat image generation and editing pipelines with text-to-image and multi-image edit flows using diffusers framework. (Description by CC)"
},
{
"author": "fabbarix",
"title": "comfyui-promptstore",
"reference": "https://github.com/fabbarix/comfyui-promptstore",
"files": [
"https://github.com/fabbarix/comfyui-promptstore"
],
"install_type": "git-clone",
"description": "Custom node system for ComfyUI enabling efficient prompt management with YAML-based datastore, categories, selection interface, and dynamic text interpolation for creating complex prompts."
},
{
"author": "hubo502",
"title": "ComfyUI-Env-Loader",
"reference": "https://github.com/hubo502/ComfyUI-Env-Loader",
"files": [
"https://github.com/hubo502/ComfyUI-Env-Loader"
],
"install_type": "git-clone",
"description": "ComfyUI custom node set that reads .env files at startup and provides dropdown selection or dynamic multi-port output for environment variable access in workflows. (Description by CC)"
},
{
"author": "BobRandomNumber",
@ -496,343 +697,6 @@
],
"install_type": "git-clone",
"description": "Minimal and easy-to-use Google Translate text node for ComfyUI using the googletrans library with automatic language detection and full language support. (Description by CC)"
},
{
"author": "Seb-Lis",
"title": "ComfyUI_Gemini_3_Pro_API_node",
"reference": "https://github.com/Seb-Lis/ComfyUI_Gemini_3_Pro_API_node",
"files": [
"https://github.com/Seb-Lis/ComfyUI_Gemini_3_Pro_API_node"
],
"install_type": "git-clone",
"description": "Custom node for ComfyUI that generates images using Google's Gemini API directly within ComfyUI, supporting resolutions up to 4K."
},
{
"author": "penposs",
"title": "Comfyui-banana2",
"reference": "https://github.com/penposs/Comfyui-banana2",
"files": [
"https://github.com/penposs/Comfyui-banana2"
],
"install_type": "git-clone",
"description": "Custom node for ComfyUI using Google's Gemini 2.5 Flash Image and Gemini 3 Pro Image Preview APIs to generate images with resolution scaling for 1K, 2K, 4K, 8K. (Description by CC)"
},
{
"author": "Daohoi123",
"title": "ComfyUI-Gemini3",
"reference": "https://github.com/Daohoi123/ComfyUI-Gemini3",
"files": [
"https://github.com/Daohoi123/ComfyUI-Gemini3"
],
"install_type": "git-clone",
"description": "Custom ComfyUI node integrating Google's Gemini 3 Pro model for native image generation and processing, featuring multi-API key load balancing and auto-retry mechanisms. (Description by CC)"
},
{
"author": "FeiMao-326",
"title": "Comfyui-General-API-Node",
"reference": "https://github.com/FeiMao-326/Comfyui-General-API-Node",
"files": [
"https://github.com/FeiMao-326/Comfyui-General-API-Node"
],
"install_type": "git-clone",
"description": "A suite of powerful and versatile utility nodes for ComfyUI, designed to streamline complex workflows involving Large Language Models and text manipulation."
},
{
"author": "mamorett",
"title": "ComfyUI-Flux2proReplicate",
"reference": "https://github.com/mamorett/ComfyUI-Flux2proReplicate",
"files": [
"https://github.com/mamorett/ComfyUI-Flux2proReplicate"
],
"install_type": "git-clone",
"description": "Set of custom nodes for ComfyUI that generates images using the Flux 2 Pro model via Replicate API with flexible aspect ratios and secure API key management. (Description by CC)"
},
{
"author": "AJbeckliy",
"title": "SynVow-Comfyui-Nanoapi",
"reference": "https://github.com/AJbeckliy/SynVow-Comfyui-Nanoapi",
"files": [
"https://github.com/AJbeckliy/SynVow-Comfyui-Nanoapi"
],
"install_type": "git-clone",
"description": "ComfyUI custom nodes for AI image generation using SynVow API supporting T2I (Text-to-Image) and I2I (Image-to-Image) with multiple API sources and batch generation. (Description by CC)"
},
{
"author": "DemonNCoding",
"title": "PromptGenerator 12-Columns",
"id": "promptgenerator12columns",
"reference": "https://github.com/DemonNCoding/PromptGenerator12Columns",
"files": [
"https://github.com/DemonNCoding/PromptGenerator12Columns"
],
"install_type": "git-clone",
"description": "A fast and flexible random prompt generator with 12 columns (Empty / Pre-filled SFW / Pre-filled NSFW). Pre filled with text so that you can get started right away. Supports comma or newline output and always adds quality tags."
},
{
"author": "Kebolder",
"title": "ComfyUI-Jax-Nodes",
"reference": "https://github.com/Kebolder/ComfyUI-Jax-Nodes",
"files": [
"https://github.com/Kebolder/ComfyUI-Jax-Nodes"
],
"install_type": "git-clone",
"description": "Some custom nodes for weird niche needs when working with Krita"
},
{
"author": "smthemex",
"title": "ComfyUI_UltraFlux",
"reference": "https://github.com/smthemex/ComfyUI_UltraFlux",
"files": [
"https://github.com/smthemex/ComfyUI_UltraFlux"
],
"install_type": "git-clone",
"description": "UltraFlux:Data-Model Co-Design for High-quality Native 4K Text-to-Image Generation across Diverse Aspect Ratios,try it in comfyUI"
},
{
"author": "BigStationW",
"title": "ComfyUi-ConditioningNoiseInjection",
"reference": "https://github.com/BigStationW/ComfyUi-ConditioningNoiseInjection",
"files": [
"https://github.com/BigStationW/ComfyUi-ConditioningNoiseInjection"
],
"install_type": "git-clone",
"description": "A custom node for ComfyUI that injects controlled noise into conditioning embeddings (like prompts) for a portion of the diffusion process."
},
{
"author": "BigStationW",
"title": "ComfyUi-ConditioningTimestepSwitch",
"reference": "https://github.com/BigStationW/ComfyUi-ConditioningTimestepSwitch",
"files": [
"https://github.com/BigStationW/ComfyUi-ConditioningTimestepSwitch"
],
"install_type": "git-clone",
"description": "A custom node for ComfyUI that allows temporal switching between prompts."
},
{
"author": "Ysthara",
"title": "ComfyUI-Resolution-AR-Node",
"reference": "https://github.com/Ysthara/ComfyUI-Resolution-AR-Node",
"files": [
"https://github.com/Ysthara/ComfyUI-Resolution-AR-Node"
],
"install_type": "git-clone",
"description": "A simple ComfyUI utility node that calculates image width and height from a target longest-side value and an aspect ratio."
},
{
"author": "TuonoMindCode",
"title": "ComfyUI-MultiClip-Text-Script",
"reference": "https://github.com/TuonoMindCode/ComfyUI-MultiClip-Text-Script",
"files": [
"https://github.com/TuonoMindCode/ComfyUI-MultiClip-Text-Script"
],
"install_type": "git-clone",
"description": "Two simple nodes that help you author sequence-friendly prompts from a single script that contains multiple clips. (Description by CC)"
},
{
"author": "sooxt98",
"title": "comfyui_longcat_image",
"reference": "https://github.com/sooxt98/comfyui_longcat_image",
"files": [
"https://github.com/sooxt98/comfyui_longcat_image"
],
"install_type": "git-clone",
"description": "ComfyUI integration of the LongCat-Image pipeline for text-to-image generation and image editing with excellent Chinese text rendering capabilities. (Description by CC)"
},
{
"author": "t22m003",
"title": "ComfyUI_LoopNode",
"reference": "https://github.com/t22m003/ComfyUI_LoopNode",
"files": [
"https://github.com/t22m003/ComfyUI_LoopNode"
],
"install_type": "git-clone",
"description": "Custom node that provides loop (for-loop) functionality in ComfyUI."
},
{
"author": "thatname",
"title": "Comfyui_CharaConsist",
"reference": "https://github.com/thatname/Comfyui_CharaConsist",
"files": [
"https://github.com/thatname/Comfyui_CharaConsist"
],
"install_type": "git-clone",
"description": "Training-free CharaConsist algorithm implementation for ComfyUI - Generate consistent subjects across multiple generations with enhanced mask generation and multi-model support."
},
{
"author": "thrakotool",
"title": "ComfyUI-KiraLoraEQ",
"reference": "https://github.com/thrakotool/ComfyUI-KiraLoraEQ",
"files": [
"https://github.com/thrakotool/ComfyUI-KiraLoraEQ"
],
"install_type": "git-clone",
"description": "20-band LoRA equalizer for ComfyUI that surgically adjusts LoRA influence across frequency-like bands, cross-attention, and MLP layers. (Description by CC)"
},
{
"author": "ckinpdx",
"title": "ComfyUI-WanKeyframeBuilder",
"reference": "https://github.com/ckinpdx/ComfyUI-WanKeyframeBuilder",
"files": [
"https://github.com/ckinpdx/ComfyUI-WanKeyframeBuilder"
],
"install_type": "git-clone",
"description": "Custom node for building keyframe timelines in Wan video generation with adjustable influence strength, supporting 1-8 keyframes. (Description by CC)"
},
{
"author": "jessesep",
"title": "SimpleVariables",
"reference": "https://github.com/jessesep/SimpleVariables",
"files": [
"https://github.com/jessesep/SimpleVariables"
],
"install_type": "git-clone",
"description": "Lightweight ComfyUI node pack for storing and retrieving any data by name across workflows. (Description by CC)"
},
{
"author": "siray-ai",
"title": "siray-comfyui",
"reference": "https://github.com/siray-ai/siray-comfyui",
"files": [
"https://github.com/siray-ai/siray-comfyui"
],
"install_type": "git-clone",
"description": "Custom ComfyUI nodes for Siray image/video models with dynamic schema-based inputs, authentication, and video streaming. (Description by CC)"
},
{
"author": "mayunejie",
"title": "ComfyUI-Allen-Yinpin",
"reference": "https://github.com/mayunejie/ComfyUI-Allen-Yinpin",
"files": [
"https://github.com/mayunejie/ComfyUI-Allen-Yinpin"
],
"install_type": "git-clone",
"description": "Enhanced audio loading node for ComfyUI supporting .wav, .mp3, .flac, .ogg, .m4a formats with filename text output. (Description by CC)"
},
{
"author": "reeoi",
"title": "ComfyUI-WebROI",
"reference": "https://github.com/reeoi/ComfyUI-WebROI",
"files": [
"https://github.com/reeoi/ComfyUI-WebROI"
],
"install_type": "git-clone",
"description": "Browser-based screen capture node enabling real-time region of interest selection and cropping for ComfyUI deployments. (Description by CC)"
},
{
"author": "ritik-devsecops",
"title": "ComfyUI-Floyo-Flux2-API-node",
"reference": "https://github.com/ritik-devsecops/ComfyUI-Floyo-Flux2-API-node",
"files": [
"https://github.com/ritik-devsecops/ComfyUI-Floyo-Flux2-API-node"
],
"install_type": "git-clone",
"description": "ComfyUI node integrating Black Forest Labs FLUX.2 [pro] API via Floyo for text-to-image and image editing. (Description by CC)"
},
{
"author": "x0x0b",
"title": "ComfyUI-spritefusion-pixel-snapper",
"reference": "https://github.com/x0x0b/ComfyUI-spritefusion-pixel-snapper",
"files": [
"https://github.com/x0x0b/ComfyUI-spritefusion-pixel-snapper"
],
"install_type": "git-clone",
"description": "ComfyUI custom node port of Sprite Fusion Pixel Snapper that snaps pixel art to a clean grid and quantized palette."
},
{
"author": "jomakaze",
"title": "ComfyUI_JomaNodes",
"reference": "https://github.com/jomakaze/ComfyUI_JomaNodes",
"files": [
"https://github.com/jomakaze/ComfyUI_JomaNodes"
],
"install_type": "git-clone",
"description": "A collection of quality-of-life and convenience nodes."
},
{
"author": "Firetheft",
"title": "ComfyUI_Simple_Web_Browser",
"reference": "https://github.com/Firetheft/ComfyUI_Simple_Web_Browser",
"files": [
"https://github.com/Firetheft/ComfyUI_Simple_Web_Browser"
],
"install_type": "git-clone",
"description": "This is a custom node for ComfyUI that embeds a simple web browser directly into the interface. It allows you to browse websites, find inspiration, and load images directly, which can help streamline your workflow."
},
{
"author": "wouterverweirder",
"title": "comfyui_live_input_stream",
"reference": "https://github.com/wouterverweirder/comfyui_live_input_stream",
"files": [
"https://github.com/wouterverweirder/comfyui_live_input_stream"
],
"install_type": "git-clone",
"description": "Webcam & Screen Share Input Nodes with Cropping and Live Preview of the Cropped Stream"
},
{
"author": "HackAfterDark",
"title": "AfterDark Film AR Selector",
"id": "ComfyUI-HackAfterDark-Nodes",
"reference": "https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes",
"files": [
"https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes"
],
"install_type": "git-clone",
"description": "A collection of utility nodes for ComfyUI, including resolution presets for film and photography aspect ratios.",
"tags": ["utility", "presets", "aspect ratio", "film"]
},
{
"author": "Dashuai",
"title": "ComfyUI DashuaiTools",
"id": "comfyui-dashuai-tools",
"reference": "https://github.com/Hasasasa/ComfyUI_DashuaiTools",
"files": [
"https://github.com/Hasasasa/ComfyUI_DashuaiTools"
],
"install_type": "git-clone",
"description": "A practical and lightweight collection of custom nodes for ComfyUI, providing utility tools and convenient workflow functions."
},
{
"author": "jeankassio",
"title": "ComfyUI_MusicTools",
"id": "ComfyUI_MusicTools",
"reference": "https://github.com/jeankassio/ComfyUI_MusicTools",
"files": [
"https://github.com/jeankassio/ComfyUI_MusicTools"
],
"install_type": "git-clone",
"description": "Professional audio processing and mastering suite for ComfyUI."
},
{
"author": "ShootTheSound",
"title": "Realtime LoRA Trainer",
"id": "comfyui-realtime-lora",
"reference": "https://github.com/ShootTheSound/comfyUI-Realtime-Lora",
"files": [
"https://github.com/ShootTheSound/comfyUI-Realtime-Lora"
],
"install_type": "git-clone",
"description": "Train LoRAs directly inside ComfyUI. Supports SDXL (via sd-scripts), FLUX, Z-Image Turbo, and Wan 2.2 (via AI-Toolkit)."
},
{
"author": "Transhumai",
"title": "ComfyUI-LegionPower",
"reference": "https://github.com/Transhumai/ComfyUI-LegionPower",
"files": [
"https://github.com/Transhumai/ComfyUI-LegionPower"
],
"install_type": "git-clone",
"description": "Nodes to run ComfyUI workflows in isolated workers for optimal GPU and memory use."
},
{
"author": "Bomborant",
"title": "ShakaNodes",
"id": "shakanodes",
"reference": "https://github.com/bomborant/ComfyUI-ShakaNodes",
"files": [
"https://github.com/bomborant/ComfyUI-ShakaNodes"
],
"install_type": "git-clone",
"description": "ShakaNodes: Utility tools for ComfyUI"
}
]
}

View File

@ -395,6 +395,7 @@
"1hew_AudioDuration",
"1hew_DetectGuideLine",
"1hew_DetectYolo",
"1hew_GetFileCount",
"1hew_ImageAddLabel",
"1hew_ImageBBoxOverlayByMask",
"1hew_ImageBatchExtract",
@ -421,6 +422,7 @@
"1hew_ImagePingPong",
"1hew_ImagePlot",
"1hew_ImageResizeFluxKontext",
"1hew_ImageResizeJimeng",
"1hew_ImageResizeQwenImage",
"1hew_ImageResizeUniversal",
"1hew_ImageRotateWithMask",
@ -437,6 +439,8 @@
"1hew_ListCustomInt",
"1hew_ListCustomSeed",
"1hew_ListCustomString",
"1hew_LoadImageFromFolder",
"1hew_LoadVideoFromFolder",
"1hew_MaskBatchMathOps",
"1hew_MaskBatchRange",
"1hew_MaskBatchSplit",
@ -446,6 +450,7 @@
"1hew_MaskListToBatch",
"1hew_MaskMathOps",
"1hew_MaskPasteByBBoxMask",
"1hew_MaskRepeat",
"1hew_MultiImageBatch",
"1hew_MultiImageStitch",
"1hew_MultiMaskBatch",
@ -1888,6 +1893,21 @@
"title_aux": "NormalMapLightEstimator"
}
],
"https://github.com/ARM64-EC/ComfyUI-LongCatPlugin": [
[
"LoadLongCatModel",
"LongCatCLIPLoader",
"LongCatImageResizer",
"LongCatSampler",
"LongCatSizePicker",
"LongCatVAELoader",
"TextEncodeLongCatImage",
"TextEncodeLongCatImageEdit"
],
{
"title_aux": "ComfyUI-LongCatPlugin"
}
],
"https://github.com/ARZUMATA/ComfyUI-ARZUMATA": [
[
"CachingCLIPTextEncode",
@ -5595,6 +5615,15 @@
"title_aux": "Pipeline Parallel ComfyUI"
}
],
"https://github.com/Deathspike/ComfyUI-MyOriginalWaifu": [
[
"MyOriginalWaifu",
"MyOriginalWaifuCLIP"
],
{
"title_aux": "ComfyUI-MyOriginalWaifu"
}
],
"https://github.com/DebugPadawan/DebugPadawans-ComfyUI-Essentials": [
[
"DebugPadawan_ConditionalString",
@ -11468,6 +11497,29 @@
"title_aux": "ComfyUI-VariationLab"
}
],
"https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler": [
[
"AdaptiveLoraScheduler",
"LoadWanVideoClipTextEncoder",
"LoadWanVideoT5TextEncoder",
"WanVideoBlockSwap",
"WanVideoExtraModelSelect",
"WanVideoLoraBlockEdit",
"WanVideoLoraSelect",
"WanVideoLoraSelectByName",
"WanVideoLoraSelectMulti",
"WanVideoModelLoader",
"WanVideoSetLoRAs",
"WanVideoTinyVAELoader",
"WanVideoTorchCompileSettings",
"WanVideoVACEModelSelect",
"WanVideoVAELoader",
"WanVideoVRAMManagement"
],
{
"title_aux": "ComfyUI-Dynamic-Lora-Scheduler"
}
],
"https://github.com/Lerc/canvas_tab": [
[
"Canvas_Tab",
@ -11834,6 +11886,14 @@
"title_aux": "ComfyUI-LTXVideo"
}
],
"https://github.com/Limbicnation/ComfyUI-PromptGenerator": [
[
"PromptGenerator"
],
{
"title_aux": "ComfyUI-PromptGenerator"
}
],
"https://github.com/Limbicnation/ComfyUI-RandomSeedGenerator": [
[
"AdvancedSeedGenerator"
@ -12569,6 +12629,7 @@
"Wan22FirstLastImageToVideoMXD",
"Wan22ImageToVideoMXD",
"Wan2_2EmptyLatentImageMXD",
"ZImageTurboEmptyLatentImage",
"wan22EmptyHunyuanLatentVideoMXD"
],
{
@ -12702,7 +12763,13 @@
],
"https://github.com/Merserk/ComfyUI-Flow-Assistor": [
[
"AddDelay",
"AnyPassthrough1to6",
"AnyPassthrough6to1",
"BypassControl",
"CLIPTextEncodePromptEnrichment",
"CameraAngleControl",
"DisplayText",
"ImageResolutionFitNode",
"MultiplicationNode",
"PromptQueue",
@ -13429,6 +13496,14 @@
"title_aux": "Image Captioning and Tagging Assistor Nodes"
}
],
"https://github.com/NOLABEL-VFX/ComfyUI-NL_Nodes": [
[
"ShotPathBuilder"
],
{
"title_aux": "ComfyUI-NL_Nodes"
}
],
"https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix": [
[
"RTXRemixCloseProject",
@ -15520,6 +15595,7 @@
"SK_CheckpointLoader",
"SK_CheckpointLoaderSimple",
"SK_LoraLoader",
"SK_PowerLoraLoader",
"SK_UNETLoader",
"SK_VAELoader",
"SK_unCLIPCheckpointLoader"
@ -16757,6 +16833,21 @@
"title_aux": "Lazy Pony Prompter"
}
],
"https://github.com/SiegeKeebsOffical/comfyui-lmstudio": [
[
"LMStudioConnectivityV2",
"LMStudioGenerate",
"LMStudioGenerateAdvance",
"LMStudioGenerateV2",
"LMStudioOptionsV2",
"LMStudioSequentialPrompt",
"LMStudioSequentialPromptAdvanced",
"LMStudioVision"
],
{
"title_aux": "comfyui-lmstudio"
}
],
"https://github.com/Siempreflaco/ComfyUI-NCNodes": [
[
"Load3DMesh",
@ -19951,6 +20042,14 @@
"title_aux": "ComfyUI XWAVE Nodes"
}
],
"https://github.com/XYMikky12138/ComfyUI-MIKKY-Mask-Editor": [
[
"MIKKYMaskEditorNode"
],
{
"title_aux": "ComfyUI-MIKKY-Mask-Editor"
}
],
"https://github.com/XchanBik/ComfyUI_SimpleBridgeNode": [
[
"LoraTextLoader",
@ -23080,6 +23179,15 @@
"title_aux": "Hunyuan-Multi-Lora-Loader"
}
],
"https://github.com/ashtar1984/ComfyUI-SwitchPathLazy": [
[
"SwitchPathLazy",
"SwitchPathRev"
],
{
"title_aux": "ComfyUI-SwitchPathLazy"
}
],
"https://github.com/ashtar1984/comfyui-find-perfect-resolution": [
[
"FindPerfectResolution"
@ -23672,6 +23780,15 @@
"title_aux": "ColorMatrixGPU Node for ComfyUI"
}
],
"https://github.com/bedovyy/ComfyUI-LLM-Helper": [
[
"LLMHelper_GetModels",
"LLMHelper_PostModelsUnload"
],
{
"title_aux": "ComfyUI-LLM-Helper"
}
],
"https://github.com/bedovyy/ComfyUI_NAIDGenerator": [
[
"AnlasTrackerNAID",
@ -24537,6 +24654,15 @@
"title_aux": "ComfyUI-OpenSoraPlan"
}
],
"https://github.com/bombdefuser-124/Newbie-Teacache-ComfyUI": [
[
"TeaCacheCoefficientCalculator",
"TeaCache_Newbie"
],
{
"title_aux": "Newbie-Teacache-ComfyUI"
}
],
"https://github.com/bombless/comfyUI-RememberingUtils": [
[
"RememberLastSeed",
@ -25142,7 +25268,6 @@
"IO_getFilePath",
"IO_image_select",
"IO_input_any",
"IO_inputbasic",
"IO_load_anyimage",
"IO_node_Script",
"IO_save_image",
@ -25192,6 +25317,8 @@
"Mask_transform_sum",
"Model_Preset_Unpack",
"Model_Preset_pack",
"Scheduler_CondNoise",
"Scheduler_MixScheduler",
"Stack_CN_union",
"Stack_CN_union3",
"Stack_ControlNet",
@ -25238,6 +25365,7 @@
"basicIn_Seed",
"basicIn_color",
"basicIn_float",
"basicIn_input",
"basicIn_int",
"basicIn_string",
"basic_KSampler_variant_seed",
@ -25308,8 +25436,9 @@
"excel_search_data",
"excel_write_data",
"excel_write_data_easy",
"flow_GetNodeInfo",
"flow_QueueTrigger",
"flow_Translate_Node_DD",
"flow_Translate_Node_office",
"flow_ValueReceiver",
"flow_ValueSender",
"flow_auto_pixel",
@ -25369,7 +25498,6 @@
"pre_sample_data",
"sampler_DynamicTileMerge",
"sampler_DynamicTileSplit",
"sampler_SeedVariance",
"sampler_enhance",
"sch_Prompt",
"sch_Value",
@ -25377,6 +25505,9 @@
"sch_mask",
"sch_split_text",
"sch_text",
"scheduler_ModelAligned",
"scheduler_manual_sigmas",
"scheduler_sigmas2Graph",
"stack_Mask2color",
"sum_Ksampler",
"sum_create_chx",
@ -25391,6 +25522,7 @@
"sum_stack_Wan",
"sum_stack_image",
"text_Splitter",
"text_StrMatrix",
"text_batch_combine",
"text_filter",
"text_loadText",
@ -27803,6 +27935,7 @@
"SamplerLCMUpscale",
"SamplerLMS",
"SamplerSASolver",
"SamplerSEEDS2",
"SamplingPercentToSigma",
"SaveAnimatedPNG",
"SaveAnimatedWEBP",
@ -29702,6 +29835,8 @@
"VaceStrengthTester",
"WVAOptionsNode",
"WVAPipeSimple",
"WanMaskToLatentSpace",
"WanNoiseMaskToLatentSpace",
"WanVacePhantomDual",
"WanVacePhantomDualV2",
"WanVacePhantomExperimental",
@ -29733,6 +29868,14 @@
"title_aux": "primitive-types"
}
],
"https://github.com/dseditor/Comfy-MCP": [
[
"MCPConfigGenerator"
],
{
"title_aux": "Comfy-MCP"
}
],
"https://github.com/dseditor/ComfyUI-ListHelper": [
[
"AudioListCombine",
@ -30500,6 +30643,15 @@
"title_aux": "ComfyUI-EZ-AF-Nodes"
}
],
"https://github.com/fabbarix/comfyui-promptstore": [
[
"Prompt Selector",
"Prompt Template"
],
{
"title_aux": "comfyui-promptstore"
}
],
"https://github.com/facefusion/facefusion-comfyui": [
[
"SwapFaceImage",
@ -30776,6 +30928,17 @@
"title_aux": "Fearnworks Nodes"
}
],
"https://github.com/febogallo/ComfyUI-Freepik": [
[
"FreepikMystic",
"FreepikRemoveBackground",
"FreepikUpscalerCreative",
"FreepikUpscalerPrecision"
],
{
"title_aux": "ComfyUI-Freepik"
}
],
"https://github.com/feffy380/comfyui-chroma-cache": [
[
"ChromaCache"
@ -31680,6 +31843,16 @@
"title_aux": "ComfyUI Load From URL"
}
],
"https://github.com/g7b2/ComfyUI-Artist-Tester": [
[
"ArtistListIterator",
"ArtistPromptComposer",
"SaveImageWithArtistTag"
],
{
"title_aux": "ComfyUI-Artist-Tester"
}
],
"https://github.com/gabe-init/ComfyUI-11labs": [
[
"ElevenLabsNode"
@ -32550,8 +32723,10 @@
],
"https://github.com/grmchn/ComfyUI-ProportionChanger": [
[
"PoseDataToPoseKeypoint",
"PoseJSONToPoseKeypoint",
"PoseKeypointPreview",
"PoseKeypointResize",
"ProportionChangerDWPoseDetector",
"ProportionChangerDWPoseRender",
"ProportionChangerInterpolator",
@ -32683,9 +32858,14 @@
],
"https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes": [
[
"FilmARSizeSelector"
"FilmARSizeSelector",
"GeminiImagePromptBuilder"
],
{
"author": "HackAfterDark",
"description": "A node to generate image prompts or images using the Google Gemini API, with support for multiple images and presets.",
"nickname": "Gemini Prompter",
"title": "Gemini Image Prompt Builder",
"title_aux": "AfterDark Film AR Selector"
}
],
@ -33237,6 +33417,7 @@
"WWAA_ImageSwitcher",
"WWAA_ImageToTextFile",
"WWAA_IndexGridLayoutNode",
"WWAA_JPEGPreview",
"WWAA_JSONPromptBuilder",
"WWAA_LineCount",
"WWAA_MetadataSaver",
@ -33348,7 +33529,8 @@
"KeypointConverter",
"KeypointPrinter",
"LoadPoseKeypoints",
"PoseInterpolation"
"PoseInterpolation",
"PoseResize"
],
{
"title_aux": "ComfyUI_DWposeDeluxe"
@ -33435,6 +33617,15 @@
"title_aux": "Multiple LoRA Loader for ComfyUI"
}
],
"https://github.com/hubo502/ComfyUI-Env-Loader": [
[
"EnvKeySelector",
"EnvKeys"
],
{
"title_aux": "ComfyUI-Env-Loader"
}
],
"https://github.com/huchenlei/ComfyUI-IC-Light-Native": [
[
"ICLightApply",
@ -33630,6 +33821,7 @@
"SetValuesFromPanel",
"image_to_sha256",
"move_file",
"rename_file",
"sort_list_string",
"steg_alpha_embed",
"steg_alpha_extract",
@ -33739,7 +33931,8 @@
"ROCMQuantizedModelOptimizer",
"ROCMSamplerPerformanceMonitor",
"ROCMVAEPerformanceMonitor",
"ROCmDiffusionLoader"
"ROCmDiffusionLoader",
"ROCmGGUFLoader"
],
{
"title_aux": "RocM Ninodes"
@ -36148,6 +36341,16 @@
"title_aux": "ComfyUI Camera Watermark"
}
],
"https://github.com/karas17/comfyui_GLM_TTS": [
[
"GLMTTSASR",
"GLMTTSLoader",
"GLMTTSSampler"
],
{
"title_aux": "comfyui_GLM_TTS"
}
],
"https://github.com/karthikg-09/ComfyUI-Vton-Mask": [
[
"ComfyUIVtonMaskGenerator",
@ -36698,6 +36901,7 @@
"GetLatentSizeAndCount",
"GetLatentsFromBatchIndexed",
"GetMaskSizeAndCount",
"GetTrackRange",
"GradientToFloat",
"GrowMaskWithBlur",
"HunyuanVideoBlockLoraSelect",
@ -36785,6 +36989,7 @@
"SetShakkerLabsUnionControlNetType",
"ShuffleImageBatch",
"SigmasToFloat",
"SimpleCalculatorKJ",
"SkipLayerGuidanceWanVideo",
"Sleep",
"SomethingToString",
@ -37132,10 +37337,12 @@
"WanVideoRoPEFunction",
"WanVideoSLG",
"WanVideoSampler",
"WanVideoSamplerExtraArgs",
"WanVideoSamplerFromSettings",
"WanVideoSamplerSettings",
"WanVideoSamplerv2",
"WanVideoScheduler",
"WanVideoSchedulerSA_ODE",
"WanVideoSchedulerv2",
"WanVideoSetBlockSwap",
"WanVideoSetLoRAs",
"WanVideoSetRadialAttention",
@ -40563,6 +40770,16 @@
"title_aux": "OllamaTools for ComfyUI"
}
],
"https://github.com/maxczc/comfyui-sora-node": [
[
"SoraImageToVideo",
"SoraTextToVideo",
"SoraVideoToVideo"
],
{
"title_aux": "comfyui-sora-node"
}
],
"https://github.com/maxmad62/ComfyUI-DiscordWebhookWithInput": [
[
"DiscordPostViaWebhook",
@ -43287,6 +43504,14 @@
"title_aux": "sd-perturbed-attention"
}
],
"https://github.com/pantaleone-ai/Comfy-Firefly": [
[
"AdobeFireflyTextToImage"
],
{
"title_aux": "Comfy-Firefly"
}
],
"https://github.com/pants007/comfy-pants": [
[
"CLIPTextEncodeAIO",
@ -46239,6 +46464,17 @@
"title_aux": "SRL's nodes"
}
],
"https://github.com/sebagallo/comfyui-sg-llama-cpp": [
[
"LlamaCPPEngine",
"LlamaCPPMemoryCleanup",
"LlamaCPPModelLoader",
"LlamaCPPOptions"
],
{
"title_aux": "comfyui-sg-llama-cpp"
}
],
"https://github.com/sebord/ComfyUI-LMCQ": [
[
"LmcqCodeDecryptionLoader",
@ -48472,7 +48708,8 @@
],
"https://github.com/synthetai/ComfyUI-JM-Gemini-API": [
[
"JMGeminiImageGenerator"
"JMGeminiImageGenerator",
"JMGeminiVideoGenerator"
],
{
"title_aux": "ComfyUI-JM-Gemini-API"
@ -48906,10 +49143,14 @@
[
"CLIPTokenCounter",
"DivergentGeminiNode",
"KoboldCppApiNode",
"GeminiBatchProcess",
"ImageInfo",
"LoraStrengthXYPlot",
"MusiQNode",
"SaveImageEnhancedNode"
"PreviewText",
"PromptCombiner",
"SaveImageEnhancedNode",
"StringToList"
],
{
"title_aux": "Divergent Nodes"
@ -49036,6 +49277,24 @@
"title_aux": "ComfyUI Multimedia Utilities"
}
],
"https://github.com/thnikk/comfyui-thnikk-utils": [
[
"CharacterPresetNode",
"DetailerNode",
"DetailerPipeNode",
"FullPipeIn",
"FullPipeLoader",
"FullPipeOut",
"ModelPresetNode",
"MultiStringConditioning",
"SeedWithOverride",
"StylePresetNode",
"WildcardNode"
],
{
"title_aux": "comfyui-thnikk-utils"
}
],
"https://github.com/thoddnn/ComfyUI-MLX": [
[
"MLXClipTextEncoder",
@ -49765,6 +50024,16 @@
"title_aux": "ComfyUI-Fans"
}
],
"https://github.com/ubisoft/ComfyUI-Chord": [
[
"ChordLoadModel",
"ChordMaterialEstimation",
"ChordNormalToHeight"
],
{
"title_aux": "ComfyUI-Chord"
}
],
"https://github.com/ucloud/comfyui-plugin": [
[
"ModelVerse Image Packer",
@ -50486,15 +50755,6 @@
"title_aux": "ComfyUI-SageAttention3"
}
],
"https://github.com/wallen0322/ComfyUI-TTM-WAN22": [
[
"WanTTMConditioning",
"WanTTMSamplerComplete"
],
{
"title_aux": "ComfyUI-TTM-WAN22"
}
],
"https://github.com/wallen0322/ComfyUI-Wan22FMLF": [
[
"WanAdvancedExtractLastFrames",
@ -51951,6 +52211,7 @@
"AdvancedImageSelector",
"DynamicThreshold",
"ImageBatchSelector",
"ImageBlendMaskFitCover",
"ImageBlendResize",
"ImageIC",
"ImageICAdvanced",
@ -52006,6 +52267,7 @@
],
"https://github.com/yichengup/ComfyUI-YCNodes_Toolkit": [
[
"YCLiveLoadImagesMulti",
"YCSwitch",
"YC_ShowText",
"ycBBoxBridge",