Compare commits

...

47 Commits

Author SHA1 Message Date
ZiYu
ed1485cd7d
Merge e7d4ea76d7 into de64af4a68 2025-12-07 21:00:30 +00:00
Dr.Lt.Data
de64af4a68 update DB
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
2025-12-07 21:32:58 +09:00
Dr.Lt.Data
4a852ac8a8 update DB 2025-12-07 21:30:06 +09:00
shootthesound
6784bfb98c
Add Realtime LoRA Trainer node to custom-node-list (#2352)
Added a new node for Realtime LoRA Trainer with details.
2025-12-07 21:29:07 +09:00
Dr.Lt.Data
c8f246d344 update DB 2025-12-07 21:28:09 +09:00
The Kraken
8b3d31a936
Add Kraken Discord Bot custom node (#2358) 2025-12-07 21:27:17 +09:00
Dr.Lt.Data
5e88d6445b update DB 2025-12-07 21:25:30 +09:00
ds
fd7dff88df
Add ComfyUI_DashuaiTools to custom-node-list.json (#2319)
This PR adds the ComfyUI_DashuaiTools custom node pack to the ComfyUI-Manager node list.
2025-12-07 21:24:06 +09:00
Dr.Lt.Data
8cfee1f483 update DB
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
2025-12-07 07:36:12 +09:00
Matthew-X
cf4d8e6125
Workflow Importer (#2356)
* Add Workflow Importer node to custom-node-list.json

* Update custom-node-list.json

* Add entry for SDXL_sizing by Ser-Hilary

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2025-12-07 07:35:14 +09:00
Dr.Lt.Data
c0e8a41d2a update DB 2025-12-07 07:32:45 +09:00
Antonio Covelo
a02c27b1af
Add ShakaNodes utility tools for ComfyUI (#2353)
Added new ShakaNodes project with author and description to ComfyUI-Maanager
2025-12-07 07:32:07 +09:00
Dr.Lt.Data
712e1bac0d update DB 2025-12-07 07:30:31 +09:00
ameyukisora
513ea46cbe
Add ComfyUI-Empty-Latent-Advanced (#2351) 2025-12-07 07:28:19 +09:00
Dr.Lt.Data
b1919b6f95 update DB 2025-12-07 07:28:06 +09:00
Jean Kássio
43561d209b
Add ComfyUI_MusicTools (#2350) 2025-12-07 07:25:47 +09:00
Dr.Lt.Data
16dcbc5412 update DB 2025-12-07 07:25:11 +09:00
HALXP
c8dd2d5cad
Added new file to existing HALXP-Comfy custom node (#2341)
* Added HALXP-Comfy to the custom node lists

* Update custom-node-list.json

* Added new file (HALXP Monitor) to current custom node

HALXP Monitor lets you run a custom script on workflow Success or Error

* Added one new file to the custom tools (runmonitor)

Lets you run custom scripts on workflow success or error

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2025-12-07 07:22:18 +09:00
Dr.Lt.Data
4b37777066 update DB 2025-12-07 07:15:35 +09:00
Antonio Sorrentini
95ecd85a12
Add ComfyUI-LegionPower node with description (#2326) 2025-12-07 07:11:33 +09:00
Dr.Lt.Data
5c475e3c15 update DB
Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
2025-12-05 19:03:46 +09:00
Dr.Lt.Data
f705ee6863 update DB
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
2025-12-05 13:00:22 +09:00
akawana
1f67c18989
Add RGBYP Mask Editor to custom-node-list.json (#2347)
* Add RGBYP Mask Editor to custom-node-list.json

Added RGBYP Mask Editor entry with details and tags.

* Fix description formatting in custom-node-list.json
2025-12-05 12:53:08 +09:00
rjgoif
de6d451c5b
Update custom-node-list.json (#2346)
Adding a small node collection "Img Label Tools" to help users add text labels easily to their images and grids, making for better sharing on Reddit and other communities. 
Small pack, no extra files, no restrictions.
2025-12-05 12:52:04 +09:00
Dr.Lt.Data
580296d6f3 update DB 2025-12-05 12:51:41 +09:00
vramfcker
a9e28fbce3
Add Random Prompt Builder node to custom-node-list (#2340)
Added new node for Random Prompt Builder with detailed description.
2025-12-05 12:50:40 +09:00
Dr.Lt.Data
311779cb20 update DB 2025-12-05 12:50:28 +09:00
llikethat
d2f8a89e87
Add faceExtractor node for ComfyUI (#2339)
Added faceExtractor node for ComfyUI which identifies based on input image reference
2025-12-05 12:49:28 +09:00
Dr.Lt.Data
84c95bf322 update DB 2025-12-05 12:48:44 +09:00
Fatih Eke
f75c801955
Add ComfyUI-Hunyuan3D-v3 - Tencent Hunyuan 3D Global API support (#2345)
Co-authored-by: exedesign <exedesign@github.com>
2025-12-05 12:46:37 +09:00
fredlef
faa2f54371
Add ComfyUI FSL Nodes — Gemini chat & image generation, utilities (#2316)
* Add ComfyUI FSL Nodes to custom-node-list.json

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
Co-authored-by: Fred LeFevre <fred@example.com>
2025-12-05 12:41:08 +09:00
Dr.Lt.Data
4249ac193a improved: display a more user-friendly message 2025-12-05 07:01:01 +09:00
Dr.Lt.Data
c709274a28 update DB
Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
2025-12-03 01:46:58 +09:00
Dr.Lt.Data
c8f05e79db update DB 2025-12-03 01:35:55 +09:00
ah-kun
4d2887e99f
Add ComfyUI-FailSafe-Translate-Node to custom-node-list (#2330) 2025-12-03 01:35:14 +09:00
Dr.Lt.Data
29256a5154 update DB 2025-12-03 01:33:18 +09:00
luxdelux7
82d42e4094
Add Forbidden Vision custom node pack (#2328)
* Add Forbidden Vision custom node pack

Custom face detection/segmentation models with enhancement nodes for ComfyUI.
Supports realistic, anime, and NSFW content.

* Update custom-node-list.json

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2025-12-03 01:32:34 +09:00
Dr.Lt.Data
53850fb627 update DB 2025-12-03 01:29:30 +09:00
Pondowner857
34b4c8ce46
Update custom-node-list.json (#2325) 2025-12-03 01:28:25 +09:00
Dr.Lt.Data
e944841054 update DB 2025-12-03 01:25:51 +09:00
llikethat
f6a5ff5552
added iSeeBetter Custom Node (#2324)
* added iSeeBetter Custom Node

iSeeBetter Custom Node for upscaling

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2025-12-03 01:24:38 +09:00
Dr.Lt.Data
01763b59d4 update DB 2025-12-03 01:24:18 +09:00
BuddyBytes.co
044173b2a1
Add Smart Resolution Toolkit aspect-aware, snap64-safe resolution and latent generator nodes (#2322)
Smart Resolution Toolkit for ComfyUI

A lightweight resolution assistant for ComfyUI that provides human-friendly dropdowns to pick:

- Resolution presets: HD, FullHD, 2K, 4K, 8K
- Aspect ratios: 1:1, 9:16, 4:5, 21:9, 16:9, 2:3, etc.

Key Features:
• Auto width & height calculation (INT output)
• Latent-safe – automatically snaps to nearest multiple of 64
• Perfect for EmptyLatentImage, KSampler, AnimateDiff, ControlNet, Video formats
• Includes two nodes:
   - Smart Resolution Picker → returns width & height (INT)
   - Smart Latent Generator → directly creates empty LATENT tensor

Popular use cases:
TikTok video, IG story, portrait photography, ultra-wide banners, cinematic 21:9, album covers.

GitHub: https://github.com/buddy-bytes/ComfyUI-SmartResolutionToolkit
2025-12-03 01:20:12 +09:00
Dr.Lt.Data
99e7a88dbd update DB 2025-12-03 01:19:09 +09:00
HALXP
01cd9fbb0e
Add HALXP-Comfy to custom-node-list.json (#2320)
* Added HALXP-Comfy to the custom node lists

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2025-12-03 01:18:02 +09:00
Dr.Lt.Data
aaed1dc3d5
feat(security): Support System User Protection API with security migration (V3.38) (#2338)
- Migrate Manager data path: default/ComfyUI-Manager → __manager
- Force security_level=strong on outdated ComfyUI (block installations)
- Auto-migrate config.ini only; backup legacy files for manual verification
- Raise weak/normal- to normal during migration
- Add /manager/startup_alerts API for UI warnings
- Differentiate 403 responses: comfyui_outdated vs security_level
- Block startup scripts execution on old ComfyUI

Requires ComfyUI v0.3.76+ for full functionality.
Backward compatible with older versions (uses legacy path).
2025-12-03 00:42:12 +09:00
ZiYu
e7d4ea76d7
Add ComfyUI-ZiYu_LabelKit node
### Description
Added a new custom node package: **ComfyUI-ZiYu_LabelKit**.

This node allows users to batch-load images from a directory while automatically retrieving their filenames.  
It helps streamline labeling and dataset preparation workflows by outputting both image data and structured file information.

### Details
- Supports batch image loading (.jpg, .png, .webp, .jxl)
- Extracts filenames and file paths simultaneously
- Provides outputs for images, masks, filenames, paths, and count
- Designed to accelerate data labeling and preprocessing tasks

### Version
v1.0.0 — Initial release
2025-10-20 00:38:14 +08:00
23 changed files with 9440 additions and 6501 deletions

View File

@ -5,6 +5,7 @@
![menu](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/refs/heads/Main/ComfyUI-Manager/images/dialog.jpg)
## NOTICE
* V3.38: **Security patch** - Manager data migrated to protected path. See [Migration Guide](docs/en/v3.38-userdata-security-migration.md).
* V3.16: Support for `uv` has been added. Set `use_uv` in `config.ini`.
* V3.10: `double-click feature` is removed
* This feature has been moved to https://github.com/ltdrdata/comfyui-connection-helper
@ -140,20 +141,27 @@ This repository provides Colab notebooks that allow you to install and use Comfy
## Paths
In `ComfyUI-Manager` V3.0 and later, configuration files and dynamically generated files are located under `<USER_DIRECTORY>/default/ComfyUI-Manager/`.
Starting from V3.38, Manager uses a protected system path for enhanced security.
* <USER_DIRECTORY>
* If executed without any options, the path defaults to ComfyUI/user.
* It can be set using --user-directory <USER_DIRECTORY>.
* <USER_DIRECTORY>
* If executed without any options, the path defaults to ComfyUI/user.
* It can be set using --user-directory <USER_DIRECTORY>.
* Basic config files: `<USER_DIRECTORY>/default/ComfyUI-Manager/config.ini`
* Configurable channel lists: `<USER_DIRECTORY>/default/ComfyUI-Manager/channels.ini`
* Configurable pip overrides: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_overrides.json`
* Configurable pip blacklist: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_blacklist.list`
* Configurable pip auto fix: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_auto_fix.list`
* Saved snapshot files: `<USER_DIRECTORY>/default/ComfyUI-Manager/snapshots`
* Startup script files: `<USER_DIRECTORY>/default/ComfyUI-Manager/startup-scripts`
* Component files: `<USER_DIRECTORY>/default/ComfyUI-Manager/components`
| ComfyUI Version | Manager Path |
|-----------------|--------------|
| v0.3.76+ (with System User API) | `<USER_DIRECTORY>/__manager/` |
| Older versions | `<USER_DIRECTORY>/default/ComfyUI-Manager/` |
* Basic config files: `config.ini`
* Configurable channel lists: `channels.list`
* Configurable pip overrides: `pip_overrides.json`
* Configurable pip blacklist: `pip_blacklist.list`
* Configurable pip auto fix: `pip_auto_fix.list`
* Saved snapshot files: `snapshots/`
* Startup script files: `startup-scripts/`
* Component files: `components/`
> **Note**: See [Migration Guide](docs/en/v3.38-userdata-security-migration.md) for upgrade details.
## `extra_model_paths.yaml` Configuration

View File

@ -8284,6 +8284,16 @@
"install_type": "git-clone",
"description": "Powerful ComfyUI custom node built on the FlashVSR model, facilitating real-time diffusion-based video super-resolution for streaming applications."
},
{
"author": "1038lab",
"title": "ComfyUI-QwenVL",
"reference": "https://github.com/1038lab/ComfyUI-QwenVL",
"files": [
"https://github.com/1038lab/ComfyUI-QwenVL"
],
"install_type": "git-clone",
"description": "ComfyUI-QwenVL custom node: Integrates the Qwen-VL series, including Qwen2.5-VL and the latest Qwen3-VL, to enable advanced multimodal AI for text generation, image understanding, and video analysis."
},
{
"author": "Klinter",
"title": "Klinter_nodes",
@ -9785,16 +9795,6 @@
"install_type": "git-clone",
"description": "Load new workflow after mask editing."
},
{
"author": "shinich39",
"title": "comfyui-no-one-above-me",
"reference": "https://github.com/shinich39/comfyui-no-one-above-me",
"files": [
"https://github.com/shinich39/comfyui-no-one-above-me"
],
"install_type": "git-clone",
"description": "Fix node to top."
},
{
"author": "shinich39",
"title": "comfyui-break-workflow",
@ -11389,6 +11389,16 @@
"install_type": "git-clone",
"description": "DyPE: Dynamic Position Extrapolation for Ultra High Resolution Diffusion ,you can use a wrapper node it in comfyUI"
},
{
"author": "smthemex",
"title": "ComfyUI_GRAG_Image_Editing",
"reference": "https://github.com/smthemex/ComfyUI_GRAG_Image_Editing",
"files": [
"https://github.com/smthemex/ComfyUI_GRAG_Image_Editing"
],
"install_type": "git-clone",
"description": "GRAG-Image-Editing : Group-Relative Attention Guidance for Image Editing,you can try it in comfyUI"
},
{
"author": "choey",
"title": "Comfy-Topaz",
@ -16834,6 +16844,16 @@
"install_type": "git-clone",
"description": "Unofficial diffusers integration of the official SDNQ pipeline to run in ComfyUI. (Description by CC)"
},
{
"author": "erosDiffusion",
"title": "ComfyUI-EulerDiscreteScheduler",
"reference": "https://github.com/erosDiffusion/ComfyUI-EulerDiscreteScheduler",
"files": [
"https://github.com/erosDiffusion/ComfyUI-EulerDiscreteScheduler"
],
"install_type": "git-clone",
"description": "Noise Free images with Euler Discrete Scheduler in ComfyUI with Z-Image or other models"
},
{
"author": "Steudio",
"title": "ComfyUI Steudio",
@ -20238,6 +20258,16 @@
"install_type": "git-clone",
"description": "A node for ComfyUI that provides a convenient way of resizing or cropping an image for diffusion tasks."
},
{
"author": "SparknightLLC",
"title": "ComfyUI-LatentOrientation",
"reference": "https://github.com/SparknightLLC/ComfyUI-LatentOrientation",
"files": [
"https://github.com/SparknightLLC/ComfyUI-LatentOrientation"
],
"install_type": "git-clone",
"description": "A simple node for ComfyUI that rotates or resizes the input latent to common orientations."
},
{
"author": "lightricks",
"title": "ComfyUI-LTXVideo",
@ -22960,6 +22990,16 @@
"install_type": "git-clone",
"description": "A super simple node that outputs common video resolutions as 2 integers for Hunyuan and others!"
},
{
"author": "HellerCommaA",
"title": "ComfyUI-ZImageLatent",
"reference": "https://github.com/HellerCommaA/ComfyUI-ZImageLatent",
"files": [
"https://github.com/HellerCommaA/ComfyUI-ZImageLatent"
],
"install_type": "git-clone",
"description": "A super simple node that outputs official zimage resolutions as a latent"
},
{
"author": "benjiyaya",
"title": "ComfyUI-KokoroTTS",
@ -23145,6 +23185,16 @@
"install_type": "git-clone",
"description": "Frontend extension that adds a sidebar for easy viewing of PNG file metadata."
},
{
"author": "KLL535",
"title": "ComfyUI_Simple_Qwen3-VL-gguf",
"reference": "https://github.com/KLL535/ComfyUI_Simple_Qwen3-VL-gguf",
"files": [
"https://github.com/KLL535/ComfyUI_Simple_Qwen3-VL-gguf"
],
"install_type": "git-clone",
"description": "Simple Qwen3-VL gguf LLM model loader"
},
{
"author": "mango125",
"title": "ComfyUI-Mango-Random",
@ -24796,6 +24846,16 @@
"install_type": "git-clone",
"description": "A ComfyUI custom node that provides dynamic text substitution using wildcards and CSV files. Perfect for creating varied prompts with consistent relationships between terms."
},
{
"author": "illuminatianon",
"title": "comfyui-lumi-tools",
"reference": "https://github.com/illuminatianon/comfyui-lumi-tools",
"files": [
"https://github.com/illuminatianon/comfyui-lumi-tools"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node pack by Lumi."
},
{
"author": "finegrain",
"title": "comfyui-finegrain",
@ -25964,6 +26024,16 @@
"install_type": "git-clone",
"description": "volcengine comfyui api"
},
{
"author": "synthetai",
"title": "ComfyUI-JM-Gemini-API",
"reference": "https://github.com/synthetai/ComfyUI-JM-Gemini-API",
"files": [
"https://github.com/synthetai/ComfyUI-JM-Gemini-API"
],
"install_type": "git-clone",
"description": "A custom node for ComfyUI that generates images using Google's Gemini API, supporting both text-to-image and image-to-image generation."
},
{
"author": "chou18194766xx",
"title": "comfyui-EncryptSave",
@ -30418,6 +30488,16 @@
"install_type": "git-clone",
"description": "ComfyUI node for Flux Kontext Pro and Max models from Replicate"
},
{
"author": "Aryan185",
"title": "ComfyUI-VertexAPI",
"reference": "https://github.com/Aryan185/ComfyUI-VertexAPI",
"files": [
"https://github.com/Aryan185/ComfyUI-VertexAPI"
],
"install_type": "git-clone",
"description": "A collection of powerful custom nodes for ComfyUI that connect your local workflows to closed-source AI models via their APIs, supporting Google Gemini, Imagen, Veo, OpenAI's GPT-Image-1, and FLUX models."
},
{
"author": "iacoposk8",
"title": "ComfyUI Fooocus Inpaint Wrapper",
@ -32506,6 +32586,17 @@
"install_type": "git-clone",
"description": "High-utility nodes for ComfyUI with a focus on Flux 1 Dev workflows and Ultimate SD Upscale enhancement loops."
},
{
"author": "krakenunbound",
"title": "Kraken Discord Bot",
"id": "kraken-discord-bot",
"reference": "https://github.com/krakenunbound/kraken-discord-bot",
"files": [
"https://github.com/krakenunbound/kraken-discord-bot"
],
"install_type": "git-clone",
"description": "All-in-one Discord bot node for AI image generation. Simple setup - just add token, select model, and queue. Includes style presets, rate limiting, and queue management."
},
{
"author": "joanna910225",
"title": "HouseKeeper",
@ -32859,6 +32950,16 @@
"install_type": "git-clone",
"description": "A comprehensive suite of custom nodes for building structured JSON prompts for FLUX.2 image generation with precision and control."
},
{
"author": "MushroomFleet",
"title": "ComfyUI-Variationator",
"reference": "https://github.com/MushroomFleet/ComfyUI-Variationator",
"files": [
"https://github.com/MushroomFleet/ComfyUI-Variationator"
],
"install_type": "git-clone",
"description": "Advanced multi-dimensional prompt variation system for ComfyUI with 240 pre-defined modifiers and 19 custom nodes. (Description by CC)"
},
{
"author": "Urabewe",
"title": "ComfyUI Video Extend Counter",
@ -33594,6 +33695,16 @@
"install_type": "git-clone",
"description": "A ComfyUI custom node based on the Volcano Engine Doubao large model Seedream API, designed for high-quality image generation."
},
{
"author": "dzy1128",
"title": "ComfyUI-VertexAI",
"reference": "https://github.com/dzy1128/ComfyUI-VertexAI",
"files": [
"https://github.com/dzy1128/ComfyUI-VertexAI"
],
"install_type": "git-clone",
"description": "Google Gemini image generation node for ComfyUI supporting up to 6 input images with customizable prompts and parameters. (Description by CC)"
},
{
"author": "swfxliyiyu",
"title": "ComfyUI-FastVideo",
@ -33725,16 +33836,6 @@
"install_type": "git-clone",
"description": "A custom ComfyUI node for seamless image editing using fal.ai's NanoBanana and Seedream (v4) models. Edit images with AI-powered prompts, supporting multi-image batches, custom resolutions, and easy fal.ai API key integration directly in the node interface. "
},
{
"author": "comrender",
"title": "ComfyUI-gpt5_image_text",
"reference": "https://github.com/comrender/ComfyUI-gpt5_image_text",
"files": [
"https://github.com/comrender/ComfyUI-gpt5_image_text"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node for vision + text analysis using GPT-5 and GPT-4o with direct API key input, system prompt, temperature, max tokens, and multi-image support."
},
{
"author": "comrender",
"title": "ComfyUI-Topaz-Upscaler",
@ -33745,26 +33846,6 @@
"install_type": "git-clone",
"description": "A custom node for ComfyUI that integrates the Topaz Labs API for AI-powered image upscaling and enhancement."
},
{
"author": "comrender",
"title": "ComfyUI-Nano-Banana-Resizer",
"reference": "https://github.com/comrender/ComfyUI-Nano-Banana-Resizer",
"files": [
"https://github.com/comrender/ComfyUI-Nano-Banana-Resizer"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node that automatically calculates optimal output dimensions for Google's Nano Banana image editing model, supporting 22 aspect ratio buckets and ensuring pixel-perfect outputs without shifting or cropping."
},
{
"author": "comrender",
"title": "ComfyUI-edge-match-checker",
"reference": "https://github.com/comrender/ComfyUI-edge-match-checker",
"files": [
"https://github.com/comrender/ComfyUI-edge-match-checker"
],
"install_type": "git-clone",
"description": "Node comparing two image masks or images with adjustable overlap threshold (default 95%) for detecting minor shifts and mismatches in proportions, suitable for automated post-processing validation. (Description by CC)"
},
{
"author": "DecartAI",
"title": "Lucy-Edit-ComfyUI",
@ -35617,16 +35698,6 @@
"install_type": "git-clone",
"description": "NODES: TextEncodeQwenImageEditKrsSimple, TextEncodeQwenImageEditKrsAdvanced, QwenImageEditLatentKrs, ..."
},
{
"author": "yemanou",
"title": "NABA Image (Gemini REST) Node",
"reference": "https://github.com/yemanou/ComfyUI-NABA",
"files": [
"https://github.com/yemanou/ComfyUI-NABA"
],
"install_type": "git-clone",
"description": "Simplified Gemini 2.5 Flash Image Preview node for ComfyUI. REST-only for stability, two optional reference images, padded aspect ratio resizing (no stretching), and basic sampling controls. All extra debug layers, SDK path, multi-seed, and legacy compatibility code removed to avoid crashes."
},
{
"author": "Blacksnowskill",
"title": "BSS WD14 Batch Tagger",
@ -35675,6 +35746,16 @@
"install_type": "git-clone",
"description": "ComfyUI-Fossiel-QoL-Nodes is (what will hopefully become) a suite of custom nodes for ComfyUI to improve quality of life. These nodes have been developed for personal use but maybe youll find them useful as well."
},
{
"author": "Fossiel",
"title": "ComfyUI-Fossiel-WAN-Additional-Tilers",
"reference": "https://github.com/Fossiel/ComfyUI-Fossiel-WAN-Additional-Tilers",
"files": [
"https://github.com/Fossiel/ComfyUI-Fossiel-WAN-Additional-Tilers"
],
"install_type": "git-clone",
"description": "Suite of nodes providing VAE tiling functionality for WAN conditioners to reduce VRAM usage while maintaining generation quality. (Description by CC)"
},
{
"author": "rsxdalv",
"title": "TTS WebUI API nodes for ComfyUI",
@ -36056,6 +36137,16 @@
"install_type": "git-clone",
"description": "Image labeler for ComyUI"
},
{
"author": "Seb-Lis",
"title": "ComfyUI_Node_Pack",
"reference": "https://github.com/Seb-Lis/ComfyUI_Node_Pack",
"files": [
"https://github.com/Seb-Lis/ComfyUI_Node_Pack"
],
"install_type": "git-clone",
"description": "A collection of utility nodes for image processing, workflow management, and generation metadata tracking."
},
{
"author": "gitcapoom",
"title": "ComfyUI FOV Estimator",
@ -37051,7 +37142,18 @@
"install_type": "git-clone",
"description": "Utility tools. Index Multiple is used for expanding multiple values from a list, IsOneOfGroupsActive to identify groups state, RepeatGroupState group enable/disable like rg but without connection etc.",
"tags": ["utility", "list", "batch"]
},
},
{
"author": "akawana",
"title": "RGBYP Mask Editor (RGB + YP)",
"reference": "https://github.com/akawana/ComfyUI-RGBYP-Mask-Editor",
"files": [
"https://github.com/akawana/ComfyUI-RGBYP-Mask-Editor"
],
"install_type": "git-clone",
"description": "A JS editor for five-color masks (RGB + Yellow + Pink) that works with any nodes, with three helper nodes — RGBYPLoadImage, RGBYPMaskBridge, and RGBYPMaskToRegularMasks—for convenient RGBYP mask handling.",
"tags": ["utility", "mask", "rgb", "bridge"]
},
{
"author": "lovisdotio",
"title": "ComfyUI-Replace-First-Frame-Last-Frame",
@ -37293,12 +37395,380 @@
"install_type": "git-clone",
"description": "ComfyUI custom nodes for Bokeh Diffusion - Defocus Blur Control in Text-to-Image Diffusion Models."
},
{
"author": "HAL-XP",
"title": "HALXP-Comfy",
"reference": "https://github.com/HAL-XP/halxp-comfy",
"files": [
"https://github.com/HAL-XP/halxp-comfy"
],
"install_type": "git-clone",
"description": "A UI suite for ComfyUI including Focus mode and layout enhancements."
},
{
"author": "BuddyBytes",
"title": "Smart Resolution Toolkit",
"reference": "https://github.com/buddy-bytes/ComfyUI-SmartResolutionToolkit",
"files": [
"https://github.com/buddy-bytes/ComfyUI-SmartResolutionToolkit"
],
"install_type": "git-clone",
"description": "Resolution picker and latent generator for ComfyUI. Select presets like HD, FullHD, 2K, 4K, 8K with aspect ratios (1:1, 9:16, 4:5, 21:9 etc.) via dropdowns. Automatically snaps width/height to latent-safe multiples of 64. Ideal for EmptyLatentImage, AnimateDiff, ControlNet, video formats, and KSampler workflows. Outputs clean INT values or ready-to-use LATENT tensor."
},
{
"author": "Bharanidharan",
"title": "iSeeBetter Node for ComfyUI",
"reference": "https://github.com/llikethat/ComfyUI-iseebetter",
"files": [
"https://github.com/llikethat/ComfyUI-iseebetter"
],
"install_type": "git-clone",
"description": "Custom Node to implement iSeeBetter upscaling method."
},
{
"author": "Bharanidharan",
"title": "faceExtractor for ComfyUI",
"reference": "https://github.com/llikethat/ComfyUI-faceExtractor",
"files": [
"https://github.com/llikethat/ComfyUI-faceExtractor"
],
"install_type": "git-clone",
"description": "Custom Node to detect face matching the input reference image."
},
{
"author": "Pondowner857",
"title": "ComfyUI Remote Workflow Executor",
"id": "comfy_Pond_Nodes_V2",
"reference": "https://github.com/Pondowner857/comfy_Pond_Nodes_V2",
"files": [
"https://github.com/Pondowner857/comfy_Pond_Nodes_V2"
],
"install_type": "git-clone",
"description": "Remote workflow executor node - Execute workflows on remote ComfyUI servers. Supports image/text/audio/video input and output."
},
{
"author": "luxdelux7",
"title": "Forbidden Vision",
"reference": "https://github.com/luxdelux7/ComfyUI-Forbidden-Vision",
"files": [
"https://github.com/luxdelux7/ComfyUI-Forbidden-Vision"
],
"install_type": "git-clone",
"description": "Custom face detection and segmentation for ComfyUI with automatic face fixing, intelligent color grading, and iterative refinement. Custom-trained models optimized for realistic, anime, and NSFW content.",
"nodename_pattern": "ForbiddenVision"
},
{
"author": "ah-kun",
"title": "ComfyUI-FailSafe-Translate-Node",
"reference": "https://github.com/ah-kun/ComfyUI-FailSafe-Translate-Node",
"files": [
"https://github.com/ah-kun/ComfyUI-FailSafe-Translate-Node"
],
"install_type": "git-clone",
"description": "Fail-safe Google Translate prompt node for ComfyUI (retry + caching)."
},
{
"author": "Kazama-Suichiku",
"title": "ComfyUI-Meshy",
"id": "comfyui-meshy",
"reference": "https://github.com/Kazama-Suichiku/ComfyUI-Meshy",
"files": [
"https://github.com/Kazama-Suichiku/ComfyUI-Meshy"
],
"install_type": "git-clone",
"description": "ComfyUI-Meshy is a 3D generation extension based on Meshy AI API. It provides Text-to-3D and Image-to-3D capabilities within ComfyUI, allowing you to generate 3D models directly from text prompts or images. Supports multiple AI models (Meshy-4, Meshy-5, Meshy-6) with customizable topology, polygon count, and PBR settings."
},
{
"author": "Carasibana",
"title": "ComfyUI-PolyMask",
"reference": "https://github.com/Carasibana/ComfyUI-PolyMask",
"files": [
"https://github.com/Carasibana/ComfyUI-PolyMask"
],
"install_type": "git-clone",
"description": "ComfyUI nodes for loading images and drawing polygon masks interactively on them"
},
{
"author": "cdanielp",
"title": "COMFYUI_PROMPTMODELS",
"reference": "https://github.com/cdanielp/COMFYUI_PROMPTMODELS",
"files": [
"https://github.com/cdanielp/COMFYUI_PROMPTMODELS"
],
"install_type": "git-clone",
"description": "Custom nodes for ComfyUI by PROMPTMODELS."
},
{
"author": "supElement",
"title": "ComfyUI_Element_easy",
"reference": "https://github.com/supElement/ComfyUI_Element_easy",
"files": [
"https://github.com/supElement/ComfyUI_Element_easy"
],
"install_type": "git-clone",
"description": "Three custom ComfyUI nodes: Empty Image RGB, Text Line Break, and Random Chars (Append) for convenient utilities. (Description by CC)"
},
{
"author": "Zeknes",
"title": "Comfyui-Nanobanana-API",
"reference": "https://github.com/Zeknes/Comfyui-Nanobanana-API",
"files": [
"https://github.com/Zeknes/Comfyui-Nanobanana-API"
],
"install_type": "git-clone",
"description": "ComfyUI custom node for Gemini image generation via OpenRouter API, supporting text prompts and multiple image inputs (up to 4 images) with automatic saving to output directory. (Description by CC)"
},
{
"author": "xiaoshengyvlin",
"title": "ComfyUI-MetaData-ZaKo",
"reference": "https://github.com/xiaoshengyvlin/ComfyUI-MetaData-ZaKo",
"files": [
"https://github.com/xiaoshengyvlin/ComfyUI-MetaData-ZaKo"
],
"install_type": "git-clone",
"description": "ComfyUI extension for image metadata swapping and preservation in workflows. (Description by CC)"
},
{
"author": "UndefinedUo",
"title": "DuoUmiWildcards",
"reference": "https://github.com/UndefinedUo/DuoUmiWildcards",
"files": [
"https://github.com/UndefinedUo/DuoUmiWildcards"
],
"install_type": "git-clone",
"description": "Custom ComfyUI node supporting wildcard text processing from files with YAML tags, randomization, latent ratio selection and preset aspect ratios."
},
{
"author": "bpmpnaito",
"title": "comfyui-imageviewer",
"reference": "https://github.com/bpmpnaito/comfyui-imageviewer",
"files": [
"https://github.com/bpmpnaito/comfyui-imageviewer"
],
"install_type": "git-clone",
"description": "Image viewer node that displays preview of images directly in the node."
},
{
"author": "ChangeTheConstants",
"title": "SeedVarianceEnhancer",
"reference": "https://github.com/ChangeTheConstants/SeedVarianceEnhancer",
"files": [
"https://github.com/ChangeTheConstants/SeedVarianceEnhancer"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node that adds diversity to Z-Image Turbo outputs by adding random noise to text prompt embeddings to compensate for low seed variance. (Description by CC)"
},
{
"author": "SaTaNoob",
"title": "ComfyUI-Z-Image-Turbo-Resolutions",
"reference": "https://github.com/SaTaNoob/ComfyUI-Z-Image-Turbo-Resolutions",
"files": [
"https://github.com/SaTaNoob/ComfyUI-Z-Image-Turbo-Resolutions"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node that provides quick access to all image resolutions for the Z Image Turbo model, sourced from its official Hugging Face Space."
},
{
"author": "CraftBlack",
"title": "ComfyUI-Resolution-Divider",
"reference": "https://github.com/CraftBlack/ComfyUI-Resolution-Divider",
"files": [
"https://github.com/CraftBlack/ComfyUI-Resolution-Divider"
],
"install_type": "git-clone",
"description": "Utility node for ComfyUI that calculates downscaled resolutions while maintaining original aspect ratio, ideal for image-to-video workflows to prevent OOM errors. (Description by CC)"
},
{
"author": "Randy420Marsh",
"title": "ComfyUI-Civitai-API-Url-Resolver",
"reference": "https://github.com/Randy420Marsh/ComfyUI-Civitai-API-Url-Resolver",
"files": [
"https://github.com/Randy420Marsh/ComfyUI-Civitai-API-Url-Resolver"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node that converts Civitai share/model page URLs into direct download URLs, making it easier to integrate Civitai models into your workflows."
},
{
"author": "zn123",
"title": "ComfyUI-image-processor-zn123",
"reference": "https://github.com/zn123/ComfyUI-image-processor-zn123",
"files": [
"https://github.com/zn123/ComfyUI-image-processor-zn123"
],
"install_type": "git-clone",
"description": "Comprehensive image processing plugin for ComfyUI"
},
{
"author": "Koko-boya",
"title": "Comfyui-Z-Image-Utilities",
"reference": "https://github.com/Koko-boya/Comfyui-Z-Image-Utilities",
"files": [
"https://github.com/Koko-boya/Comfyui-Z-Image-Utilities"
],
"install_type": "git-clone",
"description": "Collection of utility nodes for ComfyUI designed specifically for the Z-Image model with vision model support and LLM-powered prompt enhancement."
},
{
"author": "fredlef",
"title": "ComfyUI FSL Nodes",
"reference": "https://github.com/fredlef/Comfyui_FSL_Nodes",
"files": [
"https://github.com/fredlef/Comfyui_FSL_Nodes"
],
"install_type": "git-clone",
"tags": ["image", "chat", "gemini", "fsl"]
},
{
"author": "exedesign",
"title": "ComfyUI-Hunyuan3D-v3",
"id": "hunyuan3d-v3",
"reference": "https://github.com/exedesign/Hunyuan-3D-v3",
"files": [
"https://github.com/exedesign/Hunyuan-3D-v3"
],
"install_type": "git-clone",
"description": "Text-to-3D and Image-to-3D generation using Tencent Cloud Hunyuan 3D Global API. Supports PBR materials, face count control (40K-1.5M faces), and multiple generation types (Normal/LowPoly/Geometry/Sketch). Outputs industry-standard GLB format. Requires Tencent Cloud account with API access.",
"nodename_pattern": "Hunyuan",
"tags": ["3D", "generation", "text-to-3d", "image-to-3d", "hunyuan", "tencent"]
},
{
"author": "btitkin",
"title": "Random Prompt Builder",
"id": "random-prompt-builder",
"reference": "https://github.com/btitkin/ComfyUI-RandomPromptBuilder",
"files": [
"https://github.com/btitkin/ComfyUI-RandomPromptBuilder"
],
"install_type": "git-clone",
"description": "Advanced AI-powered prompt generation using local GGUF models. Generate detailed, structured prompts with character controls, style presets, and model-specific formatting for Pony, SDXL, Flux, and more. Supports GPU acceleration and runs completely offline."
},
{
"author": "rjgoif",
"title": "Img Label Tools",
"id": "Img-Label-Tools",
"reference": "https://github.com/rjgoif/ComfyUI-Img-Label-Tools",
"install_type": "git-clone",
"description": "Tools to help annotate images for sharing on Reddit, Discord, etc."
},
{
"author": "mrf",
"title": "ComfyPoe",
"reference": "https://github.com/mrf/ComfyPoe",
"files": [
"https://github.com/mrf/ComfyPoe"
],
"install_type": "git-clone",
"description": "ComfyUI nodes for image generation via Poe API"
},
{
"author": "sirouk",
"title": "chutes-comfyui-node",
"reference": "https://github.com/sirouk/chutes-comfyui-node",
"files": [
"https://github.com/sirouk/chutes-comfyui-node"
],
"install_type": "git-clone",
"description": "ComfyUI custom nodes for Chutes.ai video generation API"
},
{
"author": "Tinuva88",
"title": "Comfy-UmiAI",
"reference": "https://github.com/Tinuva88/Comfy-UmiAI",
"files": [
"https://github.com/Tinuva88/Comfy-UmiAI"
],
"install_type": "git-clone",
"description": "A logic engine for ComfyUI prompts that transforms static prompts into dynamic, context-aware workflows with persistent variables, conditional logic, native LoRA loading, and external data fetching. (Description by CC)"
},
{
"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": "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": "ameyukisora",
"title": "ComfyUI Empty Latent Advanced",
"reference": "https://github.com/ameyukisora/ComfyUI-Empty-Latent-Advanced",
"files": [
"https://github.com/ameyukisora/ComfyUI-Empty-Latent-Advanced"
],
"install_type": "git-clone",
"description": "An advanced Empty Latent selector with visual presets and foldable UI."
},
{
"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"
},
{
"author": "Matthew-X",
"title": "Workflow Importer",
"id": "comfyui-workflow_importer",
"reference": "https://github.com/Matthew-X/comfyui-workflow_importer",
"files": [
"https://github.com/Matthew-X/comfyui-workflow_importer"
],
"install_type": "git-clone",
"js_path": "workflow_importer",
"description": "Import ComfyUI workflows from images with embedded metadata. Adds a toolbar Import button, drag-and-drop dialog and Ctrl+Shift+I shortcut. Supports legacy and new UIs, common image formats, opens each image in a new workflow tab."
},
{
"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": "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": "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"]
},

View File

@ -0,0 +1,230 @@
# ComfyUI-Manager V3.38: Userdata Security Migration Guide
## Introduction
ComfyUI-Manager V3.38 introduces a **security patch** that migrates Manager's configuration and data to a protected system path. This change leverages ComfyUI's new System User Protection API (PR #10966) to provide enhanced security isolation.
This guide explains what happens during the migration and how to handle various situations.
---
## What Changed
### Finding Your Paths
When ComfyUI starts, it displays the full paths in the terminal:
```
** User directory: /path/to/ComfyUI/user
** ComfyUI-Manager config path: /path/to/ComfyUI/user/__manager/config.ini
```
Look for these lines in your startup log to find the exact location on your system. In this guide, paths are shown relative to the `user` directory.
### Path Migration
| Data | Legacy Path | New Path |
|------|-------------|----------|
| Configuration | `user/default/ComfyUI-Manager/` | `user/__manager/` |
| Snapshots | `user/default/ComfyUI-Manager/snapshots/` | `user/__manager/snapshots/` |
### Why This Change
In older ComfyUI versions, the `default/` directory was **unprotected** and accessible via web APIs. If you ran ComfyUI with `--listen 0.0.0.0` or similar options to allow external connections, this data **may have been tampered with** by malicious actors.
**Note:** If you only used ComfyUI locally (without `--listen` or with `--listen 127.0.0.1`), your data was not exposed to this vulnerability.
The new `__manager` path uses ComfyUI's protected system directory, which:
- **Cannot be accessed** from outside (protected by ComfyUI)
- Isolates system settings from user data
- Enables stricter security for remote access
**This is why only `config.ini` is automatically migrated** - other files (snapshots) may have been compromised and should be manually verified before copying.
---
## Automatic Migration
When you start ComfyUI with the new System User Protection API, Manager automatically handles the migration:
### Step 1: Configuration Migration
Only `config.ini` is migrated automatically.
**Important**: Snapshots are **NOT** automatically migrated. You must copy them manually if needed.
### Step 2: Security Level Check
During migration, if your security level is below `normal` (i.e., `weak` or `normal-`), it will be automatically raised to `normal`. This is a safety measure because the security level setting itself may have been tampered with in the old version.
```
======================================================================
[ComfyUI-Manager] WARNING: Security level adjusted
- Previous: 'weak' → New: 'normal'
- Raised to prevent unauthorized remote access.
======================================================================
```
If you need a lower security level, you can manually edit the config after migration.
### Step 3: Legacy Backup
Your entire legacy directory is moved to a backup location:
```
user/__manager/.legacy-manager-backup/
```
This backup is preserved until you manually delete it.
---
## Persistent Backup Notification
As long as the backup exists, Manager will remind you on **every startup**:
```
----------------------------------------------------------------------
[ComfyUI-Manager] NOTICE: Legacy backup exists
- Your old Manager data was backed up to:
/path/to/ComfyUI/user/__manager/.legacy-manager-backup
- Please verify and remove it when no longer needed.
----------------------------------------------------------------------
```
**To stop this notification**: Delete the `.legacy-manager-backup` folder inside `user/__manager/` after confirming you don't need any data from it.
---
## Recovering Old Data
### Snapshots
If you need your old snapshots, copy the contents of `.legacy-manager-backup/snapshots/` to `user/__manager/snapshots/`.
---
## Outdated ComfyUI Warning
If you're running an older version of ComfyUI without the System User Protection API, Manager will:
1. **Force security level to `strong`** - All installations are blocked
2. **Display warning message**:
```
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[ComfyUI-Manager] ERROR: ComfyUI version is outdated!
- Most operations are blocked for security.
- ComfyUI update is still allowed.
- Please update ComfyUI to use Manager normally.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
```
**Solution**: Update ComfyUI to v0.3.76 or later.
---
## Security Levels
| Level | What's Allowed |
|-------|----------------|
| `strong` | ComfyUI update only. All other installations blocked. |
| `normal` | Install/update/remove registered custom nodes and models. |
| `normal-` | Above + Install via Git URL or pip (localhost only). |
| `weak` | All operations allowed, including from remote connections. |
**Notes:**
- `strong` is forced on outdated ComfyUI versions.
- `normal` is the default and recommended for most users.
- `normal-` is for developers who need to install unregistered nodes locally.
- `weak` should only be used in isolated development environments.
### Changing Security Level
Edit `user/__manager/config.ini`:
```ini
[default]
security_level = normal
```
---
## Error Messages
### "comfyui_outdated" (HTTP 403)
This error appears when:
- Your ComfyUI doesn't have the System User Protection API
- All installations are blocked until you update ComfyUI
**Solution**: Update ComfyUI to the latest version.
### "security_level" (HTTP 403)
This error appears when:
- Your security level blocks the requested operation
- For example, `strong` level blocks all installations
**Solution**: Lower your security level in config.ini if appropriate for your use case.
---
## Security Warning: Suspicious Path
If you see this error on an **older** ComfyUI:
```
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[ComfyUI-Manager] ERROR: Suspicious path detected!
- '__manager' exists with low security level: 'weak'
- Please verify manually:
/path/to/ComfyUI/user/__manager/config.ini
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
```
On older ComfyUI versions, the `__manager` directory is not normally created. If this directory exists, it may have been created externally. For safety, manually verify the contents of this directory before updating ComfyUI.
---
## Troubleshooting
### All my installations are blocked
**Check 1**: Is your ComfyUI updated?
- Old ComfyUI forces `security_level = strong`
- Update ComfyUI to resolve
**Check 2**: What's your security level?
- Check `user/__manager/config.ini`
- `security_level = strong` blocks all installations
### My snapshots are missing
Snapshots are not automatically migrated. You need to manually copy the `snapshots` folder from inside `.legacy-manager-backup` to the `user/__manager/` directory.
### I keep seeing the backup notification
Delete the `.legacy-manager-backup` folder inside `user/__manager/` after confirming you don't need any data from it.
### Snapshot restore is blocked
On old ComfyUI (without System User API), snapshot restore is blocked because security is forced to `strong`. Update ComfyUI to enable snapshot restore.
---
## File Structure Reference
```
user/
└── __manager/
├── config.ini # Manager configuration
├── channels.list # Custom node channels
├── snapshots/ # Environment snapshots
└── .legacy-manager-backup/ # Backup of old Manager data (temporary)
```
---
## Requirements
- **ComfyUI**: v0.3.76 or later (with System User Protection API)
- **ComfyUI-Manager**: V3.38 or later

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -40,10 +40,11 @@ import cnr_utils
import manager_util
import git_utils
import manager_downloader
import manager_migration
from node_package import InstalledNodePackage
version_code = [3, 37, 2]
version_code = [3, 38, 1]
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
@ -214,9 +215,10 @@ def update_user_directory(user_dir):
global manager_pip_blacklist_path
global manager_components_path
manager_files_path = os.path.abspath(os.path.join(user_dir, 'default', 'ComfyUI-Manager'))
manager_files_path = manager_migration.get_manager_path(user_dir)
if not os.path.exists(manager_files_path):
os.makedirs(manager_files_path)
manager_migration.run_migration_checks(user_dir, manager_files_path)
manager_snapshot_path = os.path.join(manager_files_path, "snapshots")
if not os.path.exists(manager_snapshot_path):
@ -1719,7 +1721,7 @@ def read_config():
manager_util.use_uv = default_conf['use_uv'].lower() == 'true' if 'use_uv' in default_conf else False
manager_util.bypass_ssl = get_bool('bypass_ssl', False)
return {
result = {
'http_channel_enabled': get_bool('http_channel_enabled', False),
'preview_method': default_conf.get('preview_method', manager_funcs.get_current_preview_method()).lower(),
'git_exe': default_conf.get('git_exe', ''),
@ -1739,6 +1741,8 @@ def read_config():
'security_level': default_conf.get('security_level', 'normal').lower(),
'db_mode': default_conf.get('db_mode', 'cache').lower(),
}
manager_migration.force_security_level_if_needed(result)
return result
except Exception:
import importlib.util
@ -1746,7 +1750,7 @@ def read_config():
manager_util.use_uv = importlib.util.find_spec("uv") is not None and platform.system() != "Windows"
manager_util.bypass_ssl = False
return {
result = {
'http_channel_enabled': False,
'preview_method': manager_funcs.get_current_preview_method(),
'git_exe': '',
@ -1766,6 +1770,8 @@ def read_config():
'security_level': 'normal', # strong | normal | normal- | weak
'db_mode': 'cache', # local | cache | remote
}
manager_migration.force_security_level_if_needed(result)
return result
def get_config():
@ -3360,8 +3366,8 @@ def get_comfyui_versions(repo=None):
repo = git.Repo(comfy_path)
try:
remote = get_remote_name(repo)
repo.remotes[remote].fetch()
remote = get_remote_name(repo)
repo.remotes[remote].fetch()
except:
logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI")

356
glob/manager_migration.py Normal file
View File

@ -0,0 +1,356 @@
"""
ComfyUI-Manager migration module.
Handles migration from legacy paths to new __manager path structure.
"""
import os
import sys
import subprocess
import configparser
# Startup notices for notice board
startup_notices = [] # List of (message, level) tuples
def add_startup_notice(message, level='warning'):
"""Add a notice to be displayed on Manager notice board.
Args:
message: HTML-formatted message string
level: 'warning', 'error', 'info'
"""
global startup_notices
startup_notices.append((message, level))
# Cache for API check (computed once per session)
_cached_has_system_user_api = None
def has_system_user_api():
"""Check if ComfyUI has the System User Protection API (PR #10966).
Result is cached for performance.
"""
global _cached_has_system_user_api
if _cached_has_system_user_api is None:
try:
import folder_paths
_cached_has_system_user_api = hasattr(folder_paths, 'get_system_user_directory')
except Exception:
_cached_has_system_user_api = False
return _cached_has_system_user_api
def get_manager_path(user_dir):
"""Get the appropriate manager files path based on ComfyUI version.
Returns:
str: manager_files_path
"""
if has_system_user_api():
return os.path.abspath(os.path.join(user_dir, '__manager'))
else:
return os.path.abspath(os.path.join(user_dir, 'default', 'ComfyUI-Manager'))
def run_migration_checks(user_dir, manager_files_path):
"""Run all migration and security checks.
Call this after get_manager_path() to handle:
- Legacy config migration (new ComfyUI)
- Legacy backup notification (every startup)
- Suspicious directory detection (old ComfyUI)
- Outdated ComfyUI warning (old ComfyUI)
"""
if has_system_user_api():
migrated = migrate_legacy_config(user_dir, manager_files_path)
# Only check for legacy backup if migration didn't just happen
# (migration already shows backup location in its message)
if not migrated:
check_legacy_backup(manager_files_path)
else:
check_suspicious_manager(user_dir)
warn_outdated_comfyui()
def check_legacy_backup(manager_files_path):
"""Check for legacy backup and notify user to verify and remove it.
This runs on every startup to remind users about pending legacy backup.
"""
backup_dir = os.path.join(manager_files_path, '.legacy-manager-backup')
if not os.path.exists(backup_dir):
return
# Terminal output
print("\n" + "-"*70)
print("[ComfyUI-Manager] NOTICE: Legacy backup exists")
print(" - Your old Manager data was backed up to:")
print(f" {backup_dir}")
print(" - Please verify and remove it when no longer needed.")
print("-"*70 + "\n")
# Notice board output
add_startup_notice(
"Legacy ComfyUI-Manager data backup exists. Please verify and remove when no longer needed. See terminal for details.",
level='info'
)
def check_suspicious_manager(user_dir):
"""Check for suspicious __manager directory on old ComfyUI.
On old ComfyUI without System User API, if __manager exists with low security,
warn the user to verify manually.
Returns:
bool: True if suspicious setup detected
"""
if has_system_user_api():
return False # Not suspicious on new ComfyUI
suspicious_path = os.path.abspath(os.path.join(user_dir, '__manager'))
if not os.path.exists(suspicious_path):
return False
config_path = os.path.join(suspicious_path, 'config.ini')
if not os.path.exists(config_path):
return False
config = configparser.ConfigParser()
config.read(config_path)
sec_level = config.get('default', 'security_level', fallback='normal').lower()
if sec_level in ['weak', 'normal-']:
# Terminal output
print("\n" + "!"*70)
print("[ComfyUI-Manager] ERROR: Suspicious path detected!")
print(f" - '__manager' exists with low security level: '{sec_level}'")
print(" - Please verify manually:")
print(f" {config_path}")
print("!"*70 + "\n")
# Notice board output
add_startup_notice(
"[Security Alert] Suspicious path detected. See terminal log for details.",
level='error'
)
return True
return False
def warn_outdated_comfyui():
"""Warn user about outdated ComfyUI without System User API."""
if has_system_user_api():
return
# Terminal output
print("\n" + "!"*70)
print("[ComfyUI-Manager] ERROR: ComfyUI version is outdated!")
print(" - Most operations are blocked for security.")
print(" - ComfyUI update is still allowed.")
print(" - Please update ComfyUI to use Manager normally.")
print("!"*70 + "\n")
# Notice board output
add_startup_notice(
"[Security Alert] ComfyUI outdated. Installations blocked (update allowed).<BR>"
"Update ComfyUI for normal operation.",
level='error'
)
def migrate_legacy_config(user_dir, manager_files_path):
"""Migrate ONLY config.ini to new __manager path if needed.
IMPORTANT: Only config.ini is migrated. Other files (snapshots, cache, etc.)
are NOT migrated - users must recreate them.
Scenarios:
1. Legacy exists, New doesn't exist → Migrate config.ini
2. Legacy exists, New exists First update after upgrade
- Run ComfyUI dependency installation
- Rename legacy to .backup
3. Legacy doesn't exist → No migration needed
Returns:
bool: True if migration was performed
"""
if not has_system_user_api():
return False
legacy_dir = os.path.join(user_dir, 'default', 'ComfyUI-Manager')
legacy_config = os.path.join(legacy_dir, 'config.ini')
new_config = os.path.join(manager_files_path, 'config.ini')
if not os.path.exists(legacy_dir):
return False # No legacy directory, nothing to migrate
# IMPORTANT: Check for config.ini existence, not just directory
# (because makedirs() creates __manager before this function is called)
# Case: Both configs exist (first update after ComfyUI upgrade)
# This means user ran new ComfyUI at least once, creating __manager/config.ini
if os.path.exists(legacy_config) and os.path.exists(new_config):
_handle_first_update_migration(user_dir, legacy_dir, manager_files_path)
return True
# Case: Legacy config exists but new config doesn't (normal migration)
# This is the first run after ComfyUI upgrade
if os.path.exists(legacy_config) and not os.path.exists(new_config):
pass # Continue with normal migration below
else:
return False
# Terminal output
print("\n" + "-"*70)
print("[ComfyUI-Manager] NOTICE: Legacy config.ini detected")
print(f" - Old: {legacy_config}")
print(f" - New: {new_config}")
print(" - Migrating config.ini only (other files are NOT migrated).")
print(" - Security level below 'normal' will be raised.")
print("-"*70 + "\n")
_migrate_config_with_security_check(legacy_config, new_config)
# Move legacy directory to backup
_move_legacy_to_backup(legacy_dir, manager_files_path)
return True
def _handle_first_update_migration(user_dir, legacy_dir, manager_files_path):
"""Handle first ComfyUI update when both legacy and new directories exist.
This scenario happens when:
- User was on old ComfyUI (using default/ComfyUI-Manager)
- ComfyUI was updated (now has System User API)
- Manager already created __manager on first new run
- But legacy directory still exists
Actions:
1. Run ComfyUI dependency installation
2. Move legacy to __manager/.legacy-manager-backup
"""
# Terminal output
print("\n" + "-"*70)
print("[ComfyUI-Manager] NOTICE: First update after ComfyUI upgrade detected")
print(" - Both legacy and new directories exist.")
print(" - Running ComfyUI dependency installation...")
print("-"*70 + "\n")
# Run ComfyUI dependency installation
# Path: glob/manager_migration.py → glob → comfyui-manager → custom_nodes → ComfyUI
try:
comfyui_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
requirements_path = os.path.join(comfyui_path, 'requirements.txt')
if os.path.exists(requirements_path):
subprocess.run([sys.executable, '-m', 'pip', 'install', '-r', requirements_path],
capture_output=True, check=False)
print("[ComfyUI-Manager] ComfyUI dependencies installation completed.")
except Exception as e:
print(f"[ComfyUI-Manager] WARNING: Failed to install ComfyUI dependencies: {e}")
# Move legacy to backup inside __manager
_move_legacy_to_backup(legacy_dir, manager_files_path)
def _move_legacy_to_backup(legacy_dir, manager_files_path):
"""Move legacy directory to backup inside __manager.
Returns:
str: Path to backup directory if successful, None if failed
"""
import shutil
backup_dir = os.path.join(manager_files_path, '.legacy-manager-backup')
try:
if os.path.exists(backup_dir):
shutil.rmtree(backup_dir) # Remove old backup if exists
shutil.move(legacy_dir, backup_dir)
# Terminal output (full paths shown here only)
print("\n" + "-"*70)
print("[ComfyUI-Manager] NOTICE: Legacy settings migrated")
print(f" - Old location: {legacy_dir}")
print(f" - Backed up to: {backup_dir}")
print(" - Please verify and remove the backup when no longer needed.")
print("-"*70 + "\n")
# Notice board output (no full paths for security)
add_startup_notice(
"Legacy ComfyUI-Manager data migrated. See terminal for details.",
level='info'
)
return backup_dir
except Exception as e:
print(f"[ComfyUI-Manager] WARNING: Failed to backup legacy directory: {e}")
add_startup_notice(
f"[MIGRATION] Failed to backup legacy directory: {e}",
level='warning'
)
return None
def _migrate_config_with_security_check(legacy_path, new_path):
"""Migrate legacy config, raising security level only if below default."""
config = configparser.ConfigParser()
try:
config.read(legacy_path)
except Exception as e:
print(f"[ComfyUI-Manager] WARNING: Failed to parse config.ini: {e}")
print(" - Creating fresh config with default settings.")
add_startup_notice(
"[MIGRATION] Failed to parse legacy config. Using defaults.",
level='warning'
)
return # Skip migration, let Manager create fresh config
# Security level hierarchy: strong > normal > normal- > weak
# Default is 'normal', only raise if below default
if 'default' in config:
current_level = config['default'].get('security_level', 'normal').lower()
below_default_levels = ['weak', 'normal-']
if current_level in below_default_levels:
config['default']['security_level'] = 'normal'
# Terminal output
print("\n" + "="*70)
print("[ComfyUI-Manager] WARNING: Security level adjusted")
print(f" - Previous: '{current_level}' → New: 'normal'")
print(" - Raised to prevent unauthorized remote access.")
print("="*70 + "\n")
# Notice board output
add_startup_notice(
f"[MIGRATION] Security level raised: '{current_level}''normal'.<BR>"
"To prevent unauthorized remote access.",
level='warning'
)
else:
print(f" - Security level: '{current_level}' (no change needed)")
# Ensure directory exists
os.makedirs(os.path.dirname(new_path), exist_ok=True)
with open(new_path, 'w') as f:
config.write(f)
def force_security_level_if_needed(config_dict):
"""Force security level to 'strong' if on old ComfyUI.
Args:
config_dict: Configuration dictionary to modify in-place
Returns:
bool: True if security level was forced
"""
if not has_system_user_api():
config_dict['security_level'] = 'strong'
return True
return False

View File

@ -22,6 +22,7 @@ import asyncio
import queue
import manager_downloader
import manager_migration
logging.info(f"### Loading: ComfyUI-Manager ({core.version_str})")
@ -276,6 +277,13 @@ import zipfile
import urllib.request
def security_403_response():
"""Return appropriate 403 response based on ComfyUI version."""
if not manager_migration.has_system_user_api():
return web.json_response({"error": "comfyui_outdated"}, status=403)
return web.json_response({"error": "security_level"}, status=403)
def get_model_dir(data, show_log=False):
if 'download_model_base' in folder_paths.folder_names_and_paths:
models_base = folder_paths.folder_names_and_paths['download_model_base'][0][0]
@ -732,7 +740,7 @@ async def fetch_updates(request):
async def update_all(request):
if not is_allowed_security_level('middle'):
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
return security_403_response()
with task_worker_lock:
is_processing = task_worker_thread is not None and task_worker_thread.is_alive()
@ -965,7 +973,7 @@ async def get_snapshot_list(request):
async def remove_snapshot(request):
if not is_allowed_security_level('middle'):
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
return security_403_response()
try:
target = request.rel_url.query["target"]
@ -983,7 +991,7 @@ async def remove_snapshot(request):
async def restore_snapshot(request):
if not is_allowed_security_level('middle'):
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
return security_403_response()
try:
target = request.rel_url.query["target"]
@ -1302,7 +1310,7 @@ async def fix_custom_node(request):
async def install_custom_node_git_url(request):
if not is_allowed_security_level('high'):
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
return web.Response(status=403)
return security_403_response()
url = await request.text()
res = await core.gitclone_install(url)
@ -1322,7 +1330,7 @@ async def install_custom_node_git_url(request):
async def install_custom_node_pip(request):
if not is_allowed_security_level('high'):
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
return web.Response(status=403)
return security_403_response()
packages = await request.text()
core.pip_install(packages.split(' '))
@ -1594,6 +1602,16 @@ async def get_notice(request):
except:
pass
# Prepend startup notices from manager_migration
for message, level in reversed(manager_migration.startup_notices):
if level == 'error':
style = 'color:red; background-color:white; font-weight:bold'
elif level == 'warning':
style = 'color:orange; background-color:white; font-weight:bold'
else:
style = 'color:blue; background-color:white'
markdown_content = f'<P style="{style}">{message}</P>' + markdown_content
return web.Response(text=markdown_content, status=200)
else:
return web.Response(text="Unable to retrieve Notice", status=200)
@ -1601,11 +1619,35 @@ async def get_notice(request):
return web.Response(text="Unable to retrieve Notice", status=200)
@routes.get("/manager/startup_alerts")
async def get_startup_alerts(request):
"""Return startup alerts for customAlert display on page load.
Returns JSON array of alerts that should be shown to user immediately.
All startup notices (error, warning, info) are returned.
"""
alerts = []
# Return all startup notices for alert display
for message, level in manager_migration.startup_notices:
# Convert HTML BR to newlines for customAlert
text = message.replace('<BR>', '\n').replace('<br>', '\n')
# Add [ComfyUI-Manager] prefix for customAlert (notice board shows in Manager UI anyway)
text = text.replace('[Security Alert]', '[ComfyUI-Manager] Security Alert:')
text = text.replace('[MIGRATION]', '[ComfyUI-Manager] Migration:')
alerts.append({
'message': text,
'level': level
})
return web.json_response(alerts)
@routes.get("/manager/reboot")
def restart(self):
if not is_allowed_security_level('middle'):
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
return security_403_response()
try:
sys.stdout.close_log()

View File

@ -55,7 +55,7 @@ def get_pip_cmd(force_uv=False):
subprocess.check_output(test_cmd, stderr=subprocess.DEVNULL, timeout=5)
return [sys.executable] + (['-s'] if embedded else []) + ['-m', 'pip']
except Exception:
logging.warning("[ComfyUI-Manager] python -m pip not available. Falling back to uv.")
logging.warning("[ComfyUI-Manager] `python -m pip` not available. Falling back to `uv`.")
# Try uv (either forced or pip failed)
import shutil
@ -64,19 +64,19 @@ def get_pip_cmd(force_uv=False):
try:
test_cmd = [sys.executable] + (['-s'] if embedded else []) + ['-m', 'uv', '--version']
subprocess.check_output(test_cmd, stderr=subprocess.DEVNULL, timeout=5)
logging.info("[ComfyUI-Manager] Using uv as Python module for pip operations.")
logging.info("[ComfyUI-Manager] Using `uv` as Python module for pip operations.")
return [sys.executable] + (['-s'] if embedded else []) + ['-m', 'uv', 'pip']
except Exception:
pass
# Try standalone uv
if shutil.which('uv'):
logging.info("[ComfyUI-Manager] Using standalone uv for pip operations.")
logging.info("[ComfyUI-Manager] Using standalone `uv` for pip operations.")
return ['uv', 'pip']
# Nothing worked
logging.error("[ComfyUI-Manager] Neither python -m pip nor uv are available. Cannot proceed with package operations.")
raise Exception("Neither pip nor uv are available for package management")
logging.error("[ComfyUI-Manager] Neither `python -m pip` nor `uv` are available. Cannot proceed with package operations.")
raise Exception("Neither `pip` nor `uv` are available for package management")
def make_pip_cmd(cmd):

View File

@ -1,6 +1,6 @@
import { api } from "../../scripts/api.js";
import { app } from "../../scripts/app.js";
import { sleep, customConfirm, customAlert } from "./common.js";
import { sleep, customConfirm, customAlert, handle403Response, show_message } from "./common.js";
async function tryInstallCustomNode(event) {
let msg = '-= [ComfyUI Manager] extension installation request =-\n\n';
@ -42,7 +42,7 @@ async function tryInstallCustomNode(event) {
});
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
await handle403Response(response);
return false;
}
else if(response.status == 400) {
@ -54,7 +54,7 @@ async function tryInstallCustomNode(event) {
let response = await api.fetchApi("/manager/reboot");
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
await handle403Response(response);
return false;
}

View File

@ -14,7 +14,7 @@ import { OpenArtShareDialog } from "./comfyui-share-openart.js";
import {
free_models, install_pip, install_via_git_url, manager_instance,
rebootAPI, setManagerInstance, show_message, customAlert, customPrompt,
infoToast, showTerminal, setNeedRestart
infoToast, showTerminal, setNeedRestart, handle403Response
} from "./common.js";
import { ComponentBuilderDialog, getPureName, load_components, set_component_policy } from "./components-manager.js";
import { CustomNodesManager } from "./custom-nodes-manager.js";
@ -753,9 +753,9 @@ async function onQueueStatus(event) {
const rebootButton = document.getElementById('cm-reboot-button5');
rebootButton?.addEventListener("click",
function() {
if(rebootAPI()) {
manager_dialog.close();
async function() {
if(await rebootAPI()) {
manager_instance.close();
}
});
}
@ -780,8 +780,13 @@ async function updateAll(update_comfyui) {
const response = await api.fetchApi(`/manager/queue/update_all?mode=${mode}`);
if (response.status == 401) {
if (response.status == 403) {
await handle403Response(response);
reset_action_buttons();
}
else if (response.status == 401) {
customAlert('Another task is already in progress. Please stop the ongoing task first.');
reset_action_buttons();
}
else if(response.status == 200) {
is_updating = true;
@ -1453,6 +1458,31 @@ app.registerExtension({
load_components();
// Fetch and show startup alerts (critical errors like outdated ComfyUI)
// Poll until extensionManager.toast is ready (set in Vue onMounted)
const showStartupAlerts = async () => {
let toastWaitCount = 0;
const waitForToast = () => {
if (window['app']?.extensionManager?.toast) {
fetch('/manager/startup_alerts')
.then(response => response.ok ? response.json() : [])
.then(alerts => {
for (const alert of alerts) {
customAlert(alert.message);
}
})
.catch(e => console.warn('[ComfyUI-Manager] Failed to fetch startup alerts:', e));
} else if (toastWaitCount < 300) { // Max 30 seconds (300 * 100ms)
toastWaitCount++;
setTimeout(waitForToast, 100);
} else {
console.warn('[ComfyUI-Manager] Timeout waiting for toast. Startup alerts skipped.');
}
};
waitForToast();
};
showStartupAlerts();
const menu = document.querySelector(".comfy-menu");
const separator = document.createElement("hr");

View File

@ -100,6 +100,19 @@ export function show_message(msg) {
app.ui.dialog.element.style.zIndex = 1100;
}
export async function handle403Response(res, defaultMessage) {
try {
const data = await res.json();
if(data.error === 'comfyui_outdated') {
show_message('ComfyUI version is outdated.<BR>Please update ComfyUI to use Manager normally.');
} else {
show_message(defaultMessage || 'This action is not allowed with this security level configuration.');
}
} catch {
show_message(defaultMessage || 'This action is not allowed with this security level configuration.');
}
}
export async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
@ -163,20 +176,23 @@ export async function customPrompt(title, message) {
}
export function rebootAPI() {
export async function rebootAPI() {
if ('electronAPI' in window) {
window.electronAPI.restartApp();
return true;
}
customConfirm("Are you sure you'd like to reboot the server?").then((isConfirmed) => {
if (isConfirmed) {
try {
api.fetchApi("/manager/reboot");
const isConfirmed = await customConfirm("Are you sure you'd like to reboot the server?");
if (isConfirmed) {
try {
const response = await api.fetchApi("/manager/reboot");
if (response.status == 403) {
await handle403Response(response);
return false;
}
catch(exception) {}
}
});
catch(exception) {}
}
return false;
}
@ -216,7 +232,7 @@ export async function install_pip(packages) {
});
if(res.status == 403) {
show_message('This action is not allowed with this security level configuration.');
await handle403Response(res);
return;
}
@ -251,7 +267,7 @@ export async function install_via_git_url(url, manager_dialog) {
});
if(res.status == 403) {
show_message('This action is not allowed with this security level configuration.');
await handle403Response(res);
return;
}
@ -262,9 +278,9 @@ export async function install_via_git_url(url, manager_dialog) {
const self = this;
rebootButton.addEventListener("click",
function() {
if(rebootAPI()) {
manager_dialog.close();
async function() {
if(await rebootAPI()) {
manager_instance.close();
}
});
}

View File

@ -7,7 +7,7 @@ import {
fetchData, md5, icons, show_message, customConfirm, customAlert, customPrompt,
sanitizeHTML, infoToast, showTerminal, setNeedRestart,
storeColumnWidth, restoreColumnWidth, getTimeAgo, copyText, loadCss,
showPopover, hidePopover
showPopover, hidePopover, handle403Response
} from "./common.js";
// https://cenfun.github.io/turbogrid/api.html
@ -1528,7 +1528,16 @@ export class CustomNodesManager {
errorMsg = `'${item.title}': `;
if(res.status == 403) {
errorMsg += `This action is not allowed with this security level configuration.\n`;
try {
const data = await res.json();
if(data.error === 'comfyui_outdated') {
errorMsg += `ComfyUI version is outdated. Please update ComfyUI to use Manager normally.\n`;
} else {
errorMsg += `This action is not allowed with this security level configuration.\n`;
}
} catch {
errorMsg += `This action is not allowed with this security level configuration.\n`;
}
} else if(res.status == 404) {
errorMsg += `With the current security level configuration, only custom nodes from the <B>"default channel"</B> can be installed.\n`;
} else {

View File

@ -1,9 +1,9 @@
import { app } from "../../scripts/app.js";
import { $el } from "../../scripts/ui.js";
import {
manager_instance, rebootAPI,
import {
manager_instance, rebootAPI,
fetchData, md5, icons, show_message, customAlert, infoToast, showTerminal,
storeColumnWidth, restoreColumnWidth, loadCss
storeColumnWidth, restoreColumnWidth, loadCss, handle403Response
} from "./common.js";
import { api } from "../../scripts/api.js";
@ -477,7 +477,16 @@ export class ModelManager {
errorMsg = `'${item.name}': `;
if(res.status == 403) {
errorMsg += `This action is not allowed with this security level configuration.\n`;
try {
const data = await res.json();
if(data.error === 'comfyui_outdated') {
errorMsg += `ComfyUI version is outdated. Please update ComfyUI to use Manager normally.\n`;
} else {
errorMsg += `This action is not allowed with this security level configuration.\n`;
}
} catch {
errorMsg += `This action is not allowed with this security level configuration.\n`;
}
} else {
errorMsg += await res.text() + '\n';
}

View File

@ -1,7 +1,7 @@
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 } from "./common.js";
import { manager_instance, rebootAPI, show_message, handle403Response } from "./common.js";
async function restore_snapshot(target) {
@ -10,7 +10,7 @@ async function restore_snapshot(target) {
const response = await api.fetchApi(`/snapshot/restore?target=${target}`, { cache: "no-store" });
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
await handle403Response(response);
return false;
}
@ -38,7 +38,7 @@ async function remove_snapshot(target) {
const response = await api.fetchApi(`/snapshot/remove?target=${target}`, { cache: "no-store" });
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
await handle403Response(response);
return false;
}
@ -145,8 +145,8 @@ export class SnapshotManager extends ComfyDialog {
if(btn_id) {
const rebootButton = document.getElementById(btn_id);
const self = this;
rebootButton.onclick = function() {
if(rebootAPI()) {
rebootButton.onclick = async function() {
if(await rebootAPI()) {
self.close();
self.manager_dialog.close();
}

View File

@ -1,5 +1,126 @@
{
"custom_nodes": [
{
"author": "krakenunbound",
"title": "Kraken Discord Bot",
"id": "kraken-discord-bot",
"reference": "https://github.com/krakenunbound/kraken-discord-bot",
"files": [
"https://github.com/krakenunbound/kraken-discord-bot"
],
"install_type": "git-clone",
"description": "All-in-one Discord bot node for AI image generation. Simple setup - just add token, select model, and queue. Includes style presets, rate limiting, and queue management."
},
{
"author": "quinteroac",
"title": "comfyui_api_executor_nodes",
"reference": "https://github.com/quinteroac/comfyui_api_executor_nodes",
"files": [
"https://github.com/quinteroac/comfyui_api_executor_nodes"
],
"install_type": "git-clone",
"description": "Custom nodes for ComfyUI that enable workflow execution via API (internal or external), as well as input/output handling and workflow selection."
},
{
"author": "Chang-Jin-Lee",
"title": "ComfyUI-PromptMixer-AI [WIP]",
"reference": "https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI",
"files": [
"https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI"
],
"install_type": "git-clone",
"description": "ComfyUI custom node collection for unified control of checkpoints, steps, CFG, samplers, LoRA and prompt parameters with local LLM integration. (Description by CC)\nNOTE: The files in the repo are not organized."
},
{
"author": "leacvikas0",
"title": "ComfyUI-Presence [WIP]",
"reference": "https://github.com/leacvikas0/ComfyUI-Presence",
"files": [
"https://github.com/leacvikas0/ComfyUI-Presence"
],
"install_type": "git-clone",
"description": "NODES: BeautifulTextNode, FluxAdaptiveInjector, InspectNode, PresenceDirector, PresenceDirectorFireworks, PresenceDirectorVertex, PresenceSaver, UnaliverBundlePreview, UnaliverNode, UnaliverPlanner, UnaliverStepIterato, ...\nNOTE: The files in the repo are not organized."
},
{
"author": "Kraven1109",
"title": "ComfyUI-Llama [NAME CONFLICT]",
"reference": "https://github.com/Kraven1109/ComfyUI-Llama",
"files": [
"https://github.com/Kraven1109/ComfyUI-Llama"
],
"install_type": "git-clone",
"description": "Lightweight ComfyUI plugin exposing llama.cpp-based one-shot Qwen VQA nodes."
},
{
"author": "xiaoxidashen",
"title": "comfyui_my_utils",
"reference": "https://github.com/xiaoxidashen/comfyui_my_utils",
"files": [
"https://github.com/xiaoxidashen/comfyui_my_utils"
],
"install_type": "git-clone",
"description": "Guide and utilities for creating ComfyUI custom nodes with image/video preview functionality. (Description by CC)"
},
{
"author": "agavesunset",
"title": "ComfyUI_LoRA_Tracker",
"reference": "https://github.com/agavesunset/ComfyUI_LoRA_Tracker",
"files": [
"https://github.com/agavesunset/ComfyUI_LoRA_Tracker"
],
"install_type": "git-clone",
"description": "ComfyUI node for tracking and displaying LoRA parameters. (Description by CC)"
},
{
"author": "anilsathyan7",
"title": "ComfyUI-Crystal-Upscaler",
"reference": "https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler",
"files": [
"https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler"
],
"install_type": "git-clone",
"description": "ComfyUI custom node for image upscaling using crystal upscaling technology. (Description by CC)"
},
{
"author": "SleazySleaze",
"title": "aesthetic-persona-comfyui-node",
"reference": "https://github.com/SleazySleaze/aesthetic-persona-comfyui-node",
"files": [
"https://github.com/SleazySleaze/aesthetic-persona-comfyui-node"
],
"install_type": "git-clone",
"description": "Node providing aesthetic persona parsing capabilities for ComfyUI. (Description by CC)"
},
{
"author": "xtanqn",
"title": "comfyui-xishen [WIP]",
"reference": "https://github.com/xtanqn/comfyui-xishen",
"files": [
"https://github.com/xtanqn/comfyui-xishen"
],
"install_type": "git-clone",
"description": "A custom node for ComfyUI that generates random numbers as text output.\nNOTE: The files in the repo are not organized."
},
{
"author": "heyburns",
"title": "ComfyUI-Logic-Redux [WIP]",
"reference": "https://github.com/heyburns/ComfyUI-Logic-Redux",
"files": [
"https://github.com/heyburns/ComfyUI-Logic-Redux"
],
"install_type": "git-clone",
"description": "Validation-friendly rewrite of ComfyUI Logic nodes with drop-in compatibility, featuring compare, int/float/bool/string pass-through, ternary logic, and debug nodes. (Description by CC)\nNOTE: The files in the repo are not organized."
},
{
"author": "Mohamed-Sakr",
"title": "ComfyUI-SimpleMarkdown [UNSAFE]",
"reference": "https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown",
"files": [
"https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown"
],
"install_type": "git-clone",
"description": "A simple markdown node for ComfyUI[w/This nodepack has a frontend vulnerability.]"
},
{
"author": "starsFriday",
"title": "ComfyUI-Tracker-Person [WIP]",
@ -1203,16 +1324,6 @@
"install_type": "git-clone",
"description": "NODES: Image Size Input, Date/Time based output path"
},
{
"author": "octapus8085",
"title": "OpenAI-comfyui-O",
"reference": "https://github.com/Spicely/Comfyui-File-Utils",
"files": [
"https://github.com/Spicely/Comfyui-File-Utils"
],
"install_type": "git-clone",
"description": "This plugin provides multiple file-handling and utility nodes for ComfyUI, including: image saving, audio saving, video saving, video composition, audio-to-subtitle conversion, and random number generation nodes. These nodes not only process files but also return their absolute file paths.\nNOTE: The files in the repo are not organized.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
},
{
"author": "octapus8085",
"title": "OpenAI-comfyui-O",

View File

@ -340,6 +340,8 @@
"ImageBlendText",
"ImageBlendV1",
"ImageRatioCrop",
"Load_Images_Advance",
"Load_Images_V1",
"PDEmptyRatioLatent",
"PDIMAGE_ImageCombine",
"PDIMAGE_LongerSize",
@ -349,18 +351,29 @@
"PDImageResizeV2",
"PDImageResizeV3",
"PDImageToRatioV1",
"PDJSON_BatchJsonIncremental",
"PDJSON_Group",
"PDStringConcate",
"PDStringInput",
"PDTEXT_SAVE_PATH",
"PD_AitoolkitTrainingRedux",
"PD_BatchCropBlackBorder",
"PD_CaptionJSONEditor",
"PD_CaptionJSONParser",
"PD_CropBorder",
"PD_Extract_Image",
"PD_GetImageRatio",
"PD_GetImageSize",
"PD_ImageFileTraining",
"PD_ImageListForSort",
"PD_ImageListForSortWithMetadata",
"PD_ImageSearch",
"PD_ImageSize34Compose",
"PD_Image_Crop_Location",
"PD_Image_Rotate_v1",
"PD_Image_centerCrop",
"PD_JoinStringMultiLine",
"PD_LoadImageMetadata",
"PD_LoadImagesFromDir",
"PD_LoadImagesFromZip",
"PD_LoadTextsFromDir",
@ -370,15 +383,36 @@
"PD_Mask Selector By Area Left",
"PD_MaskFillHoles",
"PD_MaskRemoveSmallObjects",
"PD_ModelLoraLoader",
"PD_RemoveBlackBackground",
"PD_RemoveColorWords",
"PD_RemoveWhiteBorder",
"PD_RenameV2",
"PD_SAVE_PATH2",
"PD_SaveTextPathAndName",
"PD_ShowText",
"PD_StringLineCount",
"PD_StringToCaptionJSON",
"PD_TensorTraining",
"PD_Text Overlay Node",
"PD_TextListPack",
"PD_TextListSort",
"PD_TextListStringAddWord",
"PD_TextListUnpack",
"PD_TxtBatchRename",
"PD_Zip_Simple",
"PD_del_word",
"PD_empty_word",
"PD_image_coversaver",
"PD_image_ratio_size",
"PD_image_to_text_v1",
"PD_imagesave_path",
"PD_load_image_v1",
"PD_name_replacewordorder",
"PD_number_star",
"PD_number_start",
"PD_random_prompt",
"PD_rename_image",
"PDbananaImagesizeByRatio",
"PDimage_corp_v1",
"PDimage_corp_v2",
@ -1219,6 +1253,17 @@
"title_aux": "ComfyUi-Text-Tiler"
}
],
"https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI": [
[
"FavoritePromptMixer",
"FreeAIPrompt",
"FreeAIPromptGenerate",
"Load_Text_Batch_Simple"
],
{
"title_aux": "ComfyUI-PromptMixer-AI [WIP]"
}
],
"https://github.com/Chargeuk/ComfyUI-vts-nodes": [
[
"VTS Add Text To list",
@ -2327,6 +2372,22 @@
"title_aux": "ComfyUI Dynamic Prompting Simplified [WIP]"
}
],
"https://github.com/Kraven1109/ComfyUI-Llama": [
[
"ComfyLLama",
"ComfyLLamaPreviewText",
"ComfyLLamaPromptBuilder",
"ComfyLLamaSaveText",
"ComfyLLamaServer",
"ComfyLLamaTextConcat",
"ComfyLLamaTextInput",
"GGUFLoader",
"MediaPathsLoader"
],
{
"title_aux": "ComfyUI-Llama [NAME CONFLICT]"
}
],
"https://github.com/Krish-701/RK_Comfyui": [
[
"RK_Accumulate_Text_Multiline",
@ -2440,61 +2501,36 @@
],
"https://github.com/LSDJesus/ComfyUI-Luna-Collection": [
[
"LunaAssembler",
"LunaBasePrompt",
"LunaCacheManager",
"LunaBatchPromptExtractor",
"LunaBatchPromptLoader",
"LunaCheckpointLoader",
"LunaCheckpointTunnel",
"LunaCivitaiBatchScraper",
"LunaCivitaiScraper",
"LunaConditionals",
"LunaConfigGateway",
"LunaConnectionEditor",
"LunaConnectionMatcher",
"LunaConnectionStats",
"LunaDaemonConfig",
"LunaDaemonConfigFromLoaders",
"LunaDaemonModelSwitch",
"LunaDaemonStatus",
"LunaEmbeddingCache",
"LunaDaemonCLIPLoader",
"LunaDaemonVAELoader",
"LunaDimensionScaler",
"LunaDynamicModelLoader",
"LunaEmbeddingManager",
"LunaEmbeddingManagerRandom",
"LunaExpanders",
"LunaExpressionBatchSaver",
"LunaExpressionList",
"LunaExpressionPromptBuilder",
"LunaExpressionSheetSlicer",
"LunaListPreprocessedPrompts",
"LunaLoRALinker",
"LunaExpressionSlicerSaver",
"LunaGGUFBatchConverter",
"LunaGGUFConverter",
"LunaLoRARandomizer",
"LunaLoRAStacker",
"LunaLoRAStackerRandom",
"LunaLoadParameters",
"LunaLoadPreprocessedPrompt",
"LunaLogicResolver",
"LunaModifiers",
"LunaModifyPreprocessedPrompt",
"LunaLoRATriggerInjector",
"LunaLoRAValidator",
"LunaMultiSaver",
"LunaOptimizedPreprocessedLoader",
"LunaParametersBridge",
"LunaPerformanceCondition",
"LunaPerformanceDisplay",
"LunaPerformanceLogger",
"LunaPerformanceMonitor",
"LunaPerformanceStatsConcat",
"LunaPromptPreprocessor",
"LunaSampler",
"LunaSaveNegativePrompt",
"LunaSelectPromptFolder",
"LunaSharedCLIPEncode",
"LunaSharedCLIPEncodeDual",
"LunaSharedCLIPEncodeSDXL",
"LunaSharedVAEDecode",
"LunaSharedVAEEncode",
"LunaSinglePromptProcessor",
"LunaOptimizedWeightsManager",
"LunaPromptCraft",
"LunaPromptCraftDebug",
"LunaSmartLoRALinker",
"LunaTextProcessor",
"LunaUnifiedPromptProcessor",
"LunaUNetTunnel",
"LunaWildcardBuilder",
"LunaWildcardPromptGenerator",
"LunaYAMLInjector",
"LunaYAMLPathExplorer",
"LunaYAMLWildcard",
@ -2650,12 +2686,19 @@
],
"https://github.com/LvyuanW/ComfyUI-6yuan": [
[
"6yuan_DrawTextNode",
"ColorKMeans",
"CropAlpha",
"PosterColorEngine",
"PosterLogoPlacer",
"PosterMaskGenerator",
"PosterTemplateLoader",
"PosterTextRenderer",
"RemoveBackground",
"RemoveBackgroundAdvanced",
"ShapeLanguageSummary",
"ShrinkImage",
"SimpleTextLayout",
"StringPreview"
],
{
@ -2936,6 +2979,14 @@
"title_aux": "ComfyUI_mickster_nodes [WIP]"
}
],
"https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown": [
[
"SimpleMarkdownPreview"
],
{
"title_aux": "ComfyUI-SimpleMarkdown [UNSAFE]"
}
],
"https://github.com/MrAdamBlack/CheckProgress": [
[
"CHECK_PROGRESS"
@ -3435,31 +3486,76 @@
],
"https://github.com/PozzettiAndrea/ComfyUI-CADabra": [
[
"BGPSegSegmentation",
"BrepGeneration",
"CADAnalysisViewer",
"CADCheckOverlappingFaces",
"CADConnectedComponents",
"CADCountFaces",
"CADDepthMapHybrid",
"CADEdgeAnalysis",
"CADEdgeDetailAnalyzer",
"CADEdgeViewer",
"CADEstimateGapTolerance",
"CADExtractFaces",
"CADFaceAnalysis",
"CADFillMaskBiharmonic",
"CADFillMaskBiharmonicMask",
"CADFixDegenerateFaces",
"CADGetFaceInfo",
"CADGetFilename",
"CADGetMetadata",
"CADHealShape",
"CADMergeVertices",
"CADProjectFacesXY",
"CADROISelector",
"CADRaytracerBVH",
"CADRecodeInference",
"CADSave",
"CADSewFaces",
"CADSplitComponents",
"CAD_Convert_Format",
"CAD_Load",
"CAD_Load_From_Folder",
"CAD_Load_Gmsh",
"CAD_Mesh_Gmsh",
"CAD_Mesh_Gmsh_Advanced",
"CAD_Quality_Metrics",
"CAD_Remesh_OCC",
"CAD_Remesh_OCC_Advanced",
"CadQueryExecute",
"CadrilleImageInference",
"CadrilleInference",
"CadrilleTextInference",
"LoadBGPSegModels",
"LoadCADRecodeModel",
"LoadCadrilleModel",
"LoadNeurCADReconModel",
"LoadPoint2CADModel",
"LoadPointCloudXYZ",
"LoadSECADNetModel",
"LoadSurfaceParams",
"ML_FeatureDetection",
"ML_SurfaceRecon",
"MeshFaceSegmentation",
"MeshSegmentToPointCloud",
"MeshToVoxel",
"Mesh_Optimize_Gmsh",
"NeurCADReconInference",
"NeurCADReconLoadCheckpoint",
"NeurCADReconTrain",
"Point2CADExportBrep",
"Point2CADSegmentation",
"Point2CADSurfaceFitting",
"Point2CADSurfaceFittingOCC",
"Point2CADTopologyExtraction",
"PointCloudSegmentation",
"PreviewCADBatch",
"PreviewCADOCC",
"PrimitiveFitting",
"QuadRemesh"
"QuadRemesh",
"SECADNetFinetune",
"SECADNetInference",
"SaveSurfaceParams"
],
{
"title_aux": "CADabra [WIP]"
@ -3502,11 +3598,15 @@
"LoadBVHFromFolder",
"LoadFBXCharacter",
"LoadGVHMRModels",
"LoadSAM3DBodyModels",
"LoadSMPL",
"MHRViewer",
"SAM3DVideoInference",
"SMPLRetargetToSMPL",
"SMPLToFBX",
"SMPLViewer",
"SMPLtoBVH",
"SaveMHR",
"SaveSMPL"
],
{
@ -3675,8 +3775,10 @@
],
"https://github.com/Rizzlord/ComfyUI-SeqTex": [
[
"SeqTex_DisplaceMesh",
"SeqTex_Load_Mesh",
"SeqTex_Loader",
"SeqTex_ProjectTexture",
"SeqTex_Step1_ProcessMesh",
"SeqTex_Step2_GenerateCondition",
"SeqTex_Step3_GenerateTexture",
@ -3704,6 +3806,7 @@
"List Image Path \ud83d\udc24",
"List Model Path \ud83d\udc24",
"List Video Path \ud83d\udc24",
"Load Image Base64 \ud83d\udc24",
"Peaks Weights Generator \ud83d\udc24"
],
{
@ -3963,6 +4066,14 @@
"title_aux": "multigpu_diffusion_comfyui"
}
],
"https://github.com/SleazySleaze/aesthetic-persona-comfyui-node": [
[
"AestheticPersonaParser"
],
{
"title_aux": "aesthetic-persona-comfyui-node"
}
],
"https://github.com/Slix-M-Lestragg/comfyui-enhanced": [
[
"Range Iterator"
@ -4034,19 +4145,6 @@
"title_aux": "ComfyUI_Remaker_FaceSwap"
}
],
"https://github.com/Spicely/Comfyui-File-Utils": [
[
"AudioToSubtitle",
"RandomFloat",
"SaveAudioWithPath",
"SaveImageWithPath",
"SaveVideoWithPath",
"VideoCompose"
],
{
"title_aux": "OpenAI-comfyui-O"
}
],
"https://github.com/Stable-X/ComfyUI-Hi3DGen": [
[
"DifferenceExtractorNode",
@ -4940,6 +5038,14 @@
"title_aux": "ComfyUI-OpenPoser [WIP]"
}
],
"https://github.com/agavesunset/ComfyUI_LoRA_Tracker": [
[
"LoRAParameterOverlay"
],
{
"title_aux": "ComfyUI_LoRA_Tracker"
}
],
"https://github.com/ahkimkoo/ComfyUI-OSS-Upload": [
[
"OSSAudioUploader",
@ -5193,6 +5299,14 @@
"title_aux": "ComfyUI-Legendary-Nodes"
}
],
"https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler": [
[
"CrystalUpscalerNode"
],
{
"title_aux": "ComfyUI-Crystal-Upscaler"
}
],
"https://github.com/animEEEmpire/ComfyUI-Animemory-Loader": [
[
"AnimemoryNode"
@ -5398,10 +5512,14 @@
],
"https://github.com/bakker/BK_Utils": [
[
"DynamicGroupSwitchMulti",
"FileNameDefinition",
"FluxPromptSaver",
"FluxTextSampler",
"IsOneOfGroupsActive",
"ModelName",
"SamePixelResolutionCalculator"
"SamePixelResolutionCalculator",
"ZImageTurboResolutions"
],
{
"title_aux": "BK_Utils [WIP]"
@ -6070,6 +6188,8 @@
"AudioEncoderEncode",
"AudioEncoderLoader",
"AudioMerge",
"AutogrowNamesTestNode",
"AutogrowPrefixTestNode",
"BasicGuider",
"BasicScheduler",
"BetaSamplingScheduler",
@ -6095,6 +6215,7 @@
"CLIPTextEncodeFlux",
"CLIPTextEncodeHiDream",
"CLIPTextEncodeHunyuanDiT",
"CLIPTextEncodeKandinsky5",
"CLIPTextEncodeLumina2",
"CLIPTextEncodePixArtAlpha",
"CLIPTextEncodeSD3",
@ -6108,6 +6229,7 @@
"CheckpointLoaderSimple",
"CheckpointSave",
"ChromaRadianceOptions",
"ComfySwitchNode",
"ConditioningAverage",
"ConditioningCombine",
"ConditioningConcat",
@ -6129,6 +6251,7 @@
"CosmosPredict2ImageToVideoLatent",
"CreateVideo",
"CropMask",
"DCTestNode",
"DiffControlNetLoader",
"DifferentialDiffusion",
"DiffusersLoader",
@ -6221,6 +6344,7 @@
"KSampler",
"KSamplerAdvanced",
"KSamplerSelect",
"Kandinsky5ImageToVideo",
"KarrasScheduler",
"KlingCameraControlI2VNode",
"KlingCameraControlT2VNode",
@ -6230,6 +6354,12 @@
"KlingImageGenerationNode",
"KlingLipSyncAudioToVideoNode",
"KlingLipSyncTextToVideoNode",
"KlingOmniProEditVideoNode",
"KlingOmniProFirstLastFrameNode",
"KlingOmniProImageNode",
"KlingOmniProImageToVideoNode",
"KlingOmniProTextToVideoNode",
"KlingOmniProVideoToVideoNode",
"KlingSingleImageVideoEffectNode",
"KlingStartEndFrameNode",
"KlingTextToVideoNode",
@ -6332,6 +6462,7 @@
"MoonvalleyTxt2VideoNode",
"MoonvalleyVideo2VideoNode",
"Morphology",
"NormalizeVideoLatentStart",
"OpenAIChatConfig",
"OpenAIChatNode",
"OpenAIDalle2",
@ -6393,6 +6524,7 @@
"RenormCFG",
"RepeatImageBatch",
"RepeatLatentBatch",
"ReplaceVideoLatentFrames",
"RescaleCFG",
"ResizeAndPadImage",
"Rodin3D_Detail",
@ -7356,6 +7488,7 @@
"SceneSelect",
"SceneUpdate",
"SceneView",
"SceneWanVideoLoraMultiSave",
"SubdirLister",
"TailEnhancePro",
"TailSplit"
@ -7824,6 +7957,22 @@
"title_aux": "ComfyUI-CC-ImageLoader [UNSAFE]"
}
],
"https://github.com/heyburns/ComfyUI-Logic-Redux": [
[
"Bool-\ud83d\udd2c",
"Compare-\ud83d\udd2c",
"DebugPrint-\ud83d\udd2c",
"Float-\ud83d\udd2c",
"If ANY execute A else B",
"If ANY execute A else B-\ud83d\udd2c",
"If ANY return A else B-\ud83d\udd2c",
"Int-\ud83d\udd2c",
"String-\ud83d\udd2c"
],
{
"title_aux": "ComfyUI-Logic-Redux [WIP]"
}
],
"https://github.com/hhelloe/ComfyuiQuantizerToFp8": [
[
"FP8QuantizeFormat",
@ -8068,6 +8217,7 @@
"Alta:GetImageAndPath",
"Alta:GetImageByIndex",
"Alta:GetStringByIndex",
"Alta:IfOnly(Logic)",
"Alta:Int2Str(Math)",
"Alta:JSONKeyExtractor(Util)",
"Alta:ListAllFiles",
@ -8607,14 +8757,18 @@
],
"https://github.com/kaski23/Kaskis_Comfy_Nodes": [
[
"CollectVideoNode",
"CollectKeyedVideosNode",
"CollectVideosNode",
"ImageDelay",
"IntToString",
"KlingVideoHandler",
"LoadImageWithFilename",
"LoadVideoWithFilename",
"PairSwitchNode",
"PreviewImageLimited",
"StringSplitSelect",
"Unbroken-Video-Handler"
"Unbroken-Video-Handler",
"WorkflowLoggerNode"
],
{
"title_aux": "Kaskis_Comfy_Nodes"
@ -9040,6 +9194,17 @@
"title_aux": "ComfyUI_LBT [WIP]"
}
],
"https://github.com/leacvikas0/ComfyUI-Presence": [
[
"FluxAdaptiveInjector",
"PresenceDirectorFireworks",
"PresenceDirectorVertex",
"PresenceSaver"
],
{
"title_aux": "ComfyUI-Presence [WIP]"
}
],
"https://github.com/leadbreak/comfyui-faceaging": [
[
"AgeTransformationNode"
@ -9100,7 +9265,9 @@
],
"https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools": [
[
"LGGCFX_ImagePreview",
"LGGCFX_audio",
"LGGCFX_prompt",
"LGGCFX_resolution",
"LGGCFX_time_frame",
"VRAMReserver"
@ -9124,12 +9291,19 @@
[
"CSVRandomPicker",
"CSVRandomPickerAdv",
"ImageBatchtoImageList",
"ImageBatchtoImages",
"KSamplerConfig",
"KSamplerSchedulerFallback",
"LoadImageBatch",
"LoadZipBatch",
"MaskToSAMCoords",
"MaskToSAMCoordsV2",
"MorseCode",
"PoseReformer",
"SaveITAsZip",
"SaveImageAsZip",
"SaveTextAsZip",
"StrFormat",
"StrFormatAdv",
"YoloFaceReformer",
@ -9481,10 +9655,15 @@
"https://github.com/lyra-ai/lyra-nodes": [
[
"LyraAudioVisualizer",
"LyraCdnUploader",
"LyraCollectOpenAIResponse",
"LyraCustomOpenAIRequest",
"LyraFilenameBuilder",
"LyraImageAudioFusion",
"LyraLoadAudioFromURL",
"LyraLoadImageFromURL"
"LyraLoadImageFromURL",
"LyraStringToTypes",
"LyraWebRequester"
],
{
"title_aux": "lyra-nodes"
@ -10054,10 +10233,11 @@
"https://github.com/nobinBB/comfyui-samenodes": [
[
"BatchImageProcessor",
"CivitaiBulkDownloader",
"ExtractPromptFromImage",
"FloatToString",
"FloatToStringWithPrefix",
"LoraWildcardGenerator",
"UpscaleImageByUsingModelCustom"
"LoraWildcardGenerator"
],
{
"title_aux": "comfyui-samenodes"
@ -10563,6 +10743,30 @@
"title_aux": "ComfyUI-AI_Tools [UNSAFE]"
}
],
"https://github.com/quinteroac/comfyui_api_executor_nodes": [
[
"AnyTo",
"ImageInputCombiner",
"ImageInputPair",
"IntInputCombiner",
"IntInputPair",
"RemoteWorkflowAPIExecutor",
"SimpleText",
"SimpleWorkflowAPIExecutor",
"TextImageToImageWorkflowSelector",
"TextImageToVideoWorkflowSelector",
"TextInputCombiner",
"TextInputPair",
"TextToImageWorkflowSelector",
"TextToVideoWorkflowSelector",
"VideoInputPair",
"WorkflowAPIExecutor",
"YandereRandomTags"
],
{
"title_aux": "comfyui_api_executor_nodes"
}
],
"https://github.com/rakete/comfyui-rakete": [
[
"rakete.BuildString",
@ -11142,7 +11346,10 @@
[
"GetJsonKeyValue",
"Image_Color_Noise",
"SamplingParameters"
"ModifyMask",
"SamplingParameters",
"TextEncodeFlux2SystemPrompt",
"TextEncodeZITSystemPrompt"
],
{
"title_aux": "Sampling Utility Toolkit"
@ -12273,6 +12480,14 @@
"title_aux": "ComfyUI_RasterCardMaker"
}
],
"https://github.com/xiaoxidashen/comfyui_my_utils": [
[
"VideoSplitCombine"
],
{
"title_aux": "comfyui_my_utils"
}
],
"https://github.com/xiaoyumu/ComfyUI-XYNodes": [
[
"AdjustImageColor",
@ -12318,6 +12533,19 @@
"title_aux": "ComfyUI-CombineVideoAndSubtitle"
}
],
"https://github.com/xtanqn/comfyui-xishen": [
[
"XishenCommonPromptNode",
"XishenCommonResolutionNode",
"XishenPromptEditNode",
"XishenRandomIntegerNode",
"XishenRemoveEmptyLinesNode",
"XishenSmartDisplayNode"
],
{
"title_aux": "comfyui-xishen [WIP]"
}
],
"https://github.com/xuchenxu168/ComfyUI-Gemini-3": [
[
"Gemini3Chat",
@ -12654,6 +12882,23 @@
],
"https://github.com/zhuanvi/ComfyUI-ZVNodes": [
[
"ApimartDownloadSavedTaskImageZV",
"ApimartDownloadSavedTaskVideoZV",
"ApimartImage2VideoSubmitZV",
"ApimartNanoBananaProImageSubmitZV",
"ApimartRemixByTaskIdSubmitZV",
"ApimartRemixVideoSubmitZV",
"ApimartSeedream40ImageSubmitZV",
"ApimartSeedream45ImageSubmitZV",
"ApimartText2VideoSubmitZV",
"BBOXFormatConverterZV",
"GrsaiLoadImageFromPathNodeZV",
"GrsaiNanoBananaGeminiNodeZV",
"GrsaiNanoBananaNodeZV",
"GrsaiResultNodeZV",
"GrsaiSoraCreateCharacterNodeZV",
"GrsaiSoraUploadCharacterNodeZV",
"GrsaiSoraVideoNodeZV",
"ImageCounterNodeZV",
"JoinListZV",
"JsonListIndexerZV",
@ -12667,6 +12912,7 @@
"LoadImageFromDirZV",
"LoadImageFromUrlZV",
"LoadTxtFromDirZV",
"LoadVideoFromDirZV",
"MultiLineConditionalZV",
"MultiLineOperationZV",
"PatternFillNodeZV",
@ -12674,8 +12920,11 @@
"RandomSelectListZV",
"SaveImageToPathZV",
"SaveTxtToPathZV",
"StringToPathZV",
"TriangleCharacterLayoutZV",
"TxtCounterNodeZV",
"UniversalBBOXToMaskZV",
"Veo31Image2VideoSubmitZV",
"VideoSceneDetectorZV",
"VideoSpeedZV",
"doubaoI2INodeZV",

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,65 @@
{
"custom_nodes": [
{
"author": "shinich39",
"title": "comfyui-no-one-above-me [REMOVED]",
"reference": "https://github.com/shinich39/comfyui-no-one-above-me",
"files": [
"https://github.com/shinich39/comfyui-no-one-above-me"
],
"install_type": "git-clone",
"description": "Fix node to top."
},
{
"author": "octapus8085",
"title": "OpenAI-comfyui-O [REMOVED]",
"reference": "https://github.com/Spicely/Comfyui-File-Utils",
"files": [
"https://github.com/Spicely/Comfyui-File-Utils"
],
"install_type": "git-clone",
"description": "This plugin provides multiple file-handling and utility nodes for ComfyUI, including: image saving, audio saving, video saving, video composition, audio-to-subtitle conversion, and random number generation nodes. These nodes not only process files but also return their absolute file paths.\nNOTE: The files in the repo are not organized.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
},
{
"author": "yemanou",
"title": "NABA Image (Gemini REST) Node [REMOVED]",
"reference": "https://github.com/yemanou/ComfyUI-NABA",
"files": [
"https://github.com/yemanou/ComfyUI-NABA"
],
"install_type": "git-clone",
"description": "Simplified Gemini 2.5 Flash Image Preview node for ComfyUI. REST-only for stability, two optional reference images, padded aspect ratio resizing (no stretching), and basic sampling controls. All extra debug layers, SDK path, multi-seed, and legacy compatibility code removed to avoid crashes."
},
{
"author": "comrender",
"title": "ComfyUI-Nano-Banana-Resizer [REMOVED]",
"reference": "https://github.com/comrender/ComfyUI-Nano-Banana-Resizer",
"files": [
"https://github.com/comrender/ComfyUI-Nano-Banana-Resizer"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node that automatically calculates optimal output dimensions for Google's Nano Banana image editing model, supporting 22 aspect ratio buckets and ensuring pixel-perfect outputs without shifting or cropping."
},
{
"author": "comrender",
"title": "ComfyUI-edge-match-checker [REMOVED]",
"reference": "https://github.com/comrender/ComfyUI-edge-match-checker",
"files": [
"https://github.com/comrender/ComfyUI-edge-match-checker"
],
"install_type": "git-clone",
"description": "Node comparing two image masks or images with adjustable overlap threshold (default 95%) for detecting minor shifts and mismatches in proportions, suitable for automated post-processing validation. (Description by CC)"
},
{
"author": "comrender",
"title": "ComfyUI-gpt5_image_text [REMOVED]",
"reference": "https://github.com/comrender/ComfyUI-gpt5_image_text",
"files": [
"https://github.com/comrender/ComfyUI-gpt5_image_text"
],
"install_type": "git-clone",
"description": "A ComfyUI custom node for vision + text analysis using GPT-5 and GPT-4o with direct API key input, system prompt, temperature, max tokens, and multi-image support."
},
{
"author": "PozzettiAndrea",
"title": "ComfyUI-CameraAnalysis [REMOVED]",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -85,7 +85,15 @@ cm_global.register_api('cm.is_import_failed_extension', is_import_failed_extensi
comfyui_manager_path = os.path.abspath(os.path.dirname(__file__))
custom_nodes_base_path = folder_paths.get_folder_paths('custom_nodes')[0]
manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), 'default', 'ComfyUI-Manager'))
# Check for System User API availability (PR #10966)
_has_system_user_api = hasattr(folder_paths, 'get_system_user_directory')
if _has_system_user_api:
manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), '__manager'))
else:
manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), 'default', 'ComfyUI-Manager'))
manager_pip_overrides_path = os.path.join(manager_files_path, "pip_overrides.json")
manager_pip_blacklist_path = os.path.join(manager_files_path, "pip_blacklist.list")
restore_snapshot_path = os.path.join(manager_files_path, "startup-scripts", "restore-snapshot.json")
@ -516,7 +524,8 @@ check_bypass_ssl()
# Perform install
processed_install = set()
script_list_path = os.path.join(folder_paths.user_directory, "default", "ComfyUI-Manager", "startup-scripts", "install-scripts.txt")
# Use manager_files_path for consistency (fixes path inconsistency bug)
script_list_path = os.path.join(manager_files_path, "startup-scripts", "install-scripts.txt")
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, manager_files_path)
@ -793,7 +802,11 @@ def execute_startup_script():
# Check if script_list_path exists
if os.path.exists(script_list_path):
# Block startup-scripts on old ComfyUI (security measure)
if not _has_system_user_api:
if os.path.exists(script_list_path):
print("[ComfyUI-Manager] Startup scripts blocked on old ComfyUI version.")
elif os.path.exists(script_list_path):
execute_startup_script()

View File

@ -1,7 +1,7 @@
[project]
name = "comfyui-manager"
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
version = "3.37.2"
version = "3.38.1"
license = { file = "LICENSE.txt" }
dependencies = ["GitPython", "PyGithub", "matrix-nio", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]