diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml new file mode 100644 index 00000000..4c1a0259 --- /dev/null +++ b/.github/workflows/ruff.yml @@ -0,0 +1,23 @@ +name: Python Linting + +on: [push, pull_request] + +jobs: + ruff: + name: Run Ruff + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + + - name: Install Ruff + run: pip install ruff + + - name: Run Ruff + run: ruff check . diff --git a/.gitignore b/.gitignore index fb07dcff..33ee743b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ __pycache__/ .idea/ .vscode/ +.history/ +*.code-workspace .tmp .cache config.ini @@ -15,3 +17,4 @@ github-stats-cache.json pip_overrides.json *.json check2.sh +/venv/ \ No newline at end of file diff --git a/README.md b/README.md index 03b63335..f4ac73ea 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,10 @@ **ComfyUI-Manager** is an extension designed to enhance the usability of [ComfyUI](https://github.com/comfyanonymous/ComfyUI). It offers management functions to **install, remove, disable, and enable** various custom nodes of ComfyUI. Furthermore, this extension provides a hub feature and convenience functions to access a wide range of information within ComfyUI. -![menu](misc/menu.jpg) +![menu](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/dialog.jpg) ## NOTICE -* V2.48.1: Security policy has been changed. Downloads of models in the list are allowed under the 'normal' security level. -* V2.47: Security policy has been changed. The former 'normal' is now 'normal-', and 'normal' no longer allows high-risk features, even if your ComfyUI is local. -* V2.37 Show a ✅ mark to accounts that have been active on GitHub for more than six months. -* V2.33 Security policy is applied. -* V2.21 [cm-cli](docs/en/cm-cli.md) tool is added. -* V2.18 to V2.18.3 is not functioning due to a severe bug. Users on these versions are advised to promptly update to V2.18.4. Please navigate to the `ComfyUI/custom_nodes/ComfyUI-Manager` directory and execute `git pull` to update. +* V3.3.2: Overhauled. Officially supports [https://comfyregistry.org/](https://comfyregistry.org/). * You can see whole nodes info on [ComfyUI Nodes Info](https://ltdrdata.github.io/) page. ## Installation @@ -20,7 +15,7 @@ To install ComfyUI-Manager in addition to an existing installation of ComfyUI, you can follow the following steps: 1. goto `ComfyUI/custom_nodes` dir in terminal(cmd) -2. `git clone https://github.com/ltdrdata/ComfyUI-Manager.git` +2. `git clone https://github.com/ltdrdata/ComfyUI-Manager comfyui-manager` 3. Restart ComfyUI @@ -32,7 +27,7 @@ To install ComfyUI-Manager in addition to an existing installation of ComfyUI, y 2. Download [scripts/install-manager-for-portable-version.bat](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/install-manager-for-portable-version.bat) into installed `"ComfyUI_windows_portable"` directory 3. double click `install-manager-for-portable-version.bat` batch file -![portable-install](misc/portable-install.png) +![portable-install](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/portable-install.jpg) ### Installation[method3] (Installation through comfy-cli: install ComfyUI and ComfyUI-Manager at once.) @@ -68,15 +63,13 @@ To install ComfyUI with ComfyUI-Manager on Linux using a venv environment, you c 3. `./install-comfyui-venv-linux.sh` ### Installation Precautions -* **DO**: `ComfyUI-Manager` files must be accurately located in the path `ComfyUI/custom_nodes/ComfyUI-Manager` +* **DO**: `ComfyUI-Manager` files must be accurately located in the path `ComfyUI/custom_nodes/comfyui-manager` * Installing in a compressed file format is not recommended. * **DON'T**: Decompress directly into the `ComfyUI/custom_nodes` location, resulting in the Manager contents like `__init__.py` being placed directly in that directory. * You have to remove all ComfyUI-Manager files from `ComfyUI/custom_nodes` * **DON'T**: In a form where decompression occurs in a path such as `ComfyUI/custom_nodes/ComfyUI-Manager/ComfyUI-Manager`. - * You have to move `ComfyUI/custom_nodes/ComfyUI-Manager/ComfyUI-Manager` to `ComfyUI/custom_nodes/ComfyUI-Manager` * **DON'T**: In a form where decompression occurs in a path such as `ComfyUI/custom_nodes/ComfyUI-Manager-main`. - * In such cases, `ComfyUI-Manager` may operate, but it won't be recognized within `ComfyUI-Manager`, and updates cannot be performed. It also poses the risk of duplicate installations. - * You have to rename `ComfyUI/custom_nodes/ComfyUI-Manager-main` to `ComfyUI/custom_nodes/ComfyUI-Manager` + * In such cases, `ComfyUI-Manager` may operate, but it won't be recognized within `ComfyUI-Manager`, and updates cannot be performed. It also poses the risk of duplicate installations. Remove it and install properly via `git clone` method. You can execute ComfyUI by running either `./run_gpu.sh` or `./run_cpu.sh` depending on your system configuration. @@ -87,42 +80,17 @@ This repository provides Colab notebooks that allow you to install and use Comfy * Support for basic installation of ComfyUI-Manager * Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks. -## Changes -* **2.38** `Install Custom Nodes` menu is changed to `Custom Nodes Manager`. -* **2.21** [cm-cli](docs/en/cm-cli.md) tool is added. -* **2.4** Copy the connections of the nearest node by double-clicking. -* **2.2.3** Support Components System -* **0.29** Add `Update all` feature -* **0.25** support db channel - * You can directly modify the db channel settings in the `config.ini` file. - * If you want to maintain a new DB channel, please modify the `channels.list` and submit a PR. -* **0.23** support multiple selection -* **0.18.1** `skip update check` feature added. - * A feature that allows quickly opening windows in environments where update checks take a long time. -* **0.17.1** Bug fix for the issue where enable/disable of the web extension was not working. Compatibility patch for StableSwarmUI. - * Requires latest version of ComfyUI (Revision: 1240) -* **0.17** Support preview method setting feature. -* **0.14** Support robust update. -* **0.13** Support additional 'pip' section for install spec. -* **0.12** Better installation support for Windows. -* **0.9** Support keyword search in installer menu. -* **V0.7.1** Bug fix for the issue where updates were not being applied on Windows. - * **For those who have been using versions 0.6, please perform a manual git pull in the custom_nodes/ComfyUI-Manager directory.** -* **V0.7** To address the issue of a slow list refresh, separate the fetch update and update check processes. -* **V0.6** Support extension installation for missing nodes. -* **V0.5** Removed external git program dependencies. - ## How To Use 1. Click "Manager" button on main menu - ![mainmenu](misc/main.jpg) + ![mainmenu](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/topbar.jpg) 2. If you click on 'Install Custom Nodes' or 'Install Models', an installer dialog will open. - ![menu](misc/menu.jpg) + ![menu](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/dialog.jpg) * There are three DB modes: `DB: Channel (1day cache)`, `DB: Local`, and `DB: Channel (remote)`. * `Channel (1day cache)` utilizes Channel cache information with a validity period of one day to quickly display the list. @@ -138,9 +106,9 @@ This repository provides Colab notebooks that allow you to install and use Comfy 3. Click 'Install' or 'Try Install' button. - ![node-install-dialog](misc/custom-nodes.jpg) + ![node-install-dialog](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/custom-nodes.jpg) - ![model-install-dialog](misc/models.png) + ![model-install-dialog](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/models.jpg) * Installed: This item is already installed. * Install: Clicking this button will install the item. @@ -150,39 +118,46 @@ This repository provides Colab notebooks that allow you to install and use Comfy * Channel settings have a broad impact, affecting not only the node list but also all functions like "Update all." * Conflicted Nodes with a yellow background show a list of nodes conflicting with other extensions in the respective extension. This issue needs to be addressed by the developer, and users should be aware that due to these conflicts, some nodes may not function correctly and may need to be installed accordingly. -4. If you set the `Badge:` item in the menu as `Badge: Nickname`, `Badge: Nickname (hide built-in)`, `Badge: #ID Nickname`, `Badge: #ID Nickname (hide built-in)` the information badge will be displayed on the node. - * When selecting (hide built-in), it hides the 🦊 icon, which signifies built-in nodes. - * Nodes without any indication on the badge are custom nodes that Manager cannot recognize. - * `Badge: Nickname` displays the nickname of custom nodes, while `Badge: #ID Nickname` also includes the internal ID of the node. - - ![model-install-dialog](misc/nickname.jpg) - - -5. Share - ![menu](misc/main.jpg) ![share](misc/share.jpg) +4. Share + ![menu](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/topbar.jpg) ![share](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/share.jpg) * You can share the workflow by clicking the Share button at the bottom of the main menu or selecting Share Output from the Context Menu of the Image node. * Currently, it supports sharing via [https://comfyworkflows.com/](https://comfyworkflows.com/), [https://openart.ai](https://openart.ai/workflows/dev), [https://youml.com](https://youml.com) as well as through the Matrix channel. - ![menu](misc/share-setting.jpg) + ![menu](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/share-setting.jpg) - * Through the Share settings in the Manager menu, you can configure the behavior of the Share button in the Main menu or Share Ouput button on Context Menu. + * Through the Share settings in the Manager menu, you can configure the behavior of the Share button in the Main menu or Share Output button on Context Menu. * `None`: hide from Main menu * `All`: Show a dialog where the user can select a title for sharing. +## Paths +In `ComfyUI-Manager` V3.0 and later, configuration files and dynamically generated files are located under `/default/ComfyUI-Manager/`. + +* + * If executed without any options, the path defaults to ComfyUI/user. + * It can be set using --user-directory . + +* Basic config files: `/default/ComfyUI-Manager/config.ini` +* Configurable channel lists: `/default/ComfyUI-Manager/channels.ini` +* Configurable pip overrides: `/default/ComfyUI-Manager/pip_overrides.json` +* Saved snapshot files: `/default/ComfyUI-Manager/snapshots` +* Startup script files: `/default/ComfyUI-Manager/startup-scripts` +* Component files: `/default/ComfyUI-Manager/components` + + ## Snapshot-Manager * When you press `Save snapshot` or use `Update All` on `Manager Menu`, the current installation status snapshot is saved. - * Snapshot file dir: `ComfyUI-Manager/snapshots` + * Snapshot file dir: `/default/ComfyUI-Manager/snapshots` * You can rename snapshot file. * Press the "Restore" button to revert to the installation status of the respective snapshot. * However, for custom nodes not managed by Git, snapshot support is incomplete. * When you press `Restore`, it will take effect on the next ComfyUI startup. - * The selected snapshot file is saved in `ComfyUI-Manager/startup-scripts/restore-snapshot.json`, and upon restarting ComfyUI, the snapshot is applied and then deleted. + * The selected snapshot file is saved in `/default/ComfyUI-Manager/startup-scripts/restore-snapshot.json`, and upon restarting ComfyUI, the snapshot is applied and then deleted. -![model-install-dialog](misc/snapshot.jpg) +![model-install-dialog](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/snapshot.jpg) ## cm-cli: command line tools for power user @@ -199,38 +174,7 @@ This repository provides Colab notebooks that allow you to install and use Comfy ## Custom node support guide -* Currently, the system operates by cloning the git repository and sequentially installing the dependencies listed in requirements.txt using pip, followed by invoking the install.py script. In the future, we plan to discuss and determine the specifications for supporting custom nodes. - -* Please submit a pull request to update either the custom-node-list.json or model-list.json file. - -* The scanner currently provides a detection function for missing nodes, which is capable of detecting nodes described by the following two patterns. - -``` -NODE_CLASS_MAPPINGS = { - "ExecutionSwitch": ExecutionSwitch, - "ExecutionBlocker": ExecutionBlocker, - ... -} - -NODE_CLASS_MAPPINGS.update({ - "UniFormer-SemSegPreprocessor": Uniformer_SemSegPreprocessor, - "SemSegPreprocessor": Uniformer_SemSegPreprocessor, -}) -``` - * Or you can provide manually `node_list.json` file. - -* When you write a docstring in the header of the .py file for the Node as follows, it will be used for managing the database in the Manager. - * Currently, only the `nickname` is being used, but other parts will also be utilized in the future. - * The `nickname` will be the name displayed on the badge of the node. - * If there is no `nickname`, it will be truncated to 20 characters from the arbitrarily written title and used. -``` -""" -@author: Dr.Lt.Data -@title: Impact Pack -@nickname: Impact Pack -@description: This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler. -""" -``` +* https://docs.comfy.org/registry/overview * **Special purpose files** (optional) @@ -259,12 +203,12 @@ NODE_CLASS_MAPPINGS.update({ } ``` * `` Ensure that the timestamp is always unique. - * "components" should have the same structure as the content of the file stored in ComfyUI-Manager/components. + * "components" should have the same structure as the content of the file stored in `/default/ComfyUI-Manager/components`. * ``: The name should be in the format `::`. * ``: In the nodedata of the group node. * ``: Only two formats are allowed: `major.minor.patch` or `major.minor`. (e.g. `1.0`, `2.2.1`) * ``: Saved time - * ``: If the packname is not empty, the category becomes packname/workflow, and it is saved in the .pack file in ComfyUI-Manager/components. + * ``: If the packname is not empty, the category becomes packname/workflow, and it is saved in the .pack file in `/default/ComfyUI-Manager/components`. * ``: If there is neither a category nor a packname, it is saved in the components category. ``` "version":"1.0", @@ -281,11 +225,11 @@ NODE_CLASS_MAPPINGS.update({ ## Support of missing nodes installation -![missing-menu](misc/missing-menu.jpg) +![missing-menu](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/missing-menu.jpg) * When you click on the ```Install Missing Custom Nodes``` button in the menu, it displays a list of extension nodes that contain nodes not currently present in the workflow. -![missing-list](misc/missing-list.jpg) +![missing-list](https://raw.githubusercontent.com/ltdrdata/ComfyUI-extension-tutorials/Main/ComfyUI-Manager/images/missing-list.jpg) ## Additional Feature @@ -320,6 +264,9 @@ NODE_CLASS_MAPPINGS.update({ * Use `aria2` as downloader * [howto](docs/en/use_aria2.md) +* If you add the item `skip_migration_check = True` to `config.ini`, it will not check whether there are nodes that can be migrated at startup. + * This option can be used if performance issues occur in a Colab+GDrive environment. + ## Scanner When you run the `scan.sh` script: @@ -336,12 +283,8 @@ When you run the `scan.sh` script: ## Troubleshooting -* If your `git.exe` is installed in a specific location other than system git, please install ComfyUI-Manager and run ComfyUI. Then, specify the path including the file name in `git_exe = ` in the ComfyUI-Manager/config.ini file that is generated. +* If your `git.exe` is installed in a specific location other than system git, please install ComfyUI-Manager and run ComfyUI. Then, specify the path including the file name in `git_exe = ` in the `/default/ComfyUI-Manager/config.ini` file that is generated. * If updating ComfyUI-Manager itself fails, please go to the **ComfyUI-Manager** directory and execute the command `git update-ref refs/remotes/origin/main a361cc1 && git fetch --all && git pull`. - * Alternatively, download the update-fix.py script from [update-fix.py](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/update-fix.py) and place it in the ComfyUI-Manager directory. Then, run it using your Python command. - For the portable version, use `..\..\..\python_embeded\python.exe update-fix.py`. -* For cases where nodes like `PreviewTextNode` from `ComfyUI_Custom_Nodes_AlekPet` are only supported as front-end nodes, we currently do not provide missing nodes for them. -* Currently, `vid2vid` is not being updated, causing compatibility issues. * If you encounter the error message `Overlapped Object has pending operation at deallocation on Comfyui Manager load` under Windows * Edit `config.ini` file: add `windows_selector_event_loop_policy = True` * if `SSL: CERTIFICATE_VERIFY_FAILED` error is occured. @@ -375,41 +318,6 @@ When you run the `scan.sh` script: * Update ComfyUI -## TODO: Unconventional form of custom node list - -* https://github.com/diontimmer/Sample-Diffusion-ComfyUI-Extension -* https://github.com/senshilabs/NINJA-plugin -* https://github.com/MockbaTheBorg/Nodes -* https://github.com/StartHua/Comfyui_GPT_Story -* https://github.com/NielsGercama/comfyui_customsampling -* https://github.com/wrightdaniel2017/ComfyUI-VideoLipSync -* https://github.com/bxdsjs/ComfyUI-Image-preprocessing -* https://github.com/SMUELDigital/ComfyUI-ONSET -* https://github.com/SimithWang/comfyui-renameImages -* https://github.com/icefairy64/comfyui-model-tilt -* https://github.com/andrewharp/ComfyUI-EasyNodes -* https://github.com/SimithWang/comfyui-renameImages -* https://github.com/Tcheko243/ComfyUI-Photographer-Alpha7-Nodes -* https://github.com/Limbicnation/ComfyUINodeToolbox -* https://github.com/APZmedia/ComfyUI-APZmedia-srtTools - -## Roadmap - -- [x] System displaying information about failed custom nodes import. -- [x] Guide for missing nodes in ComfyUI vanilla nodes. -- [x] Collision checking system for nodes with the same ID across extensions. -- [x] Template sharing system. (-> Component system based on Group Nodes) -- [x] 3rd party API system. -- [ ] Auto migration for custom nodes with changed structures. -- [ ] Version control feature for nodes. -- [ ] List of currently used custom nodes. -- [x] Download support multiple model download. -- [x] Model download via url. -- [x] List sorting (custom nodes). -- [x] List sorting (model). -- [ ] Provides description of node. - - # Disclaimer * This extension simply provides the convenience of installing custom nodes and does not guarantee their proper functioning. diff --git a/__init__.py b/__init__.py index a3b2e649..6a63dbe5 100644 --- a/__init__.py +++ b/__init__.py @@ -5,11 +5,11 @@ cli_mode_flag = os.path.join(os.path.dirname(__file__), '.enable-cli-only-mode') if not os.path.exists(cli_mode_flag): sys.path.append(os.path.join(os.path.dirname(__file__), "glob")) - import manager_server - import share_3rdparty + import manager_server # noqa: F401 + import share_3rdparty # noqa: F401 WEB_DIRECTORY = "js" else: - print(f"\n[ComfyUI-Manager] !! cli-only-mode is enabled !!\n") + print("\n[ComfyUI-Manager] !! cli-only-mode is enabled !!\n") NODE_CLASS_MAPPINGS = {} __all__ = ['NODE_CLASS_MAPPINGS'] diff --git a/check.sh b/check.sh index d0df44b8..ef5c873b 100755 --- a/check.sh +++ b/check.sh @@ -9,6 +9,7 @@ files=( "alter-list.json" "extension-node-map.json" "github-stats.json" + "extras.json" "node_db/new/custom-node-list.json" "node_db/new/model-list.json" "node_db/new/extension-node-map.json" diff --git a/cm-cli.py b/cm-cli.py index cb0e7c98..80dde26e 100644 --- a/cm-cli.py +++ b/cm-cli.py @@ -3,8 +3,6 @@ import sys import traceback import json import asyncio -import subprocess -import shutil import concurrent import threading from typing import Optional @@ -14,55 +12,67 @@ from rich import print from typing_extensions import List, Annotated import re import git +import importlib + sys.path.append(os.path.dirname(__file__)) sys.path.append(os.path.join(os.path.dirname(__file__), "glob")) -import manager_core as core -import cm_global -comfyui_manager_path = os.path.dirname(__file__) +import manager_util + +comfy_path = os.environ.get('COMFYUI_PATH') +if comfy_path is None: + try: + import folder_paths + comfy_path = os.path.join(os.path.dirname(folder_paths.__file__)) + except: + comfy_path = os.path.abspath(os.path.join(manager_util.comfyui_manager_path, '..', '..')) + +sys.path.append(comfy_path) + +import utils.extra_config +import cm_global +import manager_core as core +from manager_core import unified_manager +import cnr_utils + + + +comfyui_manager_path = os.path.abspath(os.path.dirname(__file__)) comfy_path = os.environ.get('COMFYUI_PATH') if comfy_path is None: - print(f"\n[bold yellow]WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.[/bold yellow]", file=sys.stderr) + print("\n[bold yellow]WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.[/bold yellow]", file=sys.stderr) comfy_path = os.path.abspath(os.path.join(comfyui_manager_path, '..', '..')) -startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts") -custom_nodes_path = os.path.join(comfy_path, 'custom_nodes') - -script_path = os.path.join(startup_script_path, "install-scripts.txt") -restore_snapshot_path = os.path.join(startup_script_path, "restore-snapshot.json") -pip_overrides_path = os.path.join(comfyui_manager_path, "pip_overrides.json") -git_script_path = os.path.join(comfyui_manager_path, "git_helper.py") cm_global.pip_blacklist = ['torch', 'torchsde', 'torchvision'] cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia'] -cm_global.pip_overrides = {} -if os.path.exists(pip_overrides_path): - with open(pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file: +cm_global.pip_overrides = {'numpy': 'numpy<2'} + +if os.path.exists(os.path.join(manager_util.comfyui_manager_path, "pip_overrides.json")): + with open(os.path.join(manager_util.comfyui_manager_path, "pip_overrides.json"), 'r', encoding="UTF-8", errors="ignore") as json_file: cm_global.pip_overrides = json.load(json_file) - cm_global.pip_overrides['numpy'] = 'numpy<2' def check_comfyui_hash(): repo = git.Repo(comfy_path) core.comfy_ui_revision = len(list(repo.iter_commits('HEAD'))) - comfy_ui_hash = repo.head.commit.hexsha cm_global.variables['comfyui.revision'] = core.comfy_ui_revision core.comfy_ui_commit_datetime = repo.head.commit.committed_datetime check_comfyui_hash() # This is a preparation step for manager_core +core.check_invalid_nodes() def read_downgrade_blacklist(): try: import configparser - config_path = os.path.join(os.path.dirname(__file__), "config.ini") config = configparser.ConfigParser() - config.read(config_path) + config.read(core.manager_config.path) default_conf = config['default'] if 'downgrade_blacklist' in default_conf: @@ -78,11 +88,20 @@ read_downgrade_blacklist() # This is a preparation step for manager_core class Ctx: + folder_paths = None + def __init__(self): self.channel = 'default' - self.mode = 'remote' - self.processed_install = set() - self.custom_node_map_cache = None + self.no_deps = False + self.mode = 'cache' + self.user_directory = None + self.custom_nodes_paths = [os.path.join(core.comfy_path, 'custom_nodes')] + + if Ctx.folder_paths is None: + try: + Ctx.folder_paths = importlib.import_module('folder_paths') + except ImportError: + print("Warning: Unable to import folder_paths module") def set_channel_mode(self, channel, mode): if mode is not None: @@ -99,196 +118,180 @@ class Ctx: if channel is not None: self.channel = channel - def post_install(self, url): - try: - repository_name = url.split("/")[-1].strip() - repo_path = os.path.join(custom_nodes_path, repository_name) - repo_path = os.path.abspath(repo_path) + asyncio.run(unified_manager.reload(cache_mode=self.mode == 'cache')) + asyncio.run(unified_manager.load_nightly(self.channel, self.mode)) - requirements_path = os.path.join(repo_path, 'requirements.txt') - install_script_path = os.path.join(repo_path, 'install.py') + def set_no_deps(self, no_deps): + self.no_deps = no_deps - if os.path.exists(requirements_path): - with open(requirements_path, 'r', encoding="UTF-8", errors="ignore") as file: - for line in file: - package_name = core.remap_pip_package(line.strip()) - if package_name and not core.is_installed(package_name): - install_cmd = [sys.executable, "-m", "pip", "install", package_name] - output = subprocess.check_output(install_cmd, cwd=repo_path, text=True) - for msg_line in output.split('\n'): - if 'Requirement already satisfied:' in msg_line: - print('.', end='') - else: - print(msg_line) + def set_user_directory(self, user_directory): + if user_directory is None: + return - if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in self.processed_install: - self.processed_install.add(f'{repo_path}/install.py') - install_cmd = [sys.executable, install_script_path] - output = subprocess.check_output(install_cmd, cwd=repo_path, text=True) - for msg_line in output.split('\n'): - if 'Requirement already satisfied:' in msg_line: - print('.', end='') - else: - print(msg_line) + extra_model_paths_yaml = os.path.join(user_directory, 'extra_model_paths.yaml') + if os.path.exists(extra_model_paths_yaml): + utils.extra_config.load_extra_path_config(extra_model_paths_yaml) - except Exception: - print(f"ERROR: Restoring '{url}' is failed.") + core.update_user_directory(user_directory) - def restore_dependencies(self): - node_paths = [os.path.join(custom_nodes_path, name) for name in os.listdir(custom_nodes_path) - if os.path.isdir(os.path.join(custom_nodes_path, name)) and not name.endswith('.disabled')] + if os.path.exists(core.manager_pip_overrides_path): + with open(core.manager_pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file: + cm_global.pip_overrides = json.load(json_file) + cm_global.pip_overrides = {'numpy': 'numpy<2'} - total = len(node_paths) - i = 1 - for x in node_paths: - print(f"----------------------------------------------------------------------------------------------------") - print(f"Restoring [{i}/{total}]: {x}") - self.post_install(x) - i += 1 + @staticmethod + def get_startup_scripts_path(): + return os.path.join(core.manager_startup_script_path, "install-scripts.txt") - def load_custom_nodes(self): - channel_dict = core.get_channel_dict() - if self.channel not in channel_dict: - print(f"[bold red]ERROR: Invalid channel is specified `--channel {self.channel}`[/bold red]", file=sys.stderr) - exit(1) + @staticmethod + def get_restore_snapshot_path(): + return os.path.join(core.manager_startup_script_path, "restore-snapshot.json") - if self.mode not in ['remote', 'local', 'cache']: - print(f"[bold red]ERROR: Invalid mode is specified `--mode {self.mode}`[/bold red]", file=sys.stderr) - exit(1) + @staticmethod + def get_snapshot_path(): + return core.manager_snapshot_path - channel_url = channel_dict[self.channel] - - res = {} - json_obj = asyncio.run(core.get_data_by_mode(self.mode, 'custom-node-list.json', channel_url=channel_url)) - for x in json_obj['custom_nodes']: - for y in x['files']: - if 'github.com' in y and not (y.endswith('.py') or y.endswith('.js')): - repo_name = y.split('/')[-1] - res[repo_name] = (x, False) - - if 'id' in x: - if x['id'] not in res: - res[x['id']] = (x, True) - - return res - - def get_custom_node_map(self): - if self.custom_node_map_cache is not None: - return self.custom_node_map_cache - - self.custom_node_map_cache = self.load_custom_nodes() - - return self.custom_node_map_cache - - def lookup_node_path(self, node_name, robust=False): - if '..' in node_name: - print(f"\n[bold red]ERROR: Invalid node name '{node_name}'[/bold red]\n") - exit(2) - - custom_node_map = self.get_custom_node_map() - if node_name in custom_node_map: - node_url = custom_node_map[node_name][0]['files'][0] - repo_name = node_url.split('/')[-1] - node_path = os.path.join(custom_nodes_path, repo_name) - return node_path, custom_node_map[node_name][0] - elif robust: - node_path = os.path.join(custom_nodes_path, node_name) - return node_path, None - - print(f"\n[bold red]ERROR: Invalid node name '{node_name}'[/bold red]\n") - exit(2) + @staticmethod + def get_custom_nodes_paths(): + if Ctx.folder_paths is None: + print("Error: folder_paths module is not available") + return [] + return Ctx.folder_paths.get_folder_paths('custom_nodes') -cm_ctx = Ctx() +cmd_ctx = Ctx() -def install_node(node_name, is_all=False, cnt_msg=''): - if core.is_valid_url(node_name): +def install_node(node_spec_str, is_all=False, cnt_msg=''): + if core.is_valid_url(node_spec_str): # install via urls - res = core.gitclone_install([node_name]) - if not res: - print(f"[bold red]ERROR: An error occurred while installing '{node_name}'.[/bold red]") + res = asyncio.run(core.gitclone_install(node_spec_str, no_deps=cmd_ctx.no_deps)) + if not res.result: + print(res.msg) + print(f"[bold red]ERROR: An error occurred while installing '{node_spec_str}'.[/bold red]") else: - print(f"{cnt_msg} [INSTALLED] {node_name:50}") + print(f"{cnt_msg} [INSTALLED] {node_spec_str:50}") else: - node_path, node_item = cm_ctx.lookup_node_path(node_name) + node_spec = unified_manager.resolve_node_spec(node_spec_str) - if os.path.exists(node_path): - if not is_all: - print(f"{cnt_msg} [ SKIPPED ] {node_name:50} => Already installed") - elif os.path.exists(node_path + '.disabled'): - enable_node(node_name) + if node_spec is None: + return + + node_name, version_spec, is_specified = node_spec + + # NOTE: install node doesn't allow update if version is not specified + if not is_specified: + version_spec = None + + res = asyncio.run(unified_manager.install_by_id(node_name, version_spec, cmd_ctx.channel, cmd_ctx.mode, instant_execution=True, no_deps=cmd_ctx.no_deps)) + + if res.action == 'skip': + print(f"{cnt_msg} [ SKIP ] {node_name:50} => Already installed") + elif res.action == 'enable': + print(f"{cnt_msg} [ ENABLED ] {node_name:50}") + elif res.action == 'install-git' and res.target == 'nightly': + print(f"{cnt_msg} [INSTALLED] {node_name:50}[NIGHTLY]") + elif res.action == 'install-git' and res.target == 'unknown': + print(f"{cnt_msg} [INSTALLED] {node_name:50}[UNKNOWN]") + elif res.action == 'install-cnr' and res.result: + print(f"{cnt_msg} [INSTALLED] {node_name:50}[{res.target}]") + elif res.action == 'switch-cnr' and res.result: + print(f"{cnt_msg} [INSTALLED] {node_name:50}[{res.target}]") + elif (res.action == 'switch-cnr' or res.action == 'install-cnr') and not res.result and node_name in unified_manager.cnr_map: + print(f"\nAvailable version of '{node_name}'") + show_versions(node_name) + print("") else: - res = core.gitclone_install(node_item['files'], instant_execution=True, msg_prefix=f"[{cnt_msg}] ") - if not res: - print(f"[bold red]ERROR: An error occurred while installing '{node_name}'.[/bold red]") - else: - print(f"{cnt_msg} [INSTALLED] {node_name:50}") + print(f"[bold red]ERROR: An error occurred while installing '{node_name}'.\n{res.msg}[/bold red]") -def reinstall_node(node_name, is_all=False, cnt_msg=''): - node_path, node_item = cm_ctx.lookup_node_path(node_name) +def reinstall_node(node_spec_str, is_all=False, cnt_msg=''): + node_spec = unified_manager.resolve_node_spec(node_spec_str) - if os.path.exists(node_path): - shutil.rmtree(node_path) - if os.path.exists(node_path + '.disabled'): - shutil.rmtree(node_path + '.disabled') + node_name, version_spec, _ = node_spec + unified_manager.unified_uninstall(node_name, version_spec == 'unknown') install_node(node_name, is_all=is_all, cnt_msg=cnt_msg) -def fix_node(node_name, is_all=False, cnt_msg=''): - node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) +def fix_node(node_spec_str, is_all=False, cnt_msg=''): + node_spec = unified_manager.resolve_node_spec(node_spec_str, guess_mode='active') - files = node_item['files'] if node_item is not None else [node_path] + if node_spec is None: + if not is_all: + if unified_manager.resolve_node_spec(node_spec_str, guess_mode='inactive') is not None: + print(f"{cnt_msg} [ SKIPPED ]: {node_spec_str:50} => Disabled") + else: + print(f"{cnt_msg} [ SKIPPED ]: {node_spec_str:50} => Not installed") - if os.path.exists(node_path): - print(f"{cnt_msg} [ FIXING ]: {node_name:50} => Disabled") - res = core.gitclone_fix(files, instant_execution=True) - if not res: - print(f"ERROR: An error occurred while fixing '{node_name}'.") - elif not is_all and os.path.exists(node_path + '.disabled'): - print(f"{cnt_msg} [ SKIPPED ]: {node_name:50} => Disabled") - elif not is_all: - print(f"{cnt_msg} [ SKIPPED ]: {node_name:50} => Not installed") + return + + node_name, version_spec, _ = node_spec + + print(f"{cnt_msg} [ FIXING ]: {node_name:50}[{version_spec}]") + res = unified_manager.unified_fix(node_name, version_spec, no_deps=cmd_ctx.no_deps) + + if not res.result: + print(f"ERROR: f{res.msg}") -def uninstall_node(node_name, is_all=False, cnt_msg=''): - node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) - - files = node_item['files'] if node_item is not None else [node_path] - - if os.path.exists(node_path) or os.path.exists(node_path + '.disabled'): - res = core.gitclone_uninstall(files) - if not res: - print(f"ERROR: An error occurred while uninstalling '{node_name}'.") - else: - print(f"{cnt_msg} [UNINSTALLED] {node_name:50}") +def uninstall_node(node_spec_str: str, is_all: bool = False, cnt_msg: str = ''): + spec = node_spec_str.split('@') + if len(spec) == 2 and spec[1] == 'unknown': + node_name = spec[0] + is_unknown = True else: + node_name = spec[0] + is_unknown = False + + res = unified_manager.unified_uninstall(node_name, is_unknown) + if len(spec) == 1 and res.action == 'skip' and not is_unknown: + res = unified_manager.unified_uninstall(node_name, True) + + if res.action == 'skip': print(f"{cnt_msg} [ SKIPPED ]: {node_name:50} => Not installed") + elif res.result: + print(f"{cnt_msg} [UNINSTALLED] {node_name:50}") + else: + print(f"ERROR: An error occurred while uninstalling '{node_name}'.") -def update_node(node_name, is_all=False, cnt_msg=''): - node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) - files = node_item['files'] if node_item is not None else [node_path] +def update_node(node_spec_str, is_all=False, cnt_msg=''): + node_spec = unified_manager.resolve_node_spec(node_spec_str, 'active') - res = core.gitclone_update(files, skip_script=True, msg_prefix=f"[{cnt_msg}] ") - - if not res: - print(f"ERROR: An error occurred while updating '{node_name}'.") + if node_spec is None: + if unified_manager.resolve_node_spec(node_spec_str, 'inactive'): + print(f"{cnt_msg} [ SKIPPED ]: {node_spec_str:50} => Disabled") + else: + print(f"{cnt_msg} [ SKIPPED ]: {node_spec_str:50} => Not installed") return None - return node_path + node_name, version_spec, _ = node_spec + + res = unified_manager.unified_update(node_name, version_spec, no_deps=cmd_ctx.no_deps, return_postinstall=True) + + if not res.result: + print(f"ERROR: An error occurred while updating '{node_name}'.") + elif res.action == 'skip': + print(f"{cnt_msg} [ SKIPPED ]: {node_name:50} => {res.msg}") + else: + print(f"{cnt_msg} [ UPDATED ]: {node_name:50} => ({version_spec} -> {res.target})") + + return res.with_target(f'{node_name}@{res.target}') def update_parallel(nodes): is_all = False if 'all' in nodes: is_all = True - nodes = [x for x in cm_ctx.get_custom_node_map().keys() if os.path.exists(os.path.join(custom_nodes_path, x)) or os.path.exists(os.path.join(custom_nodes_path, x) + '.disabled')] - - nodes = [x for x in nodes if x.lower() not in ['comfy', 'comfyui', 'all']] + nodes = [] + for x in unified_manager.active_nodes.keys(): + nodes.append(x) + for x in unified_manager.unknown_active_nodes.keys(): + nodes.append(x+"@unknown") + else: + nodes = [x for x in nodes if x.lower() not in ['comfy', 'comfyui']] total = len(nodes) @@ -305,9 +308,9 @@ def update_parallel(nodes): i += 1 try: - node_path = update_node(x, is_all=is_all, cnt_msg=f'{i}/{total}') + res = update_node(x, is_all=is_all, cnt_msg=f'{i}/{total}') with lock: - processed.append(node_path) + processed.append(res) except Exception as e: print(f"ERROR: {e}") traceback.print_exc() @@ -317,12 +320,11 @@ def update_parallel(nodes): executor.submit(process_custom_node, item) i = 1 - for node_path in processed: - if node_path is None: - print(f"[{i}/{total}] Post update: ERROR") - else: - print(f"[{i}/{total}] Post update: {node_path}") - cm_ctx.post_install(node_path) + for res in processed: + if res is not None: + print(f"[{i}/{total}] Post update: {res.target}") + if res.postinstall is not None: + res.postinstall() i += 1 @@ -336,104 +338,162 @@ def update_comfyui(): print("ComfyUI is already up to date.") -def enable_node(node_name, is_all=False, cnt_msg=''): - if node_name == 'ComfyUI-Manager': +def enable_node(node_spec_str, is_all=False, cnt_msg=''): + if unified_manager.resolve_node_spec(node_spec_str, guess_mode='active') is not None: + print(f"{cnt_msg} [ SKIP ] {node_spec_str:50} => Already enabled") return - node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) + node_spec = unified_manager.resolve_node_spec(node_spec_str, guess_mode='inactive') - if os.path.exists(node_path + '.disabled'): - current_name = node_path + '.disabled' - os.rename(current_name, node_path) + if node_spec is None: + print(f"{cnt_msg} [ SKIP ] {node_spec_str:50} => Not found") + return + + node_name, version_spec, _ = node_spec + + res = unified_manager.unified_enable(node_name, version_spec) + + if res.action == 'skip': + print(f"{cnt_msg} [ SKIP ] {node_name:50} => {res.msg}") + elif res.result: print(f"{cnt_msg} [ENABLED] {node_name:50}") - elif os.path.exists(node_path): - print(f"{cnt_msg} [SKIPPED] {node_name:50} => Already enabled") - elif not is_all: - print(f"{cnt_msg} [SKIPPED] {node_name:50} => Not installed") + else: + print(f"{cnt_msg} [ FAIL ] {node_name:50} => {res.msg}") -def disable_node(node_name, is_all=False, cnt_msg=''): - if node_name == 'ComfyUI-Manager': +def disable_node(node_spec_str: str, is_all=False, cnt_msg=''): + if 'comfyui-manager' in node_spec_str.lower(): return - node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) + node_spec = unified_manager.resolve_node_spec(node_spec_str, guess_mode='active') - if os.path.exists(node_path): - current_name = node_path - new_name = node_path + '.disabled' - os.rename(current_name, new_name) + if node_spec is None: + if unified_manager.resolve_node_spec(node_spec_str, guess_mode='inactive') is not None: + print(f"{cnt_msg} [ SKIP ] {node_spec_str:50} => Already disabled") + else: + print(f"{cnt_msg} [ SKIP ] {node_spec_str:50} => Not found") + return + + node_name, version_spec, _ = node_spec + + res = unified_manager.unified_disable(node_name, version_spec == 'unknown') + + if res.action == 'skip': + print(f"{cnt_msg} [ SKIP ] {node_name:50} => {res.msg}") + elif res.result: print(f"{cnt_msg} [DISABLED] {node_name:50}") - elif os.path.exists(node_path + '.disabled'): - print(f"{cnt_msg} [ SKIPPED] {node_name:50} => Already disabled") - elif not is_all: - print(f"{cnt_msg} [ SKIPPED] {node_name:50} => Not installed") + else: + print(f"{cnt_msg} [ FAIL ] {node_name:50} => {res.msg}") def show_list(kind, simple=False): - for k, v in cm_ctx.get_custom_node_map().items(): - if v[1]: - continue + custom_nodes = asyncio.run(unified_manager.get_custom_nodes(channel=cmd_ctx.channel, mode=cmd_ctx.mode)) - node_path = os.path.join(custom_nodes_path, k) + # collect not-installed unknown nodes + not_installed_unknown_nodes = [] + repo_unknown = {} - states = set() - if os.path.exists(node_path): - prefix = '[ ENABLED ] ' - states.add('installed') - states.add('enabled') - states.add('all') - elif os.path.exists(node_path + '.disabled'): - prefix = '[ DISABLED ] ' - states.add('installed') - states.add('disabled') - states.add('all') - else: - prefix = '[ NOT INSTALLED ] ' - states.add('not-installed') - states.add('all') - - if kind in states: - if simple: - print(f"{k:50}") - else: - short_id = v[0].get('id', "") - print(f"{prefix} {k:50} {short_id:20} (author: {v[0]['author']})") - - # unregistered nodes - candidates = os.listdir(os.path.realpath(custom_nodes_path)) - - for k in candidates: - fullpath = os.path.join(custom_nodes_path, k) - - if os.path.isfile(fullpath): - continue - - if k in ['__pycache__']: - continue - - states = set() - if k.endswith('.disabled'): - prefix = '[ DISABLED ] ' - states.add('installed') - states.add('disabled') - states.add('all') - k = k[:-9] - else: - prefix = '[ ENABLED ] ' - states.add('installed') - states.add('enabled') - states.add('all') - - if k not in cm_ctx.get_custom_node_map(): - if kind in states: - if simple: - print(f"{k:50}") + for k, v in custom_nodes.items(): + if 'cnr_latest' not in v: + if len(v['files']) == 1: + repo_url = v['files'][0] + node_name = repo_url.split('/')[-1] + if node_name not in unified_manager.unknown_inactive_nodes and node_name not in unified_manager.unknown_active_nodes: + not_installed_unknown_nodes.append(v) else: - print(f"{prefix} {k:50} {'':20} (author: N/A)") + repo_unknown[node_name] = v + + processed = {} + unknown_processed = [] + + flag = kind in ['all', 'cnr', 'installed', 'enabled'] + for k, v in unified_manager.active_nodes.items(): + if flag: + cnr = unified_manager.cnr_map[k] + processed[k] = "[ ENABLED ] ", cnr['name'], k, cnr['publisher']['name'], v[0] + else: + processed[k] = None + + if flag and kind != 'cnr': + for k, v in unified_manager.unknown_active_nodes.items(): + item = repo_unknown.get(k) + + if item is None: + continue + + log_item = "[ ENABLED ] ", item['title'], k, item['author'] + unknown_processed.append(log_item) + + flag = kind in ['all', 'cnr', 'installed', 'disabled'] + for k, v in unified_manager.cnr_inactive_nodes.items(): + if k in processed: + continue + + if flag: + cnr = unified_manager.cnr_map[k] + processed[k] = "[ DISABLED ] ", cnr['name'], k, cnr['publisher']['name'], ", ".join(list(v.keys())) + else: + processed[k] = None + + for k, v in unified_manager.nightly_inactive_nodes.items(): + if k in processed: + continue + + if flag: + cnr = unified_manager.cnr_map[k] + processed[k] = "[ DISABLED ] ", cnr['name'], k, cnr['publisher']['name'], 'nightly' + else: + processed[k] = None + + if flag and kind != 'cnr': + for k, v in unified_manager.unknown_inactive_nodes.items(): + item = repo_unknown.get(k) + + if item is None: + continue + + log_item = "[ DISABLED ] ", item['title'], k, item['author'] + unknown_processed.append(log_item) + + flag = kind in ['all', 'cnr', 'not-installed'] + for k, v in unified_manager.cnr_map.items(): + if k in processed: + continue + + if flag: + cnr = unified_manager.cnr_map[k] + ver_spec = v['latest_version']['version'] if 'latest_version' in v else '0.0.0' + processed[k] = "[ NOT INSTALLED ] ", cnr['name'], k, cnr['publisher']['name'], ver_spec + else: + processed[k] = None + + if flag and kind != 'cnr': + for x in not_installed_unknown_nodes: + if len(x['files']) == 1: + node_id = os.path.basename(x['files'][0]) + log_item = "[ NOT INSTALLED ] ", x['title'], node_id, x['author'] + unknown_processed.append(log_item) + + for x in processed.values(): + if x is None: + continue + + prefix, title, short_id, author, ver_spec = x + if simple: + print(title+'@'+ver_spec) + else: + print(f"{prefix} {title:50} {short_id:30} (author: {author:20}) \\[{ver_spec}]") + + for x in unknown_processed: + prefix, title, short_id, author = x + if simple: + print(title+'@unknown') + else: + print(f"{prefix} {title:50} {short_id:30} (author: {author:20}) [UNKNOWN]") -def show_snapshot(simple_mode=False): - json_obj = core.get_current_snapshot() +async def show_snapshot(simple_mode=False): + json_obj = await core.get_current_snapshot() if simple_mode: print(f"[{json_obj['comfyui']}] comfyui") @@ -448,7 +508,7 @@ def show_snapshot(simple_mode=False): def show_snapshot_list(simple_mode=False): - snapshot_path = os.path.join(comfyui_manager_path, 'snapshots') + snapshot_path = cmd_ctx.get_snapshot_path() files = os.listdir(snapshot_path) json_files = [x for x in files if x.endswith('.json')] @@ -457,25 +517,60 @@ def show_snapshot_list(simple_mode=False): def cancel(): - if os.path.exists(script_path): - os.remove(script_path) + if os.path.exists(cmd_ctx.get_startup_scripts_path()): + os.remove(cmd_ctx.get_startup_scripts_path()) - if os.path.exists(restore_snapshot_path): - os.remove(restore_snapshot_path) + if os.path.exists(cmd_ctx.get_restore_snapshot_path()): + os.remove(cmd_ctx.get_restore_snapshot_path()) -def auto_save_snapshot(): - path = core.save_snapshot_with_postfix('cli-autosave') +async def auto_save_snapshot(): + path = await core.save_snapshot_with_postfix('cli-autosave') print(f"Current snapshot is saved as `{path}`") +def get_all_installed_node_specs(): + res = [] + processed = set() + for k, v in unified_manager.active_nodes.items(): + node_spec_str = f"{k}@{v[0]}" + res.append(node_spec_str) + processed.add(k) + + for k, _ in unified_manager.cnr_inactive_nodes.keys(): + if k in processed: + continue + + latest = unified_manager.get_from_cnr_inactive_nodes(k) + if latest is not None: + node_spec_str = f"{k}@{str(latest[0])}" + res.append(node_spec_str) + + for k, _ in unified_manager.nightly_inactive_nodes.keys(): + if k in processed: + continue + + node_spec_str = f"{k}@nightly" + res.append(node_spec_str) + + for k in unified_manager.unknown_active_nodes.keys(): + node_spec_str = f"{k}@unknown" + res.append(node_spec_str) + + for k in unified_manager.unknown_inactive_nodes.keys(): + node_spec_str = f"{k}@unknown" + res.append(node_spec_str) + + return res + + def for_each_nodes(nodes, act, allow_all=True): is_all = False if allow_all and 'all' in nodes: is_all = True - nodes = [x for x in cm_ctx.get_custom_node_map().keys() if os.path.exists(os.path.join(custom_nodes_path, x)) or os.path.exists(os.path.join(custom_nodes_path, x) + '.disabled')] - - nodes = [x for x in nodes if x.lower() not in ['comfy', 'comfyui', 'all']] + nodes = get_all_installed_node_specs() + else: + nodes = [x for x in nodes if x.lower() not in ['comfy', 'comfyui', 'all']] total = len(nodes) i = 1 @@ -513,8 +608,22 @@ def install( None, help="[remote|local|cache]" ), + no_deps: Annotated[ + Optional[bool], + typer.Option( + "--no-deps", + show_default=False, + help="Skip installing any Python dependencies", + ), + ] = False, + user_directory: str = typer.Option( + None, + help="user directory" + ), ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_no_deps(no_deps) for_each_nodes(nodes, act=install_node) @@ -534,8 +643,22 @@ def reinstall( None, help="[remote|local|cache]" ), + no_deps: Annotated[ + Optional[bool], + typer.Option( + "--no-deps", + show_default=False, + help="Skip installing any Python dependencies", + ), + ] = False, + user_directory: str = typer.Option( + None, + help="user directory" + ), ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_no_deps(no_deps) for_each_nodes(nodes, act=reinstall_node) @@ -556,7 +679,7 @@ def uninstall( help="[remote|local|cache]" ), ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_channel_mode(channel, mode) for_each_nodes(nodes, act=uninstall_node) @@ -577,11 +700,16 @@ def update( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ), ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) if 'all' in nodes: - auto_save_snapshot() + asyncio.run(auto_save_snapshot()) for x in nodes: if x.lower() in ['comfyui', 'comfy', 'all']: @@ -608,11 +736,16 @@ def disable( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ), ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) if 'all' in nodes: - auto_save_snapshot() + asyncio.run(auto_save_snapshot()) for_each_nodes(nodes, disable_node, allow_all=True) @@ -634,11 +767,16 @@ def enable( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ), ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) if 'all' in nodes: - auto_save_snapshot() + asyncio.run(auto_save_snapshot()) for_each_nodes(nodes, enable_node, allow_all=True) @@ -660,19 +798,34 @@ def fix( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ), ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) if 'all' in nodes: - auto_save_snapshot() + asyncio.run(auto_save_snapshot()) for_each_nodes(nodes, fix_node, allow_all=True) -@app.command("show", help="Show node list (simple mode)") +@app.command("show-versions", help="Show all available versions of the node") +def show_versions(node_name: str): + versions = cnr_utils.all_versions_of_node(node_name) + if versions is None: + print(f"Node not found in Comfy Registry: {node_name}") + + for x in versions: + print(f"[{x['createdAt'][:10]}] {x['version']} -- {x['changelog']}") + + +@app.command("show", help="Show node list") def show( arg: str = typer.Argument( - help="[installed|enabled|not-installed|disabled|all|snapshot|snapshot-list]" + help="[installed|enabled|not-installed|disabled|all|cnr|snapshot|snapshot-list]" ), channel: Annotated[ str, @@ -685,6 +838,10 @@ def show( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ), ): valid_commands = [ "installed", @@ -692,6 +849,7 @@ def show( "not-installed", "disabled", "all", + "cnr", "snapshot", "snapshot-list", ] @@ -699,7 +857,8 @@ def show( typer.echo(f"Invalid command: `show {arg}`", err=True) exit(1) - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) if arg == 'snapshot': show_snapshot() elif arg == 'snapshot-list': @@ -724,6 +883,10 @@ def simple_show( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ), ): valid_commands = [ "installed", @@ -738,7 +901,9 @@ def simple_show( typer.echo(f"[bold red]Invalid command: `show {arg}`[/bold red]", err=True) exit(1) - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) + if arg == 'snapshot': show_snapshot(True) elif arg == 'snapshot-list': @@ -751,16 +916,23 @@ def simple_show( def cli_only_mode( mode: str = typer.Argument( ..., help="[enable|disable]" - )): - cli_mode_flag = os.path.join(os.path.dirname(__file__), '.enable-cli-only-mode') + ), + user_directory: str = typer.Option( + None, + help="user directory" + ) +): + cmd_ctx.set_user_directory(user_directory) + cli_mode_flag = os.path.join(cmd_ctx.manager_files_directory, '.enable-cli-only-mode') + if mode.lower() == 'enable': - with open(cli_mode_flag, 'w') as file: + with open(cli_mode_flag, 'w'): pass - print(f"\nINFO: `cli-only-mode` is enabled\n") + print("\nINFO: `cli-only-mode` is enabled\n") elif mode.lower() == 'disable': if os.path.exists(cli_mode_flag): os.remove(cli_mode_flag) - print(f"\nINFO: `cli-only-mode` is disabled\n") + print("\nINFO: `cli-only-mode` is disabled\n") else: print(f"\n[bold red]Invalid value for cli-only-mode: {mode}[/bold red]\n") exit(1) @@ -787,8 +959,13 @@ def deps_in_workflow( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ) ): - cm_ctx.set_channel_mode(channel, mode) + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) input_path = workflow output_path = output @@ -797,7 +974,7 @@ def deps_in_workflow( print(f"[bold red]File not found: {input_path}[/bold red]") exit(1) - used_exts, unknown_nodes = asyncio.run(core.extract_nodes_from_workflow(input_path, mode=cm_ctx.mode, channel_url=cm_ctx.channel)) + used_exts, unknown_nodes = asyncio.run(core.extract_nodes_from_workflow(input_path, mode=cmd_ctx.mode, channel_url=cmd_ctx.channel)) custom_nodes = {} for x in used_exts: @@ -824,8 +1001,14 @@ def save_snapshot( show_default=False, help="Specify the output file path. (.json/.yaml)" ), ] = None, + user_directory: str = typer.Option( + None, + help="user directory" + ) ): - path = core.save_snapshot_with_postfix('snapshot', output) + cmd_ctx.set_user_directory(user_directory) + + path = asyncio.run(core.save_snapshot_with_postfix('snapshot', output)) print(f"Current snapshot is saved as `{path}`") @@ -850,7 +1033,13 @@ def restore_snapshot( is_flag=True, help="Restore for pip packages specified by local paths.", ), + user_directory: str = typer.Option( + None, + help="user directory" + ) ): + cmd_ctx.set_user_directory(user_directory) + extras = [] if pip_non_url: extras.append('--pip-non-url') @@ -866,59 +1055,13 @@ def restore_snapshot( if os.path.exists(snapshot_name): snapshot_path = os.path.abspath(snapshot_name) else: - snapshot_path = os.path.join(core.comfyui_manager_path, 'snapshots', snapshot_name) + snapshot_path = os.path.join(cmd_ctx.get_snapshot_path(), snapshot_name) if not os.path.exists(snapshot_path): print(f"[bold red]ERROR: `{snapshot_path}` is not exists.[/bold red]") exit(1) try: - cloned_repos = [] - checkout_repos = [] - skipped_repos = [] - enabled_repos = [] - disabled_repos = [] - is_failed = False - - def extract_infos(msg): - nonlocal is_failed - - for x in msg: - if x.startswith("CLONE: "): - cloned_repos.append(x[7:]) - elif x.startswith("CHECKOUT: "): - checkout_repos.append(x[10:]) - elif x.startswith("SKIPPED: "): - skipped_repos.append(x[9:]) - elif x.startswith("ENABLE: "): - enabled_repos.append(x[8:]) - elif x.startswith("DISABLE: "): - disabled_repos.append(x[9:]) - elif 'APPLY SNAPSHOT: False' in x: - is_failed = True - - print(f"Restore snapshot.") - cmd_str = [sys.executable, git_script_path, '--apply-snapshot', snapshot_path] + extras - output = subprocess.check_output(cmd_str, cwd=custom_nodes_path, text=True) - msg_lines = output.split('\n') - extract_infos(msg_lines) - - for url in cloned_repos: - cm_ctx.post_install(url) - - # print summary - for x in cloned_repos: - print(f"[ INSTALLED ] {x}") - for x in checkout_repos: - print(f"[ CHECKOUT ] {x}") - for x in enabled_repos: - print(f"[ ENABLED ] {x}") - for x in disabled_repos: - print(f"[ DISABLED ] {x}") - - if is_failed: - print(output) - print("[bold red]ERROR: Failed to restore snapshot.[/bold red]") - + asyncio.run(core.restore_snapshot(snapshot_path, extras)) except Exception: print("[bold red]ERROR: Failed to restore snapshot.[/bold red]") traceback.print_exc() @@ -928,16 +1071,28 @@ def restore_snapshot( @app.command( "restore-dependencies", help="Restore dependencies from whole installed custom nodes." ) -def restore_dependencies(): - node_paths = [os.path.join(custom_nodes_path, name) for name in os.listdir(custom_nodes_path) - if os.path.isdir(os.path.join(custom_nodes_path, name)) and not name.endswith('.disabled')] +def restore_dependencies( + user_directory: str = typer.Option( + None, + help="user directory" + ) +): + cmd_ctx.set_user_directory(user_directory) + + node_paths = [] + + for base_path in cmd_ctx.get_custom_nodes_paths(): + for name in os.listdir(base_path): + target = os.path.join(base_path, name) + if os.path.isdir(target) and not name.endswith('.disabled'): + node_paths.append(target) total = len(node_paths) i = 1 for x in node_paths: - print(f"----------------------------------------------------------------------------------------------------") + print("----------------------------------------------------------------------------------------------------") print(f"Restoring [{i}/{total}]: {x}") - cm_ctx.post_install(x) + unified_manager.execute_install_script('', x, instant_execution=True) i += 1 @@ -947,9 +1102,10 @@ def restore_dependencies(): def post_install( path: str = typer.Argument( help="path to custom node", - )): + ) +): path = os.path.expanduser(path) - cm_ctx.post_install(path) + unified_manager.execute_install_script('', path, instant_execution=True) @app.command( @@ -971,9 +1127,14 @@ def install_deps( None, help="[remote|local|cache]" ), + user_directory: str = typer.Option( + None, + help="user directory" + ), ): - cm_ctx.set_channel_mode(channel, mode) - auto_save_snapshot() + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) + asyncio.run(auto_save_snapshot()) if not os.path.exists(deps): print(f"[bold red]File not found: {deps}[/bold red]") @@ -991,7 +1152,7 @@ def install_deps( if state == 'installed': continue elif state == 'not-installed': - core.gitclone_install([k], instant_execution=True) + asyncio.run(core.gitclone_install(k, instant_execution=True)) else: # disabled core.gitclone_set_active([k], False) @@ -1016,16 +1177,48 @@ def export_custom_node_ids( mode: str = typer.Option( None, help="[remote|local|cache]" - )): - cm_ctx.set_channel_mode(channel, mode) + ), + user_directory: str = typer.Option( + None, + help="user directory" + ), +): + cmd_ctx.set_user_directory(user_directory) + cmd_ctx.set_channel_mode(channel, mode) with open(path, "w", encoding='utf-8') as output_file: - for x in cm_ctx.get_custom_node_map().keys(): + for x in unified_manager.cnr_map.keys(): print(x, file=output_file) + custom_nodes = asyncio.run(unified_manager.get_custom_nodes(channel=cmd_ctx.channel, mode=cmd_ctx.mode)) + for x in custom_nodes.values(): + if 'cnr_latest' not in x: + if len(x['files']) == 1: + repo_url = x['files'][0] + node_id = repo_url.split('/')[-1] + print(f"{node_id}@unknown", file=output_file) + + if 'id' in x: + print(f"{x['id']}@unknown", file=output_file) + + +@app.command( + "migrate", + help="Migrate legacy node system to new node system", +) +def migrate( + user_directory: str = typer.Option( + None, + help="user directory" + ) +): + cmd_ctx.set_user_directory(user_directory) + asyncio.run(unified_manager.migrate_unmanaged_nodes()) + if __name__ == '__main__': sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) sys.exit(app()) -print(f"") + +print("") diff --git a/cm-cli.sh b/cm-cli.sh new file mode 100755 index 00000000..b1a21ca5 --- /dev/null +++ b/cm-cli.sh @@ -0,0 +1,2 @@ +#!/bin/bash +python cm-cli.py $* diff --git a/custom-node-list.json b/custom-node-list.json index 99e3a006..7001969f 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -14,16 +14,26 @@ { "author": "Dr.Lt.Data", "title": "ComfyUI Impact Pack", - "id": "impact", + "id": "comfyui-impact-pack", "reference": "https://github.com/ltdrdata/ComfyUI-Impact-Pack", "files": [ "https://github.com/ltdrdata/ComfyUI-Impact-Pack" ], - "pip": ["ultralytics==8.3.40"], "install_type": "git-clone", - "description": "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler.", + "description": "This node pack offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler.\nNOTE: To use the UltralyticsDetectorProvider, you must install the 'ComfyUI Impact Subpack' separately.", "preemptions":["SAMLoader"] }, + { + "author": "Dr.Lt.Data", + "title": "ComfyUI Impact Subpack", + "id": "comfyui-impact-subpack", + "reference": "https://github.com/ltdrdata/ComfyUI-Impact-Subpack", + "files": [ + "https://github.com/ltdrdata/ComfyUI-Impact-Subpack" + ], + "install_type": "git-clone", + "description": "This node pack provides nodes that complement the Impact Pack, such as the UltralyticsDetectorProvider." + }, { "author": "Dr.Lt.Data", "title": "ComfyUI Inspire Pack", @@ -378,29 +388,6 @@ "install_type": "git-clone", "description": "Nodes:Conditioning (Blend), Inpainting VAE Encode (WAS), VividSharpen. Experimental nodes, or other random extra helper nodes." }, - { - "author": "SaltAI", - "title": "SaltAI-Open-Resources", - "id": "saltai-open-resource", - "reference": "https://github.com/get-salt-AI/SaltAI", - "pip": ["numba"], - "files": [ - "https://github.com/get-salt-AI/SaltAI" - ], - "install_type": "git-clone", - "description": "This repository is a collection of open-source nodes and workflows for ComfyUI, a dev tool that allows users to create node-based workflows often powered by various AI models to do pretty much anything.\nOur mission is to seamlessly connect people and organizations with the world’s foremost AI innovations, anywhere, anytime. Our vision is to foster a flourishing AI ecosystem where the world’s best developers can build and share their work, thereby redefining how software is made, pushing innovation forward, and ensuring as many people as possible can benefit from the positive promise of AI technologies.\nWe believe that ComfyUI is a powerful tool that can help us achieve our mission and vision, by enabling anyone to explore the possibilities and limitations of AI models in a visual and interactive way, without coding if desired.\nWe hope that by sharing our nodes and workflows, we can inspire and empower more people to create amazing AI-powered content with ComfyUI." - }, - { - "author": "SaltAI", - "title": "SaltAI_Language_Toolkit", - "id": "saltai_language_toolkit", - "reference": "https://github.com/get-salt-AI/SaltAI_Language_Toolkit", - "files": [ - "https://github.com/get-salt-AI/SaltAI_Language_Toolkit" - ], - "install_type": "git-clone", - "description": "The project integrates the Retrieval Augmented Generation (RAG) tool [a/Llama-Index](https://www.llamaindex.ai/), [a/Microsoft's AutoGen](https://microsoft.github.io/autogen/), and [a/LlaVA-Next](https://github.com/LLaVA-VL/LLaVA-NeXT) with ComfyUI's adaptable node interface, enhancing the functionality and user experience of the platform." - }, { "author": "omar92", "title": "Quality of life Suit:V2", @@ -503,7 +490,7 @@ { "author": "YinBailiang", "title": "MergeBlockWeighted_fo_ComfyUI", - "id": "mbw", + "id": "mergeblockweighted_fo_comfyui", "reference": "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI", "files": [ "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI" @@ -609,6 +596,13 @@ "files": [ "https://github.com/city96/ComfyUI-GGUF" ], + "preemptions":[ + "CLIPLoaderGGUF", + "DualCLIPLoaderGGUF", + "TripleCLIPLoaderGGUF", + "UnetLoaderGGUF", + "UnetLoaderGGUFAdvanced" + ], "install_type": "git-clone", "description": "GGUF Quantization support for native ComfyUI models\nThis is currently very much WIP. These custom nodes provide support for model files stored in the GGUF format popularized by llama.cpp.\nWhile quantization wasn't feasible for regular UNET models (conv2d), transformer/DiT models such as flux seem less affected by quantization. This allows running it in much lower bits per weight variable bitrate quants on low-end GPUs." }, @@ -1262,6 +1256,16 @@ "install_type": "git-clone", "description": "Nodes: String, Int, Float, Short String, CLIP Text Encode (With Variables), String Format, Short String Format. This extension introduces quality of life improvements by providing variable nodes and shared global variables." }, + { + "author": "yolanother", + "title": "Save Uncompressed 16 Bit PNG", + "reference": "https://github.com/yolanother/ComfyUI-Save16bitPng", + "files": [ + "https://github.com/yolanother/ComfyUI-Save16bitPng" + ], + "install_type": "git-clone", + "description": "The SaveImageARGB16PNG node provides functionality for saving images as uncompressed PNG files with ARGB16 precision. This node is particularly useful for workflows that require high-quality image saving with metadata such as prompts and additional PNG info." + }, { "author": "sipherxyz", "title": "comfyui-art-venture", @@ -1427,6 +1431,17 @@ "install_type": "git-clone", "description": "An implementation of adaptive guidance for ComfyUI\nSee [a/https://bcv-uniandes.github.io/adaptiveguidance-wp](https://bcv-uniandes.github.io/adaptiveguidance-wp)" }, + { + "author": "asagi4", + "title": "ComfyUI NPNet (Golden Noise)", + "id": "comfyui-adaptive-guidance", + "reference": "https://github.com/asagi4/ComfyUI-NPNet", + "files": [ + "https://github.com/asagi4/ComfyUI-NPNet" + ], + "install_type": "git-clone", + "description": "A very barebones mostly-copypaste implementation of [a/https://github.com/xie-lab-ml/Golden-Noise-for-Diffusion-Models](https://github.com/xie-lab-ml/Golden-Noise-for-Diffusion-Models)" + }, { "author": "jamesWalker55", "title": "ComfyUI - P2LDGAN Node", @@ -3217,6 +3232,17 @@ "install_type": "git-clone", "description": "Upgrade the Save File node: customize subfolders, file names with checkpoint names, or any sampler attribute your want! [w/NOTE: This node is a fork from @thedyze, since the [a/original repository](https://github.com/thedyze/save-image-extended-comfyui) is no longer maintained. Simply *uninstall* the original version and **REINSTALL** this one.]" }, + { + "author": "audioscavenger", + "title": "ComfyUI-Thumbnails", + "id": "thumbnails", + "reference": "https://github.com/audioscavenger/ComfyUI-Thumbnails", + "files": [ + "https://github.com/audioscavenger/ComfyUI-Thumbnails" + ], + "install_type": "git-clone", + "description": "Load Image thumbnails, delete images, browse input subfolders." + }, { "author": "SOELexicon", "title": "ComfyUI-LexTools", @@ -3651,6 +3677,16 @@ "install_type": "git-clone", "description": "Canvas to use with ComfyUI" }, + { + "author": "taabata", + "title": "SANA_LOWVRAM", + "reference": "https://github.com/taabata/SANA_LOWVRAM", + "files": [ + "https://github.com/taabata/SANA_LOWVRAM" + ], + "install_type": "git-clone", + "description": "ComfyUI Diffusers wrapper nodes to run SANA models on low vram devices. Works on 2GB VRAM 12GB RAM laptop." + }, { "author": "noxinias", "title": "ComfyUI_NoxinNodes", @@ -3957,6 +3993,28 @@ "install_type": "git-clone", "description": "Webcam, MIDI, Spout and GLSL shader support. Animation via tick. Parameter manipulation with wave generator. Math operations, universal value converstion, shape mask generation, image channel ops, batch splitting/merging/randomizing, load image/video from URL, Dynamic bus routing, support for GIPHY, save output anywhere! flatten, crop, transform; check color blindness, make stereograms or stereoscopic images, and much more." }, + { + "author": "amorano", + "title": "Jovi_GLSL", + "id": "jovi_glsl", + "reference": "https://github.com/Amorano/Jovi_GLSL", + "files": [ + "https://github.com/Amorano/Jovi_GLSL" + ], + "install_type": "git-clone", + "description": "Integrates GLSL shader support." + }, + { + "author": "amorano", + "title": "Jovi_Spout", + "id": "jovi_spout", + "reference": "https://github.com/Amorano/Jovi_Spout", + "files": [ + "https://github.com/Amorano/Jovi_Spout" + ], + "install_type": "git-clone", + "description": "ComfyUI Nodes for using Spout streams." + }, { "author": "Umikaze-job", "title": "select_folder_path_easy", @@ -4148,6 +4206,17 @@ "install_type": "git-clone", "description": "A NSFW/Safety Checker Node for ComfyUI." }, + { + "author": "42lux", + "title": "Just a bunch of QOL nodes by 42lux", + "id": "comfyui-42lux", + "reference": "https://github.com/42lux/ComfyUI-42lux", + "files": [ + "https://github.com/42lux/ComfyUI-42lux" + ], + "install_type": "git-clone", + "description": "Just a bunch of QOL nodes. Normalized Flux Sampling, High Res Latent Picker, Textbox with Token Counter." + }, { "author": "sergekatzmann", "title": "ComfyUI_Nimbus-Pack", @@ -4730,6 +4799,17 @@ "install_type": "git-clone", "description": "Automatically creates checkpoints during workflow execution. If If an workflow is canceled or ComfyUI crashes mid-execution, then these checkpoints are used when the workflow is re-queued to resume execution with minimal progress loss." }, + { + "author": "AustinMroz", + "title": "ComfyUI-MinCache", + "id": "comfyui-mincache", + "reference": "https://github.com/AustinMroz/ComfyUI-MinCache", + "files": [ + "https://github.com/AustinMroz/ComfyUI-MinCache" + ], + "install_type": "git-clone", + "description": "Modifies execution to minimize RAM at the cost of performance" + }, { "author": "11cafe", "title": "ComfyUI Workspace Manager - Comfyspace", @@ -5394,7 +5474,7 @@ "https://github.com/Limitex/ComfyUI-Diffusers" ], "install_type": "git-clone", - "description": "This extension enables the use of the diffuser pipeline in ComfyUI." + "description": "This extension enables the use of the diffuser pipeline in ComfyUI. It also includes nodes related to Stream Diffusion." }, { "author": "aiXander", @@ -5585,6 +5665,16 @@ "install_type": "git-clone", "description": "Nodes: Shadertoy, Load Audio (from Path), Audio Frame Transform (Shadertoy), Audio Frame Transform (Beats)" }, + { + "author": "tocubed", + "title": "ComfyUI-EvTexture", + "reference": "https://github.com/tocubed/ComfyUI-EvTexture", + "files": [ + "https://github.com/tocubed/ComfyUI-EvTexture" + ], + "install_type": "git-clone", + "description": "Wrapper for EvTexture Video Upscaler: [a/https://github.com/DachunKai/EvTexture](https://github.com/DachunKai/EvTexture)" + }, { "author": "ntc-ai", "title": "ComfyUI - Apply LoRA Stacker with DARE", @@ -6918,6 +7008,16 @@ "install_type": "git-clone", "description": "flux lora merge.\nadaptive Merge (uses tensor norms and weight), manual Merge (uses fixed weights you specify), additive Merge (uses 100% of the first and adds a percentage of the second)" }, + { + "author": "StartHua", + "title": "Comfyui_Gemini2", + "reference": "https://github.com/StartHua/Comfyui_Gemini2", + "files": [ + "https://github.com/StartHua/Comfyui_Gemini2" + ], + "install_type": "git-clone", + "description": "NODES:CXH_Gemini2_TX, CXH_Gemini2_Vision, CXH_Local_Prompt" + }, { "author": "ricklove", "title": "comfyui-ricklove", @@ -7266,7 +7366,77 @@ "https://github.com/ShmuelRonen/ComfyUI_pixtral_large" ], "install_type": "git-clone", - "description": "A ComfyUI custom node that integrates Mistral AI's Pixtral Large vision model, enabling powerful multimodal AI capabilities within ComfyUI. Pixtral Large is a 124B parameter model (123B decoder + 1B vision encoder) that can analyze up to 30 high-resolution images simultaneously." + "description": "A ComfyUI custom node that integrates Mistral AI's Pixtral Large vision model, enabling powerful multimodal AI capabilities within ComfyUI. Pixtral Large is a 124B parameter model (123B decoder + 1B visual encoder)" + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI Coherent Video Sampler Node", + "reference": "https://github.com/ShmuelRonen/ComfyUI-CohernetVideoSampler", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-CohernetVideoSampler" + ], + "install_type": "git-clone", + "description": "A custom node for ComfyUI that enables coherent video generation while maintaining efficient memory usage, specifically optimized for heavy models like Flux." + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI-Gemini_Flash_2.0_Exp", + "reference": "https://github.com/ShmuelRonen/ComfyUI-Gemini_Flash_2.0_Exp", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-Gemini_Flash_2.0_Exp" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node that integrates Google's Gemini Flash 2.0 Experimental model, enabling multimodal analysis of text, images, video frames, and audio directly within ComfyUI workflows." + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI-ImageMotionGuider", + "reference": "https://github.com/ShmuelRonen/ComfyUI-ImageMotionGuider", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-ImageMotionGuider" + ], + "install_type": "git-clone", + "description": "A custom ComfyUI node designed to create seamless motion effects from single images by integrating with Hunyuan Video through latent space manipulation." + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI-EmptyHunyuanLatent", + "reference": "https://github.com/ShmuelRonen/ComfyUI-EmptyHunyuanLatent", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-EmptyHunyuanLatent" + ], + "install_type": "git-clone", + "description": "Custom nodes for ComfyUI to generate empty latent space compatible with Hunyuan models for both image and video generation." + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI-HunyuanVideoStyler", + "reference": "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoStyler", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoStyler" + ], + "install_type": "git-clone", + "description": "A custom node for ComfyUI that adds cinematic and movie scene styles to video generation prompts. This node helps create more dynamic and professional-looking video outputs by incorporating iconic movie scene aesthetics." + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI-LatentSyncWrapper", + "reference": "https://github.com/ShmuelRonen/ComfyUI-LatentSyncWrapper", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-LatentSyncWrapper" + ], + "install_type": "git-clone", + "description": "This node provides lip-sync capabilities in ComfyUI using ByteDance's LatentSync model. It allows you to synchronize video lips with audio input." + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI-HunyuanVideoSamplerSave", + "reference": "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoSamplerSave", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoSamplerSave" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node implementation for optimized video generation and motion effects, designed to work with Hunyuan text-to-video models." }, { "author": "redhottensors", @@ -7342,7 +7512,7 @@ "https://github.com/mirabarukaso/ComfyUI_Mira" ], "install_type": "git-clone", - "description": "Nodes:Integer Multiplier, Float Multiplier, Convert Numeral to String, Create Canvas Advanced, Create Canvas, Create PNG Mask, Color Mask to HEX String, Color Mask to INT RGB, Color Masks to List" + "description": "Slice regions of the canvas and convert them to masks for regional conditions widh PNG preview output. And a few support nodes." }, { "author": "1038lab", @@ -7364,6 +7534,16 @@ "install_type": "git-clone", "description": "A ComfyUI node for removing image backgrounds using RMBG-2.0" }, + { + "author": "1038lab", + "title": "ComfyUI-WildPromptor", + "reference": "https://github.com/1038lab/ComfyUI-WildPromptor", + "files": [ + "https://github.com/1038lab/ComfyUI-WildPromptor" + ], + "install_type": "git-clone", + "description": "Create dynamic prompts with wildcard list." + }, { "author": "Klinter", "title": "Klinter_nodes", @@ -8343,6 +8523,26 @@ "install_type": "git-clone", "description": "Talking avatars Heads for the IF_AI tools integrates dreamtalk in ComfyUI" }, + { + "author": "if-ai", + "title": "ComfyUI-IF_MemoAvatar", + "reference": "https://github.com/if-ai/ComfyUI-IF_MemoAvatar", + "files": [ + "https://github.com/if-ai/ComfyUI-IF_MemoAvatar" + ], + "install_type": "git-clone", + "description": "ComfyUI MemoAvatar is a talking head avatar generator using Memory-Guided Diffusion for Expressive Talking Video Generation" + }, + { + "author": "if-ai", + "title": "ComfyUI-IF_Trellis", + "reference": "https://github.com/if-ai/ComfyUI-IF_Trellis", + "files": [ + "https://github.com/if-ai/ComfyUI-IF_Trellis" + ], + "install_type": "git-clone", + "description": "ComfyUI TRELLIS is a large 3D asset generation in various formats, such as Radiance Fields, 3D Gaussians, and meshes. The cornerstone of TRELLIS is a unified Structured LATent (SLAT) representation that allows decoding to different output formats and Rectified Flow Transformers tailored for SLAT as the powerful backbones." + }, { "author": "dmMaze", "title": "Sketch2Manga", @@ -8406,7 +8606,7 @@ "https://github.com/MarkoCa1/ComfyUI-Text" ], "install_type": "git-clone", - "description": "Text." + "description": "Why make this node? Because I only need simple text related operations and don't want to install anything extra." }, { "author": "MarkoCa1", @@ -8589,14 +8789,14 @@ }, { "author": "viperyl", - "title": "ComfyUI-BiRefNet", + "title": "ComfyUI-BiRefNet-Fix utils", "id": "comfyui-birefnet", - "reference": "https://github.com/viperyl/ComfyUI-BiRefNet", + "reference": "https://github.com/hieuck/ComfyUI-BiRefNet", "files": [ - "https://github.com/viperyl/ComfyUI-BiRefNet" + "https://github.com/hieuck/ComfyUI-BiRefNet" ], "install_type": "git-clone", - "description": "Bilateral Reference Network achieves SOTA result in multi Salient Object Segmentation dataset, this repo pack BiRefNet as ComfyUI nodes, and make this SOTA model easier use for everyone." + "description": "Bilateral Reference Network achieves SOTA result in multi Salient Object Segmentation dataset, this repo pack BiRefNet as ComfyUI nodes, and make this SOTA model easier use for everyone.\nNOTE: The original node was replaced with a version maintained by hieuck because it is no longer maintained." }, { "author": "viperyl", @@ -8676,6 +8876,17 @@ "install_type": "git-clone", "description": "Unofficial implementation of [a/MiniCPM-V](https://github.com/OpenBMB/MiniCPM-V) for ComfyUI" }, + { + "author": "hay86", + "title": "ComfyUI LatentSync", + "id": "latentsync", + "reference": "https://github.com/hay86/ComfyUI_LatentSync", + "files": [ + "https://github.com/hay86/ComfyUI_LatentSync" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/LatentSync](https://github.com/bytedance/LatentSync) for ComfyUI" + }, { "author": "shinich39", "title": "comfyui-load-image-in-seq", @@ -8717,16 +8928,6 @@ "install_type": "git-clone", "description": "Store settings by model." }, - { - "author": "shinich39", - "title": "comfyui-load-image-with-cmd", - "reference": "https://github.com/shinich39/comfyui-load-image-with-cmd", - "files": [ - "https://github.com/shinich39/comfyui-load-image-with-cmd" - ], - "install_type": "git-clone", - "description": "Load image and partially workflow with javascript." - }, { "author": "shinich39", "title": "connect-from-afar", @@ -8759,13 +8960,13 @@ }, { "author": "shinich39", - "title": "comfyui-textarea-keybindings", - "reference": "https://github.com/shinich39/comfyui-textarea-keybindings", + "title": "comfyui-textarea-command", + "reference": "https://github.com/shinich39/comfyui-textarea-command", "files": [ - "https://github.com/shinich39/comfyui-textarea-keybindings" + "https://github.com/shinich39/comfyui-textarea-command" ], "install_type": "git-clone", - "description": "Add keybindings to textarea." + "description": "Add command and comment in textarea. (e.g. // Disabled line)" }, { "author": "shinich39", @@ -8787,6 +8988,16 @@ "install_type": "git-clone", "description": "Extract metadata from image." }, + { + "author": "shinich39", + "title": "comfyui-view-recommendations", + "reference": "https://github.com/shinich39/comfyui-view-recommendations", + "files": [ + "https://github.com/shinich39/comfyui-view-recommendations" + ], + "install_type": "git-clone", + "description": "Load model generation data from civitai." + }, { "author": "wei30172", "title": "comfygen", @@ -9676,6 +9887,16 @@ "install_type": "git-clone", "description": "a custom node for [a/MiniMates](https://github.com/kleinlee/MiniMates)" }, + { + "author": "AIFSH", + "title": "EchoMimicV2-ComfyUI", + "reference": "https://github.com/AIFSH/EchoMimicV2-ComfyUI", + "files": [ + "https://github.com/AIFSH/EchoMimicV2-ComfyUI" + ], + "install_type": "git-clone", + "description": "a custom node for [a/echomimic_v2](https://github.com/antgroup/echomimic_v2)" + }, { "author": "Koishi-Star", "title": "Euler-Smea-Dyn-Sampler", @@ -9687,6 +9908,17 @@ "install_type": "git-clone", "description": "СomfyUI version of [a/Euler Smea Dyn Sampler](https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler). It adds samplers directly to KSampler nodes." }, + { + "author": "Koishi-Star", + "title": "Pyramid_Noise_For_Inference", + "id": "Pyramid_Noise_For_Inference", + "reference": "https://github.com/Koishi-Star/Pyramid_Noise_For_Inference", + "files": [ + "https://github.com/Koishi-Star/Pyramid_Noise_For_Inference" + ], + "install_type": "git-clone", + "description": "Using pyramid_noise instead of original noise in inference" + }, { "author": "sdfxai", "title": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration", @@ -10000,6 +10232,26 @@ "install_type": "git-clone", "description": "Face Anonymization make simple and easy." }, + { + "author": "smthemex", + "title": "ComfyUI_PBR_Maker", + "reference": "https://github.com/smthemex/ComfyUI_PBR_Maker", + "files": [ + "https://github.com/smthemex/ComfyUI_PBR_Maker" + ], + "install_type": "git-clone", + "description": "you can make PBR in comfyUI" + }, + { + "author": "smthemex", + "title": "ComfyUI_TRELLIS", + "reference": "https://github.com/smthemex/ComfyUI_TRELLIS", + "files": [ + "https://github.com/smthemex/ComfyUI_TRELLIS" + ], + "install_type": "git-clone", + "description": "You can use TRELLIS in comfyUI\n[a/TRELLIS](https://github.com/microsoft/TRELLIS/tree/main), Structured 3D Latents for Scalable and Versatile 3D Generation" + }, { "author": "choey", "title": "Comfy-Topaz", @@ -10592,7 +10844,7 @@ "https://github.com/da2el-ai/D2-nodes-ComfyUI" ], "install_type": "git-clone", - "description": "This is a collection of custom nodes that make ComfyUI slightly more convenient.[w/This node pack integrates ComfyUI-d2-size-selector, ComfyUI-d2-steps, and ComfyUI-d2-xyplot-utils. To avoid conflicts, please delete the existing node packs if you install this one.]" + "description": "This is a collection of custom nodes that make ComfyUI slightly more convenient." }, { "author": "da2el-ai", @@ -10821,13 +11073,13 @@ }, { "author": "KoreTeknology", - "title": "ComfyUI Compositing Nodes Pack", - "reference": "https://github.com/KoreTeknology/ComfyUI-Compositing-Nodes-Pack", + "title": "ComfyUI Production Nodes Pack", + "reference": "https://github.com/KoreTeknology/ComfyUI-Nai-Production-Nodes-Pack", "files": [ - "https://github.com/KoreTeknology/ComfyUI-Compositing-Nodes-Pack" + "https://github.com/KoreTeknology/ComfyUI-Nai-Production-Nodes-Pack" ], "install_type": "git-clone", - "description": "This is set of custom nodes for your ComfyUI1 local installation. It offers the very basic nodes that are missing in the official 'Vanilla' package. It is a research Node based project on Artificial Intelligence using ComfyUI visual editor. This repository also includes a set of workflows to test the nodes." + "description": "This is set of custom nodes for your ComfyUI local installation. It offers the very basic nodes that are missing in the official 'Vanilla' package. It is a research Node based project on Artificial Intelligence using ComfyUI visual editor. This repository also includes a set of workflows to test the nodes.\nNOTE:Renamed from 'ComfyUI-Compositing-Nodes-Pack'" }, { "author": "ZeDarkAdam", @@ -11130,7 +11382,27 @@ "https://github.com/GraftingRayman/ComfyUI_GraftingRayman" ], "install_type": "git-clone", - "description": "Image Manipulation Nodes" + "description": "Image Manipulation and Prompt Generation Nodes" + }, + { + "author": "GraftingRayman", + "title": "ComfyUI QueueTube", + "reference": "https://github.com/GraftingRayman/ComfyUI_QueueTube", + "files": [ + "https://github.com/GraftingRayman/ComfyUI_QueueTube" + ], + "install_type": "git-clone", + "description": "These nodes allow your YouTube LiveStream viewers to create on your local ComfyUI, you can make this a members only feature with a screen behind you displaying your members creations" + }, + { + "author": "GraftingRayman", + "title": "ComfyUI-PuLID-Flux-GR", + "reference": "https://github.com/GraftingRayman/ComfyUI-PuLID-Flux-GR", + "files": [ + "https://github.com/GraftingRayman/ComfyUI-PuLID-Flux-GR" + ], + "install_type": "git-clone", + "description": "This is a PuLID node that has been extended with new features." }, { "author": "royceschultz", @@ -11601,17 +11873,6 @@ "install_type": "git-clone", "description": "Nodes: Ultimate Concat (Mobile), Send Notification (Mobile), Settings Launcher (Mobile), Settings Launcher Outputs (Mobile)" }, - { - "author": "audioscavenger", - "title": "ComfyUI Thumbnails", - "id": "thumbnails", - "reference": "https://github.com/audioscavenger/ComfyUI-Thumbnails", - "files": [ - "https://github.com/audioscavenger/ComfyUI-Thumbnails" - ], - "install_type": "git-clone", - "description": "Load Image thumbnails for ComfyUI" - }, { "author": "goktug", "title": "Save Image Plus for ComfyUI", @@ -11714,12 +11975,12 @@ { "author": "PnthrLeo", "title": "comfyUI-PL-data-tools", - "reference": "https://github.com/PnthrLeo/comfyUI-image-search", + "reference": "https://github.com/PnthrLeo/comfyUI-PL-data-tools", "files": [ - "https://github.com/PnthrLeo/comfyUI-image-search" + "https://github.com/PnthrLeo/comfyUI-PL-data-tools" ], "install_type": "git-clone", - "description": "Nodes:Close Images Searcher, Areas Generator,Batch Image Getter" + "description": "Image data check, filtering and augmentation tools for ComfyUI 🔬\nNOTE: Renamed from 'comfyUI-image-search'" }, { "author": "l20richo", @@ -11906,6 +12167,16 @@ "install_type": "git-clone", "description": "A collection of simple nodes for Frequency Separation / Frequency Recombine with RGB and HSV methods" }, + { + "author": "risunobushi", + "title": "ComfyUI-Similarity-Score", + "reference": "https://github.com/risunobushi/ComfyUI-Similarity-Score", + "files": [ + "https://github.com/risunobushi/ComfyUI-Similarity-Score" + ], + "install_type": "git-clone", + "description": "A custom node for ComfyUI that calculates CLIP and LPIPS similarity scores between two images." + }, { "author": "zohac", "title": "ComfyUI_ZC_DrawShape", @@ -12351,17 +12622,6 @@ "install_type": "git-clone", "description": "This is a collection of tools that I use to make my life easier when developing ComfyUI applications. It is a collection of tools that I have created to help me with my development process. I have decided to share these tools with the community in the hopes that they will be useful to others as well. I use this tools to further develop features for [a/https://shibiko.ai](https://shibiko.ai)" }, - { - "author": "SaltAI", - "title": "SaltAI_AudioViz", - "id": "saltai-audioviz", - "reference": "https://github.com/get-salt-AI/SaltAI_AudioViz", - "files": [ - "https://github.com/get-salt-AI/SaltAI_AudioViz" - ], - "install_type": "git-clone", - "description": "SaltAI AudioViz contains ComfyUI nodes for generating complex audio reactive visualizations" - }, { "author": "SherryXieYuchen", "title": "ComfyUI-Image-Inpainting", @@ -12438,17 +12698,6 @@ "install_type": "git-clone", "description": "Nodes:Image Dimension Resizer, Image Sizer, Random Ratio, Show Text, Random Title Character, Random Wildcard Tag Picker, Random Show Atm Loc Outfit, Contains Word, Elements Concatenator, ..." }, - { - "author": "leiweiqiang", - "title": "ComfyUI-TRA", - "id": "tra", - "reference": "https://github.com/leiweiqiang/ComfyUI-TRA", - "files": [ - "https://github.com/leiweiqiang/ComfyUI-TRA" - ], - "install_type": "git-clone", - "description": "Nodes:TCL EbSynth, TCL Extract Frames (From File), TCL Extract Frames (From Video), TCL Combine Frames, TCL Save Video (From Frames)" - }, { "author": "hwhaocool", "title": "ComfyUI-Select-Any", @@ -12480,7 +12729,7 @@ "https://github.com/licyk/ComfyUI-Restart-Sampler" ], "install_type": "git-clone", - "description": "This extension is a node that directly expands the functionality of KSampler, rather than being in the form of a custom node. [w/Workflows created using this feature are not compatible with other users.]" + "description": "This extension is a node that directly expands the functionality of KSampler, adding the TCD sampling to KSampler." }, { "author": "licyk", @@ -12493,6 +12742,17 @@ "install_type": "git-clone", "description": "Image processing tool for ComfyUI" }, + { + "author": "licyk", + "title": "ComfyUI-TCD-Sampler", + "id": "TCD-Sampler", + "reference": "https://github.com/licyk/ComfyUI-TCD-Sampler", + "files": [ + "https://github.com/licyk/ComfyUI-TCD-Sampler" + ], + "install_type": "git-clone", + "description": "Adding TCD sampling" + }, { "author": "my-opencode", "title": "ComfyUI_IndustrialMagick", @@ -13093,6 +13353,16 @@ "install_type": "git-clone", "description": "Perform a Fast Fourier Transform on the image, and then users can freely select the filtering range to filter the image. The main function is to remove the grid patterns on the image, and it can also perform high-pass filtering and low-pass filtering. The detailed workflow is shown in the figure below. The PNG file contains the ComfyUI workflow.The working principle is similar to the FFT filter in Photoshop." }, + { + "author": "fssorc", + "title": "ComfyUI_RopeWrapper", + "reference": "https://github.com/fssorc/ComfyUI_RopeWrapper", + "files": [ + "https://github.com/fssorc/ComfyUI_RopeWrapper" + ], + "install_type": "git-clone", + "description": "Wrap Rope into ComfyUI, do a little change to use in ComfyUI. All credit goes to Hillobar and his ROPE [ㅁ/https://github.com/Hillobar/Rope](https://github.com/Hillobar/Rope)" + }, { "author": "BetaDoggo", "title": "ComfyUI YetAnotherSafetyChecker", @@ -13289,7 +13559,7 @@ "https://github.com/ai-shizuka/ComfyUI-tbox" ], "install_type": "git-clone", - "description": "Nodes:ImageLoader, ImageSaver, ImagesSaver, ImageResize, ImageSize." + "description": "Nodes:ImageLoader, ImageSaver, ImagesSaver, ImageResize, ImageSize, GFPGANNode, MaskAddNode, Video Load, ..." }, { "author": "neverbiasu", @@ -13321,7 +13591,17 @@ "https://github.com/neverbiasu/ComfyUI-StyleShot" ], "install_type": "git-clone", - "description": "NODES:StyleShotApply" + "description": "This project integrates [a/StyleShot](https://github.com/open-mmlab/StyleShot) functionality into ComfyUI, thanks to the foundational work by continue-revolution." + }, + { + "author": "neverbiasu", + "title": "ComfyUI-Dashscope", + "reference": "https://github.com/neverbiasu/ComfyUI-Dashscope", + "files": [ + "https://github.com/neverbiasu/ComfyUI-Dashscope" + ], + "install_type": "git-clone", + "description": "This project adapts the dashscope([a/aliyun-bailian](https://bailian.console.aliyun.com)) api into ComfyUI." }, { "author": "DriftJohnson", @@ -13366,6 +13646,17 @@ "install_type": "git-clone", "description": "Optional wildcards in ComfyUI" }, + { + "author": "Makki_Shizu", + "title": "ComfyUI-SaveAnimatedGIF", + "id": "SaveAnimatedGIF", + "reference": "https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF", + "files": [ + "https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF" + ], + "install_type": "git-clone", + "description": "Save animated GIF format nodes in ComfyUI" + }, { "author": "JosefKuchar", "title": "ComfyUI-AdvancedTiling", @@ -13815,6 +14106,16 @@ "install_type": "git-clone", "description": "ComfyUI nodes to use CompareModelWeights" }, + { + "author": "leeguandong", + "title": "ComfyUI_FluxCustomId", + "reference": "https://github.com/leeguandong/ComfyUI_FluxCustomId", + "files": [ + "https://github.com/leeguandong/ComfyUI_FluxCustomId" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes to use FluxCustomId\nOriginal repo: [a/https://github.com/damo-cv/FLUX-customID](https://github.com/damo-cv/FLUX-customID)" + }, { "author": "lenskikh", "title": "Propmt Worker", @@ -14156,6 +14457,27 @@ "install_type": "git-clone", "description": "Custom nodes introducing particle simulations, optical flow, audio manipulation & reactivity, and temporal masks" }, + { + "author": "RyanOnTheInside", + "title": "Nodes for use with real-time applications of ComfyUI", + "id": "realtimenodes", + "reference": "https://github.com/ryanontheinside/ComfyUI_RealTimeNodes", + "files": [ + "https://github.com/ryanontheinside/ComfyUI_RealTimeNodes" + ], + "install_type": "git-clone", + "description": "These nodes are for real-time applications of ComfyUI." + }, + { + "author": "RyanOnTheInside", + "title": "ComfyUI-EfficientTAM", + "reference": "https://github.com/ryanontheinside/ComfyUI_EfficientTAM", + "files": [ + "https://github.com/ryanontheinside/ComfyUI_EfficientTAM" + ], + "install_type": "git-clone", + "description": "A ComfyUI implementation of [a/EfficientTAM](https://github.com/yformer/EfficientTAM)" + }, { "author": "ControlAltAI", "title": "ControlAltAI Nodes", @@ -14179,16 +14501,6 @@ "install_type": "git-clone", "description": "A simple minimap in the bottom-right of the window showing the full workflow, left click to navigate" }, - { - "author": "doomy23", - "title": "ComfyUI-D00MYsNodes", - "reference": "https://github.com/doomy23/ComfyUI-D00MYsNodes", - "files": [ - "https://github.com/doomy23/ComfyUI-D00MYsNodes" - ], - "install_type": "git-clone", - "description": "Nodes: Images_Converter, Show_Text, Strings_From_List, Save_Text, Random_Images, Load_Images_From_Paths, JSPaint." - }, { "author": "Sieyalixnet", "title": "ComfyUI_Textarea_Loaders", @@ -14406,13 +14718,13 @@ }, { "author": "wmpmiles", - "title": "ComfyUI-GTF-Utilities", - "reference": "https://github.com/wmpmiles/ComfyUI-GTF-Utilities", + "title": "comfyui-some-image-processing-stuff", + "reference": "https://github.com/wmpmiles/comfyui-some-image-processing-stuff", "files": [ - "https://github.com/wmpmiles/ComfyUI-GTF-Utilities" + "https://github.com/wmpmiles/comfyui-some-image-processing-stuff" ], "install_type": "git-clone", - "description": "Generalised 'image' processing nodes for images, masks, latents, and combinations thereof." + "description": "Some ComfyUI nodes that provide some image-processing functionality. Resampling, Color Grading, Inpainting, ..." }, { "author": "nonnonstop", @@ -15249,17 +15561,6 @@ "install_type": "git-clone", "description": "This repository contains a custom node for ComfyUI that pads an image to be square, filling the new pixels black." }, - { - "author": "amorano", - "title": "Cozy Link Toggle", - "id": "cozyLinkToggle", - "reference": "https://github.com/cozy-comfyui/cozy_link_toggle", - "files": [ - "https://github.com/cozy-comfyui/cozy_link_toggle" - ], - "install_type": "git-clone", - "description": "Toggle ComfyUI Graph Links On/Off from the Menu Bar. Provides an easy example on how to register and use the ComfyUI menubar extensions." - }, { "author": "revirevy", "title": "Comfyui_saveimage_imgbb", @@ -15871,6 +16172,16 @@ "install_type": "git-clone", "description": "Implementation of Fast Fourier Transform in COMFYUI" }, + { + "author": "laogou666", + "title": "Comfyui-LG_Relight", + "reference": "https://github.com/LAOGOU-666/Comfyui-LG_Relight", + "files": [ + "https://github.com/LAOGOU-666/Comfyui-LG_Relight" + ], + "install_type": "git-clone", + "description": "A simple implementation of real-time 3D lighting in ComfyUI. It's an open-source node, have fun playing around!" + }, { "author": "VertexStudio", "title": "roblox-comfyui-nodes", @@ -16047,6 +16358,26 @@ "install_type": "git-clone", "description": "NODES:Google Translate" }, + { + "author": "sweetndata", + "title": "ComfyUI-Image-Harmonizer", + "reference": "https://github.com/sweetndata/ComfyUI-Image-Harmonizer", + "files": [ + "https://github.com/sweetndata/ComfyUI-Image-Harmonizer" + ], + "install_type": "git-clone", + "description": "NODES:Image-Harmonizer" + }, + { + "author": "sweetndata", + "title": "ComfyUI_Sticker_Compositer", + "reference": "https://github.com/sweetndata/ComfyUI_Sticker_Compositer", + "files": [ + "https://github.com/sweetndata/ComfyUI_Sticker_Compositer" + ], + "install_type": "git-clone", + "description": "NODES:Sticker Compositer.\nbackground frame + sticker" + }, { "author": "BlackVortexAI", "title": "BV Nodes", @@ -16358,7 +16689,7 @@ "https://github.com/Isulion/ComfyUI_Isulion" ], "install_type": "git-clone", - "description": "ComfyUI Nodes that generate prompts with the help of LLM from local or remote Ollama." + "description": "ComfyUI Nodes that generate prompts and many more." }, { "author": "sneccc", @@ -16618,12 +16949,12 @@ }, { "author": "Frost Ming", - "title": "ComfyUI-IDL", - "reference": "https://github.com/bentoml/ComfyUI-IDL", + "title": "Comfy-Pack", + "reference": "https://github.com/bentoml/comfy-pack", "files": [ - "https://github.com/bentoml/ComfyUI-IDL" + "https://github.com/bentoml/comfy-pack" ], - "description": "ComfyUI Interface Definition Language", + "description": "A comprehensive toolkit for standardizing, packaging and deploying ComfyUI workflows as reproducible environments and production-ready REST services", "install_type": "git-clone" }, { @@ -16645,7 +16976,7 @@ "https://github.com/Blonicx/ComfyUI-X-Rework" ], "install_type": "git-clone", - "description": "This is a plugin for ComfyUI that adds new Util Nodes and makes Lora training in ComfyUI abel. Except that it adds a new Features for Images." + "description": "This is a plugin for ComfyUI that adds new Util Nodes and Nodes for easier image creation and sharing." }, { "author": "1zhangyy1", @@ -16866,7 +17197,7 @@ "description": "A node suite for downloading audio and video from youtube as we all sevral useful video utilits such as a final frame selector and a node that merges two videos into one." }, { - "author": "DoctorDiffusion", + "author": "Doctor Diffusion", "title": "ComfyUI-SnakeOil", "reference": "https://github.com/DoctorDiffusion/ComfyUI-SnakeOil", "files": [ @@ -16875,6 +17206,26 @@ "install_type": "git-clone", "description": "Use [a/Doctor Diffusion's snake oil nLoRAs](https://civitai.com/models/987843) as well as [a/other negative LoRAs](https://civitai.com/models/186617/doctor-diffusions-negative-xl-lora) easily within ComfyUI." }, + { + "author": "Doctor Diffusion", + "title": "ComfyUI BEN - Background Erase Network", + "reference": "https://github.com/DoctorDiffusion/ComfyUI-BEN", + "files": [ + "https://github.com/DoctorDiffusion/ComfyUI-BEN" + ], + "install_type": "git-clone", + "description": "Remove backgrounds from images with [a/BEN](https://huggingface.co/PramaLLC/BEN) in ComfyUI" + }, + { + "author": "Doctor Diffusion", + "title": "ComfyUI-basic-pitch", + "reference": "https://github.com/DoctorDiffusion/ComfyUI-basic-pitch", + "files": [ + "https://github.com/DoctorDiffusion/ComfyUI-basic-pitch" + ], + "install_type": "git-clone", + "description": "Audio to midi functionality within ComfyUI" + }, { "author": "robtl2", "title": "ComfyUI-ComfyBridge", @@ -16905,6 +17256,26 @@ "install_type": "git-clone", "description": "ComfyUI supports over [a/rhymes-ai/Allegro](https://huggingface.co/rhymes-ai/Allegro), which uses text prompt to generate short video in relatively high quality, especially comparing to other open source solutions available for now." }, + { + "author": "bombax-xiaoice", + "title": "ComfyUI-Open-Sora-I2V", + "reference": "https://github.com/bombax-xiaoice/ComfyUI-Open-Sora-I2V", + "files": [ + "https://github.com/bombax-xiaoice/ComfyUI-Open-Sora-I2V" + ], + "install_type": "git-clone", + "description": "Another comfy implementation for the short video generation project hpcaitech/Open-Sora, supporting latest V2 and V3 models as well as image to video functions, etc." + }, + { + "author": "bombax-xiaoice", + "title": "ComfyUI-OpenSoraPlan", + "reference": "https://github.com/bombax-xiaoice/ComfyUI-OpenSoraPlan", + "files": [ + "https://github.com/bombax-xiaoice/ComfyUI-OpenSoraPlan" + ], + "install_type": "git-clone", + "description": "Another comfy implementation for the short video generation project PKU-YuanGroup/Open-Sora-Plan, supporting latest 1.3.0 and 1.2.0 and image to video feature, etc." + }, { "author": "chenbaiyujason", "title": "ComfyUI-SCStepFun", @@ -16926,6 +17297,17 @@ "install_type": "git-clone", "description": "ComfyUI nodes for editing background of images/videos with CUDA acceleration support." }, + { + "author": "yondonfu", + "title": "ComfyUI-Torch-Compile", + "id": "comfyui-torch-compile", + "reference": "https://github.com/yondonfu/ComfyUI-Torch-Compile", + "files": [ + "https://github.com/yondonfu/ComfyUI-Torch-Compile" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes for torch.compile." + }, { "author": "GorillaFrame", "title": "GFrbmg2", @@ -17011,12 +17393,22 @@ { "author": "c0ffymachyne", "title": "ComfyUI Signal Processing", - "reference": "https://github.com/c0ffymachyne/ComfyUI_SingalProcessing", + "reference": "https://github.com/c0ffymachyne/ComfyUI_SignalProcessing", "files": [ - "https://github.com/c0ffymachyne/ComfyUI_SingalProcessing" + "https://github.com/c0ffymachyne/ComfyUI_SignalProcessing" ], "install_type": "git-clone", - "description": "NODES:SignalProcessingPaulStretch, SignalProcessingPadSynth, SignalProcessingFilter, SignalProcessingLoadAudio.\nThis repo contains 4 nodes for ComfyUI that allows for audio filtering" + "description": "Audio processing nodes for comfyui." + }, + { + "author": "c0ffymachyne", + "title": "Bytebeat Synthesizer: Composing with Operators", + "reference": "https://github.com/c0ffymachyne/ComfyUI_BeatByte", + "files": [ + "https://github.com/c0ffymachyne/ComfyUI_BeatByte" + ], + "install_type": "git-clone", + "description": "Bytebeat is like composing music with the tools of a programmer’s toolkit. Instead of piano keys, you have operators like >>, |, and &. It’s like giving your CPU a guitar and letting it shred! 🤘" }, { "author": "liuqianhonga", @@ -17036,14 +17428,24 @@ "https://github.com/liuqianhonga/ComfyUI-Html2Image" ], "install_type": "git-clone", - "description": "NODES:Webpage Screenshot, Camera Watermark" + "description": "NODES: Webpage Screenshot, Camera Watermark, Template To Image" + }, + { + "author": "liuqianhonga", + "title": "ComfyUI-String-Helper", + "reference": "https://github.com/liuqianhonga/ComfyUI-String-Helper", + "files": [ + "https://github.com/liuqianhonga/ComfyUI-String-Helper" + ], + "install_type": "git-clone", + "description": "NODES: String Formatter, String List" }, { "author": "duhaifeng", "title": "ComfyUI-BiRefNet-lite", - "reference": "https://github.com/rubi-du/ComfyUI-BiRefNet-lite", + "reference": "https://github.com/rubi-du/ComfyUI-BiRefNet-Super", "files": [ - "https://github.com/rubi-du/ComfyUI-BiRefNet-lite" + "https://github.com/rubi-du/ComfyUI-BiRefNet-Super" ], "install_type": "git-clone", "description": "This repository packages the latest BiRefNet model as a ComfyUI node for use, supporting chunked loading on both CPU and GPU, as well as model caching features." @@ -17079,35 +17481,34 @@ "description": "A ComfyUI custom node that converts prompts between different AI image generation models." }, { - "author": "tanglup", + "author": "yichengup", "title": "Comfyui-Ycanvas", - "reference": "https://github.com/tanglup/Comfyui-Ycnode", + "reference": "https://github.com/yichengup/Comfyui-Ycanvas", "files": [ - "https://github.com/tanglup/Comfyui-Ycnode" + "https://github.com/yichengup/Comfyui-Ycanvas" ], "install_type": "git-clone", "description": "NODES:Canvas View" }, { - "author": "tanglup", - "title": "Comfyui_Flux_Style_Adjust", - "reference": "https://github.com/tanglup/Comfyui_Flux_Style_Adjust", + "author": "yichengup", + "title": "Comfyui_Flux_Style_Adjust (Redux)", + "reference": "https://github.com/yichengup/Comfyui_Flux_Style_Adjust", "files": [ - "https://github.com/tanglup/Comfyui_Flux_Style_Adjust" + "https://github.com/yichengup/Comfyui_Flux_Style_Adjust" ], "install_type": "git-clone", "description": "StyleModelApply adds more controls" }, { - "author": "Makki_Shizu", - "title": "ComfyUI-SaveAnimatedGIF", - "id": "SaveAnimatedGIF", - "reference": "https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF", + "author": "yichengup", + "title": "Comfyui_Redux_Advanced", + "reference": "https://github.com/yichengup/Comfyui_Redux_Advanced", "files": [ - "https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF" + "https://github.com/yichengup/Comfyui_Redux_Advanced" ], "install_type": "git-clone", - "description": "Save animated GIF format nodes in ComfyUI" + "description": "Redux style adds more controls" }, { "author": "Horizon Team", @@ -17151,16 +17552,6 @@ "install_type": "git-clone", "description": "A collection of custom nodes by arcum42. Currently focused on saving metadata in images so that Civitai picks it up, pulling Civitai information, and misc helper nodes." }, - { - "author": "sweetndata", - "title": "ComfyUI-Image-Harmonizer", - "reference": "https://github.com/sweetndata/ComfyUI-Image-Harmonizer", - "files": [ - "https://github.com/sweetndata/ComfyUI-Image-Harmonizer" - ], - "install_type": "git-clone", - "description": "NODES:Image-Harmonizer" - }, { "author": "Tomudo", "title": "ComfyUI-ascii-art", @@ -17263,7 +17654,17 @@ "https://github.com/SparknightLLC/ComfyUI-MaskArbiter" ], "install_type": "git-clone", - "description": "A node for ComfyUI that takes a list of masks and returns a single mask based on your criteria. For example, it can be used to mask the leftmost subject in an image containing more than one subject of the same class. The workflow below demonstrates the difference between Mask Arbiter (top) and traditional Grounding DINO masking (bottom.)" + "description": "A node for ComfyUI that takes a list of masks and returns a single mask based on your criteria." + }, + { + "author": "SparknightLLC", + "title": "ComfyUI-ConditionalInterrupt", + "reference": "https://github.com/SparknightLLC/ComfyUI-ConditionalInterrupt", + "files": [ + "https://github.com/SparknightLLC/ComfyUI-ConditionalInterrupt" + ], + "install_type": "git-clone", + "description": "A node for ComfyUI that terminates the workflow processing if 'proceed' is set to False. More convenient than manually bypassing a bunch of nodes.\nThis is a restructured version of the 'SRL Conditional Interrupt' node from the [a/srl-nodes](https://github.com/seanlynch/srl-nodes) pack." }, { "author": "lightricks", @@ -17317,16 +17718,6 @@ "install_type": "git-clone", "description": "NODES: PromptStyler, PromptLatent, PromptCLIPEncode, PromptSelector" }, - { - "author": "c0ffymachyne", - "title": "Bytebeat Synthesizer: Composing with Operators", - "reference": "https://github.com/c0ffymachyne/ComfyUI_BeatByte", - "files": [ - "https://github.com/c0ffymachyne/ComfyUI_BeatByte" - ], - "install_type": "git-clone", - "description": "Bytebeat is like composing music with the tools of a programmer’s toolkit. Instead of piano keys, you have operators like >>, |, and &. It’s like giving your CPU a guitar and letting it shred! 🤘" - }, { "author": "exectails", "title": "Info Utils", @@ -17480,7 +17871,7 @@ "https://github.com/purpen/ComfyUI-AIRedoon" ], "install_type": "git-clone", - "description": "NODES:AIRedoon Translator, AIRedoon Image Caption.\nRedoonAi Tool Kit" + "description": "NODES:AIRedoon Qwen Model Loader, AIRedoon Translator, AIRedoon Image Caption, AIRedoon LoRA Stack, AIRedoon Image RGBA2RGB, AIRedoon Preview Text, AIRedoon Save Text, ...\nRedoonAi Tool Kit" }, { "author": "purpen", @@ -17503,14 +17894,14 @@ "description": "Easy Pony is a helper node that simplifies the process of adding scoring and other attributes to prompts when using Pony models." }, { - "author": "steelan9199", - "title": "ComfyUI-Teeth", - "reference": "https://github.com/steelan9199/ComfyUI-Teeth", + "author": "itsjustregi", + "title": "ComfyUI-EasyNoobai", + "reference": "https://github.com/regiellis/ComfyUI-EasyNoobai", "files": [ - "https://github.com/steelan9199/ComfyUI-Teeth" + "https://github.com/regiellis/ComfyUI-EasyNoobai" ], "install_type": "git-clone", - "description": "NODES: Index List, TextSplitByDelimiter" + "description": "Simple set of nodes to assist with prompt generation for NOOBAI XL / Illustrious models" }, { "author": "mrhan1993", @@ -17552,7 +17943,7 @@ "https://github.com/StableDiffusionVN/SDVN_Comfy_node" ], "install_type": "git-clone", - "description": "Collection of nodes supports using comfyUi more quickly and conveniently (Auto download model, image, easy merger ...)" + "description": "Smart Node Set, Supporting Easier and More Convenient Ways to Use Comfyui.Support Translate, Dynamic Prompt, Wildcard in most nodes.Support API with popular models (Gemini, Dall-E, Chat GPT).Support to download and use models directly at Comfyui.Support sub-folder with input folders.Support Merger Model more intelligently.Support smart, higher customization node and neat, more beautiful.And many other complementary nodes ..." }, { "author": "Eugene (JEONG-JIWOO)", @@ -17577,13 +17968,23 @@ { "author": "5x00", "title": "ComfyUI-VLM_Captions", - "reference": "https://github.com/5x00/ComfyUI-VLM_Captions", + "reference": "https://github.com/5x00/ComfyUI-VLM-Captions", "files": [ - "https://github.com/5x00/ComfyUI-VLM_Captions" + "https://github.com/5x00/ComfyUI-VLM-Captions" ], "install_type": "git-clone", "description": "A simple ComfyUI node that let's you use Claude or ChatGPT 4o's VLM capabilities to generate captions/tags for images." }, + { + "author": "5x00", + "title": "ComfyUI-PiAPI-Faceswap", + "reference": "https://github.com/5x00/ComfyUI-PiAPI-Faceswap", + "files": [ + "https://github.com/5x00/ComfyUI-PiAPI-Faceswap" + ], + "install_type": "git-clone", + "description": "A simple ComfyUI nodes that integrates [a/PiAPI faceswap](https://piapi.ai/faceswap-api) service into ComfyUI. This can be helpful if you're trying to create a workflow that includes faceswap for commercial usage." + }, { "author": "ClownsharkBatwing", "title": "RES4LYF", @@ -17678,6 +18079,1153 @@ "description": "The KimaraAIWatermarker custom node allows you to apply watermark text and logo overlays to images. Optionally, the watermark can be moved by the move_watermark_step amount of pixels after each generated image. To apply a moving watermark to a list of images, use the KimaraAIBatchImages node to concatenate the list into a single tensor, then use that as an input for the watermark node, as shown in the example image below.", "install_type": "git-clone" }, + { + "author": "magic-quill", + "title": "ComfyUI_MagicQuill", + "id": "MagicQuill", + "reference": "https://github.com/magic-quill/ComfyUI_MagicQuill", + "files": [ + "https://github.com/magic-quill/ComfyUI_MagicQuill" + ], + "install_type": "git-clone", + "description": "Towards GPT-4 like large language and visual assistant." + }, + { + "author": "weilin9999", + "title": "WeiLin-ComfyUI-prompt-all-in-one", + "id": "prompt-all-in-one", + "reference": "https://github.com/weilin9999/WeiLin-ComfyUI-prompt-all-in-one", + "files": [ + "https://github.com/weilin9999/WeiLin-ComfyUI-prompt-all-in-one" + ], + "install_type": "git-clone", + "description": "Write prompt words like WebUI" + }, + { + "author": "jax-explorer", + "title": "comfyui-model-dynamic-loader", + "reference": "https://github.com/jax-explorer/comfyui-model-dynamic-loader", + "files": [ + "https://github.com/jax-explorer/comfyui-model-dynamic-loader" + ], + "install_type": "git-clone", + "description": "for comfyonline dynamic loader\ncomfyonline is comfyui cloud website" + }, + { + "author": "LucipherDev", + "title": "ComfyUI-Golden-Noise", + "reference": "https://github.com/LucipherDev/ComfyUI-Golden-Noise", + "files": [ + "https://github.com/LucipherDev/ComfyUI-Golden-Noise" + ], + "install_type": "git-clone", + "description": "ComfyUI Custom Node for 'Golden Noise for Diffusion Models: A Learning Framework'. This node refines the initial latent noise in the diffusion process, enhancing both image quality and semantic coherence." + }, + { + "author": "LucipherDev", + "title": "ComfyUI-AniDoc", + "reference": "https://github.com/LucipherDev/ComfyUI-AniDoc", + "files": [ + "https://github.com/LucipherDev/ComfyUI-AniDoc" + ], + "install_type": "git-clone", + "description": "ComfyUI Custom Nodes for 'AniDoc: Animation Creation Made Easier'. This approach automates line art video colorization using a novel model that aligns color information from references, ensures temporal consistency, and reduces manual effort in animation production." + }, + { + "author": "envy-ai", + "title": "ComfyUI-ConDelta", + "reference": "https://github.com/envy-ai/ComfyUI-ConDelta", + "files": [ + "https://github.com/envy-ai/ComfyUI-ConDelta" + ], + "install_type": "git-clone", + "description": "This extension extends ComfyUI's capabilities with respect to manipulating conditionings." + }, + { + "author": "kraglik", + "title": "PromptCollapse", + "reference": "https://github.com/kraglik/prompt_collapse", + "files": [ + "https://github.com/kraglik/prompt_collapse" + ], + "install_type": "git-clone", + "description": "A prompt generation system that manages relationships between prompt components to maintain logical consistency. Integrates with ComfyUI as a custom node." + }, + { + "author": "abdozmantar", + "title": "DeepExtract", + "reference": "https://github.com/abdozmantar/ComfyUI-DeepExtract", + "files": [ + "https://github.com/abdozmantar/ComfyUI-DeepExtract" + ], + "install_type": "git-clone", + "description": "DeepExtract is a powerful and efficient tool designed to separate vocals and sounds from audio files, providing an enhanced experience for musicians, producers, and audio engineers. With DeepExtract, you can quickly and effectively isolate vocals or instruments from mixed audio tracks, facilitating tasks like remixing, karaoke preparation, or audio analysis." + }, + { + "author": "ctefer", + "title": "CFE_comfyui", + "reference": "https://github.com/CpreForEver/CFE_comfyui", + "files": [ + "https://github.com/CpreForEver/CFE_comfyui" + ], + "install_type": "git-clone", + "description": "This is a subset of nodes for ComfyUI that I made just for my own workflow. The nodes support Flux (single conditioning, no negatives) and are just a way of minimizing the noodles. There's no real journey to be made here, just anything that helps me get through the day." + }, + { + "author": "inflamously", + "title": "comfyui-prompt-enhancer", + "reference": "https://github.com/inflamously/comfyui-prompt-enhancer", + "files": [ + "https://github.com/inflamously/comfyui-prompt-enhancer" + ], + "install_type": "git-clone", + "description": "A crazy node that pragmatically just enhances a given prompt with various descriptions in the hope that the image quality just increase and prompting just gets easier." + }, + { + "author": "111496583yzy", + "title": "Jigsaw Puzzle Effect Plugin", + "reference": "https://github.com/111496583yzy/comfyui-PuzzleCrack-Effect", + "files": [ + "https://github.com/111496583yzy/comfyui-PuzzleCrack-Effect" + ], + "install_type": "git-clone", + "description": "The Jigsaw Puzzle Effect plugin provides a unique puzzle effect for image processing. By dividing an image into multiple puzzle pieces and optionally adding missing pieces, users can easily create artistic puzzle effects." + }, + { + "author": "nsdtcloud3d", + "title": "ComfyUI-3D-Convert", + "reference": "https://github.com/nsdtcloud3d/ComfyUI-3D-Convert", + "files": [ + "https://github.com/nsdtcloud3d/ComfyUI-3D-Convert" + ], + "install_type": "git-clone", + "description": "ComfyUI-3D-Covert is a 3D File Format Conversion Extension based on 3dconvert.nsdt.cloud-API. It provides a node ConvertTo3DFormat currently available, is a powerful tool designed to streamline the conversion of 3D models between a wide array of file formats." + }, + { + "author": "Mr.Chip", + "title": "ComfyUI-SaveImageS3", + "id": "zouyuimages3", + "reference": "https://github.com/mrchipset/ComfyUI-SaveImageS3", + "files": [ + "https://github.com/mrchipset/ComfyUI-SaveImageS3" + ], + "install_type": "git-clone", + "description": "This extension offers a custom node to save image to S3-compatible oss." + }, + { + "author": "DesertPixelAi", + "title": "ComfyUI-Desert-Pixel-Nodes", + "reference": "https://github.com/DesertPixelAi/ComfyUI-Desert-Pixel-Nodes", + "files": [ + "https://github.com/DesertPixelAi/ComfyUI-Desert-Pixel-Nodes" + ], + "install_type": "git-clone", + "description": "A collection of custom nodes for ComfyUI focused on animation, image processing, and workflow optimization." + }, + { + "author": "muhammederem", + "title": "BLIP Vision-Language Model Integration", + "reference": "https://github.com/muhammederem/blip-comfyui", + "files": [ + "https://github.com/muhammederem/blip-comfyui" + ], + "install_type": "git-clone", + "description": "A Python implementation for integrating the BLIP (Bootstrapping Language-Image Pre-training) model for visual question answering." + }, + { + "author": "jiaqianjing", + "title": "ComfyUI-MidjourneyHub", + "reference": "https://github.com/jiaqianjing/ComfyUI-MidjourneyHub", + "files": [ + "https://github.com/jiaqianjing/ComfyUI-MidjourneyHub" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node for integrating with Midjourney API." + }, + { + "author": "SlackinJack", + "title": "distrifuser_comfyui", + "reference": "https://github.com/SlackinJack/distrifuser_comfyui", + "files": [ + "https://github.com/SlackinJack/distrifuser_comfyui" + ], + "install_type": "git-clone", + "description": "[a/Distrifuser](https://github.com/mit-han-lab/distrifuser) sampler node for ComfyUI\n" + }, + { + "author": "Runware Inc.", + "title": "Runware.ai ComfyUI Inference API Integration", + "id": "runware", + "reference": "https://github.com/Runware/ComfyUI-Runware", + "files": [ + "https://github.com/Runware/ComfyUI-Runware" + ], + "install_type": "git-clone", + "description": "Runware Inference API Integration for ComfyUI (No GPU Required)." + }, + { + "author": "shannooty", + "title": "ComfyUI Timer Nodes", + "id": "comfyui-timer-nodes", + "reference": "https://github.com/Shannooty/ComfyUI-Timer-Nodes", + "files": [ + "https://github.com/Shannooty/ComfyUI-Timer-Nodes" + ], + "install_type": "git-clone", + "description": "This project provides a set of custom timer nodes for ComfyUI. These nodes allow you to measure and append runtime information to strings or other data during your workflow." + }, + { + "author": "HM-RunningHub", + "title": "ComfyUI_RH_OminiControl", + "reference": "https://github.com/HM-RunningHub/ComfyUI_RH_OminiControl", + "files": [ + "https://github.com/HM-RunningHub/ComfyUI_RH_OminiControl" + ], + "install_type": "git-clone", + "description": "ComfyUI_RH_OminiControl is a ComfyUI plugin based on OminiControl By splitting the pipeline load, the plugin efficiently runs on NVIDIA RTX 4090 GPUs. Additionally, the spatial and fill functionalities are generated using the schnell model, reducing the number of sampling steps and improving overall efficiency." + }, + { + "author": "sebord", + "title": "ComfyUI-LMCQ", + "reference": "https://github.com/sebord/ComfyUI-LMCQ", + "files": [ + "https://github.com/sebord/ComfyUI-LMCQ" + ], + "install_type": "git-clone", + "description": "ComfyUI small node toolkit, this toolkit is mainly to update some practical small nodes, to make a contribution to the comfyui ecosystem, PS: 'LMCQ' is the abbreviation of the team name\nNOTE: The files in the repo are not organized, which may lead to update issues." + }, + { + "author": "InstantStudioAI", + "title": "ComfyUI-InstantStudio", + "reference": "https://github.com/InstantStudioAI/ComfyUI-InstantStudio", + "files": [ + "https://github.com/InstantStudioAI/ComfyUI-InstantStudio" + ], + "install_type": "git-clone", + "description": "A collection of nodes to enhance your experience with ComfyUI." + }, + { + "author": "Tlant", + "title": "ComfyUI-OllamaPromptsGeneratorTlant", + "reference": "https://github.com/Tlant/ComfyUI-OllamaPromptsGeneratorTlant", + "files": [ + "https://github.com/Tlant/ComfyUI-OllamaPromptsGeneratorTlant" + ], + "install_type": "git-clone", + "description": "Use ollama to generate prompts based on reference text in comfyui." + }, + { + "author": "DarioFT", + "title": "ComfyUI-VideoDirCombiner", + "reference": "https://github.com/DarioFT/ComfyUI-VideoDirCombiner", + "files": [ + "https://github.com/DarioFT/ComfyUI-VideoDirCombiner" + ], + "install_type": "git-clone", + "description": "A custom node for ComfyUI that combines multiple videos from a directory with optional transitions and background music. Perfect for batch processing and creating seamless video compilations." + }, + { + "author": "Kim", + "title": "ComfyUI_KimNodes", + "reference": "https://github.com/wjl0313/ComfyUI_KimNodes", + "files": [ + "https://github.com/wjl0313/ComfyUI_KimNodes" + ], + "install_type": "git-clone", + "description": "Image effects, icon layout processing, cropping — this toolbox is a node library organized according to my own needs." + }, + { + "author": "LiJT", + "title": "Gemini prompt generator JT version", + "reference": "https://github.com/LiJT/ComfyUI-Gemini-Prompt-Generator-JT", + "files": [ + "https://github.com/LiJT/ComfyUI-Gemini-Prompt-Generator-JT" + ], + "install_type": "git-clone", + "description": "Custom node to use Gemini 1.5 and above for Comfyui to generates theme related prompts for image generators" + }, + { + "author": "codeprimate", + "title": "ComfyUI Mask Contour Processor", + "reference": "https://github.com/codeprimate/ComfyUI-MaskContourProcessor", + "files": [ + "https://github.com/codeprimate/ComfyUI-MaskContourProcessor" + ], + "install_type": "git-clone", + "description": "A ComfyUI node that improves inpainting results by extending mask boundaries with geometric patterns, helping create smoother transitions and better context for AI-driven image completion." + }, + { + "author": "Miyuutsu", + "title": "comfyui-save-vpred", + "reference": "https://github.com/Miyuutsu/comfyui-save-vpred", + "files": [ + "https://github.com/Miyuutsu/comfyui-save-vpred" + ], + "install_type": "git-clone", + "description": "Simple ComfyUI Custom Node to enable saving checkpoints with V-Pred ZTSNR tensors and metadata." + }, + { + "author": "kostenickj", + "title": "comfyui-jk-easy-nodes", + "reference": "https://github.com/kostenickj/jk-comfyui-helpers", + "files": [ + "https://github.com/kostenickj/jk-comfyui-helpers" + ], + "install_type": "git-clone", + "description": "NODES: EasyHRFix, EasyHRFix_Context, JKAnythingToString, JKBigContext, JKDynamicThresholdingMultiModel, JKEasyCheckpointLoader, JKEasyDetailer, JKEasyDetailer_Context, JKEasyKSampler_Context, JKEasyWatermark, JKInspireSchedulerAdapter, JKLilContext, JKMultiModelSamplerUnpatch, JKStringEmpty, JKStringEquals, JKStringNotEmpty, JKStringNotEquals, JKStringToSamplerAdapter" + }, + { + "author": "IamCreateAI", + "title": "ComfyUI-Ruyi", + "reference": "https://github.com/IamCreateAI/Ruyi-Models", + "files": [ + "https://github.com/IamCreateAI/Ruyi-Models" + ], + "install_type": "git-clone", + "description": "ComfyUI wrapper nodes for Ruyi, an image-to-video model by CreateAI." + }, + { + "author": "pollockjj", + "title": "ComfyUI-MultiGPU", + "reference": "https://github.com/pollockjj/ComfyUI-MultiGPU", + "files": [ + "https://github.com/pollockjj/ComfyUI-MultiGPU" + ], + "install_type": "git-clone", + "description": "This extension adds CUDA device selection to supported loader nodes in ComfyUI. By monkey-patching ComfyUI’s memory management, each model component (like UNet, Clip, or VAE) can be loaded on a specific GPU. Examples included are multi-GPU workflows for SDXL, FLUX, LTXVideo, and Hunyuan Video for both standard and GGUF loader nodes." + }, + { + "author": "PressWagon", + "title": "ComfyUI-StringsAndThings", + "reference": "https://github.com/PressWagon/ComfyUI-StringsAndThings", + "files": [ + "https://github.com/PressWagon/ComfyUI-StringsAndThings" + ], + "install_type": "git-clone", + "description": "EA collection of ComfyUI custom nodes for formatting and debugging string data with the intention of collecting generation data to be processed by a custom node pack like comfy-image-saver, as well as miscellaneous extra nodes to experiment with." + }, + { + "author": "ADDOOR", + "title": "ComfyUI-Addoor", + "reference": "https://github.com/Eagle-CN/ComfyUI-Addoor", + "files": [ + "https://github.com/Eagle-CN/ComfyUI-Addoor" + ], + "install_type": "git-clone", + "description": "A collection of batch operation toolkits suitable for ComfyUI" + }, + { + "author": "CyanAutumn", + "title": "ComfyUi Random Manage Cyan", + "id": "CyanAutumn", + "reference": "https://github.com/CyanAutumn/ComfyUi_Random_Manage_Cyan", + "files": [ + "https://github.com/CyanAutumn/ComfyUi_Random_Manage_Cyan" + ], + "install_type": "git-clone", + "description": "A random prompt node" + }, + { + "author": "Black Forest Labs", + "title": "Black Forest Labs API Nodes", + "reference": "https://github.com/black-forest-labs/bfl-comfy-nodes", + "files": [ + "https://github.com/black-forest-labs/bfl-comfy-nodes" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes for Black Forest Labs API Services" + }, + { + "author": "kazeyori", + "title": "Quick Image Sequence Process", + "reference": "https://github.com/kazeyori/ComfyUI-QuickImageSequenceProcess", + "files": [ + "https://github.com/kazeyori/ComfyUI-QuickImageSequenceProcess" + ], + "install_type": "git-clone", + "description": "A ComfyUI plugin for quick image sequence processing. This plugin allows users to manipulate frame sequences with various operations including frame insertion, deletion, and duplication." + }, + { + "author": "Light-x02", + "title": "Image Metadata Nodes", + "id": "image_metadata_nodes", + "reference": "https://github.com/Light-x02/ComfyUI-Image-Metadata-Nodes", + "files": [ + "https://github.com/Light-x02/ComfyUI-Image-Metadata-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes for loading and saving images with metadata in ComfyUI." + }, + { + "author": "Light-x02", + "title": "Flux Settings Node", + "id": "flux_settings_node", + "reference": "https://github.com/Light-x02/ComfyUI-FluxSettingsNode", + "files": [ + "https://github.com/Light-x02/ComfyUI-FluxSettingsNode" + ], + "install_type": "git-clone", + "description": "A combined node for ComfyUI with six configurable tabs for managing multiple parameter configurations, including guidance, sampler, scheduler, steps, and denoise." + }, + { + "author": "marcoc2", + "title": "Image Processing Suite for ComfyUI", + "reference": "https://github.com/marcoc2/ComfyUI-AnotherUtils", + "files": [ + "https://github.com/marcoc2/ComfyUI-AnotherUtils" + ], + "install_type": "git-clone", + "description": "A collection of specialized image processing nodes for ComfyUI, focused on dataset preparation and pixel art manipulation." + }, + { + "author": "BIMer-99", + "title": "ComfyUI_FishSpeech_EX", + "reference": "https://github.com/BIMer-99/ComfyUI_FishSpeech_EX", + "files": [ + "https://github.com/BIMer-99/ComfyUI_FishSpeech_EX" + ], + "install_type": "git-clone", + "description": "This plugin is optimized for Fish-Speech-1.5 version and is only applicable to version 1.5" + }, + { + "author": "AEmotionStudio", + "title": "ComfyUI Christmas Theme 🎄✨", + "reference": "https://github.com/AEmotionStudio/ComfyUI-ChristmasTheme", + "files": [ + "https://github.com/AEmotionStudio/ComfyUI-ChristmasTheme" + ], + "install_type": "git-clone", + "description": "A beautiful theme extension for ComfyUI that adds festive touches with dynamic backgrounds, snowfall effects, and animated node connections" + }, + { + "author": "xfgexo", + "title": "EXO Custom ComfyUI Nodes", + "id": "exo-custom-nodes", + "reference": "https://github.com/xfgexo/EXO-Custom-ComfyUI-Nodes", + "files": [ + "https://github.com/xfgexo/EXO-Custom-ComfyUI-Nodes" + ], + "install_type": "git-clone", + "description": "A custom node pack made with efficiency and quality of life features in mind. Most notably is my Prompt Builder Deluxe Node. Unlike any other run-of-the-mill prompt builder or styler node out there. Mine allows you to create and design in a way no other node does." + }, + { + "author": "jefferyharrell", + "title": "JH XMP Metadata Nodes", + "reference": "https://github.com/ComfyUI-JH/ComfyUI-JH-XMP-Metadata-Nodes", + "files": [ + "https://github.com/ComfyUI-JH/ComfyUI-JH-XMP-Metadata-Nodes" + ], + "install_type": "git-clone", + "description": "These are custom nodes for ComfyUI for the loading and saving of metadata in XMP format. XMP metadata is embedded in the images created by these nodes; it travels along wherever the image does. Both macOS and Windows index XMP metadata automatically, making it searchable from the Finder on the Mac or the File Explorer in Windows. Apps like Photoshop or Lightroom (and presumably many others) expose XMP metadata and allow it to be edited." + }, + { + "author": "jefferyharrell", + "title": "JH Misc. Nodes", + "reference": "https://github.com/ComfyUI-JH/ComfyUI-JH-Misc-Nodes", + "files": [ + "https://github.com/ComfyUI-JH/ComfyUI-JH-Misc-Nodes" + ], + "install_type": "git-clone", + "description": "NODES: Daisy-Chainable String Constant, Two-Way Switch, Three-Way Switch, Preview Imag\nMiscellaneous custom nodes for ComfyUI" + }, + { + "author": "TKRLAB", + "title": "Prompt List JSON", + "reference": "https://github.com/TKRLAB/ComfyUI_Prompt_List_JSON", + "files": [ + "https://github.com/TKRLAB/ComfyUI_Prompt_List_JSON" + ], + "install_type": "git-clone", + "description": "This repository provides a custom node for ComfyUI that allows managing positive and negative prompts in a structured JSON format. The node supports adding, updating, and logging prompts, ensuring seamless integration into your workflow." + }, + { + "author": "kevinmcmahondev", + "title": "Skin Tone Detector for ComfyUI", + "reference": "https://github.com/kevinmcmahondev/comfyui-skin-tone-detector", + "files": [ + "https://github.com/kevinmcmahondev/comfyui-skin-tone-detector" + ], + "install_type": "git-clone", + "description": "A ComfyUI node that detects the skin tone of a person in an image and matches it to the standard emoji skin tone palette." + }, + { + "author": "mahdi", + "title": "seamless-clone-comfyui", + "reference": "https://github.com/Aksaz/comfyui-seamless-clone", + "files": [ + "https://github.com/Aksaz/comfyui-seamless-clone" + ], + "install_type": "git-clone", + "description": "Seamless Clone for ComfyUI" + }, + { + "author": "SlackinJack", + "title": "asyncdiff_comfyui", + "reference": "https://github.com/SlackinJack/asyncdiff_comfyui", + "files": [ + "https://github.com/SlackinJack/asyncdiff_comfyui" + ], + "install_type": "git-clone", + "description": "AsyncDiff node for ComfyUI" + }, + { + "author": "pharmapsychotic", + "title": "comfy-cliption", + "id": "comfy-cliption", + "reference": "https://github.com/pharmapsychotic/comfy-cliption", + "files": [ + "https://github.com/pharmapsychotic/comfy-cliption" + ], + "install_type": "git-clone", + "description": "Image to caption with CLIP ViT-L/14. Small and fast addition to the CLIP-L model you already have loaded to generate captions for images within your workflow." + }, + { + "author": "York Xiang", + "title": "Remembering utils", + "id": "comfyui-rememberingutils", + "reference": "https://github.com/bombless/comfyUI-RememberingUtils", + "files": [ + "https://github.com/bombless/comfyUI-RememberingUtils" + ], + "install_type": "git-clone", + "description": "Helper nodes to display last seed and prompt." + }, + { + "author": "shahkoorosh", + "title": "ComfyUI-KGnodes", + "reference": "https://github.com/shahkoorosh/ComfyUI-KGnodes", + "files": [ + "https://github.com/shahkoorosh/ComfyUI-KGnodes" + ], + "install_type": "git-clone", + "description": "NODES:Custom Resolution Latent Node, Style Selector\nThis Custom node offers various experimental nodes to make it easier to use ComfyUI." + }, + { + "author": "shahkoorosh", + "title": "comfyui-sunflower-nodes", + "reference": "https://github.com/andygill/comfyui-sunflower-nodes", + "files": [ + "https://github.com/andygill/comfyui-sunflower-nodes" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes for 3D visualization." + }, + { + "author": "shahkoorosh", + "title": "ComfyUI_RH_APICall", + "reference": "https://github.com/HM-RunningHub/ComfyUI_RH_APICall", + "files": [ + "https://github.com/HM-RunningHub/ComfyUI_RH_APICall" + ], + "install_type": "git-clone", + "description": "This is a ComfyUI plugin that makes it easier to call and run workflows from RunningHub in your local ComfyUI setup." + }, + { + "author": "wqjuser", + "title": "ComfyUI-Chat-Image", + "reference": "https://github.com/wqjuser/ComfyUI-Chat-Image", + "files": [ + "https://github.com/wqjuser/ComfyUI-Chat-Image" + ], + "install_type": "git-clone", + "description": "Use an online large language model to describe images." + }, + { + "author": "solution9th", + "title": "Comfyui_mobilesam", + "reference": "https://github.com/solution9th/Comfyui_mobilesam", + "files": [ + "https://github.com/solution9th/Comfyui_mobilesam" + ], + "install_type": "git-clone", + "description": "NODES: Mobile SAM Model Loader, Mobile SAM Detector, Mobile SAM Predictor" + }, + { + "author": "ronsantash", + "title": "ComfyUIFlexiLoRALoader", + "reference": "https://github.com/ronsantash/Comfyui-flexi-lora-loader", + "files": [ + "https://github.com/ronsantash/Comfyui-flexi-lora-loader" + ], + "install_type": "git-clone", + "description": "FlexiLoRALoader - A ComfyUI custom node for dynamic LoRA weight management. Apply multiple LoRAs with flexible weight patterns and randomization features for creative AI image generation.\nFeatures: • Multiple LoRA handling (up to 3) • Weight pattern presets • Random/Sequential mode • Debug logging support" + }, + { + "author": "zhilemann", + "title": "ComfyUI-moondream2", + "reference": "https://github.com/zhilemann/ComfyUI-moondream2", + "files": [ + "https://github.com/zhilemann/ComfyUI-moondream2" + ], + "install_type": "git-clone", + "description": "nodes for nightly moondream2 VLM inference\nsupports only captioning and visual queries at the moment" + }, + { + "author": "cherninlab", + "title": "Logo Generator Node for ComfyUI", + "reference": "https://github.com/cherninlab/logo-generator-comfyui", + "files": [ + "https://github.com/cherninlab/logo-generator-comfyui" + ], + "install_type": "git-clone", + "description": "This custom node allows you to generate logo images using Google Fonts." + }, + { + "author": "hzane", + "title": "OmniGen-ComfyUI", + "reference": "https://github.com/hzane/OmniGen-ComfyUI", + "files": [ + "https://github.com/hzane/OmniGen-ComfyUI" + ], + "install_type": "git-clone", + "description": "A custom node for [a/OmniGen](https://github.com/VectorSpaceLab/OmniGen)." + }, + { + "author": "SongGuo11", + "title": "ComfyUI SaveAnything Node (SG11)", + "reference": "https://github.com/SongGuo11/ComfyUI-SaveAnything-SG11", + "files": [ + "https://github.com/SongGuo11/ComfyUI-SaveAnything-SG11" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node for saving images in various formats" + }, + { + "author": "ciga2011", + "title": "ComfyUI MarkItDown", + "id": "markitdown", + "reference": "https://github.com/ciga2011/ComfyUI-MarkItDown", + "files": [ + "https://github.com/ciga2011/ComfyUI-MarkItDown" + ], + "pip": ["markitdown", "openai"], + "install_type": "git-clone", + "description": "This node pack helps to convert various files to Markdown. It supports pdf, pptx, xlsx, docx, html and image files." + }, + { + "author": "IgalOgonov", + "title": "Simple String Repository", + "reference": "https://github.com/IgalOgonov/ComfyUI_Simple_String_Repository", + "files": [ + "https://github.com/IgalOgonov/ComfyUI_Simple_String_Repository" + ], + "install_type": "git-clone", + "description": "Custom node that allows storing and accessing strings, meant to be parts of a prompt, in a simplified manner. Partially supports dynamic prompt syntax." + }, + { + "author": "fairy-root", + "title": "ComfyUI-GLHF", + "id": "comfyui-glhf", + "reference": "https://github.com/fairy-root/ComfyUI-GLHF", + "files": [ + "https://github.com/fairy-root/ComfyUI-GLHF" + ], + "install_type": "git-clone", + "description": "GLHF is a ComfyUI node that facilitates seamless interaction with the GLHF chat API. Designed to enhance user experience, it supports multiple language models, web search integration, and customizable instructions, making it a powerful extension for AI-driven workflows." + }, + { + "author": "Jurdn", + "title": "Jurdns Groq API Node", + "id": "jurdnsgroqapinode", + "reference": "https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node", + "files": [ + "https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node" + ], + "pip": ["groq"], + "install_type": "git-clone", + "description": "This node utilizes the Groq.com API to enhance prompts. (Place API key and main system prompt in the groq_config.json)" + }, + { + "author": "randomnoner11", + "title": "ComfyUI-MistralAI-API", + "reference": "https://github.com/randomnoner11/ComfyUI-MistralAI-API", + "files": [ + "https://github.com/randomnoner11/ComfyUI-MistralAI-API" + ], + "install_type": "git-clone", + "description": "Mistral AI API's chat completion endpoint in ComfyUI" + }, + { + "author": "ahernandezmiro", + "title": "ComfyUI-GCP_Storage_tools", + "reference": "https://github.com/ahernandezmiro/ComfyUI-GCP_Storage_tools", + "files": [ + "https://github.com/ahernandezmiro/ComfyUI-GCP_Storage_tools" + ], + "install_type": "git-clone", + "description": "A set of ComfyUI nodes for GPC Storage access" + }, + { + "author": "rohitsainier", + "title": "ComfyUI-InstagramDownloader", + "id": "comfyui-instagram-downloader", + "reference": "https://github.com/rohitsainier/ComfyUI-InstagramDownloader", + "files": [ + "https://github.com/rohitsainier/ComfyUI-InstagramDownloader" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node package that allows downloading and organizing Instagram content directly in your ComfyUI Output folder" + }, + { + "author": "zmwv823", + "title": "ComfyUI_Anytext", + "reference": "https://github.com/zmwv823/ComfyUI_Anytext", + "files": [ + "https://github.com/zmwv823/ComfyUI_Anytext" + ], + "install_type": "git-clone", + "description": "Unofficial Simple And Rough Implementation Of [a/AnyText](https://github.com/tyxsspa/AnyText) and [a/Glyph-ByT5] (https://github.com/AIGText/Glyph-ByT5) and [a/JoyType](https://github.com/jdh-algo/JoyType)" + }, + { + "author": "SKBv0", + "title": "ComfyUI SKBundle", + "reference": "https://github.com/SKBv0/ComfyUI_SKBundle", + "files": [ + "https://github.com/SKBv0/ComfyUI_SKBundle" + ], + "install_type": "git-clone", + "description": "Nodes: MultiText, TextBox, TitlePlus, SeamlessTexture, AspectRatioPlus, DisplayEverything, ComparerPlus, AnySwitch, Node Design Tools..." + }, + { + "author": "civen-cn", + "title": "ComfyUI Whisper Translator", + "reference": "https://github.com/civen-cn/ComfyUI-Whisper-Translator", + "files": [ + "https://github.com/civen-cn/ComfyUI-Whisper-Translator" + ], + "install_type": "git-clone", + "description": "This is a ComfyUI node that allows you to translate subtitles using the Whisper. Now support for multiple languages: ['zh', 'en', 'ja', 'ko', 'ru', 'fr', 'de', 'es', 'pt', 'it', 'ar'] You may need to put fonts in the 'fonts' folder to support different languages." + }, + { + "author": "WainWong", + "title": "ComfyUI-Loop-image", + "reference": "https://github.com/WainWong/ComfyUI-Loop-image", + "files": [ + "https://github.com/WainWong/ComfyUI-Loop-image" + ], + "install_type": "git-clone", + "description": "ComfyUI Loop Image is a node package specifically designed for image loop processing. It provides two main processing modes: Batch Image Processing and Single Image Processing, along with supporting image segmentation and merging functions." + }, + { + "author": "Jash-Vora", + "title": "FitDiT", + "reference": "https://github.com/Jash-Vora/ComfyUI-GarmentDiT", + "files": [ + "https://github.com/Jash-Vora/ComfyUI-GarmentDiT" + ], + "install_type": "git-clone", + "description": "[a/FitDiT](https://arxiv.org/abs/2411.10499): Advancing the Authentic Garment Details for High-fidelity Virtual Try-onon" + }, + { + "author": "rhplus0831", + "title": "ComfyMepi", + "reference": "https://github.com/rhplus0831/ComfyMepi", + "files": [ + "https://github.com/rhplus0831/ComfyMepi" + ], + "install_type": "git-clone", + "description": "Another mobile frontend for ComfyUI" + }, + { + "author": "0x-jerry", + "title": "Rembg Background Removal Node for ComfyUI", + "reference": "https://github.com/0x-jerry/comfyui-rembg", + "files": [ + "https://github.com/0x-jerry/comfyui-rembg" + ], + "install_type": "git-clone", + "description": "Rembg Background Removal Node for ComfyUI" + }, + { + "author": "sanbuphy", + "title": "ComfyUI-AudioLDM", + "reference": "https://github.com/sanbuphy/ComfyUI-AudioLDM", + "files": [ + "https://github.com/sanbuphy/ComfyUI-AudioLDM" + ], + "install_type": "git-clone", + "description": "ComfyUI Workflow to run audioldm-l-full pipeline\n[a/https://huggingface.co/cvssp/audioldm-l-full](https://huggingface.co/cvssp/audioldm-l-full)" + }, + { + "author": "bear2b", + "title": "ColorMatrixGPU Node for ComfyUI", + "reference": "https://github.com/bear2b/comfyui-argo-nodes", + "files": [ + "https://github.com/bear2b/comfyui-argo-nodes" + ], + "install_type": "git-clone", + "description": "This node applies a custom 4x4 color matrix to an image using GPU acceleration via PyTorch." + }, + { + "author": "phuvinh010701", + "title": "ComfyUI-Nudenet", + "reference": "https://github.com/phuvinh010701/ComfyUI-Nudenet", + "files": [ + "https://github.com/phuvinh010701/ComfyUI-Nudenet" + ], + "install_type": "git-clone", + "description": "Nodes for NSFW content filtering" + }, + { + "author": "Vaibhavs10", + "title": "ComfyUI-DDUF", + "reference": "https://github.com/Vaibhavs10/ComfyUI-DDUF", + "files": [ + "https://github.com/Vaibhavs10/ComfyUI-DDUF" + ], + "install_type": "git-clone", + "description": "Run DDUF in ComfyUI - powered by Diffusers." + }, + { + "author": "AconexOfficial", + "title": "ComfyUI GOAT Nodes", + "reference": "https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes", + "files": [ + "https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes" + ], + "install_type": "git-clone", + "description": "Nodes to level up your workflows performance and streamline specific functions." + }, + { + "author": "Jaminanim", + "title": "ComfyUI-Random-Int-Divisor-Node", + "reference": "https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node", + "files": [ + "https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node" + ], + "install_type": "git-clone", + "description": "A set of custom ComfyUI nodes for generating random integers within a range, adjusted to the nearest multiple of a user-defined divisor. Needlessly includes both an efficient and simple list implementation. Updates with each generation." + }, + { + "author": "cenzijing", + "title": "ComfyUI-Markmap", + "reference": "https://github.com/cenzijing/ComfyUI-Markmap", + "files": [ + "https://github.com/cenzijing/ComfyUI-Markmap" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node for creating mindmaps from markdown" + }, + { + "author": "bongsang", + "title": "ComfyUI-Bongsang", + "reference": "https://github.com/bongsang/ComfyUI-Bongsang", + "files": [ + "https://github.com/bongsang/ComfyUI-Bongsang" + ], + "install_type": "git-clone", + "description": "The 'ComfyUI-Bongsang' is very useful tools for a diffusion model developer." + }, + { + "author": "muxueChen", + "title": "CosyVoice2 for ComfyUI", + "reference": "https://github.com/muxueChen/ComfyUI_NTCosyVoice", + "files": [ + "https://github.com/muxueChen/ComfyUI_NTCosyVoice" + ], + "install_type": "git-clone", + "description": "ComfyUI_NTCosyVoice is a plugin of ComfyUI for Cosysvoice2" + }, + { + "author": "inventorado", + "title": "ComfyUI Neural Network Toolkit NNT ", + "id": "nnt", + "reference": "https://github.com/inventorado/ComfyUI_NNT", + "files": [ + "https://github.com/inventorado/ComfyUI_NNT" + ], + "install_type": "git-clone", + "description": "Neural Network Toolkit (NNT) for ComfyUI is an extensive set of custom ComfyUI nodes for designing, training, and fine-tuning neural networks. This toolkit allows defining models, layers, training workflows, transformers, and tensor operations in a visual manner using nodes." + }, + { + "author": "Hullabalo", + "title": "ComfyUI-Loop", + "reference": "https://github.com/Hullabalo/ComfyUI-Loop", + "files": [ + "https://github.com/Hullabalo/ComfyUI-Loop" + ], + "install_type": "git-clone", + "description": "A pair of nodes (Load Image and Save Image) to create a simple loop in your ComfyUI inpainting workflow, without the need of loading your last saved image" + }, + { + "author": "hodanajan", + "title": "optimal-crop-resolution", + "reference": "https://github.com/hodanajan/optimal-crop-resolution", + "files": [ + "https://github.com/hodanajan/optimal-crop-resolution" + ], + "install_type": "git-clone", + "description": "ComfyUI node to calculate optimal resolution to crop the image to (from a list of aspect ratios)" + }, + { + "author": "JJ", + "title": "ComfyUI-Jtils", + "reference": "https://github.com/cnbjjj/ComfyUI-Jtils", + "files": [ + "https://github.com/cnbjjj/ComfyUI-Jtils" + ], + "install_type": "git-clone", + "description": "An extension for ComfyUI that adds utility functions and nodes not available in the default setup." + }, + { + "author": "billwuhao", + "title": "ComfyUI_OneButtonPrompt_Flux", + "reference": "https://github.com/billwuhao/ComfyUI_OneButtonPrompt_Flux", + "files": [ + "https://github.com/billwuhao/ComfyUI_OneButtonPrompt_Flux" + ], + "install_type": "git-clone", + "description": "ComfyUI_OneButtonPrompt_Flux is a Flux prompt generation node. The subject can be 'human,' 'other' or a combination of both. For human, pose settings can be enabled. Additionally, various styles can be applied. Finally, combine it with 'Prompt Enhancement' to seamlessly automate image generation, eliminating the hassle of designing prompts." + }, + { + "author": "pandaer119", + "title": "ComfyUI_pandai", + "reference": "https://github.com/pandaer119/ComfyUI_pandai", + "files": [ + "https://github.com/pandaer119/ComfyUI_pandai" + ], + "install_type": "git-clone", + "description": "Introduction The ComfyUI_pandai node is a custom ComfyUI node designed to interact with the DeepSeek API. It supports text generation, translation, and text polishing. With this node, users can easily generate text, translate content, and refine the generated text for better quality." + }, + { + "author": "umiyuki", + "title": "ComfyUI Pad To Eight", + "reference": "https://github.com/umiyuki/comfyui-pad-to-eight", + "files": [ + "https://github.com/umiyuki/comfyui-pad-to-eight" + ], + "install_type": "git-clone", + "description": "A custom ComfyUI node that pads an image to a multiple of 8 width." + }, + { + "author": "Meettya", + "title": "ComfyUI-OneForOne", + "reference": "https://github.com/Meettya/ComfyUI-OneForOne", + "files": [ + "https://github.com/Meettya/ComfyUI-OneForOne" + ], + "install_type": "git-clone", + "description": "Node:Image Fit Calculator" + }, + { + "author": "KunmyonChoi", + "title": "ComfyUI_S3_direct", + "reference": "https://github.com/KunmyonChoi/ComfyUI_S3_direct", + "files": [ + "https://github.com/KunmyonChoi/ComfyUI_S3_direct" + ], + "install_type": "git-clone", + "description": "ComfyUI custom_node that load and save file directly from S3\nSimplified version of [a/https://github.com/kealiu/ComfyUI-S3-Tools](https://github.com/kealiu/ComfyUI-S3-Tools)" + }, + { + "author": "ChenDarYen", + "title": "ComfyUI-TimestepShiftModel", + "reference": "https://github.com/ChenDarYen/ComfyUI-TimestepShiftModel", + "files": [ + "https://github.com/ChenDarYen/ComfyUI-TimestepShiftModel" + ], + "install_type": "git-clone", + "description": "This is a ComfyUI implementation of the timestep shift technique used in [a/NitroFusion: High-Fidelity Single-Step Diffusion through Dynamic Adversarial Training.](https://arxiv.org/abs/2412.02030)\nFor more details, visit the official [a/NitroFusion GitHub repository](https://github.com/ChenDarYen/NitroFusion)." + }, + { + "author": "facok", + "title": "ComfyUI-HunyuanVideoMultiLora", + "reference": "https://github.com/facok/ComfyUI-HunyuanVideoMultiLora", + "files": [ + "https://github.com/facok/ComfyUI-HunyuanVideoMultiLora" + ], + "install_type": "git-clone", + "description": "A custom LoRA-loading node designed to prevent issues such as blurriness and other artifacts when loading multiple LoRAs in HunYuan Video.\nUsage Instructions: The connection method remains unchanged from the original. The only difference is the additional blocks_type option. Please select double_blocks." + }, + { + "author": "facok", + "title": "ComfyUI-TeaCacheHunyuanVideo", + "reference": "https://github.com/facok/ComfyUI-TeaCacheHunyuanVideo", + "files": [ + "https://github.com/facok/ComfyUI-TeaCacheHunyuanVideo" + ], + "install_type": "git-clone", + "description": "This is a TeaCache acceleration node for HunYuan Video, supporting the native node workflow for seamless upgrades. Simply choose the acceleration multiplier you want—currently, three levels are available." + }, + { + "author": "FinetunersAI", + "title": "ComfyUI_Finetuners_Suite", + "reference": "https://github.com/FinetunersAI/ComfyUI_Finetuners_Suite", + "files": [ + "https://github.com/FinetunersAI/ComfyUI_Finetuners_Suite" + ], + "install_type": "git-clone", + "description": "A suite of nodes for ComfyUI that helps making ComfyUI more accesible for artists" + }, + { + "author": "sh570655308", + "title": "ComfyUI-GigapixelAI", + "id": "gigapixel", + "reference": "https://github.com/sh570655308/ComfyUI-GigapixelAI", + "files": [ + "https://github.com/sh570655308/ComfyUI-GigapixelAI" + ], + "install_type": "git-clone", + "description": "Custom nodes use gigapixelai in comfyui." + }, + { + "author": "sh570655308", + "title": "ComfyUI-TopazVideoAI", + "id": "tvai", + "reference": "https://github.com/sh570655308/ComfyUI-TopazVideoAI", + "files": [ + "https://github.com/sh570655308/ComfyUI-TopazVideoAI" + ], + "install_type": "git-clone", + "description": "Custom nodes use topazvideoai in comfyui." + }, + { + "author": "jammyfu", + "title": "Painting Coder Utils", + "id": "painting-coder-utils", + "reference": "https://github.com/jammyfu/ComfyUI_PaintingCoderUtils", + "files": [ + "https://github.com/jammyfu/ComfyUI_PaintingCoderUtils" + ], + "install_type": "git-clone", + "description": "A practical collection of nodes for ComfyUI that streamlines image and text processing workflows. Features include image optimized resolution adjustment, text cleaning tools, dynamic image/text combination, and mask preview utilities. Perfect for artists and developers looking to enhance their AI art creation pipeline." + }, + { + "author": "welltop-cn", + "title": "ComfyUI-TeaCache", + "id": "teacache", + "reference": "https://github.com/welltop-cn/ComfyUI-TeaCache", + "files": [ + "https://github.com/welltop-cn/ComfyUI-TeaCache" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [ali-vilab/TeaCache](https://github.com/ali-vilab/TeaCache) for ComfyUI" + }, + { + "author": "calcuis", + "title": "gguf", + "id": "gguf", + "reference": "https://github.com/calcuis/gguf", + "files": [ + "https://github.com/calcuis/gguf" + ], + "preemptions":[ + "LoaderGGUF", + "ClipLoaderGGUF", + "DualClipLoaderGGUF", + "TripleClipLoaderGGUF", + "LoaderGGUFAdvanced", + "GGUFSave" + ], + "install_type": "git-clone", + "description": "gguf node for comfyui" + }, + { + "author": "LucipherDev", + "title": "ComfyUI-TangoFlux", + "reference": "https://github.com/LucipherDev/ComfyUI-TangoFlux", + "files": [ + "https://github.com/LucipherDev/ComfyUI-TangoFlux" + ], + "install_type": "git-clone", + "description": "ComfyUI Custom Nodes for 'TangoFlux: Super Fast and Faithful Text to Audio Generation with Flow Matching'. This generates high-quality 44.1kHz audio up to 30 seconds using just a text prompt." + }, + { + "author": "ainewsto", + "title": "comfyui-labs-google", + "reference": "https://github.com/ainewsto/comfyui-labs-google", + "files": [ + "https://github.com/ainewsto/comfyui-labs-google" + ], + "install_type": "git-clone", + "description": "NODES: ComfyUI-ImageFx, ComfyUI-Whisk" + }, + { + "author": "gremlation", + "title": "ComfyUI-ViewData", + "reference": "https://github.com/gremlation/ComfyUI-ViewData", + "files": [ + "https://github.com/gremlation/ComfyUI-ViewData" + ], + "install_type": "git-clone", + "description": "A ComfyUI node that displays the type and contents of whatever is connected to the input. In the case of a Tensor object, it shows the shape instead of its value." + }, + { + "author": "gremlation", + "title": "ComfyUI-JMESPath", + "reference": "https://github.com/gremlation/ComfyUI-JMESPath", + "files": [ + "https://github.com/gremlation/ComfyUI-JMESPath" + ], + "install_type": "git-clone", + "description": "A ComfyUI node that runs a [a/JMESPath](https://jmespath.org/) query against input JSON and outputs the result." + }, + { + "author": "gremlation", + "title": "ComfyUI-jq", + "reference": "https://github.com/gremlation/ComfyUI-jq", + "files": [ + "https://github.com/gremlation/ComfyUI-jq" + ], + "install_type": "git-clone", + "description": "A ComfyUI node that runs a [a/jq](https://jqlang.github.io/jq/) query against input JSON and outputs the result." + }, + { + "author": "gremlation", + "title": "ComfyUI-ImageLabel", + "reference": "https://github.com/gremlation/ComfyUI-ImageLabel", + "files": [ + "https://github.com/gremlation/ComfyUI-ImageLabel" + ], + "install_type": "git-clone", + "description": "A ComfyUI node that extends an image vertically to add a label either above or below it." + }, + { + "author": "gremlation", + "title": "ComfyUI-TrackAndWheel", + "reference": "https://github.com/gremlation/ComfyUI-TrackAndWheel", + "files": [ + "https://github.com/gremlation/ComfyUI-TrackAndWheel" + ], + "install_type": "git-clone", + "description": "A ComfyUI extension that improves panning and zooming on trackpads and with the mouse wheel." + }, + { + "author": "nmlen", + "title": "comfyui-mosaic-blur", + "reference": "https://github.com/nmlen/comfyui-mosaic-blur", + "files": [ + "https://github.com/nmlen/comfyui-mosaic-blur" + ], + "install_type": "git-clone", + "description": "A simple mosaic blur node for ComfyUI that uses CV2 or Pillow" + }, + { + "author": "jerrylongyan", + "title": "ComfyUI-My-Mask", + "reference": "https://github.com/jerrylongyan/ComfyUI-My-Mask", + "files": [ + "https://github.com/jerrylongyan/ComfyUI-My-Mask" + ], + "install_type": "git-clone", + "description": "Some nodes for processing masks, currently including nodes that fill in the concave parts of existing masks with convex hulls." + }, + { + "author": "mira-6", + "title": "comfyui-sasolver", + "reference": "https://github.com/mira-6/comfyui-sasolver", + "files": [ + "https://github.com/mira-6/comfyui-sasolver" + ], + "install_type": "git-clone", + "description": "SASolver for Comfyui. Adapted from [a/comfyanonymous/ComfyUI#4454](https://github.com/comfyanonymous/ComfyUI/pull/4454) and [a/https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler](https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler)" + }, + + + + + + @@ -18082,8 +19630,16 @@ "install_type": "copy", "description": "Extremely inspired and forked from: [a/https://github.com/klimaleksus/stable-diffusion-webui-embedding-merge](https://github.com/klimaleksus/stable-diffusion-webui-embedding-merge)" }, - - + { + "author": "ptmaster", + "title": "Embedding Merge for ComfyUI", + "reference": "https://github.com/ptmaster/ComfyUI-Load-Diffusion-Model-to-Muti-GPUs", + "files": [ + "https://github.com/ptmaster/ComfyUI-Load-Diffusion-Model-to-Muti-GPUs/raw/refs/heads/main/Load%20Diffusion%20Model%20into%20Muti%20GPUs.py" + ], + "install_type": "copy", + "description": "NODES: OverrideLoadedDiffusionDevice.\nI happen to have two graphics cards, and I want to load models into another graphics card in Comfyui, so I designed this small node." + }, { diff --git a/extension-node-map.json b/extension-node-map.json index fb076ab0..b183944d 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -9,6 +9,15 @@ "title_aux": "alkemann nodes" } ], + "https://github.com/0x-jerry/comfyui-rembg": [ + [ + "Load Rembg Model", + "Rembg Remove background" + ], + { + "title_aux": "Rembg Background Removal Node for ComfyUI" + } + ], "https://github.com/0xbitches/ComfyUI-LCM": [ [ "LCM_Sampler", @@ -30,12 +39,40 @@ ], "https://github.com/1038lab/ComfyUI-RMBG": [ [ - "RMBG" + "ClothesSegment", + "FashionSegmentAccessories", + "FashionSegmentClothing", + "RMBG", + "Segment" ], { "title_aux": "ComfyUI-RMBG" } ], + "https://github.com/1038lab/ComfyUI-WildPromptor": [ + [ + "AllInOneList", + "KeywordPicker", + "PromptBuilder", + "PromptConcat", + "WildPromptorAllInOne", + "WildPromptorGenerator", + "WildPromptor_DataToPromptList", + "WildPromptor_Enhancer" + ], + { + "title_aux": "ComfyUI-WildPromptor" + } + ], + "https://github.com/111496583yzy/comfyui-PuzzleCrack-Effect": [ + [ + "MyJigsawPuzzleEffect", + "MyRegionBoundaryEffect" + ], + { + "title_aux": "Jigsaw Puzzle Effect Plugin" + } + ], "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant": [ [ "EGIPAdapter_Mad_Assistant", @@ -134,7 +171,8 @@ "https://github.com/1mckw/Comfyui-Gelbooru": [ [ "Gelbooru (ID)", - "Gelbooru (Random)" + "Gelbooru (Random)", + "UrlsToImage" ], { "title_aux": "Comfyui-Gelbooru" @@ -178,6 +216,17 @@ "title_aux": "ComfyUI MagicClip_Strength for SDXL" } ], + "https://github.com/42lux/ComfyUI-42lux": [ + [ + "FluxEmptyLatentSizePicker", + "FluxHighresFixScaler", + "ModelSamplingFluxNormalized", + "PromptWithTokenCounter" + ], + { + "title_aux": "Just a bunch of QOL nodes by 42lux" + } + ], "https://github.com/42lux/ComfyUI-safety-checker": [ [ "Safety Checker" @@ -252,7 +301,15 @@ "title_aux": "ComfyUI-DareMerge" } ], - "https://github.com/5x00/ComfyUI-VLM_Captions": [ + "https://github.com/5x00/ComfyUI-PiAPI-Faceswap": [ + [ + "Face Swapper" + ], + { + "title_aux": "ComfyUI-PiAPI-Faceswap" + } + ], + "https://github.com/5x00/ComfyUI-VLM-Captions": [ [ "Image To Caption" ], @@ -345,22 +402,39 @@ "https://github.com/807502278/ComfyUI-WJNodes": [ [ "AdvCrop", + "ApplyEasyOCR_batch", + "BilateralFilter", + "ColorSegmentation", + "ColorSegmentation_v2", "ComfyUIPath", + "CoordsSelectMask", "ImageChannelBus", "InvertChannelAdv", + "LoadColorConfig", "LoadImageAdv", "LoadImageFromPath", + "MaskAndMaskMath", "MaskDetection", + "MaskLineMapping", + "MaskSelectMask", "MergeImageList", "PathAppend", "PrimitiveNode", "RGBABatchToImage", + "Sam2AutoSegmentation_data", "SaveImageOut", "SaveImageToPath", + "SegmDetectorCombined_batch", "SelectImagesBatch", "SplitPath", "ToImageListData", + "VideoFade", + "WAS_Mask_Fill_Region_batch", "any_data", + "array_count", + "bbox_restore_mask", + "get_image_data", + "load_EasyOCR_model", "load_model_value", "show_type", "sort_images_batch" @@ -689,6 +763,15 @@ "title_aux": "DiffSynth-ComfyUI" } ], + "https://github.com/AIFSH/EchoMimicV2-ComfyUI": [ + [ + "EchoMimicV2Node", + "EchoMimicV2PoseNode" + ], + { + "title_aux": "EchoMimicV2-ComfyUI" + } + ], "https://github.com/AIFSH/EzAudio-ComfyUI": [ [ "EzAudioControlNetNode", @@ -793,15 +876,6 @@ "title_aux": "MiniMates-ComfyUI" } ], - "https://github.com/AIFSH/OmniGen-ComfyUI": [ - [ - "OmniGenLoader", - "OmniGenNode" - ], - { - "title_aux": "OmniGen-ComfyUI" - } - ], "https://github.com/AIFSH/PyramidFlow-ComfyUI": [ [ "PyramidFlowNode" @@ -1166,9 +1240,31 @@ "title_aux": "ComfyUI Nodes for External Tooling" } ], + "https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes": [ + [ + "Advanced_Upscale_Image_Using_Model", + "Capped_Float_Positive", + "Capped_Int_Positive", + "Embedding_Selector", + "Fast_Color_Match", + "Fast_Film_Grain", + "Get_Side_Length_Of_Image", + "Image_Dimensions", + "Image_Tiler", + "Image_Untiler", + "Int_Divide_Rounded", + "Sampler_Settings", + "Smart_Seed", + "Triple_Prompt" + ], + { + "title_aux": "ComfyUI GOAT Nodes" + } + ], "https://github.com/Aerse/ComfyUI-Seed-Nodes": [ [ "Seed-Nodes: ImagePixelator", + "Seed-Nodes: ImageTo3D", "Seed-Nodes: LoadImage", "Seed-Nodes: LoadMultipleImages", "Seed-Nodes: SLICPixelator" @@ -1184,6 +1280,7 @@ "BillBum_Modified_Dalle_API_Node", "BillBum_Modified_DropoutToken_Node", "BillBum_Modified_Flux_API_Node", + "BillBum_Modified_Ideogram_API_Node", "BillBum_Modified_ImageSplit_Node", "BillBum_Modified_Image_API_Call_Node", "BillBum_Modified_LLM_API_Node", @@ -1219,16 +1316,27 @@ "https://github.com/AkashKarnatak/ComfyUI_faishme": [ [ "Faishme Debug", + "Faishme Mannequin to Model Loader", + "Faishme Moondream", "Load Fashion Model" ], { "title_aux": "ComfyUI_faishme" } ], + "https://github.com/Aksaz/comfyui-seamless-clone": [ + [ + "Seamless Clone" + ], + { + "title_aux": "seamless-clone-comfyui" + } + ], "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet": [ [ "ArgosTranslateCLIPTextEncodeNode", "ArgosTranslateTextNode", + "ChatGLM4InstructMediaNode", "ChatGLM4InstructNode", "ChatGLM4TranslateCLIPTextEncodeNode", "ChatGLM4TranslateTextNode", @@ -1255,6 +1363,36 @@ "title_aux": "ComfyUI-Text2Json" } ], + "https://github.com/Amorano/Jovi_GLSL": [ + [ + "GLSL (JOV_GL) \ud83c\udf69", + "GLSL BLEND LINEAR (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL COLOR CONVERSION (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL COLOR PALETTE (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL CONICAL GRADIENT (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL DIRECTIONAL WARP (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL FILTER RANGE (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL GRAYSCALE (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL HSV ADJUST (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL INVERT (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL NORMAL (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL NORMAL BLEND (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL POSTERIZE (JOV_GL) \ud83e\uddd9\ud83c\udffd", + "GLSL TRANSFORM (JOV_GL) \ud83e\uddd9\ud83c\udffd" + ], + { + "title_aux": "Jovi_GLSL" + } + ], + "https://github.com/Amorano/Jovi_Spout": [ + [ + "SPOUT READER (JOV_SP) \ud83d\udcfa", + "SPOUT WRITER (JOV_SP) \ud83c\udfa5" + ], + { + "title_aux": "Jovi_Spout" + } + ], "https://github.com/Amorano/Jovimetrix": [ [ "ADJUST (JOV) \ud83d\udd78\ufe0f", @@ -1297,7 +1435,6 @@ "MIDI READER (JOV) \ud83c\udfb9", "OP BINARY (JOV) \ud83c\udf1f", "OP UNARY (JOV) \ud83c\udfb2", - "PASSTHRU (JOV) \ud83d\ude8c", "PIXEL MERGE (JOV) \ud83e\udec2", "PIXEL SPLIT (JOV) \ud83d\udc94", "PIXEL SWAP (JOV) \ud83d\udd03", @@ -1322,7 +1459,7 @@ "WAVE GEN (JOV) \ud83c\udf0a" ], { - "author": "amorano", + "author": "Alexander G. Morano", "description": "Integrates Webcam, MIDI, Spout and GLSL shader support. Animation", "nodename_pattern": " \\(JOV\\)$", "title": "Jovimetrix", @@ -1331,12 +1468,13 @@ ], "https://github.com/Anibaaal/ComfyUI-UX-Nodes": [ [ + "AdvancedCompositeImageMasked", "BlockLayerStringGenerator", - "CheckpointLoaderBNB", + "BlurNode", + "ColorGeneratorNode", + "DropShadowNode", "EasyResolutionPicker", - "ModelMergeSD3_Large", - "ModelSave", - "UNETLoaderBNB" + "LerpNode" ], { "title_aux": "ComfyUI UX Nodes" @@ -1508,6 +1646,18 @@ "title_aux": "ComfyUI_RSS_Feed_Reader" } ], + "https://github.com/BIMer-99/ComfyUI_FishSpeech_EX": [ + [ + "AudioToPrompt", + "LoadVQGAN", + "Prompt2Semantic", + "SaveAudioToMp3", + "Semantic2Audio" + ], + { + "title_aux": "ComfyUI_FishSpeech_EX" + } + ], "https://github.com/BIMer-99/Comfyui_Hunyuan3D_EX": [ [ "GenerateSixViews", @@ -1706,7 +1856,8 @@ "ComfyUIDeployExternalTextAny", "ComfyUIDeployExternalVid", "ComfyUIDeployExternalVideo", - "ComfyUIDeployModelList" + "ComfyUIDeployModelList", + "ComfyUIDeployStringCombine" ], { "author": "BennyKok", @@ -1927,26 +2078,23 @@ [ "ClearNode", "LoadImageURL", - "LoraTrainer", "UploadImage", - "XSampler" + "XSampler", + "XSave" ], { "title_aux": "ComfyUI-Rework-X" } ], - "https://github.com/BobsBlazed/Bobs_Latent_Optimizer/raw/refs/heads/main/Bobs_Latent_Optimizer.py": [ - [ - "BobsFluxSDXLLatentNode" - ], - { - "title_aux": "Bobs_Latent_Optimizer" - } - ], "https://github.com/Bria-AI/ComfyUI-BRIA-API": [ [ "BriaEraser", - "BriaGenFill" + "BriaGenFill", + "BriaTailoredGen", + "ShotByImageNode", + "ShotByTextNode", + "TailoredModelInfoNode", + "Text2ImageBaseNode" ], { "title_aux": "BRIA AI API nodes" @@ -2084,6 +2232,14 @@ "title_aux": "ImageTransceiver - ComfyUI" } ], + "https://github.com/ChenDarYen/ComfyUI-TimestepShiftModel": [ + [ + "Timestep Shift Model" + ], + { + "title_aux": "ComfyUI-TimestepShiftModel" + } + ], "https://github.com/ChrisColeTech/ComfyUI-Elegant-Resource-Monitor": [ [ "Resource Monitor" @@ -2107,13 +2263,19 @@ "AdvancedNoise", "Base64ToConditioning", "CLIPTextEncodeFluxUnguided", + "ClownInpaint", + "ClownInpaintSimple", "ClownSampler", + "ClownSamplerAdvanced", "ClownsharKSampler", "ClownsharKSamplerAutomation", + "ClownsharKSamplerGuide", "ClownsharKSamplerGuides", "ClownsharKSamplerOptions", "ClownsharKSamplerOptions_SDE_Noise", + "ClownsharkSamplerOptions_FrameWeights", "Conditioning Recast FP64", + "ConditioningAdd", "ConditioningAverageScheduler", "ConditioningMultiply", "ConditioningToBase64", @@ -2122,7 +2284,10 @@ "EmptyLatentImage64", "EmptyLatentImageCustom", "Film Grain", + "FluxGuidanceDisable", "FluxLoader", + "FluxRegionalConditioning", + "FluxRegionalPrompt", "Frequency Separation Hard Light", "Frequency Separation Hard Light LAB", "Image Channels LAB", @@ -2149,12 +2314,15 @@ "Legacy_ClownsharKSampler", "Legacy_ClownsharKSamplerGuides", "Legacy_SharkSampler", + "ModelSamplingAdvanced", + "ModelSamplingAdvancedResolution", "ModelTimestepPatcher", "PrepForUnsampling", + "ReFluxPatcher", "SD35Loader", - "Sampler10th_World_Order", "SamplerOptions_GarbageCollection", "SamplerOptions_TimestepScaling", + "SamplerRK_Test", "Set Precision", "Set Precision Advanced", "Set Precision Universal", @@ -2187,6 +2355,7 @@ "Sigmas2 Add", "Sigmas2 Mult", "SigmasPreview", + "SigmasSchedulePreview", "StableCascade_StageB_Conditioning64", "StableCascade_StageC_VAEEncode_Exact", "StyleModelApplyAdvanced", @@ -2195,10 +2364,14 @@ "Tan Scheduler 2 Simple", "TextBox1", "TextBox3", + "TorchCompileModelFluxAdv", "UNetSave", "UltraSharkSampler", "UltraSharkSampler Tiled", - "VGG19StyleTransfer" + "UltraSharkSamplerRBTest", + "VAEEncodeAdvanced", + "VGG19StyleTransfer", + "Zampler_Test" ], { "title_aux": "RES4LYF" @@ -2236,14 +2409,20 @@ "title_aux": "ComfyUI-Latent-Modifiers" } ], + "https://github.com/ComfyUI-JH/ComfyUI-JH-Misc-Nodes": [ + [ + "JHDaisyChainableStringConstantNode", + "JHPreviewImage", + "JHThreeWaySwitchNode", + "JHTwoWaySwitchNode" + ], + { + "title_aux": "JH Misc. Nodes" + } + ], "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": [ [ "DebugToFile", - "DiTCondLabelEmpty", - "DiTCondLabelSelect", - "DitCheckpointLoader", - "OverrideCLIPDevice", - "OverrideVAEDevice", "PrimereAestheticCKPTScorer", "PrimereAnyDetailer", "PrimereAnyOutput", @@ -2258,6 +2437,7 @@ "PrimereEmbeddingHandler", "PrimereEmbeddingKeywordMerger", "PrimereEmotionsStyles", + "PrimereFaceAnalyzer", "PrimereFastSeed", "PrimereHypernetwork", "PrimereImageSegments", @@ -2266,6 +2446,7 @@ "PrimereLORA", "PrimereLYCORIS", "PrimereLatentNoise", + "PrimereLensStyles", "PrimereLoraKeywordMerger", "PrimereLoraStackMerger", "PrimereLycorisKeywordMerger", @@ -2310,6 +2491,23 @@ "title_aux": "Primere nodes for ComfyUI" } ], + "https://github.com/CpreForEver/CFE_comfyui": [ + [ + "CFE Aspect Ratio", + "CFE FLUX Guidance", + "CFE FLUX Sampler", + "CFE FLUX Sampler (Pipe)", + "CFE Flux In Pipe", + "CFE Flux Out Pipe", + "CFE Lora Params", + "CFE Scheduler", + "CFE Sigma Sampler", + "CFE Sigma Sampler Strings" + ], + { + "title_aux": "CFE_comfyui" + } + ], "https://github.com/Creeper-MZ/comfyui_nai_api": [ [ "NovelAI", @@ -2323,6 +2521,15 @@ "title_aux": "comfyui_nai_api" } ], + "https://github.com/CyanAutumn/ComfyUi_Random_Manage_Cyan": [ + [ + "Random Prompt Cyan", + "Remove Prompt Cyan" + ], + { + "title_aux": "ComfyUi Random Manage Cyan" + } + ], "https://github.com/Cyber-BCat/ComfyUI_Auto_Caption": [ [ "Auto Caption", @@ -2335,12 +2542,14 @@ ], "https://github.com/Cyber-Blacat/ComfyUI-Yuan": [ [ + "Black and white", "Image Judgment", "ImageMinusMask", "Light or Dark", - "Yuan", - "Yuan Transfer", - "YuanBW" + "Load Random Images", + "Mask Preprocess Morphology", + "PhotoShop Transfer", + "Yuan" ], { "title_aux": "ComfyUI-Yuan" @@ -2396,6 +2605,14 @@ "title_aux": "ComfyUI-Roboflow" } ], + "https://github.com/DarioFT/ComfyUI-VideoDirCombiner": [ + [ + "VideoDirCombiner" + ], + { + "title_aux": "ComfyUI-VideoDirCombiner" + } + ], "https://github.com/DataCTE/prompt_injection": [ [ "AdvancedPromptInjection", @@ -2441,6 +2658,92 @@ "title_aux": "Derfuu_ComfyUI_ModdedNodes" } ], + "https://github.com/DesertPixelAi/ComfyUI-Desert-Pixel-Nodes": [ + [ + "DP 10 String Switch", + "DP 2 String Switch", + "DP 5 String Switch", + "DP Add Weight To String Sdxl", + "DP Advanced Weight String Sdxl", + "DP Animation Calculator 10 Inputs", + "DP Animation Calculator 5 Inputs", + "DP Art Style Generator", + "DP Aspect Ratio Picker", + "DP Big Letters", + "DP Broken Token", + "DP Clean Prompt", + "DP Combo Controller", + "DP Condition Mixer", + "DP Crazy Prompt Mixer", + "DP Create Json File", + "DP Custom Aspect Ratio", + "DP Diff Int 8step Selector", + "DP Draggable Floats 1", + "DP Draggable Floats 2", + "DP Draggable Floats 3", + "DP Fast Slow Motion", + "DP Five Lora", + "DP Five Lora Random", + "DP Image Color Analyzer", + "DP Image Color Analyzer Small", + "DP Image Color Effect", + "DP Image Effect Processor", + "DP Image Empty Latent Switch Flux", + "DP Image Empty Latent Switch SDXL", + "DP Image Slide Show", + "DP Image Strip", + "DP Image Switch 10", + "DP Image Switch 3", + "DP Image Switch 5", + "DP Int 0-1000", + "DP Int 0-1000 4 Step", + "DP Int 0-1000 8 Step", + "DP Load Image Effects", + "DP Load Image Effects Small", + "DP Logo Animator", + "DP Logo Animator Advanced", + "DP Lora Random Strength Controller", + "DP Lora Strength Controller", + "DP Lora Strength Stepper", + "DP Prompt Inverter", + "DP Prompt Manager", + "DP Prompt Manager Small", + "DP Prompt Mode Controller", + "DP Prompt Styler", + "DP Prompt Token Compressor", + "DP Random Character", + "DP Random Crazy Prompt Generator", + "DP Random Logo Style Generator", + "DP Random Min Max", + "DP Random Mode Controller", + "DP Random Mode Switch", + "DP Random Psychedelic Punk Generator", + "DP Random Superhero Prompt Generator", + "DP Random Vehicle Generator", + "DP Save Preview Image", + "DP Set New Model Folder Link", + "DP String Text", + "DP String With Switch", + "DP Strings Connector", + "DP Strip Edge Masks", + "DP Switch Controller", + "DP Text Preview", + "DP Transition Frames Selector", + "DP Video Effect Receiver", + "DP Video Effect Sender", + "DP Video Flicker", + "DP Video Looper", + "DP Video Transition", + "DP_Crazy_Prompt_Mixer", + "DP_Logo_Animator_Advanced", + "DP_Lora_Strength_Stepper", + "DP_Prompt_Inverter", + "DP_Strings_Connector" + ], + { + "title_aux": "ComfyUI-Desert-Pixel-Nodes" + } + ], "https://github.com/Dobidop/ComfyStereo": [ [ "LazyStereo", @@ -2450,6 +2753,14 @@ "title_aux": "Dobidop ComfyStereo" } ], + "https://github.com/DoctorDiffusion/ComfyUI-BEN": [ + [ + "BackgroundEraseNetwork" + ], + { + "title_aux": "ComfyUI BEN - Background Erase Network" + } + ], "https://github.com/DoctorDiffusion/ComfyUI-MediaMixer": [ [ "FinalFrameSelector", @@ -2474,12 +2785,21 @@ ], "https://github.com/DoctorDiffusion/ComfyUI-SnakeOil": [ [ - "SnakeOil" + "NegativeLoRALoader" ], { "title_aux": "ComfyUI-SnakeOil" } ], + "https://github.com/DoctorDiffusion/ComfyUI-basic-pitch": [ + [ + "AudioToMidi", + "SaveMidi" + ], + { + "title_aux": "ComfyUI-basic-pitch" + } + ], "https://github.com/DrMWeigand/ComfyUI-StereoVision": [ [ "AutostereogramGenerator", @@ -2498,6 +2818,49 @@ "title_aux": "ComfyUI Color Detection Nodes" } ], + "https://github.com/Eagle-CN/ComfyUI-Addoor": [ + [ + "AD_AnyFileList", + "AD_BatchImageLoadFromDir", + "AD_CSVPromptStyler", + "AD_CSVReader", + "AD_CSVTranslator", + "AD_DeleteLocalAny", + "AD_FluxTrainStepMath", + "AD_HFDownload", + "AD_ImageDrawRectangleSimple", + "AD_ImageIndexer", + "AD_ImageSaver", + "AD_LoadImageAdvanced", + "AD_PromptReplace", + "AD_TextIndexer", + "AD_TextListToString", + "AD_TextSaver", + "AD_TxtToCSVCombiner", + "AD_ZipSave", + "AD_advanced-padding", + "AD_color-image", + "AD_image-concat", + "AD_image-resize", + "AD_mockup-maker", + "AD_poster-maker", + "AD_prompt-saver", + "ImageResize", + "Incrementer \ud83e\udeb4", + "TextAppendNode", + "Width and height for scaling image to ideal resolution \ud83e\udeb4", + "Width and height from aspect ratio \ud83e\udeb4", + "YANC.MultilineString", + "comfyui-easy-padding", + "image concat mask" + ], + { + "author": "ComfyUI Addoor", + "description": "Save prompts to CSV file with customizable naming pattern", + "title": "ComfyUI-PromptSaver", + "title_aux": "ComfyUI-Addoor" + } + ], "https://github.com/EeroHeikkinen/ComfyUI-eesahesNodes": [ [ "InstantX Flux Union ControlNet Loader" @@ -3068,6 +3431,16 @@ "title_aux": "IC-Light-ComfyUI-Node" } ], + "https://github.com/FinetunersAI/ComfyUI_Finetuners_Suite": [ + [ + "AutoImageResize", + "GroupLink", + "VariablesInjector" + ], + { + "title_aux": "ComfyUI_Finetuners_Suite" + } + ], "https://github.com/FizzleDorf/ComfyUI-AIT": [ [ "AIT_Unet_Loader", @@ -3423,6 +3796,14 @@ "title_aux": "GraftingRayman" } ], + "https://github.com/GraftingRayman/ComfyUI_QueueTube": [ + [ + "GR QueueTube" + ], + { + "title_aux": "ComfyUI QueueTube" + } + ], "https://github.com/GreenLandisaLie/AuraSR-ComfyUI": [ [ "AuraSR.AuraSRUpscaler" @@ -3474,12 +3855,34 @@ "title_aux": "ComfyUI-FilePathCreator" } ], + "https://github.com/HM-RunningHub/ComfyUI_RH_APICall": [ + [ + "RH_ExecuteNode", + "RH_ImageUploaderNode", + "RH_NodeInfoListNode", + "RH_SettingsNode", + "RH_Utils" + ], + { + "title_aux": "ComfyUI_RH_APICall" + } + ], + "https://github.com/HM-RunningHub/ComfyUI_RH_OminiControl": [ + [ + "RunningHub_Omini_Fill", + "RunningHub_Omini_Spatial", + "RunningHub_Omini_Subject" + ], + { + "title_aux": "ComfyUI_RH_OminiControl" + } + ], "https://github.com/Haiper-ai/ComfyUI-HaiperAI-API": [ [ "HaiperImage2Video", + "HaiperKeyframeConditioning", "HaiperText2Image", - "HaiperText2Video", - "ImgBBUpload" + "HaiperText2Video" ], { "title_aux": "ComfyUI-HaiperAI-API" @@ -3628,6 +4031,7 @@ "AgentMemoryProvider", "AgentNode", "BasicRecursionFilterNode", + "DocumentChunkRecursionFilterNode", "DocumentProcessor", "LinuxMemoryDirectory", "QueryNode" @@ -3639,6 +4043,17 @@ "title_aux": "ComfyUI_LiteLLM" } ], + "https://github.com/Hullabalo/ComfyUI-Loop": [ + [ + "ImageCutLoop", + "ImagePasteLoop", + "LoadImageSimple", + "SaveImageSimple" + ], + { + "title_aux": "ComfyUI-Loop" + } + ], "https://github.com/IDGallagher/ComfyUI-IG-Motion-I2V": [ [ "MI2V Flow Animator", @@ -3691,6 +4106,29 @@ "title_aux": "ComfyUI-SizeFromArray" } ], + "https://github.com/IamCreateAI/Ruyi-Models": [ + [ + "Ruyi_I2VSampler", + "Ruyi_LoadLora", + "Ruyi_LoadModel" + ], + { + "title_aux": "ComfyUI-Ruyi" + } + ], + "https://github.com/IgalOgonov/ComfyUI_Simple_String_Repository": [ + [ + "SimpleStringRepository", + "SimpleStringRepositoryCompact", + "SimpleStringRepositoryLarge", + "SimpleStringRepositoryLargeCompact", + "SimpleStringRepositorySmall", + "SimpleStringRepositorySmallCompact" + ], + { + "title_aux": "Simple String Repository" + } + ], "https://github.com/ImmortalPie/ComfyUI-PonySwitch": [ [ "PonySwitch" @@ -3699,6 +4137,16 @@ "title_aux": "PonySwitch Node" } ], + "https://github.com/InstantStudioAI/ComfyUI-InstantStudio": [ + [ + "HuggingFace Classify", + "Moondream", + "UploadImagesToInstantStudio" + ], + { + "title_aux": "ComfyUI-InstantStudio" + } + ], "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": [ [ "MX_AlphaBlend", @@ -3790,7 +4238,13 @@ ], "https://github.com/Isi-dev/ComfyUI-UniAnimate-W": [ [ + "Animate_X_Image", + "Animate_X_Image_Long", + "Animate_X_Image_v2", + "Animate_X_ReposeImage", + "Animate_X_ReposeImage_v2", "Gen_align_pose", + "Gen_align_pose2", "ReposeImage", "UniAnimateImage", "UniAnimateImageLong" @@ -3801,14 +4255,21 @@ ], "https://github.com/Isulion/ComfyUI_Isulion": [ [ + "CustomTextNode", + "DisplayImageFromURL", "IsuCollage_Node", - "Isulion Video Prompt Generator \ud83c\udfa5", + "Isulion Civitai Image Display", + "Isulion Civitai Model Explorer", + "Isulion Civitai Trending", "IsulionActionGenerator", "IsulionAlienWorldGenerator", "IsulionAnimalBehaviorGenerator", "IsulionAnimalRandom", "IsulionArtStyleGenerator", "IsulionArtifactGenerator", + "IsulionCivitaiImageDisplay", + "IsulionCivitaiModelExplorer", + "IsulionCivitaiTrending", "IsulionClothingGenerator", "IsulionCuteAnimalRandom", "IsulionEmotionGenerator", @@ -3817,21 +4278,20 @@ "IsulionHabitatGenerator", "IsulionLoadImagesNode", "IsulionMagicalEffectGenerator", - "IsulionMegaPromptGenerator", + "IsulionMegaPromptV3", + "IsulionMultiplePromptGenerator", "IsulionMythicalLocationGenerator", "IsulionNegativePromptGenerator", "IsulionProfessionGenerator", "IsulionPromptEnhancer", - "IsulionPromptGenerator", "IsulionSceneComposition", "IsulionSpacecraftGenerator", "IsulionStyleMixer", "IsulionTechGenerator", "IsulionTimeOfDayGenerator", + "IsulionVideoPromptGenerator", "IsulionWeatherGenerator", - "MegaPromptV3", - "ResourceMonitor", - "\u23fb IsulionShutdown" + "\ud83d\udca4 IsulionShutdown" ], { "title_aux": "ComfyUI_Isulion Random Prompt Generator" @@ -3995,6 +4455,16 @@ "title_aux": "ComfyUI-AI-Assistant" } ], + "https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node": [ + [ + "RandomIntegerNodeEfficient", + "RandomIntegerNodeEfficientAdvanced", + "RandomIntegerNodeList" + ], + { + "title_aux": "ComfyUI-Random-Int-Divisor-Node" + } + ], "https://github.com/Jannchie/ComfyUI-J": [ [ "DiffusersCompelPromptEmbedding", @@ -4025,6 +4495,7 @@ "JNodes_CheckpointSelectorWithString", "JNodes_ConditioningInOut", "JNodes_CreateStereoscopicImageFromDepth", + "JNodes_DiffusionModelSelector", "JNodes_FloatLiteral", "JNodes_GetCleanFilename", "JNodes_GetComfyDirectory", @@ -4061,6 +4532,7 @@ "JNodes_SearchAndReplaceFromFile", "JNodes_SearchAndReplaceFromList", "JNodes_SelectRandomFileFromDirectory", + "JNodes_SeparateStringByDelimiters", "JNodes_SetMetadataA1111", "JNodes_SetNegativePromptInMetaData", "JNodes_SetPositivePromptInMetaData", @@ -4078,6 +4550,14 @@ "title_aux": "ComfyUI-JNodes" } ], + "https://github.com/Jash-Vora/ComfyUI-GarmentDiT": [ + [ + "GarmentEnhancementNode" + ], + { + "title_aux": "FitDiT" + } + ], "https://github.com/JcandZero/ComfyUI_GLM4Node": [ [ "GLM3_turbo_CHAT", @@ -4129,14 +4609,12 @@ "https://github.com/JichaoLiang/Immortal_comfyUI": [ [ "AppendNode", - "ApplyVoiceConversion", "CombineVideos", "ImAppendFreeChatAction", "ImAppendImageActionNode", "ImAppendQuickbackNode", "ImAppendQuickbackVideoNode", "ImAppendVideoNode", - "ImApplyWav2lip", "ImDumpEntity", "ImDumpNode", "ImLoadPackage", @@ -4239,6 +4717,7 @@ ], "https://github.com/JustinMatters/comfyUI-JMNodes": [ [ + "JMBinaryNot", "JMIntegerToBooleans", "JMNumberList", "JMSWitchablePrompt" @@ -4295,7 +4774,7 @@ "title_aux": "TIPO-extension" } ], - "https://github.com/KoreTeknology/ComfyUI-Compositing-Nodes-Pack": [ + "https://github.com/KoreTeknology/ComfyUI-Nai-Production-Nodes-Pack": [ [ "Brightness Image", "ColorMatch2", @@ -4313,7 +4792,7 @@ "Set Text" ], { - "title_aux": "ComfyUI Compositing Nodes Pack" + "title_aux": "ComfyUI Production Nodes Pack" } ], "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": [ @@ -4567,13 +5046,27 @@ "title_aux": "ComfyUI-DenoiseChooser" } ], + "https://github.com/KunmyonChoi/ComfyUI_S3_direct": [ + [ + "Direct Load Image From S3", + "Direct Save Image To S3", + "Save VHS Video to S3" + ], + { + "title_aux": "ComfyUI_S3_direct" + } + ], "https://github.com/KwaiVGI/ComfyUI-KLingAI-API": [ [ "Client", "Image Generator", "Image2Video", "KLingAI Preview Video", + "Lip Sync", + "Lip Sync Audio Input", + "Lip Sync Text Input", "Text2Video", + "Video Extend", "Virtual Try On" ], { @@ -4597,6 +5090,16 @@ "title_aux": "ComfyUI_LG_FFT" } ], + "https://github.com/LAOGOU-666/Comfyui-LG_Relight": [ + [ + "LG_Relight", + "LG_Relight_Basic", + "LG_Relight_V2" + ], + { + "title_aux": "Comfyui-LG_Relight" + } + ], "https://github.com/LEv145/images-grid-comfy-plugin": [ [ "GridAnnotation", @@ -4654,10 +5157,12 @@ "Texturaizer_GetVAEName", "Texturaizer_IPAdapterEmbeds", "Texturaizer_KSamplerAdvanced", + "Texturaizer_Placeholder", "Texturaizer_PowerLoraLoader", "Texturaizer_SetGlobalDir", "Texturaizer_SigmasSelector", "Texturaizer_SwitchAny", + "Texturaizer_SwitchLazy", "Texturaizer_UseSDXL" ], { @@ -4691,6 +5196,7 @@ "Autotagger|LP", "BoolToInt|LP", "BoolToString|LP", + "CLIPTextEncodeTranslate|LP", "FastCheckerPattern|LP", "FileCounter|LP", "FloatToInt|LP", @@ -4736,6 +5242,7 @@ "TagSwitcher|LP", "TenthsSimpleFloatSlider|LP", "TextChoiceParser|LP", + "TextTranslate|LP", "Text|LP" ], { @@ -4750,6 +5257,32 @@ "title_aux": "ComfyUI-Fill-Image-for-Outpainting" } ], + "https://github.com/LiJT/ComfyUI-Gemini-Prompt-Generator-JT": [ + [ + "GeminiPromptGeneratorJT" + ], + { + "title_aux": "Gemini prompt generator JT version" + } + ], + "https://github.com/Light-x02/ComfyUI-FluxSettingsNode": [ + [ + "DisableNoise", + "FluxSettingsNode" + ], + { + "title_aux": "Flux Settings Node" + } + ], + "https://github.com/Light-x02/ComfyUI-Image-Metadata-Nodes": [ + [ + "ImageMetadataLoader", + "ImageMetadataSaver" + ], + { + "title_aux": "Image Metadata Nodes" + } + ], "https://github.com/LightSketch-ai/ComfyUI-LivePortraitNode": [ [ "LightSketch Live Portrait", @@ -4824,6 +5357,35 @@ "title_aux": "ComfyUI-RawSaver" } ], + "https://github.com/LucipherDev/ComfyUI-AniDoc": [ + [ + "AniDocLoader", + "AniDocSampler", + "GetAniDocControlnetImages", + "LoadCoTracker" + ], + { + "title_aux": "ComfyUI-AniDoc" + } + ], + "https://github.com/LucipherDev/ComfyUI-Golden-Noise": [ + [ + "GoldenNoise" + ], + { + "title_aux": "ComfyUI-Golden-Noise" + } + ], + "https://github.com/LucipherDev/ComfyUI-TangoFlux": [ + [ + "TangoFluxLoader", + "TangoFluxSampler", + "TangoFluxVAEDecodeAndPlay" + ], + { + "title_aux": "ComfyUI-TangoFlux" + } + ], "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": [ [ "ScenarioPrompt" @@ -4966,7 +5528,8 @@ ], "https://github.com/MakkiShizu/ComfyUI-Prompt-Wildcards": [ [ - "makiwildcards" + "makiwildcards", + "textconcatenate" ], { "title_aux": "ComfyUI-Prompt-Wildcards" @@ -5012,44 +5575,6 @@ "title_aux": "ComfyI2I" } ], - "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes": [ - [ - "MaraScottAnyBus_v2", - "MaraScottDisplayInfo_v2", - "MaraScottForLoopClose_v1", - "MaraScottForLoopIntMathOperation_v1", - "MaraScottForLoopOpen_v1", - "MaraScottForLoopToBoolNode_v1", - "MaraScottForLoopWhileClose_v1", - "MaraScottForLoopWhileOpen_v1", - "MaraScottGetModelBlocks_v1", - "MaraScottImageToGradient_v1", - "MaraScottIsEmptyOrNone_v1", - "MaraScottIsEmpty_v1", - "MaraScottIsEqual_v1", - "MaraScottIsNone_v1", - "MaraScottLoadImage_v1", - "MaraScottMcBoatyRefiner_v4", - "MaraScottMcBoatyRefiner_v5", - "MaraScottMcBoatyTilePrompter_v4", - "MaraScottMcBoatyTilePrompter_v5", - "MaraScottMcBoatyUpscalerRefiner_v5", - "MaraScottMcBoatyUpscaler_v4", - "MaraScottMcBoatyUpscaler_v5", - "MaraScottPasteInpaintingByMask_v1", - "MaraScottPromptFromImage_v1", - "MaraScottSetInpaintingByMask_v1", - "MaraScottTextConcatenate_v1", - "MaraScottTextConversion_StringToList_v1", - "MaraScottUpscalerRefinerNode_v3", - "MaraScott_Kijai_TokenCounter_v1", - "MaraScott_YoloDetection_v1", - "MaraScott_laksjdjf_Hires_v1" - ], - { - "title_aux": "\ud83d\udc30 MaraScott Nodes" - } - ], "https://github.com/MarcusNyne/m9-prompts-comfyui": [ [ "ScramblePrompts_m9", @@ -5132,6 +5657,14 @@ "title_aux": "SimpleToolsNodes" } ], + "https://github.com/Meettya/ComfyUI-OneForOne": [ + [ + "OFO Image Fit" + ], + { + "title_aux": "ComfyUI-OneForOne" + } + ], "https://github.com/MetaGLM/ComfyUI-ZhipuAI-Platform": [ [ "VideoReportData", @@ -5221,6 +5754,18 @@ "title_aux": "ComfyUI Slothful Attention" } ], + "https://github.com/Miyuutsu/comfyui-save-vpred": [ + [ + "CheckpointSaveVpred" + ], + { + "author": "miyuu", + "description": "Used to save SDXL V-Prediction models directly with correct tensors.", + "nickname": "vpred-save", + "title": "vpred-save", + "title_aux": "comfyui-save-vpred" + } + ], "https://github.com/MohammadAboulEla/ComfyUI-iTools": [ [ "iToolsAddOverlay", @@ -5254,10 +5799,14 @@ "ConnectInteger2", "ConnectLatent", "ConnectString", + "CycleInteger", "DirSelector", "DoubleClipTextEncode", + "DoubleConditioningMixer", "EmbeddingLoader", "FilmCharDir", + "FlexEmptyLatent", + "FloatEvaluate", "FuseImages", "FuseImages2", "HashText", @@ -5277,6 +5826,7 @@ "KillWorkflow", "LandscapeBackgrounds", "LandscapeDir", + "LinEqEval", "MakeupStylesDir", "Mbsampler", "OptimalCrop", @@ -5289,6 +5839,7 @@ "PresetRemove", "PresetSave", "PromptSwitcher", + "QuadClipTextEncode", "RandomString", "SDXLEmptyLatent", "SavePrompt", @@ -5395,19 +5946,47 @@ [ "AspectSize", "AspectSizeV2", + "BatchOffset", + "BatchRangeInsert", + "BatchRangeSwap", + "BatchThief", "DJZ-LoadLatent", "DJZ-LoadLatentV2", + "DJZDatamosh", + "DJZDatamoshV2", + "DatasetWordcloud", + "DinskyPlus", + "DinskyPlusV2", + "DjzDatamoshV3", + "DjzDatamoshV4", + "DjzDatamoshV5", + "DjzDatamoshV6", + "DjzDatamoshV7", + "FractalGenerator", + "FractalGeneratorV2", + "FractalGeneratorV3", "ImageSizeAdjuster", "ImageSizeAdjusterV2", "ImageSizeAdjusterV3", + "LoadTextDirectory", + "LoadVideoDirectory", + "ParametricMeshGen", + "ParametricMeshGenV2", "ProjectFilePathNode", + "PromptCleaner", + "PromptInject", + "PromptSwap", + "SequentialNumberGenerator", "StringWeights", + "TrianglesPlus", + "TrianglesPlusV2", "ZenkaiPrompt", "ZenkaiPromptV2", "ZenkaiWildcard", "ZenkaiWildcardV2" ], { + "author": "DJZ-Nodes", "title_aux": "DJZ-Nodes" } ], @@ -5515,6 +6094,7 @@ "NGs_BetterCLIPTextEncode", "NGs_Checkerboard_Generator", "NGs_Create_Solid_Color", + "NGs_Discord_Webhook", "NGs_Fill_with_Color", "NGs_Image_Progress_Bar", "NGs_Multimask_Read", @@ -5525,6 +6105,7 @@ "NGs_Sliders_PERCENTAGECUT", "NGs_String_Operator", "NGs_String_Squisher", + "NGs_Tag_Source", "NGs_TextBox_JOIN", "NGs_TextBox_SIMPLE", "NGs_TextBox_x2", @@ -5952,7 +6533,7 @@ "title_aux": "Remade_nodes" } ], - "https://github.com/PnthrLeo/comfyUI-image-search": [ + "https://github.com/PnthrLeo/comfyUI-PL-data-tools": [ [ "AreasGenerator", "BatchImageGetter", @@ -6016,6 +6597,21 @@ "title_aux": "ComfyUI-AdvancedLivePortrait" } ], + "https://github.com/PressWagon/ComfyUI-StringsAndThings": [ + [ + "DebugString", + "FormatConcatStrings", + "FormattingSingle", + "FourierAnalysisNode", + "MosaicEffectNode", + "PWLoraNameCollector", + "PWLoraSelector", + "TextEmbeddingsInterrogator" + ], + { + "title_aux": "ComfyUI-StringsAndThings" + } + ], "https://github.com/Pseudotools/Pseudocomfy": [ [ "Combiner", @@ -6039,7 +6635,16 @@ ], "https://github.com/Q-Bug4/Comfyui-Simple-Json-Node": [ [ - "JSONParserNode" + "JSONArrayIteratorNode", + "JSONGeneratorNode", + "JSONKeyCheckerNode", + "JSONLengthNode", + "JSONMergeNode", + "JSONModifierNode", + "JSONObjectIteratorNode", + "JSONParserNode", + "JSONStringifierNode", + "RandomJSONValueNode" ], { "title_aux": "Simple JSON Parser Node for ComfyUI" @@ -6189,6 +6794,30 @@ "title_aux": "ComfyUI-SceneGenerator" } ], + "https://github.com/Runware/ComfyUI-Runware": [ + [ + "Runware API Manager", + "Runware Background Removal", + "Runware ControlNet", + "Runware ControlNet Combine", + "Runware ControlNet PreProcessor", + "Runware Embedding Search", + "Runware Embeddings Combine", + "Runware Image Caption", + "Runware Image Inference", + "Runware Image Masking", + "Runware Image Upscaler", + "Runware Lora Combine", + "Runware Lora Search", + "Runware Model Search", + "Runware PhotoMaker V2", + "Runware Refiner", + "Runware VAE Search" + ], + { + "title_aux": "Runware.ai ComfyUI Inference API Integration" + } + ], "https://github.com/Ryuukeisyou/comfyui_face_parsing": [ [ "BBoxDecompose(FaceParsing)", @@ -6249,6 +6878,22 @@ "title_aux": "ComfyUI SaveAS" } ], + "https://github.com/SKBv0/ComfyUI_SKBundle": [ + [ + "AspectRatioAdvanced", + "DisplayEverything", + "ImageComparer", + "MultiFloat", + "MultiTextNode", + "SKB_AnySwitch", + "SeamlessTexture", + "TextBox", + "TitlePlus" + ], + { + "title_aux": "ComfyUI SKBundle" + } + ], "https://github.com/SLAPaper/ComfyUI-Image-Selector": [ [ "ImageDuplicator", @@ -6715,12 +7360,23 @@ "https://github.com/Shakker-Labs/ComfyUI-IPAdapter-Flux": [ [ "ApplyIPAdapterFlux", - "IPAdapterFluxLoader" + "ApplyIPAdapterFluxAdvanced", + "IPAdapterFluxLoader", + "IPAdapterFluxLoaderAdvanced" ], { "title_aux": "ComfyUI-IPAdapter-Flux" } ], + "https://github.com/Shannooty/ComfyUI-Timer-Nodes": [ + [ + "TimerStart", + "TimerStringConcat" + ], + { + "title_aux": "ComfyUI Timer Nodes" + } + ], "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting": [ [ "CropImageByRect", @@ -6787,6 +7443,23 @@ "title_aux": "ComfyUI-AstralAnimator" } ], + "https://github.com/ShmuelRonen/ComfyUI-CohernetVideoSampler": [ + [ + "CohernetVideoSampler" + ], + { + "title_aux": "ComfyUI Coherent Video Sampler Node" + } + ], + "https://github.com/ShmuelRonen/ComfyUI-EmptyHunyuanLatent": [ + [ + "EmptyHunyuanLatentForImage", + "EmptyHunyuanLatentForVideo" + ], + { + "title_aux": "ComfyUI-EmptyHunyuanLatent" + } + ], "https://github.com/ShmuelRonen/ComfyUI-FreeMemory": [ [ "FreeMemoryCLIP", @@ -6798,6 +7471,51 @@ "title_aux": "ComfyUI-FreeMemory" } ], + "https://github.com/ShmuelRonen/ComfyUI-Gemini_Flash_2.0_Exp": [ + [ + "AudioRecorder", + "Gemini_Flash_200_Exp" + ], + { + "title_aux": "ComfyUI-Gemini_Flash_2.0_Exp" + } + ], + "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoSamplerSave": [ + [ + "EmptyVideoLatentForHunyuan", + "HunyuanVideoSamplerSave", + "ImageMotionInfluance", + "ResizeImageForHunyuan" + ], + { + "title_aux": "ComfyUI-HunyuanVideoSamplerSave" + } + ], + "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoStyler": [ + [ + "HunyuanVideoStyler" + ], + { + "title_aux": "ComfyUI-HunyuanVideoStyler" + } + ], + "https://github.com/ShmuelRonen/ComfyUI-ImageMotionGuider": [ + [ + "ImageMotionGuider" + ], + { + "title_aux": "ComfyUI-ImageMotionGuider" + } + ], + "https://github.com/ShmuelRonen/ComfyUI-LatentSyncWrapper": [ + [ + "D_LatentSyncNode", + "D_VideoLengthAdjuster" + ], + { + "title_aux": "ComfyUI-LatentSyncWrapper" + } + ], "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": [ [ "SVDRsizer" @@ -6806,6 +7524,14 @@ "title_aux": "ComfyUI-SVDResizer" } ], + "https://github.com/ShmuelRonen/ComfyUI_Flux_1.1_RAW_API": [ + [ + "FluxPro11" + ], + { + "title_aux": "ComfyUI Flux 1.1 Ultra & Raw Node" + } + ], "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash": [ [ "Gemini_Flash_002" @@ -6885,6 +7611,24 @@ "title_aux": "ComfyUI_AnimationNodes" } ], + "https://github.com/SlackinJack/asyncdiff_comfyui": [ + [ + "AsyncDiffImg2VidSampler", + "AsyncDiffSVDPipelineLoader" + ], + { + "title_aux": "asyncdiff_comfyui" + } + ], + "https://github.com/SlackinJack/distrifuser_comfyui": [ + [ + "DistrifuserPipelineLoader", + "DistrifuserSampler" + ], + { + "title_aux": "distrifuser_comfyui" + } + ], "https://github.com/SleeeepyZhou/ComfyUI-CNtranslator": [ [ "CNtranslator", @@ -6966,6 +7710,14 @@ "title_aux": "ComfyUI_Mexx_Styler" } ], + "https://github.com/SongGuo11/ComfyUI-SaveAnything-SG11": [ + [ + "SG11_SaveAnything" + ], + { + "title_aux": "ComfyUI SaveAnything Node (SG11)" + } + ], "https://github.com/Sorcerio/MBM-Music-Visualizer": [ [ "id", @@ -7033,6 +7785,14 @@ "title_aux": "Text to video for Stable Video Diffusion in ComfyUI" } ], + "https://github.com/SparknightLLC/ComfyUI-ConditionalInterrupt": [ + [ + "Conditional Interrupt" + ], + { + "title_aux": "ComfyUI-ConditionalInterrupt" + } + ], "https://github.com/SparknightLLC/ComfyUI-LatentClamp": [ [ "LatentClamp" @@ -7096,8 +7856,16 @@ ], "https://github.com/StableDiffusionVN/SDVN_Comfy_node": [ [ + "SDVM Image List Repeat", "SDVN API chatbot", + "SDVN Any From List", "SDVN Any Input Type", + "SDVN Any List", + "SDVN Any Repeat", + "SDVN Any Show", + "SDVN Apply Style Model", + "SDVN Auto Generate", + "SDVN Boolean", "SDVN CLIP Download", "SDVN CLIP Text Encode", "SDVN CLIPVision Download", @@ -7105,20 +7873,49 @@ "SDVN ControlNet Download", "SDVN Controlnet Apply", "SDVN DALL-E Generate Image", + "SDVN Dic Convert", "SDVN Easy IPAdapter weight", + "SDVN Exif check", + "SDVN Filter List", + "SDVN Image Info", + "SDVN Image Layout", + "SDVN Image Repeat", + "SDVN Image Scraper", "SDVN Image Size", + "SDVN Inpaint", + "SDVN Join Parameter", "SDVN KSampler", "SDVN Load Checkpoint", "SDVN Load Image", + "SDVN Load Image Folder", + "SDVN Load Image From List", "SDVN Load Image Url", "SDVN Load Lora", + "SDVN Load Model", + "SDVN Load Text", + "SDVN Logic", "SDVN Lora Download", + "SDVN Lora info", + "SDVN Menu Option", "SDVN Merge Flux", "SDVN Merge SD1", "SDVN Merge SDXL", + "SDVN Metadata Check", + "SDVN Model Merge", + "SDVN Model info editor", + "SDVN Pipe In", + "SDVN Pipe Out", + "SDVN Pipe Out All", + "SDVN Quick Menu", "SDVN Run Python Code", + "SDVN Run Test", + "SDVN Save Text", "SDVN Seed", + "SDVN Simple Any Input", + "SDVN StyleModel Download", + "SDVN Styles", "SDVN Switch", + "SDVN Translate", "SDVN UNET Download", "SDVN UPscale Latent", "SDVN Upscale Image", @@ -7143,13 +7940,15 @@ ], "https://github.com/Starnodes2024/ComfyUI_StarNodes": [ [ + "DetailStarDaemon", "FluxStartSettings", "Fluxstarsampler", "OllamaModelChooser", "SD35StartSettings", "SDXLStartSettings", + "SDstarsampler", "StarFiveWildcards", - "StarNode", + "StarImageSwitch", "Starupscale" ], { @@ -7200,6 +7999,17 @@ "title_aux": "Comfyui_CXH_FluxLoraMerge" } ], + "https://github.com/StartHua/Comfyui_CXH_Phi_3.5": [ + [ + "CXH_Phi_Run", + "CXH_Phi_chat_load", + "CXH_Phi_chat_min", + "CXH_Phi_load" + ], + { + "title_aux": "Comfyui_CXH_Phi_3.5" + } + ], "https://github.com/StartHua/Comfyui_CXH_joy_caption": [ [ "CXH_DownloadAndLoadFlorence2Model", @@ -7220,6 +8030,16 @@ "title_aux": "Comfyui_CXH_joy_caption" } ], + "https://github.com/StartHua/Comfyui_Gemini2": [ + [ + "CXH_Gemini2_TX", + "CXH_Gemini2_Vision", + "CXH_Local_Prompt" + ], + { + "title_aux": "Comfyui_Gemini2" + } + ], "https://github.com/StartHua/Comfyui_joytag": [ [ "CXH_JoyTag" @@ -7244,6 +8064,7 @@ "Divide Image and Select Tile", "Divide and Conquer Algorithm", "Divide and Conquer Algorithm (No Upscale)", + "Load Images into List", "Make Size" ], { @@ -7579,6 +8400,17 @@ "title_aux": "comfyUI_TJ_NormalLighting" } ], + "https://github.com/TKRLAB/ComfyUI_Prompt_List_JSON": [ + [ + "ComfyUI_Prompt_JSON" + ], + { + "author": "TKRLAB", + "description": "ComfyUI JSON-based prompt management tool.", + "title": "ComfyUI_Prompt_List_JSON", + "title_aux": "Prompt List JSON" + } + ], "https://github.com/TMElyralab/Comfyui-MusePose": [ [ "filenamestring", @@ -7659,6 +8491,7 @@ "tri3d_H_Stack_Images", "tri3d_SaveImage_absolute", "tri3d_SaveText_absolute", + "tri3d_SmartBox", "tri3d_Wait_And_Read_File", "tri3d_extract_facer_mask", "tri3d_fill_mask", @@ -7720,7 +8553,8 @@ "TTP_condsetarea_merge_test", "TTP_condtobatch", "TTP_text_mix", - "TTPlanet_Tile_Preprocessor_Simple" + "TTPlanet_Tile_Preprocessor_Simple", + "TeaCacheHunyuanVideoSampler" ], { "title_aux": "Comfyui_TTP_Toolset" @@ -7962,6 +8796,15 @@ "title_aux": "ComfyUI_tinyterraNodes" } ], + "https://github.com/Tlant/ComfyUI-OllamaPromptsGeneratorTlant": [ + [ + "LoadRandomTxtFileTlant", + "OllamaPromptsGeneratorTlant" + ], + { + "title_aux": "ComfyUI-OllamaPromptsGeneratorTlant" + } + ], "https://github.com/Trgtuan10/ComfyUI_YoloSegment_Mask": [ [ "Object Mask" @@ -8069,6 +8912,18 @@ "title_aux": "Tripo for ComfyUI" } ], + "https://github.com/Vaibhavs10/ComfyUI-DDUF": [ + [ + "DDUFLoader", + "DiffusersModelMakeup", + "DiffusersPipelineLoader", + "DiffusersSchedulerLoader", + "DiffusersSimpleSampler" + ], + { + "title_aux": "ComfyUI-DDUF" + } + ], "https://github.com/VangengLab/ComfyUI-LivePortrait_v2": [ [ "LivePortraitProcess_animal" @@ -8154,6 +9009,7 @@ "VrchTextConcatOSCControlNode", "VrchTextKeyControlNode", "VrchTextSwitchOSCControlNode", + "VrchVideoWebViewerNode", "VrchWebViewerNode", "VrchXYOSCControlNode", "VrchXYZOSCControlNode" @@ -8402,6 +9258,8 @@ "Mask Invert", "Mask Minority Region", "Mask Paste Region", + "Mask Rect Area", + "Mask Rect Area (Advanced)", "Mask Smooth Region", "Mask Threshold Region", "Masks Add", @@ -8504,12 +9362,28 @@ "InstaCText", "InstaCTextML", "InstaPromptMultipleStyleSelector", - "InstaPromptStyleSelector" + "InstaPromptStyleSelector", + "LoadVideo", + "PreViewVideo" ], { "title_aux": "InstaSD nodes for ComfyUI" } ], + "https://github.com/WainWong/ComfyUI-Loop-image": [ + [ + "CyberEve_BatchImageLoopClose", + "CyberEve_BatchImageLoopOpen", + "CyberEve_LoopIndexSwitch", + "CyberEve_MaskMerge", + "CyberEve_MaskSegmentation", + "CyberEve_SingleImageLoopClose", + "CyberEve_SingleImageLoopOpen" + ], + { + "title_aux": "ComfyUI-Loop-image" + } + ], "https://github.com/Wakfull33/ComfyUI-SaveImageCivitAI": [ [ "SaveCivitai" @@ -8530,6 +9404,7 @@ "https://github.com/Wicloz/ComfyUI-Simply-Nodes": [ [ "WF_ConditionalLoraLoader", + "WF_FixupPixelArt", "WF_MultilineText", "WF_RandomStyle", "WF_ResolutionSDXL", @@ -8999,6 +9874,14 @@ "title_aux": "ComfyUI-AudioScheduler" } ], + "https://github.com/abdozmantar/ComfyUI-DeepExtract": [ + [ + "VocalAndSoundRemoverNode" + ], + { + "title_aux": "DeepExtract" + } + ], "https://github.com/aburahamu/ComfyUI-IsNiceParts": [ [ "NiceHand" @@ -9148,6 +10031,15 @@ "title_aux": "ComfyUI-styles-all" } ], + "https://github.com/ahernandezmiro/ComfyUI-GCP_Storage_tools": [ + [ + "GCPReadImageNode", + "GCPWriteImageNode" + ], + { + "title_aux": "ComfyUI-GCP_Storage_tools" + } + ], "https://github.com/ai-liam/comfyui-liam": [ [ "AiStoreAzureGPTLiam", @@ -9180,17 +10072,22 @@ [ "AnimalPosePreprocessor", "BatchManager", + "CannyPreprocessor", "ConstrainImageNode", "DWPosePreprocessor", "DWPreprocessor", "DensePosePreprocessor", + "GFPGANNode", "ImageLoader", "ImageResize", "ImageSaver", "ImageSize", "ImagesSaver", + "LineArtPreprocessor", + "LineartStandardPreprocessor", "MaskAddNode", "MiDaSDepthPreprocessor", + "PurgeVRAMNode", "VideoInfo", "VideoLoader", "VideoSaver", @@ -9212,13 +10109,18 @@ "https://github.com/aidenli/ComfyUI_NYJY": [ [ "CivitaiPrompt", + "ConverAnyToString", "CustomLatentImage-NYJY", "CustomLatentImageSimple", "FloatSlider-NYJY", + "GetItemFromList", "JoyCaption", "JoyCaptionAlpha1Online", "JoyCaptionAlpha2Online", "JoyTag", + "JsonDumps", + "JsonLoads", + "SplitString", "Translate" ], { @@ -9233,6 +10135,15 @@ "title_aux": "ComfyUI-HigherBitDepthSaveImage" } ], + "https://github.com/ainewsto/comfyui-labs-google": [ + [ + "ComfyUI-ImageFx", + "ComfyUI-Whisk" + ], + { + "title_aux": "comfyui-labs-google" + } + ], "https://github.com/aisabervisionlab/ComfyUI_merge_ASVL": [ [ "ASVL" @@ -9483,6 +10394,7 @@ "SchedulerToString (Image Saver)", "Seed Generator (Image Saver)", "String Literal (Image Saver)", + "UNet loader with Name (Image Saver)", "Width/Height Literal (Image Saver)" ], { @@ -9654,6 +10566,19 @@ "title_aux": "CLIP Directional Prompt Attention" } ], + "https://github.com/andygill/comfyui-sunflower-nodes": [ + [ + "DepthViewToIsometric", + "DisparityToDepthView", + "EquirectangularToRectilinear", + "ImageChannelSelect", + "MaskChannelSelect", + "ResizeDown" + ], + { + "title_aux": "comfyui-sunflower-nodes" + } + ], "https://github.com/angeloshredder/StableCascadeResizer": [ [ "CascadeResize" @@ -9676,26 +10601,38 @@ ], "https://github.com/arcum42/ComfyUI_SageUtils": [ [ + "Sage_AdvSamplerInfo", + "Sage_CacheMaintenance", + "Sage_CheckpointLoaderRecent", "Sage_CheckpointLoaderSimple", "Sage_CollectKeywordsFromLoraStack", + "Sage_ConditioningOneOut", + "Sage_ConditioningRngOut", "Sage_ConditioningZeroOut", "Sage_ConstructMetadata", + "Sage_ConstructMetadataLite", "Sage_DualCLIPTextEncode", + "Sage_EmptyLatentImagePassthrough", "Sage_GetFileHash", - "Sage_GetInfoFromHash", - "Sage_GetModelJSONFromHash", - "Sage_IterOverFiles", "Sage_JoinText", "Sage_KSampler", + "Sage_LastLoraInfo", + "Sage_LoadImage", + "Sage_LogicalSwitch", "Sage_LoraStack", - "Sage_LoraStackDebugString", "Sage_LoraStackLoader", + "Sage_LoraStackRecent", + "Sage_ModelInfo", + "Sage_ModelReport", "Sage_PonyPrefix", "Sage_SamplerInfo", "Sage_SaveImageWithMetadata", + "Sage_SetBool", "Sage_SetFloat", "Sage_SetInteger", "Sage_SetText", + "Sage_TripleJoinText", + "Sage_UNETLoader", "Sage_ViewText" ], { @@ -9736,23 +10673,33 @@ "title_aux": "ComfyUI-CADS" } ], - "https://github.com/asagi4/comfyui-prompt-control": [ + "https://github.com/asagi4/ComfyUI-NPNet": [ [ - "EditableCLIPEncode", - "FilterSchedule", - "LoRAScheduler", - "PCApplySettings", - "PCPromptFromSchedule", - "PCScheduleAddMasks", - "PCScheduleSettings", - "PCSplitSampling", - "PCWrapGuider", - "PromptControlSimple", - "PromptToSchedule", - "ScheduleToCond", - "ScheduleToModel" + "NPNetGoldenNoise" ], { + "title_aux": "ComfyUI NPNet (Golden Noise)" + } + ], + "https://github.com/asagi4/comfyui-prompt-control": [ + [ + "PCAddMaskToCLIP", + "PCAddMaskToCLIPMany", + "PCLazyLoraLoader", + "PCLazyLoraLoaderAdvanced", + "PCLazyTextEncode", + "PCLazyTextEncodeAdvanced", + "PCLoraHooksFromText", + "PCSetLogLevel", + "PCSetPCTextEncodeSettings", + "PCTextEncode", + "PCTextEncodeWithRange" + ], + { + "author": "asagi4", + "description": "Control LoRA and prompt scheduling, advanced text encoding, regional prompting, and much more, through your text prompt. Generates dynamic graphs that are literally identical to handcrafted noodle soup.", + "nickname": "ComfyUI Prompt Control", + "title": "ComfyUI Prompt Control", "title_aux": "ComfyUI Prompt Control" } ], @@ -9783,14 +10730,14 @@ ], "https://github.com/audioscavenger/ComfyUI-Thumbnails": [ [ - "LoadImageThumbnails" + "LoadImage" ], { "author": "AudioscavengeR", "description": "Load Image thumbnails and show input subfolders.", - "nickname": "ComfyUI Thumbnails", - "title": "ComfyUI Thumbnails", - "title_aux": "ComfyUI Thumbnails" + "nickname": "LoadImageThumbnails", + "title": "LoadImageThumbnails", + "title_aux": "ComfyUI-Thumbnails" } ], "https://github.com/audioscavenger/save-image-extended-comfyui": [ @@ -9934,6 +10881,7 @@ "SP-UnetSave", "SP_DDInpaint_Pipe", "SP_DictValue", + "SP_DynamicCombo", "SP_FlorenceCaption", "SP_FluxFastMergePatchFP8 [Experimental]", "SP_FluxLoader", @@ -9944,12 +10892,14 @@ "SP_HiresGen_Dynamic", "SP_HiresGen_HiresCfg", "SP_HiresGen_Sharpen", + "SP_HunyuanLoader", "SP_KSampler", "SP_KSamplerSelect", "SP_KoboldCpp", "SP_KoboldCppWithContext", "SP_KoboldCpp_BannedTokens", "SP_KoboldCpp_OverrideCfg", + "SP_ListAny", "SP_Pipe", "SP_Pipe_ToBasicPipe", "SP_SD3Loader", @@ -10091,6 +11041,14 @@ "title_aux": "Mikey Nodes" } ], + "https://github.com/bear2b/comfyui-argo-nodes": [ + [ + "ColorMatrixGPU" + ], + { + "title_aux": "ColorMatrixGPU Node for ComfyUI" + } + ], "https://github.com/bedovyy/ComfyUI_NAIDGenerator": [ [ "ColorizeNAID", @@ -10106,13 +11064,15 @@ "PromptToNAID", "RemoveBGNAID", "SketchNAID", + "V4BasePrompt", + "V4NegativePrompt", "VibeTransferOptionNAID" ], { "title_aux": "ComfyUI_NAIDGenerator" } ], - "https://github.com/bentoml/ComfyUI-IDL": [ + "https://github.com/bentoml/comfy-pack": [ [ "CPackInputAny", "CPackInputFile", @@ -10123,7 +11083,7 @@ "CPackOutputImage" ], { - "title_aux": "ComfyUI-IDL" + "title_aux": "Comfy-Pack" } ], "https://github.com/bilal-arikan/ComfyUI_TextAssets": [ @@ -10134,6 +11094,14 @@ "title_aux": "ComfyUI_TextAssets" } ], + "https://github.com/billwuhao/ComfyUI_OneButtonPrompt_Flux": [ + [ + "OneButtonPromptFlux" + ], + { + "title_aux": "ComfyUI_OneButtonPrompt_Flux" + } + ], "https://github.com/bitaffinity/ComfyUI_HF_Inference": [ [ "Classification", @@ -10149,6 +11117,20 @@ "title_aux": "ComfyUI_HF_Inference" } ], + "https://github.com/black-forest-labs/bfl-comfy-nodes": [ + [ + "FLUX 1.0 [canny]", + "FLUX 1.0 [depth]", + "FLUX 1.0 [dev]", + "FLUX 1.0 [fill]", + "FLUX 1.0 [pro]", + "FLUX 1.1 [pro]", + "FLUX 1.1 [ultra]" + ], + { + "title_aux": "Black Forest Labs API Nodes" + } + ], "https://github.com/blackcodetavern/ComfyUI-Benripack": [ [ "AnimationExtractor", @@ -10359,6 +11341,55 @@ "title_aux": "ComfyUI-MagicDance" } ], + "https://github.com/bombax-xiaoice/ComfyUI-Open-Sora-I2V": [ + [ + "OpenSoraDecoder", + "OpenSoraEncoder", + "OpenSoraLoader", + "OpenSoraSampler", + "OpenSoraTextEncoder" + ], + { + "title_aux": "ComfyUI-Open-Sora-I2V" + } + ], + "https://github.com/bombax-xiaoice/ComfyUI-OpenSoraPlan": [ + [ + "OpenSoraPlan0LoaderT2V", + "OpenSoraPlan1LoaderT2V", + "OpenSoraPlan2LoaderI2V", + "OpenSoraPlan2LoaderT2V", + "OpenSoraPlan2SamplerI2V", + "OpenSoraPlan3LoaderI2V", + "OpenSoraPlan3LoaderT2V", + "OpenSoraPlan3SamplerI2V", + "OpenSoraPlanDecoder", + "OpenSoraPlanPromptRefiner", + "OpenSoraPlanSamplerT2V" + ], + { + "title_aux": "ComfyUI-OpenSoraPlan" + } + ], + "https://github.com/bombless/comfyUI-RememberingUtils": [ + [ + "RememberLastSeed", + "ShowLastSeed", + "ShowLastText" + ], + { + "title_aux": "Remembering utils" + } + ], + "https://github.com/bongsang/ComfyUI-Bongsang": [ + [ + "AnyInfo", + "RgbChannel" + ], + { + "title_aux": "ComfyUI-Bongsang" + } + ], "https://github.com/boredofnames/ComfyUI-ntfy": [ [ "Ntfy", @@ -10493,26 +11524,53 @@ "title_aux": "Bytebeat Synthesizer: Composing with Operators" } ], - "https://github.com/c0ffymachyne/ComfyUI_SingalProcessing": [ + "https://github.com/c0ffymachyne/ComfyUI_SignalProcessing": [ [ + "SignalProcessingBaxandall3BandEQ", + "SignalProcessingBaxandallEQ", + "SignalProcessingCompressor", + "SignalProcessingConvolutionReverb", "SignalProcessingFilter", + "SignalProcessingHarmonicsEnhancer", + "SignalProcessingLimiter", "SignalProcessingLoadAudio", + "SignalProcessingLoudness", "SignalProcessingMixdown", - "SignalProcessingMultiBandEQExperimental", - "SignalProcessingMultibandEQ", + "SignalProcessingNormalizer", "SignalProcessingPadSynth", "SignalProcessingPadSynthChoir", - "SignalProcessingPadSynthChoir2", "SignalProcessingPaulStretch", + "SignalProcessingPitchShifter", + "SignalProcessingSaturation", "SignalProcessingSpectrogram", "SignalProcessingStereoWidening", - "SignalProcessingVolumeControl", "SignalProcessingWaveform" ], { "title_aux": "ComfyUI Signal Processing" } ], + "https://github.com/calcuis/gguf": [ + [ + "ClipLoaderGGUF", + "DualClipLoaderGGUF", + "GGUFSave", + "LoaderGGUF", + "LoaderGGUFAdvanced", + "TripleClipLoaderGGUF" + ], + { + "preemptions": [ + "LoaderGGUF", + "ClipLoaderGGUF", + "DualClipLoaderGGUF", + "TripleClipLoaderGGUF", + "LoaderGGUFAdvanced", + "GGUFSave" + ], + "title_aux": "gguf" + } + ], "https://github.com/caleboleary/ComfyUI-Arc2Face": [ [ "Arc2FaceEncoderLoader", @@ -10607,9 +11665,19 @@ "title_aux": "ComfyUI SimpleTools Suit" } ], + "https://github.com/cenzijing/ComfyUI-Markmap": [ + [ + "MarkmapNode", + "ReadHtmlNode" + ], + { + "title_aux": "ComfyUI-Markmap" + } + ], "https://github.com/cerspense/ComfyUI_cspnodes": [ [ "DepthToNormalMap", + "GetMP4Prompt", "ImageDirIterator", "IncrementEveryN", "Modelscopet2v", @@ -10617,7 +11685,6 @@ "RemapRange", "ResizeByImage", "SplitImageChannels", - "TextFileLineIterator", "VidDirIterator" ], { @@ -10665,6 +11732,15 @@ "title_aux": "ComfyUI_EmojiOverlay" } ], + "https://github.com/changwook987/ComfyUI-Small-Utility": [ + [ + "Eval", + "RandomEmptyLatent" + ], + { + "title_aux": "ComfyUI-Small-Utility" + } + ], "https://github.com/chaojie/ComfyUI-AniPortrait": [ [ "AniPortraitLoader", @@ -11119,6 +12195,14 @@ "title_aux": "ComfyUI-SCStepFun" } ], + "https://github.com/cherninlab/logo-generator-comfyui": [ + [ + "GoogleFontsLogo" + ], + { + "title_aux": "Logo Generator Node for ComfyUI" + } + ], "https://github.com/chesnokovivan/ComfyUI-Novakid": [ [ "Novakid Styler" @@ -11181,11 +12265,9 @@ "LayerFilter: SkinBeauty", "LayerFilter: SoftLight", "LayerFilter: WaterColor", - "LayerMask: BenUltra", "LayerMask: BlendIf Mask", "LayerMask: CreateGradientMask", "LayerMask: ImageToMask", - "LayerMask: LoadBenModel", "LayerMask: MaskBoxDetect", "LayerMask: MaskByColor", "LayerMask: MaskEdgeShrink", @@ -11223,12 +12305,14 @@ "LayerStyle: OuterGlow V2", "LayerStyle: Stroke", "LayerStyle: Stroke V2", + "LayerUtility: AnyRerouter", "LayerUtility: BatchSelector", "LayerUtility: Boolean", "LayerUtility: BooleanOperator", "LayerUtility: BooleanOperatorV2", "LayerUtility: CheckMask", "LayerUtility: CheckMaskV2", + "LayerUtility: ChoiceTextPreset", "LayerUtility: ColorImage", "LayerUtility: ColorImage V2", "LayerUtility: ColorName", @@ -11242,11 +12326,14 @@ "LayerUtility: Float", "LayerUtility: GetImageSize", "LayerUtility: GetMainColors", + "LayerUtility: GetMainColorsV2", "LayerUtility: GradientImage", "LayerUtility: GradientImage V2", "LayerUtility: GrayValue", "LayerUtility: HLFrequencyDetailRestore", "LayerUtility: HSV Value", + "LayerUtility: ICMask", + "LayerUtility: ICMaskCropBack", "LayerUtility: If", "LayerUtility: ImageBlend", "LayerUtility: ImageBlend V2", @@ -11258,6 +12345,7 @@ "LayerUtility: ImageCombineAlpha", "LayerUtility: ImageHub", "LayerUtility: ImageMaskScaleAs", + "LayerUtility: ImageMaskScaleAsV2", "LayerUtility: ImageOpacity", "LayerUtility: ImageReel", "LayerUtility: ImageReelComposit", @@ -11272,6 +12360,7 @@ "LayerUtility: LayerImageTransform", "LayerUtility: LayerMaskTransform", "LayerUtility: LoadVQAModel", + "LayerUtility: NameToColor", "LayerUtility: NumberCalculator", "LayerUtility: NumberCalculatorV2", "LayerUtility: PrintInfo", @@ -11281,6 +12370,7 @@ "LayerUtility: RandomGenerator", "LayerUtility: RandomGeneratorV2", "LayerUtility: RestoreCropBox", + "LayerUtility: RoundedRectangle", "LayerUtility: Seed", "LayerUtility: SimpleTextImage", "LayerUtility: String", @@ -11291,6 +12381,7 @@ "LayerUtility: TextImage V2", "LayerUtility: TextJoin", "LayerUtility: TextJoinV2", + "LayerUtility: TextPreseter", "LayerUtility: VQAPrompt", "LayerUtility: XY to Percent" ], @@ -11305,18 +12396,23 @@ "https://github.com/chflame163/ComfyUI_LayerStyle_Advance": [ [ "LayerMask: BBoxJoin", + "LayerMask: BenUltra", "LayerMask: BiRefNetUltra", "LayerMask: BiRefNetUltraV2", "LayerMask: DrawBBoxMask", + "LayerMask: DrawBBoxMaskV2", "LayerMask: EVFSAMUltra", "LayerMask: Florence2Ultra", "LayerMask: HumanPartsUltra", + "LayerMask: LoadBenModel", "LayerMask: LoadBiRefNetModel", "LayerMask: LoadBiRefNetModelV2", "LayerMask: LoadFlorence2Model", + "LayerMask: LoadSegmentAnythingModels", "LayerMask: MaskByDifferent", "LayerMask: MediapipeFacialSegment", "LayerMask: ObjectDetectorFL2", + "LayerMask: ObjectDetectorGemini", "LayerMask: ObjectDetectorMask", "LayerMask: ObjectDetectorYOLO8", "LayerMask: ObjectDetectorYOLOWorld", @@ -11326,12 +12422,15 @@ "LayerMask: SAM2VideoUltra", "LayerMask: SegmentAnythingUltra", "LayerMask: SegmentAnythingUltra V2", + "LayerMask: SegmentAnythingUltra V3", "LayerMask: TransparentBackgroundUltra", "LayerMask: YoloV8Detect", "LayerUtility: AddBlindWaterMark", "LayerUtility: CreateQRCode", "LayerUtility: DecodeQRCode", + "LayerUtility: DeepSeekAPI", "LayerUtility: Florence2Image2Prompt", + "LayerUtility: Gemini", "LayerUtility: GetColorTone", "LayerUtility: GetColorToneV2", "LayerUtility: ImageAutoCrop", @@ -11345,6 +12444,8 @@ "LayerUtility: LlamaVision", "LayerUtility: LoadJoyCaption2Model", "LayerUtility: LoadPSD", + "LayerUtility: LoadSmolLM2Model", + "LayerUtility: LoadSmolVLMModel", "LayerUtility: PhiPrompt", "LayerUtility: PromptEmbellish", "LayerUtility: PromptTagger", @@ -11352,9 +12453,13 @@ "LayerUtility: SD3NegativeConditioning", "LayerUtility: SaveImagePlus", "LayerUtility: ShowBlindWaterMark", + "LayerUtility: SmolLM2", + "LayerUtility: SmolVLM", "LayerUtility: UserPromptGeneratorReplaceWord", "LayerUtility: UserPromptGeneratorTxt2ImgPrompt", - "LayerUtility: UserPromptGeneratorTxt2ImgPromptWithReference" + "LayerUtility: UserPromptGeneratorTxt2ImgPromptWithReference", + "LayerUtility: ZhipuGLM4", + "LayerUtility: ZhipuGLM4V" ], { "author": "chflame", @@ -11500,7 +12605,8 @@ "Batch Noise Simulate", "Mix Noise", "Seperable Batch Noise", - "Shape Noise" + "Shape Noise", + "Split Sigmas with Rewind" ], { "title_aux": "Noise variation and batch noise tools" @@ -11576,8 +12682,26 @@ "title_aux": "youtube-dl-comfyui" } ], + "https://github.com/ciga2011/ComfyUI-MarkItDown": [ + [ + "WIZ_AUDIO2MARKDOWN", + "WIZ_EXCEL2MARKDOWN", + "WIZ_HTML2MARKDOWN", + "WIZ_IMAGE2MARKDOWN", + "WIZ_IPYNB2MARKDOWN", + "WIZ_LLM_CLIENT", + "WIZ_MARKITDOWN", + "WIZ_PDF2MARKDOWN", + "WIZ_POWERPOINT2MARKDOWN", + "WIZ_WORD2MARKDOWN" + ], + { + "title_aux": "ComfyUI MarkItDown" + } + ], "https://github.com/ciri/comfyui-model-downloader": [ [ + "Auto Model Downloader", "CivitAI Downloader", "HF Downloader" ], @@ -11594,6 +12718,13 @@ "UnetLoaderGGUFAdvanced" ], { + "preemptions": [ + "CLIPLoaderGGUF", + "DualCLIPLoaderGGUF", + "TripleCLIPLoaderGGUF", + "UnetLoaderGGUF", + "UnetLoaderGGUFAdvanced" + ], "title_aux": "ComfyUI-GGUF" } ], @@ -11718,6 +12849,15 @@ "title_aux": "ComfyUI-PaddleOcr" } ], + "https://github.com/civen-cn/ComfyUI-Whisper-Translator": [ + [ + "Add Subtitles To FramesX", + "Apply WhisperX" + ], + { + "title_aux": "ComfyUI Whisper Translator" + } + ], "https://github.com/civitai/civitai_comfy_nodes": [ [ "CivitAI_Checkpoint_Loader", @@ -11741,9 +12881,11 @@ "EchartOptionByPath_clh", "EchartOption_clh", "INTConstant_clh", + "JavaScript_clh", "JoinStringMulti_clh", "MathExpression_clh", - "ShowText|clh", + "SetRedis|clh", + "ShowText_clh", "SomethingToString_clh", "String2FatLabels_clh", "String2Image_clh", @@ -11757,6 +12899,14 @@ "title_aux": "Clh Tool for ComfyUI" } ], + "https://github.com/codeprimate/ComfyUI-MaskContourProcessor": [ + [ + "MaskContourProcessor" + ], + { + "title_aux": "ComfyUI Mask Contour Processor" + } + ], "https://github.com/comfyanonymous/ComfyUI": [ [ "AddNoise", @@ -11776,6 +12926,7 @@ "CLIPTextEncodeControlnet", "CLIPTextEncodeFlux", "CLIPTextEncodeHunyuanDiT", + "CLIPTextEncodePixArtAlpha", "CLIPTextEncodeSD3", "CLIPTextEncodeSDXL", "CLIPTextEncodeSDXLRefiner", @@ -11793,6 +12944,7 @@ "ConditioningSetAreaStrength", "ConditioningSetMask", "ConditioningSetTimestepRange", + "ConditioningStableAudio", "ConditioningZeroOut", "ControlNetApply", "ControlNetApplyAdvanced", @@ -11806,6 +12958,7 @@ "DisableNoise", "DualCFGGuider", "DualCLIPLoader", + "EmptyHunyuanLatentVideo", "EmptyImage", "EmptyLTXVLatentVideo", "EmptyLatentAudio", @@ -11873,6 +13026,8 @@ "LatentSubtract", "LatentUpscale", "LatentUpscaleBy", + "Load3D", + "Load3DAnimation", "LoadAudio", "LoadImage", "LoadImageMask", @@ -11880,6 +13035,7 @@ "LoraLoader", "LoraLoaderModelOnly", "LoraSave", + "Mahiro", "MaskComposite", "MaskToImage", "ModelMergeAdd", @@ -11913,6 +13069,7 @@ "PhotoMakerLoader", "PolyexponentialScheduler", "PorterDuffImageComposite", + "Preview3D", "PreviewAudio", "PreviewImage", "RandomNoise", @@ -12466,6 +13623,7 @@ "D2 Checkpoint Loader", "D2 Controlnet Loader", "D2 EmptyImage Alpha", + "D2 Filename Template", "D2 Folder Image Queue", "D2 Get Image Size", "D2 Grid Image", @@ -12477,6 +13635,7 @@ "D2 Load Folder Images", "D2 Load Image", "D2 Multi Output", + "D2 Pipe", "D2 Preview Image", "D2 Refiner Steps", "D2 Refiner Steps A1111", @@ -12493,9 +13652,11 @@ "D2 XY Lora List", "D2 XY Model List", "D2 XY Plot", + "D2 XY Plot Easy", "D2 XY Prompt SR", "D2 XY Prompt SR2", - "D2 XY Seed" + "D2 XY Seed", + "D2 XY String To Plot" ], { "author": "da2el", @@ -12879,6 +14040,14 @@ "title_aux": "ComfyUI-TCD-scheduler" } ], + "https://github.com/diStyApps/ComfyUI-disty-Flow": [ + [ + "Flow" + ], + { + "title_aux": "Flow - Streamlined Way to ComfyUI" + } + ], "https://github.com/diStyApps/ComfyUI_FrameMaker": [ [ "FrameMaker", @@ -13095,21 +14264,6 @@ "title_aux": "ComfyUI-Keyframed" } ], - "https://github.com/doomy23/ComfyUI-D00MYsNodes": [ - [ - "Images_Converter|D00MYs", - "JSPaint|D00MYs", - "Load_Images_From_Paths|D00MYs", - "Random_Images|D00MYs", - "Save_Images|D00MYs", - "Save_Text|D00MYs", - "Show_Text|D00MYs", - "Strings_From_List|D00MYs" - ], - { - "title_aux": "ComfyUI-D00MYsNodes" - } - ], "https://github.com/drago87/ComfyUI_Dragos_Nodes": [ [ "file_padding", @@ -13123,15 +14277,31 @@ ], "https://github.com/drmbt/comfyui-dreambait-nodes": [ [ + "AudioInfoPlus", "BoolPlusPlus", "DRMBT_AspectPadImageForOutpainting", "DRMBT_LoadMedia", "DRMBT_MultiMinMax", "DRMBT_String_Item_Menu", + "DictToOutputs", + "DownloadAndLoadMiniCPMV", + "DreambaitFolderOpener", + "DynamicDictionary", + "ImageFrameBlend", + "ImageResizeFaceAware", + "ListItemExtract", "ListItemSelector", + "LoadAudioPlus", + "MiniCPMVNode", + "MusicGen", + "NormalizeAudio", "NumberPlusPlus", "NumberRemap", + "Qwen2AudioInstruct", + "StringToDict", "SwitchDuo", + "TextLineSelect", + "TextLinesToList", "TextPlusPlus" ], { @@ -13248,10 +14418,12 @@ "Eden_MaskBoundingBox", "Eden_MaskCombiner", "Eden_Math", + "Eden_RandomPromptFromFile", "Eden_RepeatLatentBatch", "Eden_Seed", "Eden_String", "Eden_StringHash", + "Eden_StringReplace", "Eden_gpt4_node", "Extend_Sequence", "FolderScanner", @@ -13313,6 +14485,28 @@ "title_aux": "ComfyUI_Emojiiii_Custom_Nodes" } ], + "https://github.com/envy-ai/ComfyUI-ConDelta": [ + [ + "ApplyConDelta", + "ApplyConDeltaAutoScale", + "ClampConDelta", + "ConditioningAddConDelta", + "ConditioningAddConDeltaAutoScale", + "ConditioningAverageMultiple", + "ConditioningGetNoise", + "ConditioningScale", + "ConditioningSubtract", + "ExtendedConditioningAverage", + "HardClampConDelta", + "LoadConditioningDelta", + "MaskConDelta", + "SaveConditioningDelta", + "ThresholdConditioning" + ], + { + "title_aux": "ComfyUI-ConDelta" + } + ], "https://github.com/erosDiffusion/ComfyUI-enricos-nodes": [ [ "Compositor3", @@ -13388,7 +14582,10 @@ [ "Genera.BatchPreviewer", "Genera.BatchTester", - "Genera.GCPStorageNode" + "Genera.GCPStorageNode", + "Genera.MaskDrawer", + "Genera.Utils", + "PainterNode" ], { "title_aux": "ComfyUI-GeneraNodes" @@ -13473,6 +14670,30 @@ "title_aux": "ComfyUI-Showrunner-Utils" } ], + "https://github.com/facok/ComfyUI-HunyuanVideoMultiLora": [ + [ + "HunyuanVideoLoraLoader" + ], + { + "title_aux": "ComfyUI-HunyuanVideoMultiLora" + } + ], + "https://github.com/facok/ComfyUI-TeaCacheHunyuanVideo": [ + [ + "TeaCacheHunyuanVideoSampler_FOK" + ], + { + "title_aux": "ComfyUI-TeaCacheHunyuanVideo" + } + ], + "https://github.com/fairy-root/ComfyUI-GLHF": [ + [ + "glhf_chat" + ], + { + "title_aux": "ComfyUI-GLHF" + } + ], "https://github.com/fairy-root/Flux-Prompt-Generator": [ [ "FluxPromptGenerator" @@ -14008,6 +15229,22 @@ "title_aux": "ComfyUI_FaceShaper" } ], + "https://github.com/fssorc/ComfyUI_RopeWrapper": [ + [ + "RopeVideoCombine", + "RopeWrapper_DetectNode", + "RopeWrapper_FaceRestore", + "RopeWrapper_LoadModels", + "RopeWrapper_LoadSwapInfo", + "RopeWrapper_OptionNode", + "RopeWrapper_SaveSwapInfo", + "RopeWrapper_SwapNode", + "RopeWrapper_SwapNodeTEST" + ], + { + "title_aux": "ComfyUI_RopeWrapper" + } + ], "https://github.com/fssorc/ComfyUI_pose_inter": [ [ "Pose_Inter" @@ -14053,124 +15290,6 @@ "title_aux": "geocine-comfyui" } ], - "https://github.com/get-salt-AI/SaltAI": [ - [ - "SAIPrimitiveConverter", - "SAIStringRegexSearchMatch", - "SAIStringRegexSearchReplace", - "SaltAIStableVideoDiffusion", - "SaltBatchCropDataExtractor", - "SaltCLIPSegLoader", - "SaltCLIPSegMasking", - "SaltCropImageLocation", - "SaltDisplayAny", - "SaltImagePasteCrop", - "SaltInfo", - "SaltInput", - "SaltLoadImageZip", - "SaltMaskCropRegion", - "SaltMasksToImages", - "SaltOutput", - "SaltRGBAFromMask", - "SaltWebsiteScreenshot" - ], - { - "title_aux": "SaltAI-Open-Resources" - } - ], - "https://github.com/get-salt-AI/SaltAI_Language_Toolkit": [ - [ - "AddTool", - "ChangeSystemMessage", - "ClearMemory", - "ConversableAgentCreator", - "ConversableAgentCreatorAdvanced", - "ConvertAgentAsTool", - "ConvertAgentToLlamaindex", - "CreateTavilySearchTool", - "Example", - "GenerateReply", - "GroupChat", - "GroupChatAdvanced", - "GroupChatManagerCreator", - "LLMCSVReader", - "LLMChat", - "LLMChatBot", - "LLMChatEngine", - "LLMChatMessageConcat", - "LLMChatMessages", - "LLMChatMessagesAdv", - "LLMComplete", - "LLMCustomNodeComposer", - "LLMDirectoryReader", - "LLMDocumentListAppend", - "LLMDocxReader", - "LLMEpubReader", - "LLMFlatReader", - "LLMHTMLTagReader", - "LLMHWPReader", - "LLMHtmlComposer", - "LLMHtmlRepair", - "LLMIPYNBReader", - "LLMImageCaptionReader", - "LLMImageTabularChartReader", - "LLMImageTextReader", - "LLMImageVisionLLMReader", - "LLMInputToDocuments", - "LLMJsonComposer", - "LLMJsonRepair", - "LLMLLaVANextImageEvaluator", - "LLMLLaVANextModelLoader", - "LLMMarkdownComposer", - "LLMMarkdownReader", - "LLMMarkdownRepair", - "LLMMboxReader", - "LLMMultiModalImageEvaluation", - "LLMNotionReader", - "LLMOpenAIModel", - "LLMOpenAIModelOpts", - "LLMPDFReader", - "LLMPagedCSVReader", - "LLMPandasCSVReader", - "LLMParquetDatasetSearcher", - "LLMPostProcessDocuments", - "LLMPptxReader", - "LLMPyMuPDFReader", - "LLMQueryEngine", - "LLMQueryEngineAdv", - "LLMQueryEngineAsTool", - "LLMRTFReader", - "LLMRegexCreator", - "LLMRegexRepair", - "LLMRssReaderNode", - "LLMSaltWebCrawler", - "LLMScaleSERPSearch", - "LLMSemanticSplitterNodeParser", - "LLMSentenceSplitterNodeCreator", - "LLMServiceContextAdv", - "LLMServiceContextDefault", - "LLMSimpleWebPageReader", - "LLMSimpleWebPageReaderAdv", - "LLMSummaryIndex", - "LLMTavilyResearch", - "LLMTrafilaturaWebReader", - "LLMTrafilaturaWebReaderAdv", - "LLMTreeIndex", - "LLMUnstructuredReader", - "LLMVectorStoreIndex", - "LLMVectorStoreIndexAdv", - "LLMVideoAudioReader", - "LLMXMLReader", - "LLMYamlComposer", - "LLMYamlRepair", - "SaltJSONQueryEngine", - "SendMessage", - "SimpleChat" - ], - { - "title_aux": "SaltAI_Language_Toolkit" - } - ], "https://github.com/ggarra13/ComfyUI-mrv2": [ [ "mrv2AnnotationsImageNode", @@ -14280,16 +15399,19 @@ "AI Chooser", "Add Parameters", "AdvPromptEnhancer", + "Custom API Key", "DalleImage", "Enhancer", "Image Mixer", "ImgTextSwitch", + "Load Remote Models", "ParseJSON", "Plush-Exif Wrangler", "Random Image Output", "Random Mixer", "Random Output", "Tagger", + "Text (Any)", "Type Converter", "mulTextSwitch" ], @@ -14481,31 +15603,65 @@ "title_aux": "GFrbmg2" } ], + "https://github.com/gremlation/ComfyUI-ImageLabel": [ + [ + "gremlation:ComfyUI-ImageLabel:ImageLabel" + ], + { + "title_aux": "ComfyUI-ImageLabel" + } + ], + "https://github.com/gremlation/ComfyUI-JMESPath": [ + [ + "gremlation:ComfyUI-JMESPath" + ], + { + "title_aux": "ComfyUI-JMESPath" + } + ], + "https://github.com/gremlation/ComfyUI-ViewData": [ + [ + "gremlation:ComfyUI-ViewData:ViewData" + ], + { + "title_aux": "ComfyUI-ViewData" + } + ], + "https://github.com/gremlation/ComfyUI-jq": [ + [ + "gremlation:ComfyUI-jq" + ], + { + "title_aux": "ComfyUI-jq" + } + ], "https://github.com/griptape-ai/ComfyUI-Griptape": [ [ "Griptape Agent Config: Amazon Bedrock Drivers", - "Griptape Agent Config: Amazon Bedrock [DEPRICATED]", + "Griptape Agent Config: Amazon Bedrock [DEPRECATED]", "Griptape Agent Config: Anthropic Drivers", - "Griptape Agent Config: Anthropic [DEPRICATED]", + "Griptape Agent Config: Anthropic [DEPRECATED]", "Griptape Agent Config: Azure OpenAI Drivers", - "Griptape Agent Config: Azure OpenAI [DEPRICATED]", + "Griptape Agent Config: Azure OpenAI [DEPRECATED]", "Griptape Agent Config: Cohere Drivers", "Griptape Agent Config: Custom Structure", "Griptape Agent Config: Environment Variables", "Griptape Agent Config: Expand", "Griptape Agent Config: Google Drivers", - "Griptape Agent Config: Google [DEPRICATED]", + "Griptape Agent Config: Google [DEPRECATED]", "Griptape Agent Config: HuggingFace Drivers", - "Griptape Agent Config: HuggingFace [DEPRICATED]", + "Griptape Agent Config: HuggingFace [DEPRECATED]", "Griptape Agent Config: LM Studio Drivers", - "Griptape Agent Config: LM Studio [DEPRICATED]", + "Griptape Agent Config: LM Studio [DEPRECATED]", "Griptape Agent Config: Ollama Drivers", - "Griptape Agent Config: Ollama [DEPRICATED]", + "Griptape Agent Config: Ollama [DEPRECATED]", "Griptape Agent Config: OpenAI Compatible Drivers", - "Griptape Agent Config: OpenAI Compatible [DEPRICATED]", + "Griptape Agent Config: OpenAI Compatible [DEPRECATED]", "Griptape Agent Config: OpenAI Drivers", - "Griptape Agent Config: OpenAI [DEPRICATED]", + "Griptape Agent Config: OpenAI [DEPRECATED]", "Griptape Audio Transcription Driver: OpenAI", + "Griptape Code: Run Griptape Cloud Structure", + "Griptape Code: Run Python", "Griptape Combine: Merge Inputs", "Griptape Combine: Merge Texts", "Griptape Combine: RAG Module List", @@ -14521,7 +15677,6 @@ "Griptape Create: Image Inpainting Variation", "Griptape Create: Image Variation", "Griptape Create: Image from Text", - "Griptape Create: Pipeline", "Griptape Create: Rules", "Griptape Create: Text", "Griptape Display: Artifact", @@ -14531,6 +15686,7 @@ "Griptape Driver: Amazon Bedrock Stable Diffusion", "Griptape Driver: Amazon Bedrock Titan", "Griptape Driver: Azure OpenAI Image Generation", + "Griptape Driver: Black Forest Labs Image Generation", "Griptape Driver: Leonardo.AI", "Griptape Driver: OpenAI Compatible Image Generation", "Griptape Driver: OpenAI Image Generation", @@ -14549,8 +15705,6 @@ "Griptape Load: Audio", "Griptape Load: Image From URL", "Griptape Load: Text", - "Griptape Pipeline: Add Task", - "Griptape Pipeline: Insert Task", "Griptape Prompt Driver: Amazon Bedrock", "Griptape Prompt Driver: Amazon SageMaker Jumpstart", "Griptape Prompt Driver: Anthropic", @@ -14578,7 +15732,6 @@ "Griptape Run: Image Description", "Griptape Run: Parallel Image Description", "Griptape Run: Prompt Task", - "Griptape Run: Structure", "Griptape Run: Task", "Griptape Run: Text Extraction", "Griptape Run: Text Summary", @@ -14605,6 +15758,7 @@ "Griptape Util: Create Agent Modelfile", "Griptape Util: Create Model from Modelfile", "Griptape Util: Remove Ollama Model", + "Griptape Util: Switch Node", "Griptape Vector Store Driver: Amazon OpenSearch", "Griptape Vector Store Driver: Azure MongoDB", "Griptape Vector Store Driver: Griptape Cloud", @@ -14620,8 +15774,7 @@ "Griptape WebSearch Driver: DuckDuckGo", "Griptape WebSearch Driver: Exa", "Griptape WebSearch Driver: Google", - "Griptape WebSearch Driver: Tavily", - "Gt Run Agent" + "Griptape WebSearch Driver: Tavily" ], { "author": "Jason Schleifer", @@ -14636,13 +15789,20 @@ "BooleanBasic", "BooleanReverse", "ChooseUpscaleModel", + "FluxAttentionCleanup", + "FluxAttentionControl", "FluxControlNetApply", "FluxResolutionNode", "FluxSampler", "FluxUnionControlNetApply", "GetImageSizeRatio", "IntegerSettings", - "NoisePlusBlend" + "NoisePlusBlend", + "RegionMaskConditioning", + "RegionMaskGenerator", + "RegionMaskProcessor", + "RegionMaskValidator", + "RegionOverlayVisualizer" ], { "title_aux": "ControlAltAI Nodes" @@ -14736,6 +15896,14 @@ "title_aux": "ComfyUI Hallo" } ], + "https://github.com/hay86/ComfyUI_LatentSync": [ + [ + "D_LatentSyncNode" + ], + { + "title_aux": "ComfyUI LatentSync" + } + ], "https://github.com/hay86/ComfyUI_MiniCPM-V": [ [ "D_MiniCPM_VQA" @@ -14812,7 +15980,7 @@ "FolderCleaner", "GGUFLoader", "GeocodeTool", - "Image2Video", + "Image2Video_party", "Images2Image", "KG_csv_toolkit_developer", "KG_csv_toolkit_user", @@ -14828,6 +15996,7 @@ "LLavaLoader", "LorapathLoader", "Lorebook", + "Mcp_tool", "RSS_loader", "RSS_tool", "SpeedChange", @@ -14844,6 +16013,7 @@ "bing_loader", "bing_tool", "bool_logic", + "browser_use_tool", "check_text", "check_web_tool", "classify_function", @@ -14962,7 +16132,6 @@ "save_redis_memo", "savepersona", "searxng_tool", - "selenium_tool", "send_to_wechat_official", "show_text_party", "sql_tool", @@ -14973,6 +16142,8 @@ "story_json_tool", "str2float", "str2int", + "string_combine", + "string_combine_plus", "string_logic", "substring", "svg2html", @@ -15028,6 +16199,14 @@ "title_aux": "Comfyui-Lama" } ], + "https://github.com/hieuck/ComfyUI-BiRefNet": [ + [ + "BiRefNet" + ], + { + "title_aux": "ComfyUI-BiRefNet-Fix utils" + } + ], "https://github.com/hiforce/comfyui-hiforce-plugin": [ [ "HfBoolSwitchKSampleStatus", @@ -15061,6 +16240,14 @@ "title_aux": "ComfyUI 3D Pose Editor" } ], + "https://github.com/hodanajan/optimal-crop-resolution": [ + [ + "AspectRatioCalculator" + ], + { + "title_aux": "optimal-crop-resolution" + } + ], "https://github.com/holchan/ComfyUI-ModelDownloader": [ [ "LoRADownloader", @@ -15103,6 +16290,8 @@ "https://github.com/huanngzh/ComfyUI-MVAdapter": [ [ "BiRefNet", + "ControlImagePreprocessor", + "ControlNetModelLoader", "DiffusersMVSampler", "DiffusersModelMakeup", "DiffusersPipelineLoader", @@ -15111,7 +16300,8 @@ "DiffusersVaeLoader", "ImagePreprocessor", "LdmPipelineLoader", - "LdmVaeLoader" + "LdmVaeLoader", + "LoraModelLoader" ], { "title_aux": "ComfyUI-MVAdapter" @@ -15240,6 +16430,15 @@ "title_aux": "Comfy-UI on-complete-email-me" } ], + "https://github.com/hzane/OmniGen-ComfyUI": [ + [ + "OmniGenLoader", + "OmniGenNode" + ], + { + "title_aux": "OmniGen-ComfyUI" + } + ], "https://github.com/iFREEGROUP/comfyui-undistort": [ [ "IG_LoadCheckerboardImageForCalibrateCamera", @@ -15337,12 +16536,30 @@ "IF_StepCounter", "IF_TextTyper", "IF_VisualizeGraph", - "IF_saveText" + "IF_tools_LoadImagesS" ], { "title_aux": "ComfyUI-IF_AI_tools" } ], + "https://github.com/if-ai/ComfyUI-IF_MemoAvatar": [ + [ + "IF_MemoAvatar", + "IF_MemoCheckpointLoader" + ], + { + "title_aux": "ComfyUI-IF_MemoAvatar" + } + ], + "https://github.com/if-ai/ComfyUI-IF_Trellis": [ + [ + "IF_TrellisCheckpointLoader", + "IF_TrellisImageTo3D" + ], + { + "title_aux": "ComfyUI-IF_Trellis" + } + ], "https://github.com/ihmily/ComfyUI-Light-Tool": [ [ "Light-Tool: AddBackground", @@ -15354,6 +16571,7 @@ "Light-Tool: ImageOverlay", "Light-Tool: ImageToMask", "Light-Tool: InputText", + "Light-Tool: InputTextList", "Light-Tool: InvertMask", "Light-Tool: IsTransparent", "Light-Tool: LoadImage", @@ -15371,7 +16589,8 @@ "Light-Tool: SaveToAliyunOSS", "Light-Tool: SaveVideo", "Light-Tool: ShowText", - "Light-Tool: SolidColorBackground" + "Light-Tool: SolidColorBackground", + "Light-Tool: TextConnect" ], { "author": "Hmily", @@ -15389,6 +16608,14 @@ "title_aux": "FaceSwap" } ], + "https://github.com/inflamously/comfyui-prompt-enhancer": [ + [ + "PROMPT_ENHANCE_Simple" + ], + { + "title_aux": "comfyui-prompt-enhancer" + } + ], "https://github.com/injet-zhou/comfyui_extra_api": [ [ "SimpleGenImageInterface" @@ -15397,6 +16624,72 @@ "title_aux": "comfyui_extra_api" } ], + "https://github.com/inventorado/ComfyUI_NNT": [ + [ + "NntAnalyzeInferenceMetrics", + "NntAnalyzeModel", + "NntCompileModel", + "NntDatasetToImageTensor", + "NntDatasetToTargetTensor", + "NntDatasetToTensor", + "NntDatasetToTextTensor", + "NntDefineActivationLayer", + "NntDefineAlibiPositionalBias", + "NntDefineConvLayer", + "NntDefineDenseLayer", + "NntDefineFlattenLayer", + "NntDefineGRULayer", + "NntDefineLSTMLayer", + "NntDefineLinearAttention", + "NntDefineLocalAttention", + "NntDefineMultiheadAttention", + "NntDefineNormLayer", + "NntDefinePoolingLayer", + "NntDefinePositionalEncoding", + "NntDefineRNNLayer", + "NntDefineReformerAttention", + "NntDefineRelativePositionBias", + "NntDefineReshapeLayer", + "NntDefineRotaryPositionalEmbedding", + "NntDefineTransformerEncoderLayer", + "NntDefineTransformerXLAttention", + "NntDefineVanillaAttention", + "NntEditModelLayers", + "NntEvaluatePredictions", + "NntFileLoader", + "NntFineTuneModel", + "NntHuggingFaceDataLoader", + "NntImageToTensor", + "NntInference", + "NntInputLayer", + "NntLoadModel", + "NntMergeExtendModel", + "NntPlotTensors", + "NntRandomTensorGenerator", + "NntSHAPSummaryNode", + "NntSaveModel", + "NntShowLayerStack", + "NntShowModelInfo", + "NntTensorElementToImage", + "NntTensorOperations", + "NntTensorSlice", + "NntTensorToText", + "NntTextBatchProcessor", + "NntTextToTensor", + "NntTimeSeriesDataLoader", + "NntTorchvisionDataLoader", + "NntTorchvisionDatasets", + "NntTrainModel", + "NntTrainingHyperparameters", + "NntVisualizeConfidenceScores", + "NntVisualizeGraph", + "NntVisualizePredictionMetrics", + "NntVisualizeTrainingMetrics" + ], + { + "title_aux": "ComfyUI Neural Network Toolkit NNT " + } + ], "https://github.com/iwanders/ComfyUI_nodes": [ [ "IW_JsonPickItem", @@ -15562,6 +16855,8 @@ "Base Model Parameters SD3API JK", "Base Model Pipe Extract JK", "Base Model Pipe JK", + "Bool Binary And JK", + "Bool Binary OR JK", "CM_BoolBinaryOperation JK", "CM_BoolToInt JK", "CM_BoolUnaryOperation JK", @@ -15622,6 +16917,7 @@ "CR Clip Input Switch JK", "CR Conditioning Input Switch JK", "CR ControlNet Input Switch JK", + "CR ControlNet Loader JK", "CR ControlNet Stack Input Switch JK", "CR Float Input Switch JK", "CR Guider Input Switch JK", @@ -15634,6 +16930,7 @@ "CR Mask Input Switch JK", "CR Mesh Input Switch JK", "CR Model Input Switch JK", + "CR Multi-ControlNet Param Stack JK", "CR Multi-ControlNet Stack JK", "CR Noise Input Switch JK", "CR Obit Pose Input Switch JK", @@ -15648,6 +16945,7 @@ "CR Text Input Switch JK", "CR VAE Input Switch JK", "Ckpt Loader JK", + "Color Grading JK", "Detailer Parameters JK", "Embedding Picker JK", "Embedding Picker Multi JK", @@ -15656,13 +16954,58 @@ "Evaluate Floats JK", "Evaluate Ints JK", "Evaluate Strings JK", + "Get Size JK", + "Guidance Default JK", "HintImageEnchance JK", + "IPAAdapterFaceIDBatch", + "IPAdapter", + "IPAdapterAdvanced", + "IPAdapterBatch", + "IPAdapterClipVisionEnhancer", + "IPAdapterClipVisionEnhancerBatch", + "IPAdapterCombineEmbeds", + "IPAdapterCombineParams", + "IPAdapterCombineWeights", + "IPAdapterEmbeds", + "IPAdapterEmbedsBatch", + "IPAdapterEncoder", + "IPAdapterFaceID", + "IPAdapterFaceIDKolors", + "IPAdapterFromParams", + "IPAdapterInsightFaceLoader", + "IPAdapterLoadEmbeds", + "IPAdapterMS", + "IPAdapterModelLoader", + "IPAdapterNoise", + "IPAdapterPreciseComposition", + "IPAdapterPreciseCompositionBatch", + "IPAdapterPreciseStyleTransfer", + "IPAdapterPreciseStyleTransferBatch", + "IPAdapterPromptScheduleFromWeightsStrategy", + "IPAdapterRegionalConditioning", + "IPAdapterSaveEmbeds", + "IPAdapterStyleComposition", + "IPAdapterStyleCompositionBatch", + "IPAdapterTiled", + "IPAdapterTiledBatch", + "IPAdapterUnifiedLoader", + "IPAdapterUnifiedLoaderCommunity", + "IPAdapterUnifiedLoaderFaceID", + "IPAdapterWeights", + "IPAdapterWeightsFromStrategy", + "Image Crop by Mask Params JK", + "Image Crop by Mask Resolution JK", "Image Remove Alpha JK", + "Image Resize Mode JK", "Image Upscale Parameters Extract JK", "Is Mask Empty JK", + "Ksampler Parameters Default JK", "Ksampler Parameters JK", + "Latent Crop Offset JK", "Latent Upscale Parameters Extract JK", + "Load Image With Alpha JK", "Load Image With Metadata JK", + "Make Image Grid JK", "Metadata Pipe Extract JK", "Metadata Pipe JK", "NodesState JK", @@ -15672,6 +17015,7 @@ "OrbitLists to OrbitPoses JK", "OrbitPoses to OrbitLists JK", "Pipe End JK", + "PrepImageForClipVision", "Project Setting JK", "Random Beats JK", "Refine 1 Parameters Extract JK", @@ -15686,6 +17030,7 @@ "Reroute String JK", "Reroute Upscale JK", "Reroute Vae JK", + "SDXL Target Res JK", "SDXLPromptStylerAll", "SDXLPromptStylerHorror", "SDXLPromptStylerMisc", @@ -15730,8 +17075,10 @@ "Sampler Loader JK", "Save Image with Metadata Flow JK", "Save Image with Metadata JK", + "Scale To Resolution JK", + "Split Image Grid JK", "Stability Conservative Upscale", - "Stability Control Skech", + "Stability Control Sketch", "Stability Control Structure", "Stability Control Style", "Stability Creative Upscale", @@ -15742,11 +17089,13 @@ "Stability Inpainting", "Stability Outpainting", "Stability Remove Background", + "Stability Replace Background and Relight", "Stability SD3", "Stability Search And Recolor", "Stability Search and Replace", "String To Combo JK", "Tiling Mode JK", + "Upscale Method JK", "Upscale Model Loader JK", "Upscale Model Parameters Extract JK", "Upscale Model Parameters JK", @@ -15852,6 +17201,50 @@ "title_aux": "Various ComfyUI Nodes by Type" } ], + "https://github.com/jammyfu/ComfyUI_PaintingCoderUtils": [ + [ + "ClickPopup", + "ColorPicker", + "DynamicImageCombiner", + "DynamicMaskCombiner", + "ImageLatentCreator", + "ImageResolutionAdjuster", + "ImageSizeCreator", + "ImageSwitch", + "ImageToBase64", + "LatentSwitch", + "MaskPreview", + "MaskSwitch", + "MultilineTextInput", + "RemoveEmptyLinesAndLeadingSpaces", + "RemoveEmptyLinesAndLeadingSpacesAdvance", + "ShowTextPlus", + "SimpleTextInput", + "TextCombiner", + "TextSwitch", + "WebImageLoader" + ], + { + "title_aux": "Painting Coder Utils" + } + ], + "https://github.com/jax-explorer/comfyui-model-dynamic-loader": [ + [ + "ComfyOnlineSaveFile", + "ComfyOnlineUploadAnything", + "EmbeddingLoader", + "LoadHunyuanLoraFromCivitAI", + "LoadHunyuanLoraFromComfyOnline", + "LoadHunyuanLoraFromHF", + "LoadLoraFromCivitAI", + "LoadLoraFromComfyOnline", + "LoadLoraFromHF", + "SaveAudioAsWav" + ], + { + "title_aux": "comfyui-model-dynamic-loader" + } + ], "https://github.com/jax-explorer/fast_video_comfyui": [ [ "FastImageListToImageBatch" @@ -15888,6 +17281,15 @@ "title_aux": "Faceless Node for ComfyUI" } ], + "https://github.com/jerrylongyan/ComfyUI-My-Mask": [ + [ + "MaskToBottonHalfConvexMask", + "MaskToConvexMask" + ], + { + "title_aux": "ComfyUI-My-Mask" + } + ], "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": [ [ "StreamDiffusion_Loader", @@ -15897,6 +17299,16 @@ "title_aux": "ComfyUI_StreamDiffusion" } ], + "https://github.com/jiaqianjing/ComfyUI-MidjourneyHub": [ + [ + "MidjourneyActionNode", + "MidjourneyBatchActionNode", + "MidjourneyImagineNode" + ], + { + "title_aux": "ComfyUI-MidjourneyHub" + } + ], "https://github.com/jiaxiangc/ComfyUI-ResAdapter": [ [ "ResAdapterLoader" @@ -16164,12 +17576,34 @@ "title_aux": "ComfyUI LayerDivider" } ], + "https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node": [ + [ + "JurdnsGroqAPIPromptEnhancer" + ], + { + "title_aux": "Jurdns Groq API Node" + } + ], "https://github.com/justUmen/Bjornulf_custom_nodes": [ [ + "Bjornulf_APIGenerateCivitAI", + "Bjornulf_APIGenerateCivitAIAddLORA", + "Bjornulf_APIGenerateFalAI", + "Bjornulf_APIGenerateFlux", + "Bjornulf_APIGenerateStability", "Bjornulf_AddLineNumbers", "Bjornulf_AnythingToText", "Bjornulf_AudioVideoSync", "Bjornulf_CharacterDescriptionGenerator", + "Bjornulf_CivitAILoraSelector", + "Bjornulf_CivitAILoraSelectorPONY", + "Bjornulf_CivitAILoraSelectorSD15", + "Bjornulf_CivitAILoraSelectorSDXL", + "Bjornulf_CivitAIModelSelectorFLUX_D", + "Bjornulf_CivitAIModelSelectorFLUX_S", + "Bjornulf_CivitAIModelSelectorPony", + "Bjornulf_CivitAIModelSelectorSD15", + "Bjornulf_CivitAIModelSelectorSDXL", "Bjornulf_CombineBackgroundOverlay", "Bjornulf_CombineImages", "Bjornulf_CombineTexts", @@ -16182,10 +17616,19 @@ "Bjornulf_FreeVRAM", "Bjornulf_GrayscaleTransform", "Bjornulf_GreenScreenToTransparency", + "Bjornulf_HiResFix", "Bjornulf_IfElse", + "Bjornulf_ImageBlend", "Bjornulf_ImageDetails", "Bjornulf_ImageMaskCutter", "Bjornulf_ImagesListToVideo", + "Bjornulf_LatentResolutionSelector", + "Bjornulf_ListLooper", + "Bjornulf_ListLooperCharacter", + "Bjornulf_ListLooperOutfitFemale", + "Bjornulf_ListLooperOutfitMale", + "Bjornulf_ListLooperScene", + "Bjornulf_ListLooperStyle", "Bjornulf_LoadImageWithTransparency", "Bjornulf_LoadImagesFromSelectedFolder", "Bjornulf_LoopAllLines", @@ -16235,6 +17678,16 @@ "Bjornulf_ShowStringText", "Bjornulf_ShowText", "Bjornulf_SpeechToText", + "Bjornulf_TextGenerator", + "Bjornulf_TextGeneratorCharacterCreature", + "Bjornulf_TextGeneratorCharacterFemale", + "Bjornulf_TextGeneratorCharacterMale", + "Bjornulf_TextGeneratorCharacterObject", + "Bjornulf_TextGeneratorCharacterPose", + "Bjornulf_TextGeneratorOutfitFemale", + "Bjornulf_TextGeneratorOutfitMale", + "Bjornulf_TextGeneratorScene", + "Bjornulf_TextGeneratorStyle", "Bjornulf_TextReplace", "Bjornulf_TextToAnything", "Bjornulf_TextToSpeech", @@ -16466,6 +17919,18 @@ "title_aux": "comfyUI-nsfw-detection" } ], + "https://github.com/kazeyori/ComfyUI-QuickImageSequenceProcess": [ + [ + "QuickImageSequenceProcess" + ], + { + "author": "kazeyori", + "description": "A ComfyUI plugin for efficient image sequence processing. Features frame insertion, duplication, and removal with intuitive controls.", + "nickname": "QuickSeq", + "title": "Quick Image Sequence Process", + "title_aux": "Quick Image Sequence Process" + } + ], "https://github.com/kealiu/ComfyUI-S3-Tools": [ [ "Load Image From S3", @@ -16510,6 +17975,14 @@ "title_aux": "qq-nodes-comfyui" } ], + "https://github.com/kevinmcmahondev/comfyui-skin-tone-detector": [ + [ + "SkinToneDetector" + ], + { + "title_aux": "Skin Tone Detector for ComfyUI" + } + ], "https://github.com/kft334/Knodes": [ [ "Image(s) To Websocket (Base64)", @@ -16575,6 +18048,7 @@ "CogVideoContextOptions", "CogVideoControlNet", "CogVideoDecode", + "CogVideoEnhanceAVideo", "CogVideoImageEncode", "CogVideoImageEncodeFunInP", "CogVideoLatentPreview", @@ -16735,6 +18209,38 @@ "title_aux": "Geowizard depth and normal estimation in ComfyUI" } ], + "https://github.com/kijai/ComfyUI-HunyuanVideoWrapper": [ + [ + "DownloadAndLoadHyVideoTextEncoder", + "HyVideoBlockSwap", + "HyVideoCFG", + "HyVideoContextOptions", + "HyVideoCustomPromptTemplate", + "HyVideoDecode", + "HyVideoEmptyTextEmbeds", + "HyVideoEncode", + "HyVideoEnhanceAVideo", + "HyVideoInverseSampler", + "HyVideoLatentPreview", + "HyVideoLoraBlockEdit", + "HyVideoLoraSelect", + "HyVideoModelLoader", + "HyVideoPromptMixSampler", + "HyVideoReSampler", + "HyVideoSTG", + "HyVideoSampler", + "HyVideoTeaCache", + "HyVideoTextEmbedsLoad", + "HyVideoTextEmbedsSave", + "HyVideoTextEncode", + "HyVideoTextImageEncode", + "HyVideoTorchCompileSettings", + "HyVideoVAELoader" + ], + { + "title_aux": "ComfyUI-HunyuanVideoWrapper" + } + ], "https://github.com/kijai/ComfyUI-IC-Light": [ [ "BackgroundScaler", @@ -16754,6 +18260,7 @@ "AddLabel", "AppendInstanceDiffusionTracking", "AppendStringsToList", + "AudioConcatenate", "BOOLConstant", "BatchCLIPSeg", "BatchCropFromMask", @@ -16857,6 +18364,7 @@ "OffsetMask", "OffsetMaskByNormalizedAmplitude", "PatchModelPatcherOrder", + "PathchSageAttentionKJ", "PlotCoordinates", "PointsEditor", "PreviewAnimation", @@ -17164,9 +18672,9 @@ "https://github.com/klinter007/klinter_nodes": [ [ "AspectSelector", - "ExtraPadding", "FolderLoader", "LoadImagePlus", + "OutpaintPadding", "SizeSelector", "SpeedRamp", "YellowBus", @@ -17242,6 +18750,32 @@ "title_aux": "komojini-comfyui-nodes" } ], + "https://github.com/kostenickj/jk-comfyui-helpers": [ + [ + "EasyHRFix", + "EasyHRFix_Context", + "JKAnythingToString", + "JKBigContext", + "JKDynamicThresholdingMultiModel", + "JKEasyCheckpointLoader", + "JKEasyDetailer", + "JKEasyDetailer_Context", + "JKEasyKSampler_Context", + "JKEasyUpscaleImage", + "JKEasyWatermark", + "JKInspireSchedulerAdapter", + "JKLilContext", + "JKMultiModelSamplerUnpatch", + "JKStringEmpty", + "JKStringEquals", + "JKStringNotEmpty", + "JKStringNotEquals", + "JKStringToSamplerAdapter" + ], + { + "title_aux": "comfyui-jk-easy-nodes" + } + ], "https://github.com/kunieone/ComfyUI_alkaid": [ [ "A_EmptyLatentImageLongside", @@ -17440,6 +18974,15 @@ "title_aux": "ComfyUI nodes to use CrossImageAttention" } ], + "https://github.com/leeguandong/ComfyUI_FluxCustomId": [ + [ + "ApplyCustomIDFlux", + "CustomIDModelLoader" + ], + { + "title_aux": "ComfyUI_FluxCustomId" + } + ], "https://github.com/leeguandong/ComfyUI_InternVL2": [ [ "DynamicPreprocess", @@ -17541,26 +19084,6 @@ "title_aux": "ComfyUI-GG" } ], - "https://github.com/leiweiqiang/ComfyUI-TRA": [ - [ - "TclEbSynth", - "TclEbSynthBatch", - "TclExr2png", - "TclExtractFramesFromVideo", - "TclExtractFramesFromVideoFile", - "TclFrames2Video", - "TclFresco", - "TclLoraGenDatasets", - "TclLoraSaveImages", - "TclLoraTraining", - "TclSaveVideoFromFrames", - "TclYoloV8Segmentation", - "TclYoloV9Segmentation" - ], - { - "title_aux": "ComfyUI-TRA" - } - ], "https://github.com/lenskikh/ComfyUI-Prompt-Worker": [ [ "Prompt Worker" @@ -17571,11 +19094,9 @@ ], "https://github.com/leoleelxh/ComfyUI-LLMs": [ [ - "\ud83d\uddbc\ufe0f LLMs_Vison_Ali", - "\ud83d\uddbc\ufe0f LLMs_Vison_GLM4", - "\ud83d\uddbc\ufe0f LLMs_Vison_Gemini", - "\ud83d\ude00 LLMs_Chat", - "\ud83d\ude00 LLMs_Chat_GLM4_Only" + "LLMs Chat", + "LLMs Vision Unified", + "LLMs_Vision_Unified" ], { "title_aux": "ComfyUI-LLMs" @@ -17613,6 +19134,7 @@ "LenDistortion", "PixelOE", "Pixelize", + "SaveImageWithCustomExif", "Sketch", "TiltShift" ], @@ -17620,6 +19142,14 @@ "title_aux": "ComfyUI-HakuImg" } ], + "https://github.com/licyk/ComfyUI-TCD-Sampler": [ + [ + "TCDScheduler" + ], + { + "title_aux": "ComfyUI-TCD-Sampler" + } + ], "https://github.com/linshier/comfyui-remote-tools": [ [ "LoadBase64(js)", @@ -17649,6 +19179,23 @@ "title_aux": "ComfyUI-Image-Compressor" } ], + "https://github.com/liuqianhonga/ComfyUI-String-Helper": [ + [ + "JsonToCSV", + "ShowTranslateString", + "StringConverter", + "StringFormatter", + "StringList", + "StringListFromCSV", + "StringListToCSV", + "StringMatcher", + "StringTranslate", + "TimeFormatter" + ], + { + "title_aux": "ComfyUI-String-Helper" + } + ], "https://github.com/liushuchun/ComfyUI_Lora_List_With_Url_Loader": [ [ "LoraListUrlLoader" @@ -17751,8 +19298,11 @@ "https://github.com/lldacing/ComfyUI_BiRefNet_ll": [ [ "AutoDownloadBiRefNetModel", + "BlurFusionForegroundEstimation", + "GetMaskByBiRefNet", "LoadRembgByBiRefNetModel", - "RembgByBiRefNet" + "RembgByBiRefNet", + "RembgByBiRefNetAdvanced" ], { "title_aux": "ComfyUI_BiRefNet_ll" @@ -17845,7 +19395,8 @@ "SliceList", "SplitStringToList", "StringArea", - "StringToList" + "StringToList", + "TryFreeMemory" ], { "title_aux": "comfyui-easyapi-nodes" @@ -17863,6 +19414,7 @@ [ "FluxModCheckpointLoader", "FluxModCheckpointLoaderMini", + "FluxModSamplerWrapper", "KSamplerMod", "SkipLayerForward" ], @@ -17920,7 +19472,9 @@ "ConfigureModifiedFlux", "CreateRegionalCond", "FlowEditForwardSampler", + "FlowEditGuider", "FlowEditReverseSampler", + "FlowEditSampler", "FluxAttnOverride", "FluxDeGuidance", "FluxForwardODESampler", @@ -17970,6 +19524,9 @@ "LTXAttentioOverride", "LTXAttentionBank", "LTXAttnOverride", + "LTXFetaEnhance", + "LTXFlowEditCFGGuider", + "LTXFlowEditSampler", "LTXForwardModelSamplingPred", "LTXPerturbedAttention", "LTXPrepareAttnInjections", @@ -18382,6 +19939,8 @@ "MaskDetailerPipe", "MaskListToMaskBatch", "MaskPainter", + "MaskRectArea", + "MaskRectAreaAdvanced", "MaskToSEGS", "MaskToSEGS_for_AnimateDiff", "MasksToMaskList", @@ -18442,7 +20001,6 @@ "TwoSamplersForMask", "TwoSamplersForMaskUpscalerProvider", "TwoSamplersForMaskUpscalerProviderPipe", - "UltralyticsDetectorProvider", "UnsamplerDetailerHookProvider", "UnsamplerHookProvider", "VariationNoiseDetailerHookProvider", @@ -18459,6 +20017,18 @@ "title_aux": "ComfyUI Impact Pack" } ], + "https://github.com/ltdrdata/ComfyUI-Impact-Subpack": [ + [ + "UltralyticsDetectorProvider" + ], + { + "author": "Dr.Lt.Data", + "description": "This extension provides UltralyticsDetectorProvider node", + "nickname": "Impact Subpack", + "title": "Impact Subpack", + "title_aux": "ComfyUI Impact Subpack" + } + ], "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": [ [ "AnimeLineArt_Preprocessor_Provider_for_SEGS //Inspire", @@ -18587,6 +20157,7 @@ ], "https://github.com/lucafoscili/comfyui-lf": [ [ + "LF_Blend", "LF_BlurImages", "LF_Boolean", "LF_Brightness", @@ -18608,6 +20179,7 @@ "LF_EmbeddingSelector", "LF_ExtractPromptFromLoraTag", "LF_ExtractString", + "LF_FilmGrain", "LF_Float", "LF_GaussianBlur", "LF_GetRandomKeyFromJSON", @@ -18640,6 +20212,7 @@ "LF_Notify", "LF_ParsePromptWithLoraTags", "LF_RandomBoolean", + "LF_RegexReplace", "LF_RegionExtractor", "LF_ResizeImageByEdge", "LF_ResizeImageToDimension", @@ -18650,6 +20223,7 @@ "LF_SaveJSON", "LF_SaveMarkdown", "LF_SchedulerSelector", + "LF_Sepia", "LF_SequentialSeedsGenerator", "LF_SetValueInJSON", "LF_ShuffleJSONKeys", @@ -18657,6 +20231,8 @@ "LF_Something2String", "LF_SortJSONKeys", "LF_String", + "LF_StringReplace", + "LF_StringTemplate", "LF_StringToJSON", "LF_SwitchFloat", "LF_SwitchImage", @@ -18732,6 +20308,18 @@ "title_aux": "Diffusers-in-ComfyUI" } ], + "https://github.com/magic-quill/ComfyUI_MagicQuill": [ + [ + "MagicQuill" + ], + { + "author": "Zichen LIU (https://zliucz.github.io/) and Yue YU (https://bruceyyu.github.io/)", + "description": "Official ComfyUI Implementations for Paper - MagicQuill: An Intelligent Interactive Image Editing System", + "nickname": "MagicQuill nodes", + "title": "MagicQuill", + "title_aux": "ComfyUI_MagicQuill" + } + ], "https://github.com/mape/ComfyUI-mape-Helpers": [ [ "mape Variable" @@ -18752,6 +20340,18 @@ "title_aux": "ComfyUI-SubjectStyle-CSV" } ], + "https://github.com/marcoc2/ComfyUI-AnotherUtils": [ + [ + "CustomCrop", + "LoadImagesOriginal", + "NearestUpscale", + "PixelArtNormalizer", + "SmartResize" + ], + { + "title_aux": "Image Processing Suite for ComfyUI" + } + ], "https://github.com/marduk191/ComfyUI-Fluxpromptenhancer": [ [ "FluxPromptEnhance" @@ -19193,6 +20793,15 @@ "title_aux": "ComfyUI-MingNodes" } ], + "https://github.com/mira-6/comfyui-sasolver": [ + [ + "SamplerSASolver", + "SamplerSASolverExperimental" + ], + { + "title_aux": "comfyui-sasolver" + } + ], "https://github.com/mirabarukaso/ComfyUI_Mira": [ [ "BooleanListInterpreter1", @@ -19216,6 +20825,7 @@ "FloatMultiplication", "FourBooleanTrigger", "FourFloats", + "FunctionSelectAuto", "FunctionSwap", "ImageBrightness", "ImageColorTransferMira", @@ -19253,11 +20863,14 @@ "TextBox", "TextCombinerSix", "TextCombinerTwo", + "TextLoopCombiner", "TextSwitcherThreeWays", "TextSwitcherTwoWays", + "TextWildcardSeprator", "TextWithBooleanSwitchAndCommonTextInput", "TwoBooleanTrigger", - "TwoFloats" + "TwoFloats", + "UpscaleImageByModelThenResize" ], { "title_aux": "ComfyUI_Mira" @@ -19281,8 +20894,17 @@ "title_aux": "MLTask_ComfyUI" } ], + "https://github.com/mithamunda/ComfyUI-SD3.5-Latent-Size-Picker": [ + [ + "SD3_5EmptyLatent" + ], + { + "title_aux": "SD3.5 Empty Latent Size Picker" + } + ], "https://github.com/mithamunda/ComfyUI-TogetherVision": [ [ + "Together Image \ud83c\udfa8", "Together Vision \ud83d\udd0d", "TogetherVisionNode" ], @@ -19392,6 +21014,18 @@ "title_aux": "ComfyUI_Seamless_Patten" } ], + "https://github.com/mrchipset/ComfyUI-SaveImageS3": [ + [ + "SaveImageS3" + ], + { + "author": "Mr.Chip", + "description": "This extension offers a custom node to save image to S3-compatible oss.", + "nickname": "SaveImageS3", + "title": "SaveImageS3", + "title_aux": "ComfyUI-SaveImageS3" + } + ], "https://github.com/mrhan1993/ComfyUI-Fooocus": [ [ "AlignYourStepsScheduler", @@ -19409,6 +21043,7 @@ "CheckpointLoader", "CheckpointLoaderSimple", "CheckpointSave", + "ClearVram", "ConditioningAverage", "ConditioningCombine", "ConditioningConcat", @@ -19548,6 +21183,15 @@ "title_aux": "ComfyUI-Fooocus" } ], + "https://github.com/muhammederem/blip-comfyui": [ + [ + "Blip Processor Node", + "List to Text Node" + ], + { + "title_aux": "BLIP Vision-Language Model Integration" + } + ], "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes": [ [ "ConcatStrings", @@ -19560,6 +21204,16 @@ "title_aux": "comfyui_dynamic_util_nodes" } ], + "https://github.com/muxueChen/ComfyUI_NTCosyVoice": [ + [ + "NTCosyVoiceCrossLingualSampler", + "NTCosyVoiceInstruct2Sampler", + "NTCosyVoiceZeroShotSampler" + ], + { + "title_aux": "CosyVoice2 for ComfyUI" + } + ], "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": [ [ "Image Brightness", @@ -19592,6 +21246,7 @@ ], "https://github.com/myshell-ai/ComfyUI-ShellAgent-Plugin": [ [ + "ShellAgentPluginInputAudio", "ShellAgentPluginInputBoolean", "ShellAgentPluginInputFloat", "ShellAgentPluginInputImage", @@ -19602,6 +21257,8 @@ "ShellAgentPluginOutputFloat", "ShellAgentPluginOutputInteger", "ShellAgentPluginOutputText", + "ShellAgentPluginSaveAudio", + "ShellAgentPluginSaveAudios", "ShellAgentPluginSaveImage", "ShellAgentPluginSaveImages", "ShellAgentPluginSaveVideoVHS" @@ -19672,6 +21329,16 @@ "title_aux": "comfyui-smooth-step-lora-loader" } ], + "https://github.com/neverbiasu/ComfyUI-Dashscope": [ + [ + "DashscopeLLMLoader", + "DashscopeModelCaller", + "DashscopeVLMLoader" + ], + { + "title_aux": "ComfyUI-Dashscope" + } + ], "https://github.com/neverbiasu/ComfyUI-Image-Captioner": [ [ "ImageCaptioner" @@ -19862,6 +21529,14 @@ "title_aux": "ComfyUI-TextOnSegs" } ], + "https://github.com/nmlen/comfyui-mosaic-blur": [ + [ + "ImageMosaic" + ], + { + "title_aux": "comfyui-mosaic-blur" + } + ], "https://github.com/noarche/sd-webui-color-enhance": [ [ "MMakerColorBlend", @@ -19921,6 +21596,16 @@ "title_aux": "ComfyUI_NoxinNodes" } ], + "https://github.com/nsdtcloud3d/ComfyUI-3D-Convert": [ + [ + "ConvertTo3DFormat", + "Load3DConvertAPIKEY", + "Load3DFile" + ], + { + "title_aux": "ComfyUI-3D-Convert" + } + ], "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": [ [ "Apply LoRA", @@ -20184,14 +21869,17 @@ "CLIPTextEncodeBREAK", "CLIPTokenCounter", "ConditioningZeroOutCombine", + "ConvertTimestepToSigma", "DynSamplerSelect", + "DynamicThresholdingSimplePost", "EmptyLatentImageAR", "FreeU2PPM", "Guidance Limiter", "LatentOperationTonemapLuminance", "LatentToMaskBB", "LatentToWidthHeight", - "PPMSamplerSelect" + "PPMSamplerSelect", + "RescaleCFGPost" ], { "title_aux": "ComfyUI-ppm" @@ -20219,6 +21907,14 @@ "title_aux": "sd-perturbed-attention" } ], + "https://github.com/pandaer119/ComfyUI_pandai": [ + [ + "pandai_dsk_node" + ], + { + "title_aux": "ComfyUI_pandai" + } + ], "https://github.com/pants007/comfy-pants": [ [ "CLIPTextEncodeAIO", @@ -20270,6 +21966,16 @@ "title_aux": "ComfyUI-LyraVSIH" } ], + "https://github.com/pharmapsychotic/comfy-cliption": [ + [ + "CLIPtionBeamSearch", + "CLIPtionGenerate", + "CLIPtionLoader" + ], + { + "title_aux": "comfy-cliption" + } + ], "https://github.com/phazei/ConfyUI-node-prompt-stash-saver": [ [ "PromptStashManager", @@ -20287,6 +21993,16 @@ "title_aux": "\u2728 Clarity AI - Creative Image Upscaler and Enhancer for ComfyUI" } ], + "https://github.com/phuvinh010701/ComfyUI-Nudenet": [ + [ + "ApplyNudenet", + "FilterdLabel", + "NudenetModelLoader" + ], + { + "title_aux": "ComfyUI-Nudenet" + } + ], "https://github.com/phyblas/paint-by-example_comfyui": [ [ "PaintbyExampleAdvanced", @@ -20352,16 +22068,25 @@ ], "https://github.com/playbook3d/playbook3d-comfyui-nodes": [ [ + "Beauty Pass Sequence", + "Depth Pass Sequence", + "Mask Pass Sequence", + "Outline Pass Sequence", "Playbook Beauty", + "Playbook Beauty Sequence", "Playbook Boolean", "Playbook Depth", + "Playbook Depth Sequence", "Playbook Float", "Playbook Image", "Playbook Mask", + "Playbook Mask Sequence", "Playbook Number", "Playbook Outline", + "Playbook Outline Sequence", "Playbook Render Result", - "Playbook Text" + "Playbook Text", + "Playbook Video" ], { "title_aux": "Playbook Nodes" @@ -20502,9 +22227,26 @@ "title_aux": "ComfyUI-SAM2-Realtime" } ], + "https://github.com/ptmaster/ComfyUI-Load-Diffusion-Model-to-Muti-GPUs/raw/refs/heads/main/Load%20Diffusion%20Model%20into%20Muti%20GPUs.py": [ + [ + "OverrideLoadedDiffusionDevice" + ], + { + "title_aux": "Embedding Merge for ComfyUI" + } + ], "https://github.com/purpen/ComfyUI-AIRedoon": [ [ + "AIRedoonApplyLoRAStack", + "AIRedoonCheckLoraFile", + "AIRedoonCheckModelFile", + "AIRedoonConcatText", "AIRedoonImageCaptioning", + "AIRedoonImageRGBA2RGB", + "AIRedoonLoRAStack", + "AIRedoonPreviewText", + "AIRedoonQwenModelLoader", + "AIRedoonSaveText", "AIRedoonTranslator" ], { @@ -20594,6 +22336,15 @@ "title_aux": "advance-aesthetic-score" } ], + "https://github.com/randomnoner11/ComfyUI-MistralAI-API": [ + [ + "InvokeMistralEndpoint", + "LoadFewShotPrompt" + ], + { + "title_aux": "ComfyUI-MistralAI-API" + } + ], "https://github.com/raspie10032/ComfyUI_RS_NAI_Local_Prompt_converter": [ [ "ComfyToNovelAIPrompt", @@ -20726,6 +22477,18 @@ "title_aux": "ComfyUI-Prediction" } ], + "https://github.com/regiellis/ComfyUI-EasyNoobai": [ + [ + "EasyNoobai", + "NoobaiArtists", + "NoobaiCharacters", + "NoobaiE621Artists", + "NoobaiE621Characters" + ], + { + "title_aux": "ComfyUI-EasyNoobai" + } + ], "https://github.com/regiellis/ComfyUI-EasyPony": [ [ "EasyPony" @@ -20846,6 +22609,14 @@ "title_aux": "comfyui-ricklove" } ], + "https://github.com/risunobushi/ComfyUI-Similarity-Score": [ + [ + "ImageSimilarityScores" + ], + { + "title_aux": "ComfyUI-Similarity-Score" + } + ], "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": [ [ "FrequencyCombination", @@ -20898,6 +22669,15 @@ "title_aux": "ComfyUI-ComfyBridge" } ], + "https://github.com/rohitsainier/ComfyUI-InstagramDownloader": [ + [ + "InstagramDownloader", + "MediaOrganizer" + ], + { + "title_aux": "ComfyUI-InstagramDownloader" + } + ], "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": [ [ "SetMetadataAll", @@ -20932,6 +22712,14 @@ "title_aux": "ComfyUI-Tara-LLM-Integration" } ], + "https://github.com/ronsantash/Comfyui-flexi-lora-loader": [ + [ + "ComfyUIFlexiLoRALoader" + ], + { + "title_aux": "ComfyUIFlexiLoRALoader" + } + ], "https://github.com/royceschultz/ComfyUI-Notifications": [ [ "Notif-PlaySound", @@ -20958,9 +22746,11 @@ "title_aux": "ComfyUI-TranscriptionTools" } ], - "https://github.com/rubi-du/ComfyUI-BiRefNet-lite": [ + "https://github.com/rubi-du/ComfyUI-BiRefNet-Super": [ [ - "BiRefNet_Lite" + "BiRefNet_Lite", + "BiRefNet_Super", + "BiRefNet_onnx" ], { "title_aux": "ComfyUI-BiRefNet-lite" @@ -20968,8 +22758,12 @@ ], "https://github.com/rubi-du/ComfyUI-Flux-Inpainting": [ [ - "Flux Inpaint", - "Flux Inpainting" + "Flux Inpainting", + "FluxGuffInpainting", + "FluxInpainting", + "FluxSimpleInpainting", + "FluxTransformerInpainting", + "FluxVAELoader" ], { "title_aux": "ComfyUI-Flux-Inpainting" @@ -21061,6 +22855,39 @@ "title_aux": "Doom" } ], + "https://github.com/ryanontheinside/ComfyUI_EfficientTAM": [ + [ + "EfficientTAMLoader", + "EfficientTAMPredictor" + ], + { + "title_aux": "ComfyUI-EfficientTAM" + } + ], + "https://github.com/ryanontheinside/ComfyUI_RealTimeNodes": [ + [ + "DTypeConverter", + "DeltaControl", + "FPSMonitor", + "FastWebcamCapture", + "FloatControl", + "FloatSequence", + "IntControl", + "IntSequence", + "IntegerMotionController", + "IntervalControl", + "MotionController", + "QuickShapeMask", + "ROINode", + "StringControl", + "StringSequence", + "TAESDVaeDecode", + "TAESDVaeEncode" + ], + { + "title_aux": "Nodes for use with real-time applications of ComfyUI" + } + ], "https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside": [ [ "AreaFeatureNode", @@ -21115,6 +22942,7 @@ "FeatureRenormalize", "FeatureScaler", "FeatureSmoothing", + "FeatureToFloat", "FeatureToSplineData", "FeatureToWeightsStrategy", "FeatureTruncateOrExtend", @@ -21212,6 +23040,7 @@ "TimeFeatureNode", "VideoChunk", "Vortex", + "WhisperToPromptTravel", "_mfc" ], { @@ -21244,6 +23073,16 @@ "title_aux": "ComfyUI_FlipStreamViewer" } ], + "https://github.com/sanbuphy/ComfyUI-AudioLDM": [ + [ + "AudioLDM", + "PreviewAudioLDM", + "SaveAudioLDM" + ], + { + "title_aux": "ComfyUI-AudioLDM" + } + ], "https://github.com/sdfxai/SDFXBridgeForComfyUI": [ [ "SDFXClipTextEncode" @@ -21273,6 +23112,25 @@ "title_aux": "SRL's nodes" } ], + "https://github.com/sebord/ComfyUI-LMCQ": [ + [ + "LmcqGetMachineCode", + "LmcqImageSaver", + "LmcqImageSaverTransit", + "LmcqImageSaverWeb", + "LmcqInputValidator", + "LmcqLoadFluxNF4Checkpoint", + "LmcqRuntimeLoraDecryption", + "LmcqRuntimeLoraEncryption", + "LmcqRuntimeModelDecryption", + "LmcqRuntimeModelEncryption", + "LmcqRuntimeWorkflowDecryption", + "LmcqRuntimeWorkflowEncryption" + ], + { + "title_aux": "ComfyUI-LMCQ" + } + ], "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": [ [ "AdjustAndRoundDimensions", @@ -21285,6 +23143,24 @@ "title_aux": "ComfyUI_Nimbus-Pack" } ], + "https://github.com/sh570655308/ComfyUI-GigapixelAI": [ + [ + "GigapixelAI", + "GigapixelModelSettings", + "GigapixelUpscaleSettings" + ], + { + "title_aux": "ComfyUI-GigapixelAI" + } + ], + "https://github.com/sh570655308/ComfyUI-TopazVideoAI": [ + [ + "TopazVideoAI" + ], + { + "title_aux": "ComfyUI-TopazVideoAI" + } + ], "https://github.com/shadowcz007/comfyui-Image-reward": [ [ "ImageBatchToList_", @@ -21446,6 +23322,19 @@ "title_aux": "comfyui-ultralytics-yolo" } ], + "https://github.com/shahkoorosh/ComfyUI-KGnodes": [ + [ + "CustomResolutionLatentNode", + "StyleSelector" + ], + { + "author": "ShahKoorosh", + "description": "This Custom node offers various experimental nodes to make it easier to use ComfyUI.", + "nickname": "KGnodes", + "title": "ComfyUI-KGnodes", + "title_aux": "ComfyUI-KGnodes" + } + ], "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": [ [ "DallERender", @@ -21518,18 +23407,6 @@ "title_aux": "ComfyUI-send-Eagle(slim)" } ], - "https://github.com/shinich39/comfyui-load-image-with-cmd": [ - [ - "LoadImageWithCMD" - ], - { - "author": "shinich39", - "description": "Load image and partially workflow with javascript.", - "nickname": "load-image-with-cmd", - "title": "load-image-with-cmd", - "title_aux": "comfyui-load-image-with-cmd" - } - ], "https://github.com/shinich39/comfyui-parse-image": [ [ "LoadBooleanFromImage", @@ -21621,6 +23498,7 @@ "BizyAirUniFormer_SemSegPreprocessor", "BizyAirZoe_DepthMapPreprocessor", "BizyAir_MinusZoneChatGLM3TextEncode", + "LayerMask: SegmentAnythingUltra V2", "StableDiffusionXLControlNetUnionPipeline" ], { @@ -21765,6 +23643,7 @@ ], "https://github.com/smlbiobot/ComfyUI-Flux-Replicate-API": [ [ + "SML_FluxProUltra_Replicate_Standalone", "SML_FluxPro_Replicate_Standalone" ], { @@ -21842,9 +23721,7 @@ "https://github.com/smthemex/ComfyUI_EchoMimic": [ [ "Echo_LoadModel", - "Echo_Sampler", - "Echo_Upscaleloader", - "Echo_VideoUpscale" + "Echo_Sampler" ], { "title_aux": "ComfyUI_EchoMimic" @@ -21958,6 +23835,15 @@ "title_aux": "ComfyUI_OmniParser" } ], + "https://github.com/smthemex/ComfyUI_PBR_Maker": [ + [ + "Load_MatForger", + "MatForger_Sampler" + ], + { + "title_aux": "ComfyUI_PBR_Maker" + } + ], "https://github.com/smthemex/ComfyUI_ParlerTTS": [ [ "ParlerTTS_LoadModel", @@ -22044,6 +23930,16 @@ "title_aux": "ComfyUI_Streamv2v_Plus" } ], + "https://github.com/smthemex/ComfyUI_TRELLIS": [ + [ + "Trellis_LoadModel", + "Trellis_Sampler", + "Trellis_multiimage_loader" + ], + { + "title_aux": "ComfyUI_TRELLIS" + } + ], "https://github.com/sn0w12/ComfyUI-Sn0w-Scripts": [ [ "Character Selector", @@ -22075,6 +23971,16 @@ "title_aux": "comfyui-snek-nodes" } ], + "https://github.com/solution9th/Comfyui_mobilesam": [ + [ + "MobileSamDetector", + "MobileSamModelLoader", + "MobileSamPredictor" + ], + { + "title_aux": "Comfyui_mobilesam" + } + ], "https://github.com/souki202/ComfyUI-LoadImage-Advanced": [ [ "ColorAdjustment", @@ -22198,6 +24104,7 @@ "DilateErodeMask", "EnhanceDetail", "ExposureAdjust", + "ExtractNFrames", "FrequencyCombine", "FrequencySeparate", "GameOfLife", @@ -22205,12 +24112,15 @@ "GuidedFilterImage", "ImageConstant", "ImageConstantHSV", + "InpaintConditionApply", + "InpaintConditionEncode", "InstructPixToPixConditioningAdvanced", "JitterImage", "Keyer", "LatentNormalizeShuffle", "LatentStats", "MedianFilterImage", + "MergeFramesByIndex", "ModelTest", "NormalMapSimple", "OffsetLatentImage", @@ -22339,17 +24249,9 @@ "title_aux": "ComfyUI Ollama" } ], - "https://github.com/steelan9199/ComfyUI-Teeth": [ - [ - "Index List", - "TextSplitByDelimiter" - ], - { - "title_aux": "ComfyUI-Teeth" - } - ], "https://github.com/stormcenter/ComfyUI-AutoSplitGridImage": [ [ + "EvenImageResizer", "GridImageSplitter" ], { @@ -22358,6 +24260,7 @@ ], "https://github.com/stormcenter/ComfyUI-LivePhotoCreator": [ [ + "ImageCompareTransition", "LivePhotoCreator", "LivePhotoPreview" ], @@ -22435,11 +24338,13 @@ ], "https://github.com/sugarkwork/comfyui_tag_fillter": [ [ + "TagComparator", "TagFilter", "TagIf", "TagMerger", "TagRemover", "TagReplace", + "TagSelector", "TagSwitcher" ], { @@ -22471,6 +24376,14 @@ "title_aux": "ComfyUI-googletrans" } ], + "https://github.com/sweetndata/ComfyUI_Sticker_Compositer": [ + [ + "Sticker_Compositer" + ], + { + "title_aux": "ComfyUI_Sticker_Compositer" + } + ], "https://github.com/syaofox/ComfyUI_fnodes": [ [ "AddImageBorder-", @@ -22603,6 +24516,15 @@ "title_aux": "LCM_Inpaint-Outpaint_Comfy" } ], + "https://github.com/taabata/SANA_LOWVRAM": [ + [ + "SANADiffuse", + "SANATextEncode" + ], + { + "title_aux": "SANA_LOWVRAM" + } + ], "https://github.com/taches-ai/comfyui-scene-composer": [ [ "Action", @@ -22648,22 +24570,6 @@ "title_aux": "ComfyUI-StoryMaker" } ], - "https://github.com/tanglup/Comfyui-Ycnode": [ - [ - "CanvasNode" - ], - { - "title_aux": "Comfyui-Ycanvas" - } - ], - "https://github.com/tanglup/Comfyui_Flux_Style_Adjust": [ - [ - "StyleModelAdvancedApply" - ], - { - "title_aux": "Comfyui_Flux_Style_Adjust" - } - ], "https://github.com/teward/ComfyUI-Helper-Nodes": [ [ "HelperNodes_CfgScale", @@ -22807,6 +24713,17 @@ "title_aux": "ComfyUI-AudioReactor" } ], + "https://github.com/tocubed/ComfyUI-EvTexture": [ + [ + "EVTEventsToImage", + "EVTLoadEvTextureModel", + "EVTTextureUpscaleVideo", + "EVTVideoToEvents" + ], + { + "title_aux": "ComfyUI-EvTexture" + } + ], "https://github.com/tomudo/ComfyUI-ascii-art": [ [ "ImageToAscii" @@ -23070,6 +24987,14 @@ "title_aux": "comfyui-webcam-node" } ], + "https://github.com/umiyuki/comfyui-pad-to-eight": [ + [ + "Pad To Eight" + ], + { + "title_aux": "ComfyUI Pad To Eight" + } + ], "https://github.com/un-seen/comfyui-tensorops": [ [ "BackgroundSelect", @@ -23248,14 +25173,6 @@ "title_aux": "comfyui-psd2png" } ], - "https://github.com/viperyl/ComfyUI-BiRefNet": [ - [ - "BiRefNet" - ], - { - "title_aux": "ComfyUI-BiRefNet" - } - ], "https://github.com/viperyl/ComfyUI-RGT": [ [ "RGT_Upscale" @@ -23411,6 +25328,27 @@ "title_aux": "WTF? - a debug node for ComfyUI" } ], + "https://github.com/weilin9999/WeiLin-ComfyUI-prompt-all-in-one": [ + [ + "WeiLinComfyUIPromptAllInOneGreat", + "WeiLinComfyUIPromptAllInOneNeg", + "WeiLinComfyUIPromptToLoras", + "WeiLinComfyUIPromptToLorasOnly", + "WeiLinPromptToString" + ], + { + "title_aux": "WeiLin-ComfyUI-prompt-all-in-one" + } + ], + "https://github.com/welltop-cn/ComfyUI-TeaCache": [ + [ + "TeaCacheForImgGen", + "TeaCacheForVidGen" + ], + { + "title_aux": "ComfyUI-TeaCache" + } + ], "https://github.com/wentao-uw/ComfyUI-template-matching": [ [ "IsMaskEmptyNode (template matching)", @@ -23452,15 +25390,81 @@ ], "https://github.com/windfancy/zsq_prompt": [ [ - "PromptCLIPEncode", - "PromptLatent", - "PromptSelector", - "PromptStyler" + "BatchPromptJson", + "BatchPromptSelector", + "ConnectionString", + "DoubleCLIPEncode", + "FloatMathOperation", + "ImageAddText", + "ImageEmpty", + "IndexString", + "IntMathOperation", + "JoinImageBatch", + "LLMImage", + "LLMText", + "OptionString", + "PortraitStyler", + "SaveJpgImage", + "StringInput", + "ZSQPixelLatent", + "ZSQRatioLatent", + "ZSQShowINT", + "ZSQShowText", + "checkpoint_sampler", + "controlnetStack", + "controlnetStack_2", + "imageConcat", + "imageCount", + "imageCrop", + "imageDetailTransfer", + "imageFilter", + "imageFlip", + "imageGaussianBlur", + "imageHug", + "imageRGB", + "imageRatio", + "imageResize", + "imageRotate", + "imageSaveSimple", + "imageScaleDown", + "imageScaleDownBy", + "imageSharpen", + "imageSize", + "imageTilesFromBatch", + "imagesSplitImage", + "loraStack", + "loraStack_2", + "stylesSelector", + "zsqcheckpoint", + "zsqcontrolnet", + "zsqsampler" ], { "title_aux": "zsq_prompt" } ], + "https://github.com/wjl0313/ComfyUI_KimNodes": [ + [ + "Add_ImageMetadata", + "Crop_Paste", + "Distribute_Icons", + "IconDistributeByGrid", + "Image_Classification", + "KimFilter", + "KimHDR", + "LoadImage_Metadata", + "Manual_MetadataInput", + "Prompt_Text", + "Save_Image", + "Text_Match", + "Whitening_Node", + "YOLOWorld_Match", + "YOLO_Crop" + ], + { + "title_aux": "ComfyUI_KimNodes" + } + ], "https://github.com/wmatson/easy-comfy-nodes": [ [ "EZAssocDictNode", @@ -23477,6 +25481,35 @@ "title_aux": "easy-comfy-nodes" } ], + "https://github.com/wmpmiles/comfyui-some-image-processing-stuff": [ + [ + "Blur Mask", + "Color Grading", + "Latent Zero Mask", + "Mask-Crop Inpaint | Post", + "Mask-Crop Inpaint | Pre", + "Mask-Crop | Post", + "Mask-Crop | Pre", + "Resample Image", + "Resample Latent", + "Resample Mask", + "Resampler | Area", + "Resampler | Jinc-Lanczos", + "Resampler | Lanczos", + "Resampler | Mitchell-Netravali", + "Resampler | Nearest-Neighbor", + "Resampler | Triangle", + "Scaler | Area", + "Scaler | Fixed", + "Scaler | Megapixels", + "Scaler | Pixel Deltas", + "Scaler | Side", + "Scaler | Sides Unlinked" + ], + { + "title_aux": "comfyui-some-image-processing-stuff" + } + ], "https://github.com/wolfden/ComfyUi_PromptStylers": [ [ "SDXLPromptStylerAll", @@ -23539,9 +25572,18 @@ "title_aux": "ComfyUI-RK-Sampler" } ], + "https://github.com/wqjuser/ComfyUI-Chat-Image": [ + [ + "LLMImageDescription" + ], + { + "title_aux": "ComfyUI-Chat-Image" + } + ], "https://github.com/wu12023/ComfyUI-Image-Evaluation": [ [ - "Clip_Score-\ud83d\udd2c" + "Clip_Score-\ud83d\udd2c", + "Dino_Score-\ud83d\udd2c" ], { "title_aux": "ComfyUI-Image-Evaluation" @@ -23623,6 +25665,25 @@ "title_aux": "NodeGPT" } ], + "https://github.com/xfgexo/EXO-Custom-ComfyUI-Nodes": [ + [ + "ComfyUI_EXO_Clip_Text_Encode", + "ComfyUI_EXO_DisplayText", + "ComfyUI_EXO_FluxSampler", + "ComfyUI_EXO_FluxSamplerMini", + "ComfyUI_EXO_ImageRescale", + "ComfyUI_EXO_LatentImageSize", + "ComfyUI_EXO_LatentImageSizeX", + "ComfyUI_EXO_Notes", + "ComfyUI_EXO_NumericValue", + "ComfyUI_EXO_PromptBuilderDeluxe", + "ComfyUI_EXO_SaveText", + "ComfyUI_EXO_TranslateText" + ], + { + "title_aux": "EXO Custom ComfyUI Nodes" + } + ], "https://github.com/xiaoxiaodesha/hd_node": [ [ "Combine HDMasks", @@ -23826,6 +25887,7 @@ [ "FalAPIFluxControlNetConfigNode", "FalAPIFluxControlNetUnionConfigNode", + "FalAPIFluxDevCannyWithLoraNode", "FalAPIFluxDevImageToImageNode", "FalAPIFluxDevNode", "FalAPIFluxDevWithLoraAndControlNetImageToImageNode", @@ -23846,6 +25908,30 @@ "title_aux": "ComfyUI-Fal-API-Flux" } ], + "https://github.com/yichengup/Comfyui-Ycanvas": [ + [ + "CanvasNode" + ], + { + "title_aux": "Comfyui-Ycanvas" + } + ], + "https://github.com/yichengup/Comfyui_Flux_Style_Adjust": [ + [ + "StyleModelAdvancedApply" + ], + { + "title_aux": "Comfyui_Flux_Style_Adjust (Redux)" + } + ], + "https://github.com/yichengup/Comfyui_Redux_Advanced": [ + [ + "StyleAdvancedApply" + ], + { + "title_aux": "Comfyui_Redux_Advanced" + } + ], "https://github.com/yiwangsimple/ComfyUI_DW_Chat": [ [ "DeepSeekChatNode", @@ -24091,6 +26177,14 @@ "title_aux": "ComfyUI Easy Use" } ], + "https://github.com/yolanother/ComfyUI-Save16bitPng": [ + [ + "SaveImageARGB16PNG" + ], + { + "title_aux": "Save Uncompressed 16 Bit PNG" + } + ], "https://github.com/yolanother/DTAIComfyImageSubmit": [ [ "DTSimpleSubmitImage", @@ -24175,10 +26269,29 @@ "title_aux": "ComfyUI-Background-Edit" } ], + "https://github.com/yondonfu/ComfyUI-Torch-Compile": [ + [ + "TorchCompileLoadControlNet", + "TorchCompileLoadVAE" + ], + { + "title_aux": "ComfyUI-Torch-Compile" + } + ], "https://github.com/yorkane/ComfyUI-KYNode": [ [ "AdvancedLyingSigmaSampler", + "KY_AnyByIndex", + "KY_AnyToList", + "KY_FilePathAnalyzer-", + "KY_JoinToString", + "KY_LoadImagesFromFolder", + "KY_MathExpression", "KY_OpenAICaptionImage", + "KY_OpenAIChat", + "KY_ReadImage", + "KY_RegexExtractor", + "KY_RegexReplace", "KY_SaveImageToPath" ], { @@ -24258,6 +26371,8 @@ ], "https://github.com/yuvraj108c/ComfyUI-Pronodes": [ [ + "ImagesSeekerNode", + "ImagesShufflerNode", "LoadImageFromOutputDirectoryNode", "LoadYoutubeVideoNode", "PreviewVHSAudioNode", @@ -24421,15 +26536,18 @@ ], "https://github.com/zhangp365/ComfyUI-utils-nodes": [ [ + "BooleanControlOutput", "CheckpointLoaderSimpleWithSwitch", "ColorCorrectOfUtils", "ConcatTextOfUtils", "DeepfaceAnalyzeFaceAttributes", "DetectorForNSFW", "GenderControlOutput", + "ImageAutoSelector", "ImageBatchOneOrMore", "ImageCompositeMaskedOneByOne", "ImageCompositeMaskedWithSwitch", + "ImageCompositeWatermark", "ImageConcanateOfUtils", "ImageResizeTo8x", "IntAndIntAddOffsetLiteral", @@ -24442,6 +26560,7 @@ "MaskCoverFourCorners", "MaskFastGrow", "MaskFromFaceModel", + "MaskofCenter", "MatchImageRatioToPreset", "ModifyTextGender", "SplitMask", @@ -24462,6 +26581,17 @@ "title_aux": "ComfyUI_photomakerV2_native" } ], + "https://github.com/zhilemann/ComfyUI-moondream2": [ + [ + "moondream2_Caption", + "moondream2_DownLoad", + "moondream2_Encode", + "moondream2_Query" + ], + { + "title_aux": "ComfyUI-moondream2" + } + ], "https://github.com/zhiselfly/ComfyUI-Alimama-ControlNet-compatible": [ [ "SD3AlimamaInpaintControlNetApplyAdvanced", @@ -24501,6 +26631,31 @@ "title_aux": "ComfyUI_Bxb" } ], + "https://github.com/zmwv823/ComfyUI_Anytext": [ + [ + "UL_AnyTextEncoder", + "UL_AnyTextFormatter", + "UL_AnyTextLoaderTest", + "UL_AnyText_Composer", + "UL_AnyText_FontImg", + "UL_AnyText_Inputs", + "UL_AnyText_Loader", + "UL_AnyText_Sampler", + "UL_DiffusersCheckpointLoader", + "UL_DiffusersControlNetApplyAdvanced", + "UL_DiffusersControlNetLoader", + "UL_Image_Generation_Diffusers_Sampler", + "UL_Image_Generation_Glyph_ByT5", + "UL_Image_Generation_Glyph_ByT5_Checkponits_Loader", + "UL_Image_Generation_Glyph_ByT5_Font", + "UL_Image_Generation_JoyType_Font_Img", + "UL_Image_Generation_JoyType_Render_List", + "UL_Image_Process_Common_Cv2_Canny" + ], + { + "title_aux": "ComfyUI_Anytext" + } + ], "https://github.com/zohac/ComfyUI_ZC_DrawShape": [ [ "ZcDrawShape" @@ -24517,8 +26672,6 @@ [ "CLIP Text Encode PS Regional", "Get Image From Photoshop Layer", - "Image Times Opacity", - "Mask Times Opacity", "Send Images To Photoshop" ], { diff --git a/extras.json b/extras.json new file mode 100644 index 00000000..e6332abc --- /dev/null +++ b/extras.json @@ -0,0 +1,26 @@ +{ + "favorites": [ + "comfyui_ipadapter_plus", + "comfyui-animatediff-evolved", + "comfyui_controlnet_aux", + "comfyui-impact-pack", + "comfyui-impact-subpack", + "comfyui-custom-scripts", + "comfyui-layerdiffuse", + "comfyui-liveportraitkj", + "aigodlike-comfyui-translation", + "comfyui-reactor-node", + "comfyui_instantid", + "sd-dynamic-thresholding", + "pr-was-node-suite-comfyui-47064894", + "comfyui-advancedliveportrait", + "comfyui_layerstyle", + "efficiency-nodes-comfyui", + "comfyui-crystools", + "comfyui-advanced-controlnet", + "comfyui-videohelpersuite", + "comfyui-kjnodes", + "comfy-mtb", + "comfyui_essentials" + ] +} \ No newline at end of file diff --git a/git_helper.py b/git_helper.py index 85ad9dbc..14c6b7e9 100644 --- a/git_helper.py +++ b/git_helper.py @@ -4,8 +4,6 @@ import os import traceback import git -import configparser -import re import json import yaml import requests @@ -13,6 +11,14 @@ from tqdm.auto import tqdm from git.remote import RemoteProgress +comfy_path = os.environ.get('COMFYUI_PATH') +git_exe_path = os.environ.get('GIT_EXE_PATH') + +if comfy_path is None: + print("\nWARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.", file=sys.stderr) + comfy_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) + + def download_url(url, dest_folder, filename=None): # Ensure the destination folder exists if not os.path.exists(dest_folder): @@ -36,12 +42,11 @@ def download_url(url, dest_folder, filename=None): print(f"Failed to download file from {url}") -config_path = os.path.join(os.path.dirname(__file__), "config.ini") nodelist_path = os.path.join(os.path.dirname(__file__), "custom-node-list.json") working_directory = os.getcwd() if os.path.basename(working_directory) != 'custom_nodes': - print(f"WARN: This script should be executed in custom_nodes dir") + print("WARN: This script should be executed in custom_nodes dir") print(f"DBG: INFO {working_directory}") print(f"DBG: INFO {sys.argv}") # exit(-1) @@ -59,9 +64,11 @@ class GitProgress(RemoteProgress): self.pbar.refresh() -def gitclone(custom_nodes_path, url, target_hash=None): +def gitclone(custom_nodes_path, url, target_hash=None, repo_path=None): repo_name = os.path.splitext(os.path.basename(url))[0] - repo_path = os.path.join(custom_nodes_path, repo_name) + + if repo_path is None: + repo_path = os.path.join(custom_nodes_path, repo_name) # Clone the repository from the remote URL repo = git.Repo.clone_from(url, repo_path, recursive=True, progress=GitProgress()) @@ -94,7 +101,12 @@ def gitcheck(path, do_fetch=False): # Get the current commit hash and the commit hash of the remote branch commit_hash = repo.head.commit.hexsha - remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + + if f'{remote_name}/{branch_name}' in repo.refs: + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + else: + print("CUSTOM NODE CHECK: True") # non default branch is treated as updatable + return # Compare the commit hashes to determine if the local repository is behind the remote repository if commit_hash != remote_commit_hash: @@ -113,11 +125,17 @@ def gitcheck(path, do_fetch=False): def switch_to_default_branch(repo): - show_result = repo.git.remote("show", "origin") - matches = re.search(r"\s*HEAD branch:\s*(.*)", show_result) - if matches: - default_branch = matches.group(1) + try: + default_branch = repo.git.symbolic_ref('refs/remotes/origin/HEAD').replace('refs/remotes/origin/', '') repo.git.checkout(default_branch) + except: + try: + repo.git.checkout(repo.heads.master) + except: + try: + repo.git.checkout('-b', 'master', 'origin/master') + except: + print("[ComfyUI Manager] Failed to switch to the default branch") def gitpull(path): @@ -128,6 +146,7 @@ def gitpull(path): # Pull the latest changes from the remote repository repo = git.Repo(path) if repo.is_dirty(): + print(f"STASH: '{path}' is dirty.") repo.git.stash() commit_hash = repo.head.commit.hexsha @@ -141,6 +160,11 @@ def gitpull(path): remote_name = current_branch.tracking_branch().remote_name remote = repo.remote(name=remote_name) + if f'{remote_name}/{branch_name}' not in repo.refs: + switch_to_default_branch(repo) + current_branch = repo.active_branch + branch_name = current_branch.name + remote.fetch() remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha @@ -166,9 +190,7 @@ def gitpull(path): def checkout_comfyui_hash(target_hash): - repo_path = os.path.abspath(os.path.join(working_directory, '..')) # ComfyUI dir - - repo = git.Repo(repo_path) + repo = git.Repo(comfy_path) commit_hash = repo.head.commit.hexsha if commit_hash != target_hash: @@ -250,6 +272,9 @@ def checkout_custom_node_hash(git_custom_node_infos): # clone missing for k, v in git_custom_node_infos.items(): + if 'ComfyUI-Manager' in k: + continue + if not v['disabled']: repo_name = k.split('/')[-1] if repo_name.endswith('.git'): @@ -258,7 +283,7 @@ def checkout_custom_node_hash(git_custom_node_infos): path = os.path.join(working_directory, repo_name) if not os.path.exists(path): print(f"CLONE: {path}") - gitclone(working_directory, k, v['hash']) + gitclone(working_directory, k, target_hash=v['hash']) def invalidate_custom_node_file(file_custom_node_infos): @@ -308,19 +333,18 @@ def invalidate_custom_node_file(file_custom_node_infos): download_url(url, working_directory) -def apply_snapshot(target): +def apply_snapshot(path): try: - path = os.path.join(os.path.dirname(__file__), 'snapshots', f"{target}") if os.path.exists(path): - if not target.endswith('.json') and not target.endswith('.yaml'): + if not path.endswith('.json') and not path.endswith('.yaml'): print(f"Snapshot file not found: `{path}`") print("APPLY SNAPSHOT: False") return None with open(path, 'r', encoding="UTF-8") as snapshot_file: - if target.endswith('.json'): + if path.endswith('.json'): info = json.load(snapshot_file) - elif target.endswith('.yaml'): + elif path.endswith('.yaml'): info = yaml.load(snapshot_file, Loader=yaml.SafeLoader) info = info['custom_nodes'] else: @@ -414,10 +438,8 @@ def restore_pip_snapshot(pips, options): def setup_environment(): - config = configparser.ConfigParser() - config.read(config_path) - if 'default' in config and 'git_exe' in config['default'] and config['default']['git_exe'] != '': - git.Git().update_environment(GIT_PYTHON_GIT_EXECUTABLE=config['default']['git_exe']) + if git_exe_path is not None: + git.Git().update_environment(GIT_PYTHON_GIT_EXECUTABLE=git_exe_path) setup_environment() @@ -425,7 +447,11 @@ setup_environment() try: if sys.argv[1] == "--clone": - gitclone(sys.argv[2], sys.argv[3]) + repo_path = None + if len(sys.argv) > 4: + repo_path = sys.argv[4] + + gitclone(sys.argv[2], sys.argv[3], repo_path=repo_path) elif sys.argv[1] == "--check": gitcheck(sys.argv[2], False) elif sys.argv[1] == "--fetch": @@ -446,5 +472,5 @@ try: except Exception as e: print(e) sys.exit(-1) - - + + diff --git a/github-stats.json b/github-stats.json index 3095c541..ebe361d0 100644 --- a/github-stats.json +++ b/github-stats.json @@ -1,8247 +1,9027 @@ { + "https://github.com/0x-jerry/comfyui-rembg": { + "stars": 1, + "last_update": "2025-01-01 16:03:57", + "author_account_age_days": 3408 + }, "https://github.com/0xbitches/ComfyUI-LCM": { - "stars": 251, + "stars": 252, "last_update": "2023-11-11 21:24:33", - "author_account_age_days": 695 + "author_account_age_days": 730 }, "https://github.com/1038lab/ComfyUI-OmniGen": { - "stars": 138, - "last_update": "2024-11-21 22:27:50", - "author_account_age_days": 616 + "stars": 180, + "last_update": "2025-01-06 21:07:17", + "author_account_age_days": 651 }, "https://github.com/1038lab/ComfyUI-RMBG": { - "stars": 93, - "last_update": "2024-12-04 05:10:58", - "author_account_age_days": 616 + "stars": 191, + "last_update": "2025-01-06 23:53:19", + "author_account_age_days": 651 + }, + "https://github.com/1038lab/ComfyUI-WildPromptor": { + "stars": 9, + "last_update": "2025-01-06 21:06:40", + "author_account_age_days": 651 + }, + "https://github.com/111496583yzy/comfyui-PuzzleCrack-Effect": { + "stars": 4, + "last_update": "2024-12-30 08:16:30", + "author_account_age_days": 2082 }, "https://github.com/11cafe/comfyui-workspace-manager": { - "stars": 1147, + "stars": 1175, "last_update": "2024-10-01 14:40:46", - "author_account_age_days": 369 + "author_account_age_days": 404 }, "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant": { "stars": 36, "last_update": "2024-08-02 05:24:19", - "author_account_age_days": 289 + "author_account_age_days": 324 }, "https://github.com/11dogzi/Comfyui-ergouzi-Nodes": { - "stars": 64, + "stars": 68, "last_update": "2024-08-23 12:04:09", - "author_account_age_days": 289 + "author_account_age_days": 324 }, "https://github.com/11dogzi/Comfyui-ergouzi-kaiguan": { - "stars": 39, - "last_update": "2024-11-28 18:57:15", - "author_account_age_days": 289 + "stars": 60, + "last_update": "2024-12-09 02:29:58", + "author_account_age_days": 324 }, "https://github.com/11dogzi/Comfyui-ergouzi-samplers": { - "stars": 25, + "stars": 26, "last_update": "2024-06-28 05:28:05", - "author_account_age_days": 289 + "author_account_age_days": 324 }, "https://github.com/1mckw/Comfyui-Gelbooru": { "stars": 4, - "last_update": "2024-11-02 04:05:31", - "author_account_age_days": 854 + "last_update": "2024-12-08 03:42:25", + "author_account_age_days": 889 }, "https://github.com/1zhangyy1/comfyui-vidu-nodes": { - "stars": 3, - "last_update": "2024-11-06 17:30:43", - "author_account_age_days": 623 + "stars": 4, + "last_update": "2025-01-09 13:24:13", + "author_account_age_days": 658 }, "https://github.com/2kpr/ComfyUI-PMRF": { - "stars": 114, + "stars": 117, "last_update": "2024-10-11 00:11:40", - "author_account_age_days": 1083 + "author_account_age_days": 1118 }, "https://github.com/2kpr/ComfyUI-UltraPixel": { - "stars": 217, + "stars": 223, "last_update": "2024-07-27 14:52:10", - "author_account_age_days": 1083 + "author_account_age_days": 1118 }, "https://github.com/311-code/ComfyUI-MagicClip_Strength": { "stars": 1, "last_update": "2024-09-22 12:07:40", - "author_account_age_days": 2936 + "author_account_age_days": 2971 + }, + "https://github.com/42lux/ComfyUI-42lux": { + "stars": 8, + "last_update": "2024-12-19 10:21:03", + "author_account_age_days": 3897 }, "https://github.com/42lux/ComfyUI-safety-checker": { - "stars": 28, + "stars": 29, "last_update": "2024-05-22 22:11:59", - "author_account_age_days": 3863 + "author_account_age_days": 3897 }, "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner": { "stars": 26, "last_update": "2024-06-13 05:51:56", - "author_account_age_days": 578 + "author_account_age_days": 613 }, "https://github.com/45uee/ComfyUI-Color_Transfer": { - "stars": 14, + "stars": 19, "last_update": "2024-09-19 20:16:51", - "author_account_age_days": 2467 + "author_account_age_days": 2501 }, "https://github.com/54rt1n/ComfyUI-DareMerge": { - "stars": 77, + "stars": 79, "last_update": "2024-08-01 15:28:19", - "author_account_age_days": 4215 + "author_account_age_days": 4249 + }, + "https://github.com/5x00/ComfyUI-PiAPI-Faceswap": { + "stars": 2, + "last_update": "2025-01-05 10:13:19", + "author_account_age_days": 1170 + }, + "https://github.com/5x00/ComfyUI-VLM-Captions": { + "stars": 4, + "last_update": "2025-01-04 21:27:47", + "author_account_age_days": 1170 }, "https://github.com/5x00/ComfyUI-VLM_Captions": { - "stars": 3, - "last_update": "2024-12-02 06:22:46", - "author_account_age_days": 1136 + "stars": 4, + "last_update": "2025-01-04 21:27:47", + "author_account_age_days": 1170 }, "https://github.com/6174/comflowy-nodes": { - "stars": 11, + "stars": 12, "last_update": "2024-12-03 13:31:04", - "author_account_age_days": 4283 + "author_account_age_days": 4318 }, "https://github.com/807502278/ComfyUI-3D-MeshTool": { - "stars": 15, + "stars": 19, "last_update": "2024-10-18 09:59:54", - "author_account_age_days": 2177 + "author_account_age_days": 2212 }, "https://github.com/807502278/ComfyUI-WJNodes": { - "stars": 6, - "last_update": "2024-11-11 02:00:29", - "author_account_age_days": 2177 + "stars": 8, + "last_update": "2025-01-09 09:27:43", + "author_account_age_days": 2212 }, "https://github.com/807502278/ComfyUI_MaskGCT": { "stars": 19, "last_update": "2024-11-12 08:13:01", - "author_account_age_days": 2177 + "author_account_age_days": 2212 }, "https://github.com/80sVectorz/ComfyUI-Static-Primitives": { "stars": 11, "last_update": "2024-08-07 11:21:06", - "author_account_age_days": 1635 + "author_account_age_days": 1670 }, "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp": { "stars": 1, "last_update": "2024-05-23 00:26:10", - "author_account_age_days": 637 + "author_account_age_days": 671 }, "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE-Wrapper": { "stars": 8, "last_update": "2024-10-15 05:14:43", - "author_account_age_days": 637 + "author_account_age_days": 671 }, "https://github.com/AARG-FAN/Image-Vector-for-ComfyUI": { - "stars": 111, + "stars": 117, "last_update": "2024-06-23 14:56:16", - "author_account_age_days": 663 + "author_account_age_days": 698 + }, + "https://github.com/AEmotionStudio/ComfyUI-ChristmasTheme": { + "stars": 37, + "last_update": "2024-12-21 23:43:44", + "author_account_age_days": 301 }, "https://github.com/AI2lab/comfyUI-DeepSeek-2lab": { "stars": 6, "last_update": "2024-10-02 07:21:00", - "author_account_age_days": 356 + "author_account_age_days": 391 }, "https://github.com/AI2lab/comfyUI-kling-api-2lab": { "stars": 7, "last_update": "2024-10-09 14:14:31", - "author_account_age_days": 356 + "author_account_age_days": 391 }, "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab": { "stars": 6, "last_update": "2024-08-01 15:13:33", - "author_account_age_days": 356 + "author_account_age_days": 391 }, "https://github.com/AI2lab/comfyUI-tool-2lab": { - "stars": 23, + "stars": 24, "last_update": "2024-11-15 16:42:51", - "author_account_age_days": 356 + "author_account_age_days": 391 }, "https://github.com/AIFSH/AniTalker-ComfyUI": { "stars": 6, "last_update": "2024-08-06 03:08:44", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-3d-photo-inpainting": { - "stars": 9, + "stars": 11, "last_update": "2024-06-19 13:59:49", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-AuraSR": { - "stars": 22, + "stars": 23, "last_update": "2024-06-27 14:00:16", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio": { - "stars": 73, + "stars": 74, "last_update": "2024-08-05 08:48:03", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-FishSpeech": { - "stars": 23, + "stars": 25, "last_update": "2024-05-23 01:18:49", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-GPT_SoVITS": { - "stars": 199, + "stars": 203, "last_update": "2024-08-09 22:00:45", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-Hallo": { - "stars": 287, + "stars": 292, "last_update": "2024-06-24 06:43:23", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-I2V-Adapter": { - "stars": 20, + "stars": 21, "last_update": "2024-07-02 01:59:49", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-IP_LAP": { - "stars": 31, + "stars": 32, "last_update": "2024-06-14 07:05:39", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-Live2DViewer": { - "stars": 4, + "stars": 5, "last_update": "2024-06-14 07:04:49", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-MARS5-TTS": { "stars": 27, "last_update": "2024-07-02 02:00:28", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-MimicBrush": { - "stars": 102, + "stars": 106, "last_update": "2024-06-17 22:26:53", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-MimicMotion": { - "stars": 346, + "stars": 355, "last_update": "2024-08-06 06:21:16", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH": { "stars": 17, "last_update": "2024-06-14 07:05:19", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-RVC": { - "stars": 15, + "stars": 17, "last_update": "2024-06-14 07:05:25", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-UVR5": { - "stars": 83, + "stars": 86, "last_update": "2024-06-20 07:31:20", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-UniAnimate": { "stars": 36, "last_update": "2024-06-30 09:20:25", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-WhisperX": { - "stars": 33, + "stars": 35, "last_update": "2024-10-23 22:19:56", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI-XTTS": { - "stars": 46, + "stars": 48, "last_update": "2024-06-24 09:45:59", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ComfyUI_V-Express": { "stars": 86, "last_update": "2024-06-23 09:54:57", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/CosyVoice-ComfyUI": { - "stars": 179, + "stars": 205, "last_update": "2024-09-10 22:21:37", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/DHLive-ComfyUI": { - "stars": 18, + "stars": 19, "last_update": "2024-11-14 01:45:45", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/DiffMorpher-ComfyUI": { - "stars": 14, + "stars": 15, "last_update": "2024-07-17 01:24:59", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/DiffSynth-ComfyUI": { "stars": 1, "last_update": "2024-09-07 12:23:07", - "author_account_age_days": 395 + "author_account_age_days": 430 + }, + "https://github.com/AIFSH/EchoMimicV2-ComfyUI": { + "stars": 28, + "last_update": "2024-12-08 08:53:21", + "author_account_age_days": 430 }, "https://github.com/AIFSH/EzAudio-ComfyUI": { - "stars": 7, + "stars": 8, "last_update": "2024-10-08 05:22:46", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/F5-TTS-ComfyUI": { - "stars": 21, + "stars": 24, "last_update": "2024-11-14 01:43:03", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/FancyVideo-ComfyUI": { - "stars": 36, + "stars": 37, "last_update": "2024-10-12 07:21:51", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/FireRedTTS-ComfyUI": { - "stars": 9, + "stars": 10, "last_update": "2024-10-24 01:18:51", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/GSTTS-ComfyUI": { "stars": 27, "last_update": "2024-08-25 03:23:24", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/HivisionIDPhotos-ComfyUI": { - "stars": 94, + "stars": 104, "last_update": "2024-09-16 14:16:06", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/IMAGDressing-ComfyUI": { - "stars": 58, + "stars": 59, "last_update": "2024-11-14 01:44:02", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/JoyHallo-ComfyUI": { "stars": 7, "last_update": "2024-11-14 01:44:39", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/MaskGCT-ComfyUI": { - "stars": 27, + "stars": 37, "last_update": "2024-11-14 01:40:15", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/MiniMates-ComfyUI": { - "stars": 22, + "stars": 24, "last_update": "2024-11-14 01:36:30", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/OmniGen-ComfyUI": { - "stars": 171, + "stars": 191, "last_update": "2024-11-14 01:37:33", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/PyramidFlow-ComfyUI": { "stars": 15, "last_update": "2024-10-10 13:59:16", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/RealisDance-ComfyUI": { - "stars": 35, + "stars": 39, "last_update": "2024-09-13 14:38:59", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/SenseVoice-ComfyUI": { - "stars": 12, + "stars": 13, "last_update": "2024-07-16 06:41:25", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/StyleShot-ComfyUI": { - "stars": 4, + "stars": 5, "last_update": "2024-08-17 00:25:29", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/VideoSys-ComfyUI": { - "stars": 5, + "stars": 7, "last_update": "2024-09-01 09:11:57", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/ViewCrafter-ComfyUI": { "stars": 9, "last_update": "2024-09-19 11:11:25", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIFSH/VocalSeparation-ComfyUI": { - "stars": 11, + "stars": 12, "last_update": "2024-10-24 07:16:37", - "author_account_age_days": 395 + "author_account_age_days": 430 }, "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes": { "stars": 6, "last_update": "2024-09-13 07:34:18", - "author_account_age_days": 374 + "author_account_age_days": 409 }, "https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION": { - "stars": 1835, - "last_update": "2024-12-01 18:37:30", - "author_account_age_days": 665 + "stars": 1928, + "last_update": "2024-12-19 11:43:49", + "author_account_age_days": 700 }, "https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Studio": { - "stars": 281, - "last_update": "2024-09-11 16:11:51", - "author_account_age_days": 665 + "stars": 293, + "last_update": "2025-01-06 11:31:20", + "author_account_age_days": 700 }, "https://github.com/AIGODLIKE/ComfyUI-CUP": { - "stars": 23, + "stars": 32, "last_update": "2024-06-21 03:43:20", - "author_account_age_days": 665 + "author_account_age_days": 700 }, "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter": { - "stars": 333, + "stars": 337, "last_update": "2024-07-17 02:28:49", - "author_account_age_days": 665 + "author_account_age_days": 700 }, "https://github.com/AIPOQUE/ComfyUI-APQNodes": { - "stars": 34, + "stars": 72, "last_update": "2024-11-21 08:56:49", - "author_account_age_days": 47 + "author_account_age_days": 81 }, "https://github.com/AInseven/ComfyUI-fastblend": { - "stars": 188, + "stars": 196, "last_update": "2024-11-22 03:32:25", - "author_account_age_days": 1847 + "author_account_age_days": 1882 }, "https://github.com/AIrjen/OneButtonPrompt": { - "stars": 876, + "stars": 898, "last_update": "2024-10-26 13:22:39", - "author_account_age_days": 607 + "author_account_age_days": 641 }, "https://github.com/ALatentPlace/ComfyUI_yanc": { - "stars": 49, + "stars": 53, "last_update": "2024-09-19 05:24:38", - "author_account_age_days": 1624 + "author_account_age_days": 1659 }, "https://github.com/APZmedia/APZmedia-comfyui-fast-image-save": { "stars": 2, "last_update": "2024-11-08 07:17:20", - "author_account_age_days": 2641 + "author_account_age_days": 2676 }, "https://github.com/APZmedia/ComfyUI-APZmedia-cleanName-from-string": { "stars": 5, "last_update": "2024-09-06 09:44:42", - "author_account_age_days": 2641 + "author_account_age_days": 2676 }, "https://github.com/ARZUMATA/ComfyUI-ARZUMATA": { "stars": 5, "last_update": "2024-11-01 00:10:58", - "author_account_age_days": 1930 + "author_account_age_days": 1965 }, "https://github.com/ARZUMATA/ComfyUI-ARZUMATA-Qwen2": { "stars": 1, "last_update": "2024-11-08 17:29:32", - "author_account_age_days": 1930 + "author_account_age_days": 1965 }, "https://github.com/Aaron-CHM/ComfyUI-z-a1111-sd-webui-DanTagGen": { "stars": 4, "last_update": "2024-07-17 03:55:26", - "author_account_age_days": 1690 + "author_account_age_days": 1725 }, "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD": { - "stars": 241, + "stars": 254, "last_update": "2024-06-14 07:04:37", - "author_account_age_days": 3832 + "author_account_age_days": 3866 }, "https://github.com/AbyssBadger0/ComfyUI_BadgerTools": { - "stars": 8, + "stars": 9, "last_update": "2024-11-12 11:10:16", - "author_account_age_days": 653 + "author_account_age_days": 688 }, "https://github.com/AbyssBadger0/ComfyUI_Kolors_awesome_prompts": { "stars": 4, "last_update": "2024-08-29 15:19:06", - "author_account_age_days": 653 + "author_account_age_days": 688 }, "https://github.com/Acly/comfyui-inpaint-nodes": { - "stars": 709, + "stars": 758, "last_update": "2024-11-20 08:54:22", - "author_account_age_days": 3968 + "author_account_age_days": 4003 }, "https://github.com/Acly/comfyui-tooling-nodes": { - "stars": 335, - "last_update": "2024-11-29 23:30:55", - "author_account_age_days": 3968 + "stars": 376, + "last_update": "2024-12-09 18:53:55", + "author_account_age_days": 4003 + }, + "https://github.com/AconexOfficial/ComfyUI_GOAT_Nodes": { + "stars": 3, + "last_update": "2025-01-03 17:02:12", + "author_account_age_days": 1679 }, "https://github.com/Aerse/ComfyUI-Seed-Nodes": { - "stars": 2, - "last_update": "2024-12-05 08:37:22", - "author_account_age_days": 3542 + "stars": 3, + "last_update": "2024-12-17 05:40:40", + "author_account_age_days": 3577 }, "https://github.com/AhBumm/ComfyUI_BillBum_Nodes": { - "stars": 4, - "last_update": "2024-11-05 05:31:50", - "author_account_age_days": 973 + "stars": 5, + "last_update": "2025-01-04 20:10:23", + "author_account_age_days": 1008 }, "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes": { "stars": 0, "last_update": "2024-06-20 17:26:02", - "author_account_age_days": 1440 + "author_account_age_days": 1474 }, "https://github.com/AkashKarnatak/ComfyUI_faishme": { "stars": 1, - "last_update": "2024-10-25 09:39:00", - "author_account_age_days": 1917 + "last_update": "2024-12-09 16:08:07", + "author_account_age_days": 1952 + }, + "https://github.com/Aksaz/comfyui-seamless-clone": { + "stars": 4, + "last_update": "2024-12-22 12:42:36", + "author_account_age_days": 82 }, "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet": { - "stars": 912, - "last_update": "2024-12-04 21:04:01", - "author_account_age_days": 2864 + "stars": 968, + "last_update": "2025-01-01 13:47:34", + "author_account_age_days": 2898 }, "https://github.com/Alvaroeai/ComfyUI-Text2Json": { "stars": 1, "last_update": "2024-11-26 16:40:31", - "author_account_age_days": 3865 + "author_account_age_days": 3900 + }, + "https://github.com/Amorano/Jovi_GLSL": { + "stars": 7, + "last_update": "2025-01-09 04:18:55", + "author_account_age_days": 5411 + }, + "https://github.com/Amorano/Jovi_Spout": { + "stars": 3, + "last_update": "2025-01-08 22:43:43", + "author_account_age_days": 5411 }, "https://github.com/Amorano/Jovimetrix": { - "stars": 280, - "last_update": "2024-12-05 06:30:04", - "author_account_age_days": 5376 + "stars": 293, + "last_update": "2025-01-08 22:38:24", + "author_account_age_days": 5411 }, "https://github.com/Anibaaal/ComfyUI-UX-Nodes": { "stars": 2, - "last_update": "2024-10-24 16:01:12", - "author_account_age_days": 3540 + "last_update": "2024-12-31 23:44:30", + "author_account_age_days": 3575 }, "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner": { - "stars": 7, + "stars": 8, "last_update": "2024-08-12 11:45:52", - "author_account_age_days": 4256 + "author_account_age_days": 4290 }, "https://github.com/AonekoSS/ComfyUI-SimpleCounter": { "stars": 2, "last_update": "2024-08-01 15:13:56", - "author_account_age_days": 4256 + "author_account_age_days": 4290 }, "https://github.com/Apache0ne/ComfyUI-EasyUrlLoader": { "stars": 2, "last_update": "2024-10-31 10:55:57", - "author_account_age_days": 42 + "author_account_age_days": 77 }, "https://github.com/Apache0ne/SambaNova": { "stars": 3, "last_update": "2024-11-02 07:41:35", - "author_account_age_days": 42 + "author_account_age_days": 77 }, "https://github.com/ArcherFMY/Diffusion360_ComfyUI": { - "stars": 29, + "stars": 33, "last_update": "2024-05-28 03:14:17", - "author_account_age_days": 3553 + "author_account_age_days": 3588 }, "https://github.com/ArdeniusAI/ComfyUI-Ardenius": { "stars": 4, "last_update": "2024-11-24 09:57:46", - "author_account_age_days": 291 + "author_account_age_days": 325 }, "https://github.com/ArtBot2023/CharacterFaceSwap": { - "stars": 70, + "stars": 77, "last_update": "2024-05-22 20:53:09", - "author_account_age_days": 457 + "author_account_age_days": 492 }, "https://github.com/ArtVentureX/comfyui-animatediff": { - "stars": 705, + "stars": 713, "last_update": "2024-05-22 18:16:43", - "author_account_age_days": 569 + "author_account_age_days": 604 }, "https://github.com/AshMartian/ComfyUI-DirGir": { "stars": 16, "last_update": "2024-05-29 22:28:55", - "author_account_age_days": 4750 + "author_account_age_days": 4785 }, "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction": { "stars": 37, "last_update": "2024-06-14 09:03:24", - "author_account_age_days": 554 + "author_account_age_days": 589 }, "https://github.com/AuroBit/ComfyUI-OOTDiffusion": { - "stars": 421, + "stars": 427, "last_update": "2024-07-12 03:49:27", - "author_account_age_days": 554 + "author_account_age_days": 589 }, "https://github.com/AustinMroz/ComfyUI-DynamicOversampling": { "stars": 0, "last_update": "2024-06-14 07:06:51", - "author_account_age_days": 4238 + "author_account_age_days": 4273 + }, + "https://github.com/AustinMroz/ComfyUI-MinCache": { + "stars": 2, + "last_update": "2024-12-25 18:52:07", + "author_account_age_days": 4273 }, "https://github.com/AustinMroz/ComfyUI-SpliceTools": { - "stars": 7, + "stars": 6, "last_update": "2024-06-14 07:07:21", - "author_account_age_days": 4238 + "author_account_age_days": 4273 }, "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing": { "stars": 10, "last_update": "2024-10-17 19:59:40", - "author_account_age_days": 4238 + "author_account_age_days": 4273 }, "https://github.com/Auttasak-L/ComfyUI-ImageCropper": { "stars": 1, "last_update": "2024-05-23 05:04:53", - "author_account_age_days": 2813 + "author_account_age_days": 2848 }, "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader": { "stars": 5, "last_update": "2024-09-13 22:09:17", - "author_account_age_days": 653 + "author_account_age_days": 688 + }, + "https://github.com/BIMer-99/ComfyUI_FishSpeech_EX": { + "stars": 3, + "last_update": "2024-12-21 11:35:08", + "author_account_age_days": 1431 }, "https://github.com/BIMer-99/Comfyui_Hunyuan3D_EX": { - "stars": 2, - "last_update": "2024-11-18 14:26:02", - "author_account_age_days": 1396 + "stars": 5, + "last_update": "2024-12-09 17:50:23", + "author_account_age_days": 1431 }, "https://github.com/BXYMartin/ComfyUI-InstantIDUtils": { "stars": 3, "last_update": "2024-05-23 00:08:50", - "author_account_age_days": 2607 + "author_account_age_days": 2642 }, "https://github.com/BZcreativ/ComfyUI-FLUX-TOGETHER-API": { "stars": 2, "last_update": "2024-11-02 14:45:28", - "author_account_age_days": 3401 + "author_account_age_days": 3435 }, "https://github.com/BadCafeCode/masquerade-nodes-comfyui": { - "stars": 365, + "stars": 381, "last_update": "2024-06-19 04:16:54", - "author_account_age_days": 594 + "author_account_age_days": 629 }, "https://github.com/Beinsezii/bsz-cui-extras": { - "stars": 22, + "stars": 23, "last_update": "2024-05-22 20:46:45", - "author_account_age_days": 2390 + "author_account_age_days": 2425 }, "https://github.com/BenNarum/ComfyUI_CAS": { "stars": 2, "last_update": "2024-07-13 12:00:40", - "author_account_age_days": 3236 + "author_account_age_days": 3271 }, "https://github.com/BenNarum/SigmaWaveFormNode": { "stars": 5, "last_update": "2024-06-20 15:20:35", - "author_account_age_days": 3236 + "author_account_age_days": 3271 }, "https://github.com/BennyKok/comfyui-deploy": { - "stars": 1058, - "last_update": "2024-11-13 09:14:42", - "author_account_age_days": 3160 + "stars": 1153, + "last_update": "2025-01-08 05:51:06", + "author_account_age_days": 3195 }, "https://github.com/BetaDoggo/ComfyUI-FastSDCPU": { - "stars": 7, + "stars": 9, "last_update": "2024-09-16 05:34:01", - "author_account_age_days": 962 + "author_account_age_days": 996 }, "https://github.com/BetaDoggo/ComfyUI-Gatcha-Embedding": { "stars": 1, "last_update": "2024-08-28 00:24:01", - "author_account_age_days": 962 + "author_account_age_days": 996 }, "https://github.com/BetaDoggo/ComfyUI-VideoPlayer": { "stars": 16, "last_update": "2024-08-05 04:45:12", - "author_account_age_days": 962 + "author_account_age_days": 996 }, "https://github.com/BetaDoggo/ComfyUI-WDV-Nodes": { "stars": 2, "last_update": "2024-08-01 07:59:10", - "author_account_age_days": 962 + "author_account_age_days": 996 }, "https://github.com/BetaDoggo/ComfyUI-YetAnotherSafetyChecker": { "stars": 4, "last_update": "2024-07-19 18:11:11", - "author_account_age_days": 962 + "author_account_age_days": 996 }, "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools": { - "stars": 22, + "stars": 23, "last_update": "2024-11-29 21:43:03", - "author_account_age_days": 1036 + "author_account_age_days": 1070 }, "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node": { "stars": 61, "last_update": "2024-08-01 08:01:48", - "author_account_age_days": 1036 + "author_account_age_days": 1070 }, "https://github.com/Billius-AI/ComfyUI-Path-Helper": { "stars": 17, "last_update": "2024-05-22 23:25:08", - "author_account_age_days": 299 + "author_account_age_days": 333 }, "https://github.com/Bin-sam/DynamicPose-ComfyUI": { "stars": 4, "last_update": "2024-09-11 12:09:11", - "author_account_age_days": 98 + "author_account_age_days": 133 }, "https://github.com/Black-Lioness/ComfyUI-PromptUtils": { - "stars": 2, + "stars": 3, "last_update": "2024-11-22 03:05:11", - "author_account_age_days": 1019 + "author_account_age_days": 1054 }, "https://github.com/BlackVortexAI/ComfyUI-BVortexNodes": { "stars": 3, "last_update": "2024-10-23 09:19:54", - "author_account_age_days": 120 + "author_account_age_days": 154 }, "https://github.com/BlakeOne/ComfyUI-CustomScheduler": { - "stars": 13, + "stars": 14, "last_update": "2024-05-23 00:23:56", - "author_account_age_days": 2696 + "author_account_age_days": 2731 }, "https://github.com/BlakeOne/ComfyUI-NodePresets": { "stars": 11, "last_update": "2024-05-23 00:24:07", - "author_account_age_days": 2696 + "author_account_age_days": 2731 }, "https://github.com/BlakeOne/ComfyUI-NodeReset": { "stars": 2, "last_update": "2024-05-23 00:24:18", - "author_account_age_days": 2696 + "author_account_age_days": 2731 }, "https://github.com/BlakeOne/ComfyUI-SchedulerMixer": { "stars": 10, "last_update": "2024-05-23 00:23:44", - "author_account_age_days": 2696 + "author_account_age_days": 2731 }, "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": { - "stars": 326, + "stars": 344, "last_update": "2024-08-07 15:13:31", - "author_account_age_days": 642 + "author_account_age_days": 676 }, "https://github.com/BlenderNeko/ComfyUI_Cutoff": { - "stars": 375, + "stars": 379, "last_update": "2024-05-22 15:01:45", - "author_account_age_days": 642 + "author_account_age_days": 676 }, "https://github.com/BlenderNeko/ComfyUI_Noise": { - "stars": 269, + "stars": 273, "last_update": "2024-06-10 16:38:48", - "author_account_age_days": 642 + "author_account_age_days": 676 }, "https://github.com/BlenderNeko/ComfyUI_SeeCoder": { "stars": 38, "last_update": "2024-05-22 14:57:04", - "author_account_age_days": 642 + "author_account_age_days": 676 }, "https://github.com/BlenderNeko/ComfyUI_TiledKSampler": { - "stars": 339, + "stars": 343, "last_update": "2024-05-22 14:56:49", - "author_account_age_days": 642 + "author_account_age_days": 676 }, "https://github.com/Blonicx/ComfyUI-X-Rework": { "stars": 2, - "last_update": "2024-11-09 14:58:58", - "author_account_age_days": 887 + "last_update": "2024-12-25 00:36:30", + "author_account_age_days": 922 }, "https://github.com/Bria-AI/ComfyUI-BRIA-API": { - "stars": 6, - "last_update": "2024-12-03 16:28:55", - "author_account_age_days": 1642 + "stars": 8, + "last_update": "2025-01-09 12:48:49", + "author_account_age_days": 1676 }, "https://github.com/CC-BryanOttho/ComfyUI_API_Manager": { "stars": 15, "last_update": "2024-06-14 07:13:34", - "author_account_age_days": 649 + "author_account_age_days": 684 }, "https://github.com/CY-CHENYUE/ComfyUI-InpaintEasy": { - "stars": 36, - "last_update": "2024-11-06 20:22:15", - "author_account_age_days": 362 + "stars": 47, + "last_update": "2024-12-07 17:30:21", + "author_account_age_days": 397 }, "https://github.com/CY-CHENYUE/ComfyUI-MiniCPM-Plus": { - "stars": 18, + "stars": 20, "last_update": "2024-10-09 06:56:04", - "author_account_age_days": 362 + "author_account_age_days": 397 }, "https://github.com/CY-CHENYUE/ComfyUI-Molmo": { - "stars": 103, + "stars": 105, "last_update": "2024-10-14 15:06:36", - "author_account_age_days": 362 + "author_account_age_days": 397 }, "https://github.com/CY-CHENYUE/ComfyUI-OmniGenX": { - "stars": 5, + "stars": 6, "last_update": "2024-11-06 20:54:39", - "author_account_age_days": 362 + "author_account_age_days": 397 }, "https://github.com/CY-CHENYUE/ComfyUI-Redux-Prompt": { - "stars": 2, - "last_update": "2024-12-05 18:30:38", - "author_account_age_days": 362 + "stars": 44, + "last_update": "2024-12-22 17:12:15", + "author_account_age_days": 397 }, "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr": { "stars": 7, "last_update": "2024-05-22 17:55:41", - "author_account_age_days": 413 + "author_account_age_days": 448 }, "https://github.com/CavinHuang/comfyui-nodes-docs": { - "stars": 160, + "stars": 176, "last_update": "2024-07-04 11:29:55", - "author_account_age_days": 2890 + "author_account_age_days": 2925 }, "https://github.com/Chan-0312/ComfyUI-EasyDeforum": { "stars": 10, "last_update": "2024-05-22 23:22:14", - "author_account_age_days": 2030 + "author_account_age_days": 2065 }, "https://github.com/Chan-0312/ComfyUI-IPAnimate": { - "stars": 71, + "stars": 72, "last_update": "2024-05-22 23:22:03", - "author_account_age_days": 2030 + "author_account_age_days": 2065 }, "https://github.com/Chan-0312/ComfyUI-Prompt-Preview": { - "stars": 30, + "stars": 31, "last_update": "2024-06-14 09:01:37", - "author_account_age_days": 2030 + "author_account_age_days": 2065 }, "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes": { - "stars": 23, - "last_update": "2024-10-13 15:24:52", - "author_account_age_days": 2043 + "stars": 27, + "last_update": "2024-12-22 12:10:13", + "author_account_age_days": 2077 }, "https://github.com/Charlweed/image_transceiver": { "stars": 2, - "last_update": "2024-11-13 01:14:43", - "author_account_age_days": 5261 + "last_update": "2025-01-06 19:22:50", + "author_account_age_days": 5296 + }, + "https://github.com/ChenDarYen/ComfyUI-TimestepShiftModel": { + "stars": 1, + "last_update": "2025-01-07 18:22:10", + "author_account_age_days": 2100 }, "https://github.com/ChrisColeTech/ComfyUI-Elegant-Resource-Monitor": { - "stars": 11, + "stars": 12, "last_update": "2024-09-23 21:48:27", - "author_account_age_days": 2576 + "author_account_age_days": 2611 }, "https://github.com/ChrisColeTech/ComfyUI-Line-counter": { "stars": 3, "last_update": "2024-09-02 02:30:14", - "author_account_age_days": 2576 + "author_account_age_days": 2611 }, "https://github.com/ClownsharkBatwing/RES4LYF": { - "stars": 40, - "last_update": "2024-12-05 02:23:51", - "author_account_age_days": 194 + "stars": 66, + "last_update": "2025-01-09 00:19:02", + "author_account_age_days": 228 }, "https://github.com/Clybius/ComfyUI-Extra-Samplers": { - "stars": 72, + "stars": 74, "last_update": "2024-11-15 17:21:45", - "author_account_age_days": 1898 + "author_account_age_days": 1932 }, "https://github.com/Clybius/ComfyUI-Latent-Modifiers": { - "stars": 77, + "stars": 79, "last_update": "2024-06-14 09:02:44", - "author_account_age_days": 1898 + "author_account_age_days": 1932 + }, + "https://github.com/ComfyUI-JH/ComfyUI-JH-Misc-Nodes": { + "stars": 2, + "last_update": "2024-12-28 19:44:14", + "author_account_age_days": 21 + }, + "https://github.com/ComfyUI-JH/ComfyUI-JH-XMP-Metadata-Nodes": { + "stars": 1, + "last_update": "2024-12-31 21:44:05", + "author_account_age_days": 21 }, "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": { - "stars": 108, - "last_update": "2024-12-05 13:37:24", - "author_account_age_days": 3819 + "stars": 111, + "last_update": "2025-01-07 15:03:52", + "author_account_age_days": 3854 + }, + "https://github.com/CpreForEver/CFE_comfyui": { + "stars": 1, + "last_update": "2024-12-09 01:38:42", + "author_account_age_days": 151 }, "https://github.com/Creeper-MZ/comfyui_nai_api": { "stars": 1, "last_update": "2024-10-02 21:30:26", - "author_account_age_days": 1167 + "author_account_age_days": 1202 + }, + "https://github.com/CyanAutumn/ComfyUi_Random_Manage_Cyan": { + "stars": 4, + "last_update": "2024-12-19 10:54:08", + "author_account_age_days": 1301 }, "https://github.com/Cyber-BCat/ComfyUI_Auto_Caption": { - "stars": 9, - "last_update": "2024-09-20 02:56:37", - "author_account_age_days": 579 + "stars": 10, + "last_update": "2024-12-30 07:38:13", + "author_account_age_days": 614 }, "https://github.com/Cyber-Blacat/ComfyUI-Yuan": { "stars": 6, - "last_update": "2024-09-19 10:29:40", - "author_account_age_days": 579 + "last_update": "2025-01-03 06:20:11", + "author_account_age_days": 614 }, "https://github.com/Cyberschorsch/ComfyUI-checkpoint-config-loader": { "stars": 1, "last_update": "2024-07-31 13:54:16", - "author_account_age_days": 5322 + "author_account_age_days": 5357 }, "https://github.com/Danand/ComfyUI-ComfyCouple": { - "stars": 30, + "stars": 32, "last_update": "2024-08-10 22:24:01", - "author_account_age_days": 4453 + "author_account_age_days": 4487 }, "https://github.com/DanielHabib/ComfyUI-Voxels": { "stars": 4, "last_update": "2024-09-16 15:41:02", - "author_account_age_days": 3748 + "author_account_age_days": 3782 }, "https://github.com/DareFail/ComfyUI-Roboflow": { - "stars": 31, + "stars": 32, "last_update": "2024-09-25 18:30:43", - "author_account_age_days": 4751 + "author_account_age_days": 4786 + }, + "https://github.com/DarioFT/ComfyUI-VideoDirCombiner": { + "stars": 3, + "last_update": "2024-12-22 14:37:21", + "author_account_age_days": 3676 }, "https://github.com/DataCTE/prompt_injection": { - "stars": 82, + "stars": 87, "last_update": "2024-06-21 12:56:43", - "author_account_age_days": 942 + "author_account_age_days": 976 }, "https://github.com/Dayuppy/ComfyUI-DiscordWebhook": { "stars": 4, "last_update": "2024-10-12 05:12:07", - "author_account_age_days": 4379 + "author_account_age_days": 4414 }, "https://github.com/DeJoker/pipeline-parallel-comfy": { "stars": 3, "last_update": "2024-07-29 06:59:37", - "author_account_age_days": 3155 + "author_account_age_days": 3189 }, "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": { - "stars": 367, + "stars": 378, "last_update": "2024-06-22 02:12:19", - "author_account_age_days": 1939 + "author_account_age_days": 1973 + }, + "https://github.com/DesertPixelAi/ComfyUI-Desert-Pixel-Nodes": { + "stars": 11, + "last_update": "2025-01-05 19:51:56", + "author_account_age_days": 345 }, "https://github.com/DigitalIO/ComfyUI-stable-wildcards": { - "stars": 23, + "stars": 25, "last_update": "2024-08-12 19:00:17", - "author_account_age_days": 4203 + "author_account_age_days": 4237 }, "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI": { "stars": 6, "last_update": "2024-05-22 23:14:06", - "author_account_age_days": 3237 + "author_account_age_days": 3272 }, "https://github.com/Dobidop/ComfyStereo": { "stars": 12, "last_update": "2024-08-06 19:59:34", - "author_account_age_days": 1624 + "author_account_age_days": 1659 + }, + "https://github.com/DoctorDiffusion/ComfyUI-BEN": { + "stars": 19, + "last_update": "2024-12-15 18:19:01", + "author_account_age_days": 540 }, "https://github.com/DoctorDiffusion/ComfyUI-MediaMixer": { - "stars": 5, + "stars": 8, "last_update": "2024-12-05 03:05:44", - "author_account_age_days": 506 + "author_account_age_days": 540 }, "https://github.com/DoctorDiffusion/ComfyUI-Schedulizer": { "stars": 6, "last_update": "2024-11-30 03:13:29", - "author_account_age_days": 506 + "author_account_age_days": 540 }, "https://github.com/DoctorDiffusion/ComfyUI-SnakeOil": { + "stars": 3, + "last_update": "2024-12-31 00:59:19", + "author_account_age_days": 540 + }, + "https://github.com/DoctorDiffusion/ComfyUI-basic-pitch": { "stars": 2, - "last_update": "2024-11-28 15:59:04", - "author_account_age_days": 506 + "last_update": "2024-12-25 19:07:11", + "author_account_age_days": 540 }, "https://github.com/DrJKL/ComfyUI-Anchors": { "stars": 6, "last_update": "2024-06-20 18:23:00", - "author_account_age_days": 5158 + "author_account_age_days": 5193 }, "https://github.com/DrMWeigand/ComfyUI-StereoVision": { - "stars": 2, + "stars": 3, "last_update": "2024-10-26 06:50:01", - "author_account_age_days": 1196 + "author_account_age_days": 1231 }, "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection": { "stars": 3, "last_update": "2024-07-15 13:21:10", - "author_account_age_days": 1196 + "author_account_age_days": 1231 + }, + "https://github.com/Eagle-CN/ComfyUI-Addoor": { + "stars": 21, + "last_update": "2025-01-07 01:35:48", + "author_account_age_days": 2826 }, "https://github.com/EeroHeikkinen/ComfyUI-eesahesNodes": { - "stars": 64, + "stars": 66, "last_update": "2024-09-01 11:43:02", - "author_account_age_days": 4881 + "author_account_age_days": 4916 }, "https://github.com/Elaine-chennn/comfyui-overlay-media": { "stars": 1, "last_update": "2024-10-09 11:07:46", - "author_account_age_days": 1307 + "author_account_age_days": 1342 }, "https://github.com/Electrofried/ComfyUI-OpenAINode": { - "stars": 22, + "stars": 23, "last_update": "2024-06-14 09:01:22", - "author_account_age_days": 2784 + "author_account_age_days": 2819 }, "https://github.com/EllangoK/ComfyUI-post-processing-nodes": { - "stars": 184, + "stars": 192, "last_update": "2024-08-09 17:20:17", - "author_account_age_days": 2942 + "author_account_age_days": 2977 }, "https://github.com/EnragedAntelope/ComfyUI-Doubutsu-Describer": { "stars": 10, "last_update": "2024-07-29 01:21:20", - "author_account_age_days": 133 + "author_account_age_days": 168 }, "https://github.com/EvilBT/ComfyUI_SLK_joy_caption_two": { - "stars": 213, + "stars": 273, "last_update": "2024-10-22 09:13:15", - "author_account_age_days": 3763 + "author_account_age_days": 3798 }, "https://github.com/Excidos/ComfyUI-Documents": { - "stars": 39, + "stars": 41, "last_update": "2024-07-11 20:15:21", - "author_account_age_days": 171 + "author_account_age_days": 206 }, "https://github.com/Excidos/ComfyUI-Lumina-Next-SFT-DiffusersWrapper": { "stars": 15, "last_update": "2024-07-30 10:27:07", - "author_account_age_days": 171 + "author_account_age_days": 206 }, "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V": { "stars": 27, "last_update": "2024-05-23 00:12:17", - "author_account_age_days": 1788 + "author_account_age_days": 1822 }, "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter": { - "stars": 110, + "stars": 112, "last_update": "2024-06-08 02:33:02", - "author_account_age_days": 1788 + "author_account_age_days": 1822 }, "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting": { - "stars": 281, + "stars": 284, "last_update": "2024-05-23 00:12:41", - "author_account_age_days": 1788 + "author_account_age_days": 1822 }, "https://github.com/ExterminanzHS/Gecco-Discord-Autosend": { "stars": 2, "last_update": "2024-09-05 12:33:30", - "author_account_age_days": 3372 + "author_account_age_days": 3407 }, "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG": { - "stars": 363, + "stars": 377, "last_update": "2024-09-10 17:44:50", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/LoadLoraWithTags": { - "stars": 59, + "stars": 63, "last_update": "2024-11-23 12:05:02", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/Skimmed_CFG": { - "stars": 147, + "stars": 160, "last_update": "2024-10-25 20:59:10", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": { - "stars": 40, + "stars": 41, "last_update": "2024-07-10 00:27:51", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/Uncond-Zero-for-ComfyUI": { "stars": 44, "last_update": "2024-07-10 00:27:36", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI": { - "stars": 110, + "stars": 112, "last_update": "2024-08-28 05:29:07", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/noise_latent_perlinpinpin": { - "stars": 32, + "stars": 33, "last_update": "2024-08-13 14:19:11", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI": { - "stars": 35, + "stars": 39, "last_update": "2024-09-23 02:53:31", - "author_account_age_days": 3314 + "author_account_age_days": 3348 }, "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": { - "stars": 67, - "last_update": "2024-08-21 11:52:24", - "author_account_age_days": 3314 + "stars": 71, + "last_update": "2024-12-13 00:18:40", + "author_account_age_days": 3348 }, "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation": { - "stars": 514, + "stars": 549, "last_update": "2024-10-11 04:50:47", - "author_account_age_days": 3296 + "author_account_age_days": 3331 }, "https://github.com/Fannovel16/ComfyUI-Loopchain": { "stars": 31, "last_update": "2023-12-15 14:25:35", - "author_account_age_days": 3296 + "author_account_age_days": 3331 }, "https://github.com/Fannovel16/ComfyUI-MagickWand": { - "stars": 91, + "stars": 97, "last_update": "2024-08-01 01:00:58", - "author_account_age_days": 3296 + "author_account_age_days": 3331 }, "https://github.com/Fannovel16/ComfyUI-MotionDiff": { - "stars": 178, + "stars": 182, "last_update": "2024-08-01 01:01:53", - "author_account_age_days": 3296 + "author_account_age_days": 3331 }, "https://github.com/Fannovel16/ComfyUI-Video-Matting": { - "stars": 192, + "stars": 195, "last_update": "2024-08-14 01:28:50", - "author_account_age_days": 3296 + "author_account_age_days": 3331 }, "https://github.com/Fannovel16/comfyui_controlnet_aux": { - "stars": 2367, + "stars": 2483, "last_update": "2024-10-28 22:08:11", - "author_account_age_days": 3296 + "author_account_age_days": 3331 }, "https://github.com/Fantaxico/ComfyUI-GCP-Storage": { - "stars": 1, + "stars": 2, "last_update": "2024-06-14 09:05:52", - "author_account_age_days": 700 + "author_account_age_days": 735 }, "https://github.com/Feidorian/feidorian-ComfyNodes": { "stars": 5, "last_update": "2024-06-20 11:31:37", - "author_account_age_days": 2919 + "author_account_age_days": 2954 }, "https://github.com/Fictiverse/ComfyUI_Fictiverse": { "stars": 14, "last_update": "2024-12-02 16:48:03", - "author_account_age_days": 836 + "author_account_age_days": 870 }, "https://github.com/Fihade/IC-Light-ComfyUI-Node": { "stars": 6, "last_update": "2024-07-02 03:47:17", - "author_account_age_days": 2911 + "author_account_age_days": 2946 + }, + "https://github.com/FinetunersAI/ComfyUI_Finetuners_Suite": { + "stars": 3, + "last_update": "2025-01-07 13:51:47", + "author_account_age_days": 220 }, "https://github.com/FizzleDorf/ComfyUI-AIT": { "stars": 51, "last_update": "2024-06-22 03:13:05", - "author_account_age_days": 2143 + "author_account_age_days": 2178 }, "https://github.com/FizzleDorf/ComfyUI_FizzNodes": { - "stars": 400, + "stars": 411, "last_update": "2024-10-29 01:51:46", - "author_account_age_days": 2143 + "author_account_age_days": 2178 }, "https://github.com/FlyingFireCo/tiled_ksampler": { - "stars": 69, + "stars": 70, "last_update": "2024-05-22 23:15:17", - "author_account_age_days": 796 + "author_account_age_days": 831 }, "https://github.com/ForeignGods/ComfyUI-Mana-Nodes": { - "stars": 211, + "stars": 219, "last_update": "2024-05-29 18:29:05", - "author_account_age_days": 1408 + "author_account_age_days": 1443 }, "https://github.com/Franck-Demongin/NX_HuggingFace_Flux": { "stars": 2, "last_update": "2024-08-14 02:17:21", - "author_account_age_days": 1935 + "author_account_age_days": 1970 }, "https://github.com/Franck-Demongin/NX_PromptStyler": { "stars": 8, "last_update": "2024-05-22 23:25:21", - "author_account_age_days": 1935 + "author_account_age_days": 1970 }, "https://github.com/Franck-Demongin/NX_Translator": { "stars": 1, "last_update": "2024-08-14 02:17:01", - "author_account_age_days": 1935 + "author_account_age_days": 1970 }, "https://github.com/FredBill1/comfyui-fb-utils": { "stars": 1, "last_update": "2024-05-23 01:41:02", - "author_account_age_days": 2481 + "author_account_age_days": 2516 }, "https://github.com/FuouM/ComfyUI-EbSynth": { - "stars": 78, + "stars": 84, "last_update": "2024-08-17 15:44:49", - "author_account_age_days": 1845 + "author_account_age_days": 1880 }, "https://github.com/FuouM/ComfyUI-FirstOrderMM": { "stars": 5, "last_update": "2024-08-17 15:26:38", - "author_account_age_days": 1845 + "author_account_age_days": 1880 }, "https://github.com/FuouM/ComfyUI-StyleTransferPlus": { "stars": 8, "last_update": "2024-08-14 15:42:37", - "author_account_age_days": 1845 + "author_account_age_days": 1880 }, "https://github.com/FuouM/FM_nodes": { "stars": 4, "last_update": "2024-08-12 04:49:06", - "author_account_age_days": 1845 + "author_account_age_days": 1880 }, "https://github.com/Fuwuffyi/ComfyUI-VisualArea-Nodes": { - "stars": 50, + "stars": 58, "last_update": "2024-11-05 17:00:49", - "author_account_age_days": 1327 + "author_account_age_days": 1361 }, "https://github.com/G-370/ComfyUI-SD3-Powerlab": { "stars": 20, "last_update": "2024-06-22 19:17:18", - "author_account_age_days": 1683 + "author_account_age_days": 1718 }, "https://github.com/GMapeSplat/ComfyUI_ezXY": { "stars": 26, "last_update": "2024-09-04 03:00:13", - "author_account_age_days": 1461 + "author_account_age_days": 1496 }, "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": { "stars": 8, "last_update": "2024-05-22 21:31:52", - "author_account_age_days": 2720 + "author_account_age_days": 2755 }, "https://github.com/GadzoinksOfficial/gadzoinks_ComfyUI": { "stars": 1, "last_update": "2024-11-11 14:46:34", - "author_account_age_days": 320 + "author_account_age_days": 355 }, "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": { "stars": 12, "last_update": "2024-10-10 20:39:32", - "author_account_age_days": 4732 + "author_account_age_days": 4767 }, "https://github.com/GeekyGhost/ComfyUI-GeekyRemB": { - "stars": 36, - "last_update": "2024-11-29 02:37:33", - "author_account_age_days": 834 + "stars": 40, + "last_update": "2024-12-06 15:42:18", + "author_account_age_days": 869 }, "https://github.com/GentlemanHu/ComfyUI-SunoAI": { - "stars": 17, - "last_update": "2024-08-03 04:14:44", - "author_account_age_days": 2547 + "stars": 18, + "last_update": "2024-12-17 11:46:33", + "author_account_age_days": 2582 }, "https://github.com/GiusTex/ComfyUI-DiffusersImageOutpaint": { - "stars": 58, + "stars": 66, "last_update": "2024-12-01 00:43:54", - "author_account_age_days": 829 + "author_account_age_days": 864 }, "https://github.com/Goktug/comfyui-saveimage-plus": { - "stars": 7, + "stars": 9, "last_update": "2024-11-13 06:03:10", - "author_account_age_days": 5096 + "author_account_age_days": 5131 }, "https://github.com/Gourieff/comfyui-reactor-node": { - "stars": 1647, - "last_update": "2024-11-21 12:08:59", - "author_account_age_days": 1284 + "stars": 1763, + "last_update": "2025-01-06 11:39:00", + "author_account_age_days": 1318 }, "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": { - "stars": 51, - "last_update": "2024-11-22 13:09:13", - "author_account_age_days": 327 + "stars": 55, + "last_update": "2024-12-16 10:18:14", + "author_account_age_days": 362 + }, + "https://github.com/GraftingRayman/ComfyUI_QueueTube": { + "stars": 0, + "last_update": "2025-01-08 20:59:13", + "author_account_age_days": 362 }, "https://github.com/GreenLandisaLie/AuraSR-ComfyUI": { - "stars": 156, + "stars": 163, "last_update": "2024-09-04 10:58:03", - "author_account_age_days": 1361 + "author_account_age_days": 1396 }, "https://github.com/GrenKain/PixelArt-Processing-Nodes-for-ComfyUI": { "stars": 5, "last_update": "2024-09-06 11:37:05", - "author_account_age_days": 2574 + "author_account_age_days": 2609 }, "https://github.com/GrvBdgr/comfyui-negativewildcardsprocessor": { "stars": 2, "last_update": "2024-11-15 19:46:39", - "author_account_age_days": 37 + "author_account_age_days": 71 }, "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio": { "stars": 3, "last_update": "2024-06-14 08:59:42", - "author_account_age_days": 1644 + "author_account_age_days": 1679 }, "https://github.com/HAL41/ComfyUI-aichemy-nodes": { "stars": 4, "last_update": "2024-05-22 23:10:19", - "author_account_age_days": 3010 + "author_account_age_days": 3045 }, "https://github.com/HECer/ComfyUI-FilePathCreator": { "stars": 7, "last_update": "2024-10-20 14:41:48", - "author_account_age_days": 3144 + "author_account_age_days": 3179 + }, + "https://github.com/HM-RunningHub/ComfyUI_RH_APICall": { + "stars": 12, + "last_update": "2025-01-05 16:34:15", + "author_account_age_days": 28 + }, + "https://github.com/HM-RunningHub/ComfyUI_RH_OminiControl": { + "stars": 109, + "last_update": "2024-12-20 08:41:09", + "author_account_age_days": 28 }, "https://github.com/Haiper-ai/ComfyUI-HaiperAI-API": { - "stars": 6, - "last_update": "2024-12-04 03:15:19", - "author_account_age_days": 1164 + "stars": 9, + "last_update": "2024-12-06 18:08:50", + "author_account_age_days": 1199 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream": { - "stars": 43, - "last_update": "2024-06-14 08:08:20", - "author_account_age_days": 774 + "stars": 45, + "last_update": "2025-01-04 20:41:38", + "author_account_age_days": 809 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": { "stars": 40, "last_update": "2024-06-14 08:08:28", - "author_account_age_days": 774 + "author_account_age_days": 809 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything": { - "stars": 19, + "stars": 20, "last_update": "2024-06-14 08:10:52", - "author_account_age_days": 774 + "author_account_age_days": 809 }, "https://github.com/Haoming02/comfyui-clear-screen": { "stars": 2, "last_update": "2024-09-09 09:14:41", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-diffusion-cg": { - "stars": 89, + "stars": 90, "last_update": "2024-10-12 13:39:00", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-floodgate": { - "stars": 28, + "stars": 30, "last_update": "2024-08-02 06:21:25", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-menu-anchor": { "stars": 4, "last_update": "2024-10-19 11:42:51", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-node-beautify": { - "stars": 7, + "stars": 8, "last_update": "2024-09-09 09:04:35", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-old-photo-restoration": { - "stars": 22, + "stars": 27, "last_update": "2024-11-05 02:18:05", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-prompt-format": { "stars": 33, "last_update": "2024-09-20 04:29:03", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-resharpen": { - "stars": 41, + "stars": 44, "last_update": "2024-08-20 05:21:20", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/Haoming02/comfyui-tab-handler": { "stars": 5, "last_update": "2024-09-09 09:20:58", - "author_account_age_days": 1495 + "author_account_age_days": 1530 }, "https://github.com/HaydenReeve/ComfyUI-Better-Strings": { "stars": 3, "last_update": "2024-11-18 11:08:29", - "author_account_age_days": 2406 + "author_account_age_days": 2441 }, "https://github.com/HeadshotPro/ComfyUI-HeadshotPro": { "stars": 2, "last_update": "2024-08-14 04:00:34", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/HebelHuber/comfyui-enhanced-save-node": { "stars": 2, "last_update": "2024-06-14 08:59:28", - "author_account_age_days": 2488 + "author_account_age_days": 2523 }, "https://github.com/HelloVision/ComfyUI_HelloMeme": { - "stars": 156, - "last_update": "2024-12-04 10:40:31", - "author_account_age_days": 77 + "stars": 328, + "last_update": "2024-12-23 03:22:54", + "author_account_age_days": 112 }, "https://github.com/Hellrunner2k/ComfyUI-HellrunnersMagicalNodes": { "stars": 2, "last_update": "2024-09-05 17:29:43", - "author_account_age_days": 3248 + "author_account_age_days": 3283 }, "https://github.com/Hiero207/ComfyUI-Hiero-Nodes": { "stars": 6, "last_update": "2024-08-14 01:25:26", - "author_account_age_days": 1862 + "author_account_age_days": 1897 }, "https://github.com/Hopping-Mad-Games/ComfyUI_LiteLLM": { "stars": 4, - "last_update": "2024-12-01 22:43:20", - "author_account_age_days": 352 + "last_update": "2025-01-07 06:23:17", + "author_account_age_days": 387 + }, + "https://github.com/Hullabalo/ComfyUI-Loop": { + "stars": 3, + "last_update": "2025-01-08 01:15:33", + "author_account_age_days": 809 }, "https://github.com/IDGallagher/ComfyUI-IG-Motion-I2V": { "stars": 33, "last_update": "2024-09-30 10:38:22", - "author_account_age_days": 5645 + "author_account_age_days": 5680 }, "https://github.com/IDGallagher/ComfyUI-IG-Nodes": { "stars": 3, "last_update": "2024-10-10 10:23:48", - "author_account_age_days": 5645 + "author_account_age_days": 5680 }, "https://github.com/ITurchenko/ComfyUI-SizeFromArray": { "stars": 1, "last_update": "2024-08-01 08:45:43", - "author_account_age_days": 3873 + "author_account_age_days": 3908 + }, + "https://github.com/IamCreateAI/Ruyi-Models": { + "stars": 421, + "last_update": "2025-01-06 05:58:25", + "author_account_age_days": 31 }, "https://github.com/Iemand005/ComfyUI-Touch-Gestures": { "stars": 3, "last_update": "2024-11-13 12:30:01", - "author_account_age_days": 1661 + "author_account_age_days": 1696 }, "https://github.com/Iemand005/ComfyUI-Touchpad-Gestures": { "stars": 1, - "last_update": "2024-11-25 22:20:22", - "author_account_age_days": 1661 + "last_update": "2024-12-08 23:56:49", + "author_account_age_days": 1696 + }, + "https://github.com/IgalOgonov/ComfyUI_Simple_String_Repository": { + "stars": 3, + "last_update": "2024-12-28 20:21:22", + "author_account_age_days": 2429 }, "https://github.com/ImmortalPie/ComfyUI-PonySwitch": { "stars": 10, "last_update": "2024-08-18 14:05:08", - "author_account_age_days": 3987 + "author_account_age_days": 4021 + }, + "https://github.com/InstantStudioAI/ComfyUI-InstantStudio": { + "stars": 5, + "last_update": "2025-01-07 08:01:08", + "author_account_age_days": 29 }, "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": { "stars": 9, "last_update": "2024-05-23 01:12:46", - "author_account_age_days": 2794 + "author_account_age_days": 2829 }, "https://github.com/Inzaniak/comfyui-ranbooru": { "stars": 12, "last_update": "2024-05-22 23:12:23", - "author_account_age_days": 4074 + "author_account_age_days": 4108 }, "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis": { "stars": 10, "last_update": "2024-09-21 21:39:11", - "author_account_age_days": 275 + "author_account_age_days": 310 }, "https://github.com/Isi-dev/ComfyUI-Animation_Nodes_and_Workflows": { - "stars": 16, - "last_update": "2024-12-03 16:05:18", - "author_account_age_days": 1256 + "stars": 21, + "last_update": "2024-12-21 19:28:35", + "author_account_age_days": 1291 }, "https://github.com/Isi-dev/ComfyUI-Img2DrawingAssistants": { - "stars": 13, - "last_update": "2024-08-31 18:32:00", - "author_account_age_days": 1256 + "stars": 16, + "last_update": "2024-12-15 10:03:55", + "author_account_age_days": 1291 }, "https://github.com/Isi-dev/ComfyUI-Img2PaintingAssistant": { - "stars": 7, - "last_update": "2024-09-26 14:22:05", - "author_account_age_days": 1256 + "stars": 8, + "last_update": "2024-12-15 11:00:51", + "author_account_age_days": 1291 }, "https://github.com/Isi-dev/ComfyUI-UniAnimate-W": { - "stars": 64, - "last_update": "2024-10-10 20:18:15", - "author_account_age_days": 1256 + "stars": 79, + "last_update": "2024-12-30 22:35:00", + "author_account_age_days": 1291 }, "https://github.com/Isulion/ComfyUI_Isulion": { - "stars": 19, - "last_update": "2024-12-03 13:53:05", - "author_account_age_days": 521 + "stars": 27, + "last_update": "2025-01-05 23:34:37", + "author_account_age_days": 556 }, "https://github.com/IuvenisSapiens/ComfyUI_MiniCPM-V-2_6-int4": { - "stars": 137, + "stars": 155, "last_update": "2024-09-03 02:02:45", - "author_account_age_days": 575 + "author_account_age_days": 610 }, "https://github.com/IuvenisSapiens/ComfyUI_Qwen2-Audio-7B-Instruct-Int4": { - "stars": 8, + "stars": 9, "last_update": "2024-09-26 08:29:21", - "author_account_age_days": 575 + "author_account_age_days": 610 }, "https://github.com/IuvenisSapiens/ComfyUI_Qwen2-VL-Instruct": { - "stars": 68, + "stars": 74, "last_update": "2024-09-26 08:31:38", - "author_account_age_days": 575 + "author_account_age_days": 610 }, "https://github.com/JEONG-JIWOO/ComfyUI_Eugene_Nodes": { - "stars": 1, - "last_update": "2024-12-04 15:29:48", - "author_account_age_days": 2731 + "stars": 3, + "last_update": "2024-12-21 11:56:14", + "author_account_age_days": 2766 }, "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": { - "stars": 54, + "stars": 56, "last_update": "2024-05-22 20:39:14", - "author_account_age_days": 480 + "author_account_age_days": 515 }, "https://github.com/JPrevots/ComfyUI-PhyCV": { "stars": 2, "last_update": "2024-08-19 22:00:21", - "author_account_age_days": 723 + "author_account_age_days": 758 }, "https://github.com/JackEllie/ComfyUI_AI_Assistant": { "stars": 25, "last_update": "2024-09-05 03:42:14", - "author_account_age_days": 735 + "author_account_age_days": 770 + }, + "https://github.com/Jaminanim/ComfyUI-Random-Int-Divisor-Node": { + "stars": 1, + "last_update": "2025-01-07 06:50:58", + "author_account_age_days": 1761 }, "https://github.com/Jannchie/ComfyUI-J": { - "stars": 82, + "stars": 84, "last_update": "2024-09-14 15:22:29", - "author_account_age_days": 2717 + "author_account_age_days": 2752 }, "https://github.com/JaredTherriault/ComfyUI-JNodes": { - "stars": 44, - "last_update": "2024-11-28 04:02:22", - "author_account_age_days": 3736 + "stars": 50, + "last_update": "2025-01-06 00:41:21", + "author_account_age_days": 3771 + }, + "https://github.com/Jash-Vora/ComfyUI-GarmentDiT": { + "stars": 2, + "last_update": "2025-01-04 08:22:14", + "author_account_age_days": 609 }, "https://github.com/JcandZero/ComfyUI_GLM4Node": { "stars": 26, "last_update": "2024-05-22 23:12:46", - "author_account_age_days": 854 + "author_account_age_days": 889 }, "https://github.com/Jcd1230/rembg-comfyui-node": { - "stars": 145, + "stars": 156, "last_update": "2024-05-22 17:58:34", - "author_account_age_days": 5050 + "author_account_age_days": 5085 }, "https://github.com/JerryOrbachJr/ComfyUI-RandomSize": { "stars": 4, "last_update": "2024-08-25 18:35:55", - "author_account_age_days": 320 + "author_account_age_days": 354 }, "https://github.com/JettHu/ComfyUI-TCD": { - "stars": 114, + "stars": 119, "last_update": "2024-07-31 13:50:21", - "author_account_age_days": 2522 + "author_account_age_days": 2557 }, "https://github.com/JettHu/ComfyUI_TGate": { - "stars": 82, + "stars": 89, "last_update": "2024-09-24 02:15:59", - "author_account_age_days": 2522 + "author_account_age_days": 2557 }, "https://github.com/JichaoLiang/Immortal_comfyUI": { "stars": 3, - "last_update": "2024-10-07 03:01:03", - "author_account_age_days": 1188 + "last_update": "2024-12-11 07:46:34", + "author_account_age_days": 1222 }, "https://github.com/Jonseed/ComfyUI-Detail-Daemon": { - "stars": 400, + "stars": 490, "last_update": "2024-11-04 17:57:27", - "author_account_age_days": 2344 + "author_account_age_days": 2378 }, "https://github.com/Jordach/comfy-plasma": { - "stars": 68, + "stars": 71, "last_update": "2024-05-22 18:08:28", - "author_account_age_days": 4677 + "author_account_age_days": 4712 }, "https://github.com/JosefKuchar/ComfyUI-AdvancedTiling": { - "stars": 11, + "stars": 12, "last_update": "2024-08-02 15:16:12", - "author_account_age_days": 3519 + "author_account_age_days": 3553 }, "https://github.com/JosephThomasParker/ComfyUI-DrawThingsWrapper": { - "stars": 3, + "stars": 7, "last_update": "2024-10-21 21:03:30", - "author_account_age_days": 3334 + "author_account_age_days": 3369 }, "https://github.com/Julian-adv/WildDivide": { - "stars": 15, - "last_update": "2024-12-04 13:43:17", - "author_account_age_days": 502 + "stars": 16, + "last_update": "2024-12-22 02:05:36", + "author_account_age_days": 537 }, "https://github.com/JustinMatters/comfyUI-JMNodes": { "stars": 1, - "last_update": "2024-10-27 16:54:25", - "author_account_age_days": 2935 + "last_update": "2025-01-04 14:57:58", + "author_account_age_days": 2970 }, "https://github.com/Kangkang625/ComfyUI-paint-by-example": { "stars": 16, "last_update": "2024-05-22 22:20:27", - "author_account_age_days": 1078 + "author_account_age_days": 1113 }, "https://github.com/Kesin11/ComfyUI-list-filter": { "stars": 1, "last_update": "2024-10-19 06:44:17", - "author_account_age_days": 4711 + "author_account_age_days": 4746 }, "https://github.com/KewkLW/ComfyUI-kewky_tools": { - "stars": 7, + "stars": 8, "last_update": "2024-07-10 05:45:11", - "author_account_age_days": 1851 + "author_account_age_days": 1886 }, "https://github.com/Kinglord/ComfyUI_LoRA_Sidebar": { - "stars": 32, + "stars": 52, "last_update": "2024-11-23 15:44:26", - "author_account_age_days": 5054 + "author_account_age_days": 5089 }, "https://github.com/Kinglord/ComfyUI_Prompt_Gallery": { - "stars": 39, + "stars": 40, "last_update": "2024-09-24 21:58:55", - "author_account_age_days": 5054 + "author_account_age_days": 5089 }, "https://github.com/Kinglord/ComfyUI_Slider_Sidebar": { - "stars": 35, + "stars": 36, "last_update": "2024-09-26 02:40:30", - "author_account_age_days": 5054 + "author_account_age_days": 5089 }, "https://github.com/KohakuBlueleaf/z-tipo-extension": { - "stars": 276, - "last_update": "2024-12-01 13:32:55", - "author_account_age_days": 1792 + "stars": 295, + "last_update": "2025-01-09 09:31:28", + "author_account_age_days": 1827 }, "https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler": { - "stars": 175, + "stars": 182, "last_update": "2024-09-01 03:57:22", - "author_account_age_days": 1650 + "author_account_age_days": 1684 }, - "https://github.com/KoreTeknology/ComfyUI-Compositing-Nodes-Pack": { + "https://github.com/Koishi-Star/Pyramid_Noise_For_Inference": { + "stars": 5, + "last_update": "2024-09-27 17:58:43", + "author_account_age_days": 1684 + }, + "https://github.com/KoreTeknology/ComfyUI-Nai-Production-Nodes-Pack": { "stars": 3, "last_update": "2024-11-24 15:55:30", - "author_account_age_days": 3354 + "author_account_age_days": 3389 }, "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": { - "stars": 46, + "stars": 52, "last_update": "2024-10-19 19:19:25", - "author_account_age_days": 3354 + "author_account_age_days": 3389 }, "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": { - "stars": 632, - "last_update": "2024-12-04 11:49:34", - "author_account_age_days": 3880 + "stars": 667, + "last_update": "2025-01-06 03:23:56", + "author_account_age_days": 3915 }, "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": { - "stars": 2800, - "last_update": "2024-12-04 03:08:12", - "author_account_age_days": 3880 + "stars": 2887, + "last_update": "2025-01-06 03:24:30", + "author_account_age_days": 3915 }, "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite": { - "stars": 633, - "last_update": "2024-12-05 06:58:47", - "author_account_age_days": 3880 + "stars": 714, + "last_update": "2025-01-06 23:44:25", + "author_account_age_days": 3915 }, "https://github.com/Koushakur/ComfyUI-DenoiseChooser": { "stars": 5, "last_update": "2024-07-31 14:05:13", - "author_account_age_days": 1285 + "author_account_age_days": 1319 + }, + "https://github.com/KunmyonChoi/ComfyUI_S3_direct": { + "stars": 1, + "last_update": "2025-01-07 01:22:23", + "author_account_age_days": 5767 }, "https://github.com/KwaiVGI/ComfyUI-KLingAI-API": { - "stars": 52, - "last_update": "2024-12-03 06:55:18", - "author_account_age_days": 222 + "stars": 71, + "last_update": "2025-01-08 03:22:50", + "author_account_age_days": 257 }, "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP": { "stars": 5, "last_update": "2024-05-23 00:21:43", - "author_account_age_days": 1943 + "author_account_age_days": 1978 }, "https://github.com/LAOGOU-666/ComfyUI_LG_FFT": { - "stars": 6, + "stars": 7, "last_update": "2024-10-10 04:45:57", - "author_account_age_days": 259 + "author_account_age_days": 294 + }, + "https://github.com/LAOGOU-666/Comfyui-LG_Relight": { + "stars": 47, + "last_update": "2025-01-09 09:07:22", + "author_account_age_days": 294 }, "https://github.com/LEv145/images-grid-comfy-plugin": { - "stars": 163, + "stars": 167, "last_update": "2024-05-30 17:54:32", - "author_account_age_days": 2372 + "author_account_age_days": 2406 }, "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": { - "stars": 47, + "stars": 52, "last_update": "2024-06-06 20:45:43", - "author_account_age_days": 328 + "author_account_age_days": 363 }, "https://github.com/LarryJane491/Lora-Training-in-Comfy": { - "stars": 390, + "stars": 406, "last_update": "2024-08-05 11:32:30", - "author_account_age_days": 328 + "author_account_age_days": 363 }, "https://github.com/LatentRat/comfy_remote_run": { "stars": 4, "last_update": "2024-09-08 04:06:09", - "author_account_age_days": 908 + "author_account_age_days": 943 }, "https://github.com/LatentSpaceDirective/ComfyUI-Texturaizer": { - "stars": 9, - "last_update": "2024-12-03 14:46:16", - "author_account_age_days": 23 + "stars": 11, + "last_update": "2024-12-20 19:38:19", + "author_account_age_days": 58 }, "https://github.com/Layer-norm/comfyui-lama-remover": { - "stars": 97, + "stars": 107, "last_update": "2024-08-03 04:18:39", - "author_account_age_days": 496 + "author_account_age_days": 531 }, "https://github.com/Lerc/canvas_tab": { - "stars": 166, + "stars": 168, "last_update": "2024-05-22 20:48:45", - "author_account_age_days": 5531 + "author_account_age_days": 5566 }, "https://github.com/LevelPixel/ComfyUI-LevelPixel": { - "stars": 2, - "last_update": "2024-11-16 18:26:50", - "author_account_age_days": 146 + "stars": 3, + "last_update": "2024-12-08 23:10:10", + "author_account_age_days": 181 }, "https://github.com/Lhyejin/ComfyUI-Fill-Image-for-Outpainting": { "stars": 9, "last_update": "2024-08-26 00:40:09", - "author_account_age_days": 2766 + "author_account_age_days": 2801 + }, + "https://github.com/LiJT/ComfyUI-Gemini-Prompt-Generator-JT": { + "stars": 2, + "last_update": "2024-12-22 15:06:38", + "author_account_age_days": 3601 + }, + "https://github.com/Light-x02/ComfyUI-FluxSettingsNode": { + "stars": 3, + "last_update": "2024-12-25 07:08:32", + "author_account_age_days": 976 + }, + "https://github.com/Light-x02/ComfyUI-Image-Metadata-Nodes": { + "stars": 2, + "last_update": "2024-12-23 01:54:11", + "author_account_age_days": 976 }, "https://github.com/LightSketch-ai/ComfyUI-LivePortraitNode": { "stars": 2, "last_update": "2024-07-17 01:24:53", - "author_account_age_days": 148 + "author_account_age_days": 183 }, "https://github.com/Lightricks/ComfyUI-LTXVideo": { - "stars": 332, - "last_update": "2024-12-03 14:55:31", - "author_account_age_days": 4355 + "stars": 594, + "last_update": "2024-12-22 14:57:35", + "author_account_age_days": 4389 }, "https://github.com/Limitex/ComfyUI-Calculation": { "stars": 0, "last_update": "2024-05-22 22:18:40", - "author_account_age_days": 1439 + "author_account_age_days": 1474 }, "https://github.com/Limitex/ComfyUI-Diffusers": { - "stars": 137, - "last_update": "2024-05-22 22:18:57", - "author_account_age_days": 1439 + "stars": 149, + "last_update": "2025-01-09 05:30:43", + "author_account_age_days": 1474 }, "https://github.com/Ling-APE/ComfyUI-PixelResolutionCalculator": { - "stars": 7, + "stars": 8, "last_update": "2024-09-23 06:31:38", - "author_account_age_days": 551 + "author_account_age_days": 586 }, "https://github.com/Loewen-Hob/rembg-comfyui-node-better": { "stars": 60, "last_update": "2024-09-12 14:16:23", - "author_account_age_days": 635 + "author_account_age_days": 669 }, "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame": { "stars": 28, "last_update": "2024-05-22 21:29:02", - "author_account_age_days": 1140 + "author_account_age_days": 1174 }, "https://github.com/LonicaMewinsky/ComfyUI-RawSaver": { "stars": 2, "last_update": "2024-05-22 21:31:28", - "author_account_age_days": 1140 + "author_account_age_days": 1174 + }, + "https://github.com/LucipherDev/ComfyUI-AniDoc": { + "stars": 43, + "last_update": "2025-01-08 18:28:56", + "author_account_age_days": 1696 + }, + "https://github.com/LucipherDev/ComfyUI-Golden-Noise": { + "stars": 19, + "last_update": "2024-12-26 17:25:45", + "author_account_age_days": 1696 + }, + "https://github.com/LucipherDev/ComfyUI-TangoFlux": { + "stars": 2, + "last_update": "2025-01-09 09:57:06", + "author_account_age_days": 1696 }, "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": { "stars": 15, "last_update": "2024-08-01 00:52:11", - "author_account_age_days": 1197 + "author_account_age_days": 1231 }, "https://github.com/LyazS/comfyui-anime-seg": { "stars": 8, "last_update": "2024-05-22 23:21:49", - "author_account_age_days": 3021 + "author_account_age_days": 3056 }, "https://github.com/LyazS/comfyui-nettools": { - "stars": 3, + "stars": 5, "last_update": "2024-09-23 12:52:44", - "author_account_age_days": 3021 + "author_account_age_days": 3056 }, "https://github.com/M1kep/ComfyLiterals": { - "stars": 24, + "stars": 30, "last_update": "2024-05-22 20:31:38", - "author_account_age_days": 4422 + "author_account_age_days": 4457 }, "https://github.com/M1kep/ComfyUI-KepOpenAI": { - "stars": 28, + "stars": 29, "last_update": "2024-08-20 16:33:57", - "author_account_age_days": 4422 + "author_account_age_days": 4457 }, "https://github.com/M1kep/ComfyUI-OtherVAEs": { "stars": 2, "last_update": "2024-05-22 20:33:41", - "author_account_age_days": 4422 + "author_account_age_days": 4457 }, "https://github.com/M1kep/Comfy_KepKitchenSink": { "stars": 0, "last_update": "2024-05-22 20:33:29", - "author_account_age_days": 4422 + "author_account_age_days": 4457 }, "https://github.com/M1kep/Comfy_KepListStuff": { - "stars": 35, + "stars": 38, "last_update": "2024-06-22 00:51:28", - "author_account_age_days": 4422 + "author_account_age_days": 4457 }, "https://github.com/M1kep/Comfy_KepMatteAnything": { "stars": 11, "last_update": "2024-05-22 20:33:16", - "author_account_age_days": 4422 + "author_account_age_days": 4457 }, "https://github.com/M1kep/KepPromptLang": { "stars": 6, "last_update": "2024-05-22 20:32:56", - "author_account_age_days": 4422 + "author_account_age_days": 4457 }, "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": { - "stars": 49, - "last_update": "2024-11-19 09:55:53", - "author_account_age_days": 1769 + "stars": 54, + "last_update": "2024-12-27 11:09:43", + "author_account_age_days": 1804 }, "https://github.com/Makeezi/ComfyUI-promptLAB": { "stars": 0, "last_update": "2024-05-23 01:24:51", - "author_account_age_days": 1946 + "author_account_age_days": 1981 }, "https://github.com/MakkiShizu/ComfyUI-Prompt-Wildcards": { "stars": 3, - "last_update": "2024-11-27 13:55:15", - "author_account_age_days": 477 + "last_update": "2025-01-08 12:25:10", + "author_account_age_days": 511 }, "https://github.com/MakkiShizu/ComfyUI-SaveAnimatedGIF": { - "stars": 2, + "stars": 3, "last_update": "2024-11-20 13:18:23", - "author_account_age_days": 477 + "author_account_age_days": 511 }, "https://github.com/MakkiShizu/comfyui_reimgsize": { - "stars": 5, - "last_update": "2024-12-03 03:56:15", - "author_account_age_days": 477 + "stars": 6, + "last_update": "2024-12-11 05:56:23", + "author_account_age_days": 511 }, "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes": { "stars": 23, "last_update": "2024-06-14 10:24:17", - "author_account_age_days": 546 + "author_account_age_days": 581 }, "https://github.com/ManglerFTW/ComfyI2I": { - "stars": 162, + "stars": 165, "last_update": "2024-06-14 11:01:01", - "author_account_age_days": 819 + "author_account_age_days": 854 }, "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes": { - "stars": 117, - "last_update": "2024-11-26 00:04:03", - "author_account_age_days": 5134 + "stars": 128, + "last_update": "2024-12-21 14:07:13", + "author_account_age_days": 5169 }, "https://github.com/MarcusNyne/m9-prompts-comfyui": { "stars": 2, "last_update": "2024-08-24 16:56:53", - "author_account_age_days": 1587 + "author_account_age_days": 1621 }, "https://github.com/MariusKM/ComfyUI-BadmanNodes": { "stars": 2, - "last_update": "2024-11-06 18:01:53", - "author_account_age_days": 2395 + "last_update": "2024-12-30 15:36:09", + "author_account_age_days": 2430 }, "https://github.com/MarkoCa1/ComfyUI-Text": { - "stars": 4, - "last_update": "2024-05-23 00:15:39", - "author_account_age_days": 1797 + "stars": 7, + "last_update": "2024-12-16 09:48:49", + "author_account_age_days": 1832 }, "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": { "stars": 21, "last_update": "2024-05-23 00:15:51", - "author_account_age_days": 1797 + "author_account_age_days": 1832 }, "https://github.com/Marksusu/ComfyUI_MTCLIPEncode": { "stars": 6, "last_update": "2024-11-01 07:41:03", - "author_account_age_days": 872 + "author_account_age_days": 907 }, "https://github.com/Mason-McGough/ComfyUI-Mosaica": { "stars": 7, "last_update": "2024-08-26 20:42:35", - "author_account_age_days": 3369 + "author_account_age_days": 3404 }, "https://github.com/Mcmillian/ComfyUI-SimpleToolsNodes": { "stars": 1, "last_update": "2024-09-29 14:18:23", - "author_account_age_days": 3060 + "author_account_age_days": 3095 + }, + "https://github.com/Meettya/ComfyUI-OneForOne": { + "stars": 1, + "last_update": "2025-01-07 22:49:30", + "author_account_age_days": 5531 }, "https://github.com/MetaGLM/ComfyUI-ZhipuAI-Platform": { "stars": 6, "last_update": "2024-09-16 16:11:59", - "author_account_age_days": 443 + "author_account_age_days": 478 }, "https://github.com/MiddleKD/ComfyUI-denoise-mask-scheduler": { "stars": 5, "last_update": "2024-11-07 12:35:00", - "author_account_age_days": 694 + "author_account_age_days": 729 }, "https://github.com/MiddleKD/ComfyUI-mem-safe-wrapper": { "stars": 3, "last_update": "2024-08-01 06:47:24", - "author_account_age_days": 694 + "author_account_age_days": 729 }, "https://github.com/MiddleKD/ComfyUI-productfix": { "stars": 8, "last_update": "2024-08-13 01:11:21", - "author_account_age_days": 694 + "author_account_age_days": 729 }, "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack": { "stars": 5, "last_update": "2024-10-06 07:46:05", - "author_account_age_days": 224 + "author_account_age_days": 259 }, "https://github.com/Mintbeer96/ComfyUI-KerasOCR": { "stars": 3, "last_update": "2024-07-24 16:39:41", - "author_account_age_days": 3341 + "author_account_age_days": 3376 }, "https://github.com/MinusZoneAI/ComfyUI-CogVideoX-MZ": { - "stars": 96, + "stars": 100, "last_update": "2024-10-30 10:52:42", - "author_account_age_days": 230 + "author_account_age_days": 264 }, "https://github.com/MinusZoneAI/ComfyUI-Flux1Quantize-MZ": { "stars": 12, "last_update": "2024-08-14 04:01:10", - "author_account_age_days": 230 + "author_account_age_days": 264 }, "https://github.com/MinusZoneAI/ComfyUI-FluxExt-MZ": { - "stars": 186, + "stars": 218, "last_update": "2024-08-16 18:57:07", - "author_account_age_days": 230 + "author_account_age_days": 264 }, "https://github.com/MinusZoneAI/ComfyUI-Kolors-MZ": { - "stars": 509, - "last_update": "2024-10-09 14:17:42", - "author_account_age_days": 230 + "stars": 523, + "last_update": "2024-12-20 01:10:37", + "author_account_age_days": 264 }, "https://github.com/MinusZoneAI/ComfyUI-Prompt-MZ": { - "stars": 109, + "stars": 112, "last_update": "2024-08-24 06:18:57", - "author_account_age_days": 230 + "author_account_age_days": 264 }, "https://github.com/MinusZoneAI/ComfyUI-StylizePhoto-MZ": { "stars": 18, "last_update": "2024-05-23 01:13:32", - "author_account_age_days": 230 + "author_account_age_days": 264 }, "https://github.com/MinusZoneAI/ComfyUI-TrainTools-MZ": { "stars": 47, "last_update": "2024-08-15 19:21:36", - "author_account_age_days": 230 + "author_account_age_days": 264 }, "https://github.com/Miosp/ComfyUI-FBCNN": { - "stars": 16, + "stars": 17, "last_update": "2024-08-02 19:54:17", - "author_account_age_days": 2680 + "author_account_age_days": 2715 }, "https://github.com/MitoshiroPJ/comfyui_slothful_attention": { "stars": 7, "last_update": "2024-05-22 22:09:15", - "author_account_age_days": 4132 + "author_account_age_days": 4167 + }, + "https://github.com/Miyuutsu/comfyui-save-vpred": { + "stars": 4, + "last_update": "2024-12-15 22:29:47", + "author_account_age_days": 3123 }, "https://github.com/MohammadAboulEla/ComfyUI-iTools": { - "stars": 30, + "stars": 32, "last_update": "2024-11-17 22:32:37", - "author_account_age_days": 1190 + "author_account_age_days": 1225 }, "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1": { "stars": 17, - "last_update": "2024-10-29 17:51:36", - "author_account_age_days": 543 + "last_update": "2025-01-07 19:10:27", + "author_account_age_days": 578 }, "https://github.com/MoonHugo/ComfyUI-BiRefNet-Hugo": { - "stars": 170, + "stars": 193, "last_update": "2024-10-18 04:02:27", - "author_account_age_days": 93 + "author_account_age_days": 128 }, "https://github.com/MoonHugo/ComfyUI-FFmpeg": { - "stars": 30, + "stars": 35, "last_update": "2024-11-13 03:38:07", - "author_account_age_days": 93 + "author_account_age_days": 128 }, "https://github.com/MoonHugo/ComfyUI-StableAudioOpen": { - "stars": 16, + "stars": 18, "last_update": "2024-10-18 04:12:04", - "author_account_age_days": 93 + "author_account_age_days": 128 }, "https://github.com/Moooonet/ComfyUI-ArteMoon": { "stars": 2, "last_update": "2024-09-29 15:04:10", - "author_account_age_days": 151 + "author_account_age_days": 186 }, "https://github.com/MrForExample/ComfyUI-3D-Pack": { - "stars": 2432, - "last_update": "2024-11-09 02:05:44", - "author_account_age_days": 1725 + "stars": 2565, + "last_update": "2024-12-18 00:24:04", + "author_account_age_days": 1760 }, "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved": { - "stars": 505, + "stars": 518, "last_update": "2024-06-14 12:02:47", - "author_account_age_days": 1725 + "author_account_age_days": 1760 }, "https://github.com/MrSamSeen/ComfyUI_SSStereoscope": { "stars": 15, "last_update": "2024-07-08 20:40:49", - "author_account_age_days": 3755 + "author_account_age_days": 3790 }, "https://github.com/Munkyfoot/ComfyUI-TextOverlay": { - "stars": 23, + "stars": 25, "last_update": "2024-06-28 05:57:03", - "author_account_age_days": 3209 + "author_account_age_days": 3244 }, "https://github.com/MushroomFleet/DJZ-Nodes": { - "stars": 18, - "last_update": "2024-12-04 16:26:52", - "author_account_age_days": 3886 + "stars": 25, + "last_update": "2025-01-08 23:32:18", + "author_account_age_days": 3920 }, "https://github.com/MuziekMagie/ComfyUI-Matchering": { - "stars": 36, + "stars": 43, "last_update": "2024-07-23 14:39:52", - "author_account_age_days": 136 + "author_account_age_days": 171 }, "https://github.com/MzMaXaM/ComfyUi-MzMaXaM": { "stars": 2, "last_update": "2024-10-21 22:42:15", - "author_account_age_days": 1902 + "author_account_age_days": 1937 }, "https://github.com/N3rd00d/ComfyUI-Paint3D-Nodes": { - "stars": 48, + "stars": 57, "last_update": "2024-08-19 12:52:20", - "author_account_age_days": 241 + "author_account_age_days": 276 }, "https://github.com/NMWave/ComfyUI-Nader-Tagging": { "stars": 2, "last_update": "2024-08-06 11:13:51", - "author_account_age_days": 742 + "author_account_age_days": 777 }, "https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix": { - "stars": 27, + "stars": 28, "last_update": "2024-09-25 01:40:47", - "author_account_age_days": 3844 + "author_account_age_days": 3879 }, "https://github.com/NakamuraShippo/ComfyUI-NS-ManySliders": { - "stars": 1, + "stars": 2, "last_update": "2024-11-03 02:48:52", - "author_account_age_days": 526 + "author_account_age_days": 561 }, "https://github.com/NakamuraShippo/ComfyUI-PromptList": { - "stars": 7, + "stars": 8, "last_update": "2024-11-03 02:25:08", - "author_account_age_days": 526 + "author_account_age_days": 561 }, "https://github.com/NeoGriever/ComfyUI-NeoGriever": { - "stars": 0, - "last_update": "2024-12-04 13:50:16", - "author_account_age_days": 4453 + "stars": 2, + "last_update": "2024-12-12 02:55:40", + "author_account_age_days": 4488 }, "https://github.com/Nestorchik/NStor-ComfyUI-Translation": { "stars": 2, "last_update": "2024-06-14 10:25:32", - "author_account_age_days": 1489 + "author_account_age_days": 1523 }, "https://github.com/NeuralSamurAI/ComfyUI-Dimensional-Latent-Perlin": { - "stars": 34, + "stars": 35, "last_update": "2024-08-06 19:59:25", - "author_account_age_days": 258 + "author_account_age_days": 292 }, "https://github.com/NeuralSamurAI/ComfyUI-FluxPseudoNegativePrompt": { "stars": 6, "last_update": "2024-08-14 02:16:43", - "author_account_age_days": 258 + "author_account_age_days": 292 }, "https://github.com/NeuralSamurAI/ComfyUI-PromptJSON": { "stars": 3, "last_update": "2024-08-11 18:10:36", - "author_account_age_days": 258 + "author_account_age_days": 292 }, "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial": { - "stars": 67, + "stars": 68, "last_update": "2024-05-23 00:22:08", - "author_account_age_days": 258 + "author_account_age_days": 292 }, "https://github.com/Nevysha/ComfyUI-nevysha-top-menu": { "stars": 5, "last_update": "2024-05-23 00:17:31", - "author_account_age_days": 691 + "author_account_age_days": 725 }, "https://github.com/NguynHungNguyen/Segment-Bedroom-Interior": { - "stars": 3, + "stars": 5, "last_update": "2024-10-17 13:22:19", - "author_account_age_days": 822 + "author_account_age_days": 857 }, "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite": { "stars": 14, "last_update": "2024-05-22 20:34:46", - "author_account_age_days": 5314 + "author_account_age_days": 5348 }, "https://github.com/NimaNzrii/comfyui-photoshop": { - "stars": 693, + "stars": 771, "last_update": "2024-09-12 17:24:44", - "author_account_age_days": 409 + "author_account_age_days": 443 }, "https://github.com/NimaNzrii/comfyui-popup_preview": { "stars": 35, "last_update": "2024-05-22 22:12:04", - "author_account_age_days": 409 + "author_account_age_days": 443 }, "https://github.com/Niutonian/ComfyUi-NoodleWebcam": { - "stars": 31, + "stars": 32, "last_update": "2024-05-22 21:30:40", - "author_account_age_days": 1206 + "author_account_age_days": 1241 }, "https://github.com/Nlar/ComfyUI_CartoonSegmentation": { "stars": 13, "last_update": "2024-05-22 23:15:37", - "author_account_age_days": 3995 + "author_account_age_days": 4030 }, "https://github.com/Nojahhh/ComfyUI_GLM4_Wrapper": { - "stars": 16, - "last_update": "2024-12-04 22:12:07", - "author_account_age_days": 2984 + "stars": 18, + "last_update": "2024-12-17 20:52:30", + "author_account_age_days": 3019 }, "https://github.com/NotHarroweD/Harronode": { "stars": 5, "last_update": "2024-05-22 22:18:29", - "author_account_age_days": 2147 + "author_account_age_days": 2182 }, "https://github.com/Nourepide/ComfyUI-Allor": { - "stars": 227, + "stars": 237, "last_update": "2024-05-22 18:11:17", - "author_account_age_days": 3010 + "author_account_age_days": 3045 }, "https://github.com/Nuked88/ComfyUI-N-Nodes": { - "stars": 206, + "stars": 211, "last_update": "2024-08-15 21:07:32", - "author_account_age_days": 4644 + "author_account_age_days": 4678 }, "https://github.com/Nuked88/ComfyUI-N-Sidebar": { - "stars": 519, + "stars": 525, "last_update": "2024-09-12 20:12:08", - "author_account_age_days": 4644 + "author_account_age_days": 4678 }, "https://github.com/NyaamZ/ComfyUI-GetBooruTag-ED": { - "stars": 0, + "stars": 1, "last_update": "2024-12-05 15:09:08", - "author_account_age_days": 2281 + "author_account_age_days": 2316 }, "https://github.com/NyaamZ/ComfyUI-ImageGallery-ED": { "stars": 3, - "last_update": "2024-12-01 16:37:00", - "author_account_age_days": 2281 + "last_update": "2024-12-06 19:47:27", + "author_account_age_days": 2316 }, "https://github.com/NyaamZ/efficiency-nodes-ED": { - "stars": 13, - "last_update": "2024-12-04 14:39:32", - "author_account_age_days": 2281 + "stars": 14, + "last_update": "2024-12-14 05:50:28", + "author_account_age_days": 2316 }, "https://github.com/Off-Live/ComfyUI-off-suite": { "stars": 0, "last_update": "2024-06-14 12:02:25", - "author_account_age_days": 1336 + "author_account_age_days": 1371 }, "https://github.com/OgreLemonSoup/ComfyUI-Load-Image-Gallery": { "stars": 30, "last_update": "2024-09-17 11:48:44", - "author_account_age_days": 117 + "author_account_age_days": 152 }, "https://github.com/OliverCrosby/Comfyui-Minimap": { - "stars": 81, + "stars": 83, "last_update": "2024-08-24 14:10:43", - "author_account_age_days": 2290 + "author_account_age_days": 2324 }, "https://github.com/OpalSky-AI/OpalSky_Nodes": { "stars": 3, "last_update": "2024-10-27 20:13:40", - "author_account_age_days": 1900 + "author_account_age_days": 1934 }, "https://github.com/OpenArt-AI/ComfyUI-Assistant": { "stars": 17, "last_update": "2024-05-22 22:16:57", - "author_account_age_days": 939 + "author_account_age_days": 974 }, "https://github.com/OuticNZ/ComfyUI-Simple-Of-Complex": { "stars": 1, "last_update": "2024-08-14 04:00:49", - "author_account_age_days": 2697 + "author_account_age_days": 2732 }, "https://github.com/PCMonsterx/ComfyUI-CSV-Loader": { - "stars": 14, + "stars": 15, "last_update": "2024-05-22 21:27:10", - "author_account_age_days": 1829 + "author_account_age_days": 1864 }, "https://github.com/Parameshvadivel/ComfyUI-SVGview": { "stars": 2, "last_update": "2024-07-31 13:40:33", - "author_account_age_days": 2992 + "author_account_age_days": 3027 }, "https://github.com/ParisNeo/lollms_nodes_suite": { "stars": 11, "last_update": "2024-06-23 21:04:43", - "author_account_age_days": 4934 + "author_account_age_days": 4968 }, "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts": { "stars": 0, "last_update": "2024-05-22 21:26:35", - "author_account_age_days": 3807 + "author_account_age_days": 3842 }, "https://github.com/PauldeLavallaz/comfyui_claude_prompt_generator": { - "stars": 0, - "last_update": "2024-12-04 19:19:28", - "author_account_age_days": 2007 + "stars": 1, + "last_update": "2024-12-11 17:41:42", + "author_account_age_days": 2042 }, "https://github.com/Pfaeff/pfaeff-comfyui": { "stars": 20, "last_update": "2024-05-22 18:21:10", - "author_account_age_days": 3371 + "author_account_age_days": 3406 }, "https://github.com/Phando/ComfyUI-PhandoNodes": { "stars": 1, "last_update": "2024-09-05 16:12:24", - "author_account_age_days": 5390 + "author_account_age_days": 5424 }, "https://github.com/Pheat-AI/Remade_nodes": { "stars": 4, "last_update": "2024-10-18 00:04:58", - "author_account_age_days": 198 + "author_account_age_days": 232 }, - "https://github.com/PnthrLeo/comfyUI-image-search": { + "https://github.com/PnthrLeo/comfyUI-PL-data-tools": { "stars": 2, "last_update": "2024-12-03 13:39:28", - "author_account_age_days": 2715 + "author_account_age_days": 2750 }, "https://github.com/Pos13/comfyui-cyclist": { - "stars": 33, + "stars": 34, "last_update": "2024-08-04 02:58:33", - "author_account_age_days": 1682 + "author_account_age_days": 1717 }, "https://github.com/Poseidon-fan/ComfyUI-RabbitMQ-Publisher": { "stars": 2, "last_update": "2024-11-07 08:59:23", - "author_account_age_days": 746 + "author_account_age_days": 781 }, "https://github.com/PowerHouseMan/ComfyUI-AdvancedLivePortrait": { - "stars": 1956, + "stars": 2087, "last_update": "2024-08-21 06:14:24", - "author_account_age_days": 127 + "author_account_age_days": 162 + }, + "https://github.com/PressWagon/ComfyUI-StringsAndThings": { + "stars": 2, + "last_update": "2024-12-21 12:05:13", + "author_account_age_days": 24 }, "https://github.com/Pseudotools/Pseudocomfy": { "stars": 0, "last_update": "2024-09-17 20:46:33", - "author_account_age_days": 434 + "author_account_age_days": 469 }, "https://github.com/Q-Bug4/Comfyui-Qb-DateNodes": { - "stars": 1, + "stars": 2, "last_update": "2024-11-03 01:52:39", - "author_account_age_days": 2098 + "author_account_age_days": 2133 }, "https://github.com/Q-Bug4/Comfyui-Simple-Json-Node": { - "stars": 2, - "last_update": "2024-10-13 12:13:37", - "author_account_age_days": 2098 + "stars": 3, + "last_update": "2024-12-25 16:01:52", + "author_account_age_days": 2133 }, "https://github.com/QaisMalkawi/ComfyUI-QaisHelper": { "stars": 2, "last_update": "2024-05-23 20:29:30", - "author_account_age_days": 1415 + "author_account_age_days": 1449 }, "https://github.com/Raapys/ComfyUI-LatentGC_Aggressive": { - "stars": 2, + "stars": 4, "last_update": "2024-08-12 15:55:42", - "author_account_age_days": 4096 + "author_account_age_days": 4131 }, "https://github.com/Ravenmelt/ComfyUI-Rodin": { - "stars": 4, + "stars": 5, "last_update": "2024-10-25 03:30:05", - "author_account_age_days": 2239 + "author_account_age_days": 2274 }, "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD": { - "stars": 5, + "stars": 6, "last_update": "2024-07-28 12:45:36", - "author_account_age_days": 1529 + "author_account_age_days": 1564 }, "https://github.com/RenderRift/ComfyUI-RenderRiftNodes": { "stars": 6, "last_update": "2024-05-22 22:16:41", - "author_account_age_days": 351 + "author_account_age_days": 385 }, "https://github.com/RhizoNymph/ComfyUI-CLIPSlider": { - "stars": 7, + "stars": 8, "last_update": "2024-09-07 19:47:02", - "author_account_age_days": 1331 + "author_account_age_days": 1366 }, "https://github.com/RhizoNymph/ComfyUI-ColorWheel": { "stars": 1, "last_update": "2024-10-13 06:26:51", - "author_account_age_days": 1331 + "author_account_age_days": 1366 }, "https://github.com/RhizoNymph/ComfyUI-Latte": { "stars": 4, "last_update": "2024-08-11 07:25:04", - "author_account_age_days": 1331 + "author_account_age_days": 1366 }, "https://github.com/RiceRound/ComfyUI_CryptoCat": { - "stars": 37, - "last_update": "2024-10-23 15:12:20", - "author_account_age_days": 68 + "stars": 47, + "last_update": "2024-12-27 14:52:44", + "author_account_age_days": 103 + }, + "https://github.com/RiceRound/ComfyUI_RiceRound": { + "stars": 7, + "last_update": "2025-01-02 07:23:10", + "author_account_age_days": 103 }, "https://github.com/Rinsanga1/comfyui-florence2xy": { "stars": 1, "last_update": "2024-11-25 09:51:35", - "author_account_age_days": 315 + "author_account_age_days": 350 }, "https://github.com/RodrigoSKohl/ComfyUI-Panoramic-ImgStitcher": { "stars": 5, "last_update": "2024-08-27 15:45:35", - "author_account_age_days": 912 + "author_account_age_days": 947 }, "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control": { "stars": 20, "last_update": "2024-06-21 07:29:14", - "author_account_age_days": 1546 + "author_account_age_days": 1580 }, "https://github.com/Ron-Digital/ComfyUI-SceneGenerator": { "stars": 2, "last_update": "2024-06-28 19:36:30", - "author_account_age_days": 1093 + "author_account_age_days": 1128 + }, + "https://github.com/Runware/ComfyUI-Runware": { + "stars": 5, + "last_update": "2025-01-09 12:18:48", + "author_account_age_days": 399 }, "https://github.com/Rvage0815/ComfyUI-RvTools": { "stars": 14, "last_update": "2024-11-28 15:10:43", - "author_account_age_days": 338 + "author_account_age_days": 372 }, "https://github.com/Rvage0815/ComfyUI-RvTools_v2": { - "stars": 3, - "last_update": "2024-12-05 18:44:46", - "author_account_age_days": 338 + "stars": 4, + "last_update": "2024-12-27 09:42:55", + "author_account_age_days": 372 }, "https://github.com/Ryuukeisyou/ComfyUI-SyncTalk": { - "stars": 35, + "stars": 37, "last_update": "2024-09-12 11:54:59", - "author_account_age_days": 2577 + "author_account_age_days": 2612 }, "https://github.com/Ryuukeisyou/comfyui_face_parsing": { - "stars": 113, + "stars": 124, "last_update": "2024-10-26 06:14:27", - "author_account_age_days": 2577 + "author_account_age_days": 2612 }, "https://github.com/Ryuukeisyou/comfyui_io_helpers": { "stars": 1, "last_update": "2024-07-13 13:10:10", - "author_account_age_days": 2577 + "author_account_age_days": 2612 }, "https://github.com/SEkINVR/ComfyUI-SaveAs": { - "stars": 3, + "stars": 4, "last_update": "2024-08-19 01:06:16", - "author_account_age_days": 821 + "author_account_age_days": 856 + }, + "https://github.com/SKBv0/ComfyUI_SKBundle": { + "stars": 16, + "last_update": "2025-01-02 14:51:01", + "author_account_age_days": 1754 }, "https://github.com/SLAPaper/ComfyUI-Image-Selector": { - "stars": 72, + "stars": 75, "last_update": "2024-08-03 18:32:58", - "author_account_age_days": 3862 + "author_account_age_days": 3896 }, "https://github.com/SLAPaper/StableDiffusion-dpmpp_2m_alt-Sampler": { - "stars": 11, + "stars": 12, "last_update": "2024-11-09 13:59:35", - "author_account_age_days": 3862 + "author_account_age_days": 3896 }, "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes": { "stars": 4, "last_update": "2024-07-31 15:02:32", - "author_account_age_days": 4247 + "author_account_age_days": 4282 }, "https://github.com/SOELexicon/ComfyUI-LexTools": { "stars": 28, "last_update": "2024-06-28 19:25:13", - "author_account_age_days": 4247 + "author_account_age_days": 4282 }, "https://github.com/SS-snap/ComfyUI-Snap_Processing": { "stars": 60, "last_update": "2024-10-22 07:38:50", - "author_account_age_days": 464 + "author_account_age_days": 499 }, "https://github.com/SamKhoze/ComfyUI-DeepFuze": { - "stars": 329, + "stars": 342, "last_update": "2024-11-22 19:28:20", - "author_account_age_days": 1607 + "author_account_age_days": 1642 }, "https://github.com/SayanoAI/Comfy-RVC": { - "stars": 17, + "stars": 18, "last_update": "2024-10-09 04:08:31", - "author_account_age_days": 2767 + "author_account_age_days": 2802 }, "https://github.com/Scholar01/ComfyUI-Keyframe": { - "stars": 12, + "stars": 13, "last_update": "2024-06-14 09:01:30", - "author_account_age_days": 3360 + "author_account_age_days": 3395 }, "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": { "stars": 14, "last_update": "2024-08-26 14:51:47", - "author_account_age_days": 1274 + "author_account_age_days": 1309 }, "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": { "stars": 9, "last_update": "2024-11-29 21:51:05", - "author_account_age_days": 4670 + "author_account_age_days": 4705 }, "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": { - "stars": 118, + "stars": 125, "last_update": "2024-09-04 09:23:38", - "author_account_age_days": 241 + "author_account_age_days": 276 }, "https://github.com/SeanScripts/ComfyUI-PixtralLlamaMolmoVision": { - "stars": 64, + "stars": 69, "last_update": "2024-10-05 04:21:36", - "author_account_age_days": 1684 + "author_account_age_days": 1719 }, "https://github.com/SeanScripts/ComfyUI-Unload-Model": { - "stars": 10, + "stars": 18, "last_update": "2024-10-05 04:43:42", - "author_account_age_days": 1684 + "author_account_age_days": 1719 }, "https://github.com/SeargeDP/ComfyUI_Searge_LLM": { - "stars": 47, + "stars": 61, "last_update": "2024-09-04 09:04:18", - "author_account_age_days": 4336 + "author_account_age_days": 4370 }, "https://github.com/SeargeDP/SeargeSDXL": { - "stars": 801, + "stars": 813, "last_update": "2024-05-22 00:28:26", - "author_account_age_days": 4336 + "author_account_age_days": 4370 }, "https://github.com/Seedsa/Fooocus_Nodes": { - "stars": 74, - "last_update": "2024-09-18 06:23:35", - "author_account_age_days": 2772 + "stars": 80, + "last_update": "2025-01-08 07:57:28", + "author_account_age_days": 2807 }, "https://github.com/Shadetail/ComfyUI_Eagleshadow": { "stars": 3, "last_update": "2024-06-15 13:04:49", - "author_account_age_days": 3561 + "author_account_age_days": 3596 }, "https://github.com/Shakker-Labs/ComfyUI-IPAdapter-Flux": { - "stars": 184, - "last_update": "2024-11-25 11:31:34", - "author_account_age_days": 13 + "stars": 237, + "last_update": "2024-12-31 06:28:12", + "author_account_age_days": 48 + }, + "https://github.com/Shannooty/ComfyUI-Timer-Nodes": { + "stars": 4, + "last_update": "2024-12-17 09:20:49", + "author_account_age_days": 1496 }, "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting": { "stars": 4, "last_update": "2024-07-03 03:39:49", - "author_account_age_days": 279 + "author_account_age_days": 314 }, "https://github.com/Shiba-2-shiba/ComfyUI_DiffusionModel_fp8_converter": { - "stars": 12, + "stars": 13, "last_update": "2024-09-05 00:09:26", - "author_account_age_days": 550 + "author_account_age_days": 585 }, "https://github.com/Shiba-2-shiba/comfyui-color-ascii-art-node": { "stars": 1, "last_update": "2024-09-26 04:40:37", - "author_account_age_days": 550 + "author_account_age_days": 585 }, "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools": { "stars": 10, "last_update": "2024-07-04 02:22:10", - "author_account_age_days": 566 + "author_account_age_days": 601 }, "https://github.com/ShmuelRonen/ComfyUI-Apply_Style_Model_Adjust": { "stars": 6, "last_update": "2024-11-23 03:57:20", - "author_account_age_days": 1369 + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI-AstralAnimator": { "stars": 18, "last_update": "2024-07-18 12:41:22", - "author_account_age_days": 1369 + "author_account_age_days": 1404 + }, + "https://github.com/ShmuelRonen/ComfyUI-CohernetVideoSampler": { + "stars": 17, + "last_update": "2024-12-23 10:54:08", + "author_account_age_days": 1404 + }, + "https://github.com/ShmuelRonen/ComfyUI-EmptyHunyuanLatent": { + "stars": 6, + "last_update": "2024-12-29 05:30:57", + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI-FreeMemory": { - "stars": 48, + "stars": 56, "last_update": "2024-10-19 17:01:30", - "author_account_age_days": 1369 + "author_account_age_days": 1404 + }, + "https://github.com/ShmuelRonen/ComfyUI-Gemini_Flash_2.0_Exp": { + "stars": 30, + "last_update": "2024-12-23 10:41:30", + "author_account_age_days": 1404 + }, + "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoSamplerSave": { + "stars": 3, + "last_update": "2025-01-09 09:54:44", + "author_account_age_days": 1404 + }, + "https://github.com/ShmuelRonen/ComfyUI-HunyuanVideoStyler": { + "stars": 36, + "last_update": "2024-12-31 19:19:42", + "author_account_age_days": 1404 + }, + "https://github.com/ShmuelRonen/ComfyUI-ImageMotionGuider": { + "stars": 32, + "last_update": "2024-12-27 11:19:59", + "author_account_age_days": 1404 + }, + "https://github.com/ShmuelRonen/ComfyUI-LatentSyncWrapper": { + "stars": 268, + "last_update": "2025-01-07 03:36:47", + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": { "stars": 3, "last_update": "2024-06-14 11:50:52", - "author_account_age_days": 1369 + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI_Flux_1.1_RAW_API": { - "stars": 6, + "stars": 14, "last_update": "2024-11-13 11:27:12", - "author_account_age_days": 1369 + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash": { - "stars": 23, + "stars": 27, "last_update": "2024-10-12 02:07:36", - "author_account_age_days": 1369 + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI_pixtral_large": { - "stars": 3, - "last_update": "2024-11-26 09:42:17", - "author_account_age_days": 1369 + "stars": 4, + "last_update": "2025-01-08 10:59:35", + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI_pixtral_vision": { "stars": 14, "last_update": "2024-11-20 12:58:30", - "author_account_age_days": 1369 + "author_account_age_days": 1404 }, "https://github.com/ShmuelRonen/ComfyUI_wav2lip": { - "stars": 105, + "stars": 114, "last_update": "2024-09-18 13:17:42", - "author_account_age_days": 1369 + "author_account_age_days": 1404 }, "https://github.com/Shraknard/ComfyUI-Remover": { "stars": 6, "last_update": "2024-07-24 08:42:48", - "author_account_age_days": 2481 + "author_account_age_days": 2515 }, "https://github.com/Siberpone/lazy-pony-prompter": { - "stars": 32, + "stars": 35, "last_update": "2024-11-15 10:53:43", - "author_account_age_days": 617 + "author_account_age_days": 651 }, "https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders": { - "stars": 3, + "stars": 4, "last_update": "2024-08-30 01:19:54", - "author_account_age_days": 1847 + "author_account_age_days": 1882 + }, + "https://github.com/SlackinJack/asyncdiff_comfyui": { + "stars": 1, + "last_update": "2024-12-24 03:03:05", + "author_account_age_days": 2374 + }, + "https://github.com/SlackinJack/distrifuser_comfyui": { + "stars": 1, + "last_update": "2025-01-09 08:55:51", + "author_account_age_days": 2374 }, "https://github.com/SleeeepyZhou/ComfyUI-CNtranslator": { - "stars": 3, - "last_update": "2024-11-25 16:19:16", - "author_account_age_days": 1362 + "stars": 4, + "last_update": "2024-12-21 02:21:41", + "author_account_age_days": 1396 }, "https://github.com/Slickytail/ComfyUI-InstantX-IPAdapter-SD3": { - "stars": 1, - "last_update": "2024-12-04 14:31:03", - "author_account_age_days": 3726 + "stars": 46, + "last_update": "2024-12-21 22:36:22", + "author_account_age_days": 3761 }, "https://github.com/Smirnov75/ComfyUI-mxToolkit": { - "stars": 126, - "last_update": "2024-11-30 17:53:02", - "author_account_age_days": 1676 + "stars": 141, + "last_update": "2024-12-08 10:35:19", + "author_account_age_days": 1711 }, "https://github.com/Smuzzies/comfyui_meme_maker": { - "stars": 0, + "stars": 1, "last_update": "2024-07-05 22:01:41", - "author_account_age_days": 856 + "author_account_age_days": 890 }, "https://github.com/SoftMeng/ComfyUI-DeepCache-Fix": { "stars": 9, "last_update": "2024-07-25 13:09:00", - "author_account_age_days": 3688 + "author_account_age_days": 3722 }, "https://github.com/SoftMeng/ComfyUI-PIL": { "stars": 6, "last_update": "2024-10-13 10:02:17", - "author_account_age_days": 3688 + "author_account_age_days": 3722 }, "https://github.com/SoftMeng/ComfyUI_ImageToText": { "stars": 10, "last_update": "2024-06-14 08:08:36", - "author_account_age_days": 3688 + "author_account_age_days": 3722 }, "https://github.com/SoftMeng/ComfyUI_Mexx_Poster": { - "stars": 21, + "stars": 22, "last_update": "2024-06-14 07:06:27", - "author_account_age_days": 3688 + "author_account_age_days": 3722 }, "https://github.com/SoftMeng/ComfyUI_Mexx_Styler": { - "stars": 21, + "stars": 22, "last_update": "2024-06-14 07:09:03", - "author_account_age_days": 3688 + "author_account_age_days": 3722 + }, + "https://github.com/SongGuo11/ComfyUI-SaveAnything-SG11": { + "stars": 1, + "last_update": "2024-12-26 11:12:14", + "author_account_age_days": 36 }, "https://github.com/Sorcerio/MBM-Music-Visualizer": { - "stars": 20, + "stars": 21, "last_update": "2024-05-23 01:09:18", - "author_account_age_days": 4411 + "author_account_age_days": 4446 }, "https://github.com/SozeInc/ComfyUI-Mobile": { "stars": 0, "last_update": "2024-08-22 03:12:11", - "author_account_age_days": 243 + "author_account_age_days": 278 }, "https://github.com/SozeInc/ComfyUI_Soze": { "stars": 4, "last_update": "2024-11-23 22:56:20", - "author_account_age_days": 243 + "author_account_age_days": 278 }, "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid": { "stars": 6, "last_update": "2024-05-22 22:11:52", - "author_account_age_days": 372 + "author_account_age_days": 407 + }, + "https://github.com/SparknightLLC/ComfyUI-ConditionalInterrupt": { + "stars": 3, + "last_update": "2024-12-30 01:26:43", + "author_account_age_days": 151 }, "https://github.com/SparknightLLC/ComfyUI-LatentClamp": { "stars": 3, "last_update": "2024-11-22 01:45:46", - "author_account_age_days": 116 + "author_account_age_days": 151 }, "https://github.com/SparknightLLC/ComfyUI-MaskArbiter": { "stars": 4, - "last_update": "2024-11-26 00:02:57", - "author_account_age_days": 116 + "last_update": "2025-01-01 01:36:41", + "author_account_age_days": 151 }, "https://github.com/SpenserCai/ComfyUI-FunAudioLLM": { - "stars": 50, + "stars": 64, "last_update": "2024-11-27 09:22:05", - "author_account_age_days": 2879 + "author_account_age_days": 2914 }, "https://github.com/Stability-AI/ComfyUI-SAI_API": { - "stars": 49, + "stars": 51, "last_update": "2024-06-06 14:18:15", - "author_account_age_days": 1007 + "author_account_age_days": 1041 }, "https://github.com/Stability-AI/stability-ComfyUI-nodes": { - "stars": 200, + "stars": 205, "last_update": "2024-05-22 15:30:47", - "author_account_age_days": 1007 + "author_account_age_days": 1041 }, "https://github.com/StableDiffusionVN/SDVN_Comfy_node": { - "stars": 3, - "last_update": "2024-12-05 20:10:31", - "author_account_age_days": 122 + "stars": 16, + "last_update": "2025-01-05 12:11:14", + "author_account_age_days": 157 }, "https://github.com/StarMagicAI/comfyui_tagger": { - "stars": 2, + "stars": 3, "last_update": "2024-09-03 02:01:59", - "author_account_age_days": 3710 + "author_account_age_days": 3745 }, "https://github.com/Starnodes2024/ComfyUI_StarNodes": { - "stars": 5, - "last_update": "2024-12-05 20:02:30", - "author_account_age_days": 167 + "stars": 11, + "last_update": "2024-12-21 11:01:36", + "author_account_age_days": 201 }, "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH": { - "stars": 115, + "stars": 116, "last_update": "2024-06-14 08:12:12", - "author_account_age_days": 2999 + "author_account_age_days": 3034 }, "https://github.com/StartHua/ComfyUI_PCDMs": { "stars": 6, "last_update": "2024-05-22 23:21:14", - "author_account_age_days": 2999 + "author_account_age_days": 3034 }, "https://github.com/StartHua/ComfyUI_Seg_VITON": { - "stars": 201, + "stars": 202, "last_update": "2024-05-22 23:20:17", - "author_account_age_days": 2999 + "author_account_age_days": 3034 }, "https://github.com/StartHua/Comfyui_CXH_DeepLX": { "stars": 8, "last_update": "2024-09-21 02:38:08", - "author_account_age_days": 2999 + "author_account_age_days": 3034 }, "https://github.com/StartHua/Comfyui_CXH_FluxLoraMerge": { - "stars": 12, - "last_update": "2024-11-11 12:41:25", - "author_account_age_days": 2999 + "stars": 18, + "last_update": "2024-12-26 06:56:07", + "author_account_age_days": 3034 }, "https://github.com/StartHua/Comfyui_CXH_Phi_3.5": { "stars": 17, "last_update": "2024-08-22 04:45:39", - "author_account_age_days": 2999 + "author_account_age_days": 3034 }, "https://github.com/StartHua/Comfyui_CXH_joy_caption": { - "stars": 454, + "stars": 482, "last_update": "2024-10-31 02:07:35", - "author_account_age_days": 2999 + "author_account_age_days": 3034 + }, + "https://github.com/StartHua/Comfyui_Gemini2": { + "stars": 14, + "last_update": "2024-12-12 09:42:42", + "author_account_age_days": 3034 }, "https://github.com/StartHua/Comfyui_joytag": { - "stars": 44, + "stars": 46, "last_update": "2024-05-22 23:20:28", - "author_account_age_days": 2999 + "author_account_age_days": 3034 }, "https://github.com/StartHua/Comfyui_segformer_b2_clothes": { - "stars": 60, + "stars": 67, "last_update": "2024-07-24 14:45:58", - "author_account_age_days": 2999 + "author_account_age_days": 3034 }, "https://github.com/Steudio/ComfyUI_Steudio": { - "stars": 4, - "last_update": "2024-12-02 13:52:22", - "author_account_age_days": 300 + "stars": 18, + "last_update": "2025-01-04 15:36:44", + "author_account_age_days": 335 }, "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": { - "stars": 141, + "stars": 146, "last_update": "2024-07-31 02:48:34", - "author_account_age_days": 253 + "author_account_age_days": 288 }, "https://github.com/SuperMasterBlasterLaser/ComfyUI_YOLO_Classifiers": { "stars": 1, "last_update": "2024-06-20 15:06:51", - "author_account_age_days": 3742 + "author_account_age_days": 3777 }, "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": { - "stars": 702, + "stars": 742, "last_update": "2024-07-24 11:16:13", - "author_account_age_days": 2314 + "author_account_age_days": 2348 }, "https://github.com/Sxela/ComfyWarp": { - "stars": 31, + "stars": 34, "last_update": "2024-11-16 07:17:05", - "author_account_age_days": 3536 + "author_account_age_days": 3571 }, "https://github.com/TGu-97/ComfyUI-TGu-utils": { "stars": 1, "last_update": "2024-05-22 21:07:45", - "author_account_age_days": 694 + "author_account_age_days": 728 }, "https://github.com/THtianhao/ComfyUI-FaceChain": { - "stars": 116, + "stars": 125, "last_update": "2024-06-25 02:59:28", - "author_account_age_days": 3855 + "author_account_age_days": 3890 }, "https://github.com/THtianhao/ComfyUI-Portrait-Maker": { - "stars": 179, + "stars": 181, "last_update": "2024-05-22 21:18:05", - "author_account_age_days": 3855 + "author_account_age_days": 3890 }, "https://github.com/TJ16th/comfyUI_TJ_NormalLighting": { - "stars": 143, + "stars": 145, "last_update": "2024-05-23 00:25:37", - "author_account_age_days": 2699 + "author_account_age_days": 2734 + }, + "https://github.com/TKRLAB/ComfyUI_Prompt_List_JSON": { + "stars": 1, + "last_update": "2024-12-23 05:26:14", + "author_account_age_days": 319 }, "https://github.com/TMElyralab/Comfyui-MusePose": { - "stars": 373, + "stars": 382, "last_update": "2024-07-31 06:21:52", - "author_account_age_days": 261 + "author_account_age_days": 296 }, "https://github.com/TRI3D-LC/ComfyUI-MiroBoard": { "stars": 5, "last_update": "2024-11-21 07:15:20", - "author_account_age_days": 603 + "author_account_age_days": 638 }, "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": { "stars": 25, - "last_update": "2024-09-26 05:27:16", - "author_account_age_days": 603 + "last_update": "2025-01-08 13:31:56", + "author_account_age_days": 638 }, "https://github.com/TTPlanetPig/Comfyui_Hunyuan3D": { - "stars": 15, + "stars": 22, "last_update": "2024-11-10 16:59:42", - "author_account_age_days": 367 + "author_account_age_days": 402 }, "https://github.com/TTPlanetPig/Comfyui_JC2": { - "stars": 139, + "stars": 156, "last_update": "2024-10-19 17:25:50", - "author_account_age_days": 367 + "author_account_age_days": 402 }, "https://github.com/TTPlanetPig/Comfyui_Object_Migration": { - "stars": 560, + "stars": 610, "last_update": "2024-11-20 16:51:57", - "author_account_age_days": 367 + "author_account_age_days": 402 }, "https://github.com/TTPlanetPig/Comfyui_TTP_CN_Preprocessor": { - "stars": 24, + "stars": 28, "last_update": "2024-08-21 17:52:56", - "author_account_age_days": 367 + "author_account_age_days": 402 }, "https://github.com/TTPlanetPig/Comfyui_TTP_Toolset": { - "stars": 350, - "last_update": "2024-11-20 15:56:54", - "author_account_age_days": 367 + "stars": 432, + "last_update": "2025-01-08 13:35:14", + "author_account_age_days": 402 }, "https://github.com/TW-CUI/TW-CUI-Util": { "stars": 2, "last_update": "2024-08-14 01:49:13", - "author_account_age_days": 195 + "author_account_age_days": 230 }, "https://github.com/TZOOTZ/ComfyUI-TZOOTZ_VHS": { "stars": 1, "last_update": "2024-10-27 10:20:38", - "author_account_age_days": 3213 + "author_account_age_days": 3248 }, "https://github.com/TaiTair/comfyui-simswap": { "stars": 15, "last_update": "2024-07-31 18:28:38", - "author_account_age_days": 3731 + "author_account_age_days": 3765 }, "https://github.com/Taremin/comfyui-prompt-extranetworks": { "stars": 3, "last_update": "2024-05-22 23:08:34", - "author_account_age_days": 2379 + "author_account_age_days": 2414 }, "https://github.com/Taremin/comfyui-string-tools": { "stars": 1, "last_update": "2024-05-22 23:08:45", - "author_account_age_days": 2379 + "author_account_age_days": 2414 }, "https://github.com/Taremin/webui-monaco-prompt": { "stars": 25, - "last_update": "2024-08-22 11:00:45", - "author_account_age_days": 2379 + "last_update": "2025-01-08 02:14:35", + "author_account_age_days": 2414 }, "https://github.com/TeaCrab/ComfyUI-TeaNodes": { "stars": 5, "last_update": "2024-05-22 20:44:05", - "author_account_age_days": 3382 + "author_account_age_days": 3416 }, "https://github.com/TechnoByteJS/ComfyUI-TechNodes": { "stars": 15, "last_update": "2024-09-20 23:26:02", - "author_account_age_days": 1840 + "author_account_age_days": 1875 }, "https://github.com/TemryL/ComfyS3": { - "stars": 37, + "stars": 39, "last_update": "2024-11-05 14:56:04", - "author_account_age_days": 1033 + "author_account_age_days": 1067 }, "https://github.com/TemryL/ComfyUI-IDM-VTON": { - "stars": 425, + "stars": 446, "last_update": "2024-08-20 02:44:02", - "author_account_age_days": 1033 + "author_account_age_days": 1067 }, "https://github.com/TencentQQGYLab/ComfyUI-ELLA": { - "stars": 349, + "stars": 355, "last_update": "2024-08-16 11:21:10", - "author_account_age_days": 262 + "author_account_age_days": 297 }, "https://github.com/Tenney95/ComfyUI-NodeAligner": { - "stars": 86, - "last_update": "2024-10-21 04:43:12", - "author_account_age_days": 90 + "stars": 95, + "last_update": "2024-12-28 10:58:56", + "author_account_age_days": 125 }, "https://github.com/TheBarret/ZSuite": { "stars": 8, "last_update": "2024-08-10 13:31:03", - "author_account_age_days": 2876 + "author_account_age_days": 2911 }, "https://github.com/TheBill2001/ComfyUI-Save-Image-Caption": { "stars": 5, "last_update": "2024-08-28 07:45:11", - "author_account_age_days": 1606 + "author_account_age_days": 1641 }, "https://github.com/TheBill2001/comfyui-upscale-by-model": { - "stars": 2, + "stars": 3, "last_update": "2024-06-18 17:57:06", - "author_account_age_days": 1606 + "author_account_age_days": 1641 }, "https://github.com/TheMistoAI/ComfyUI-Anyline": { - "stars": 406, + "stars": 417, "last_update": "2024-08-30 09:50:34", - "author_account_age_days": 329 + "author_account_age_days": 364 }, "https://github.com/ThereforeGames/ComfyUI-Unprompted": { "stars": 10, "last_update": "2024-11-13 20:46:08", - "author_account_age_days": 1099 + "author_account_age_days": 1134 }, "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": { - "stars": 427, - "last_update": "2024-10-23 21:18:41", - "author_account_age_days": 785 + "stars": 448, + "last_update": "2024-12-18 17:23:08", + "author_account_age_days": 820 + }, + "https://github.com/Tlant/ComfyUI-OllamaPromptsGeneratorTlant": { + "stars": 2, + "last_update": "2024-12-14 12:33:13", + "author_account_age_days": 2868 }, "https://github.com/Trgtuan10/ComfyUI_YoloSegment_Mask": { "stars": 2, "last_update": "2024-09-26 01:46:02", - "author_account_age_days": 736 + "author_account_age_days": 771 }, "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler": { - "stars": 41, + "stars": 43, "last_update": "2024-05-22 22:13:06", - "author_account_age_days": 1024 + "author_account_age_days": 1059 }, "https://github.com/Tropfchen/ComfyUI-Embedding_Picker": { - "stars": 35, + "stars": 38, "last_update": "2024-08-26 16:33:49", - "author_account_age_days": 4017 + "author_account_age_days": 4052 }, "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": { - "stars": 11, + "stars": 13, "last_update": "2024-11-10 20:44:23", - "author_account_age_days": 4017 + "author_account_age_days": 4052 }, "https://github.com/Trung0246/ComfyUI-0246": { - "stars": 113, + "stars": 117, "last_update": "2024-11-29 19:06:05", - "author_account_age_days": 3544 + "author_account_age_days": 3579 }, "https://github.com/Ttl/ComfyUi_NNLatentUpscale": { - "stars": 215, + "stars": 225, "last_update": "2024-12-01 16:34:24", - "author_account_age_days": 5086 + "author_account_age_days": 5120 }, "https://github.com/TylerZoro/SD3-Scaling": { "stars": 1, "last_update": "2024-06-15 16:59:22", - "author_account_age_days": 1449 + "author_account_age_days": 1484 }, "https://github.com/Umikaze-job/select_folder_path_easy": { "stars": 6, "last_update": "2024-05-22 21:30:13", - "author_account_age_days": 383 + "author_account_age_days": 418 }, "https://github.com/VAST-AI-Research/ComfyUI-Tripo": { - "stars": 188, + "stars": 206, "last_update": "2024-12-05 10:54:41", - "author_account_age_days": 406 + "author_account_age_days": 441 + }, + "https://github.com/Vaibhavs10/ComfyUI-DDUF": { + "stars": 3, + "last_update": "2025-01-03 15:10:44", + "author_account_age_days": 3179 }, "https://github.com/VangengLab/ComfyUI-LivePortrait_v2": { - "stars": 4, + "stars": 5, "last_update": "2024-11-09 08:00:22", - "author_account_age_days": 443 + "author_account_age_days": 478 }, "https://github.com/VangengLab/ComfyUI-LivePortrait_v3": { - "stars": 11, + "stars": 18, "last_update": "2024-11-09 07:59:42", - "author_account_age_days": 443 + "author_account_age_days": 478 }, "https://github.com/VertexStudio/roblox-comfyui-nodes": { "stars": 1, "last_update": "2024-10-08 16:35:54", - "author_account_age_days": 3143 + "author_account_age_days": 3177 }, "https://github.com/VikramxD/VEnhancer-ComfyUI-Wrapper": { - "stars": 7, + "stars": 9, "last_update": "2024-11-18 19:38:19", - "author_account_age_days": 1520 + "author_account_age_days": 1555 }, "https://github.com/Visionatrix/ComfyUI-Visionatrix": { "stars": 2, - "last_update": "2024-11-29 10:37:42", - "author_account_age_days": 281 + "last_update": "2024-12-17 14:37:04", + "author_account_age_days": 315 }, "https://github.com/VrchStudio/comfyui-web-viewer": { - "stars": 50, - "last_update": "2024-12-01 00:41:38", - "author_account_age_days": 1084 + "stars": 86, + "last_update": "2024-12-27 18:12:27", + "author_account_age_days": 1119 }, "https://github.com/VykosX/ControlFlowUtils": { - "stars": 82, - "last_update": "2024-10-01 01:42:45", - "author_account_age_days": 2074 + "stars": 94, + "last_update": "2024-12-09 17:24:48", + "author_account_age_days": 2109 }, "https://github.com/WASasquatch/ASTERR": { - "stars": 24, + "stars": 26, "last_update": "2024-10-27 01:48:56", - "author_account_age_days": 4790 + "author_account_age_days": 4824 }, "https://github.com/WASasquatch/ComfyUI_Preset_Merger": { "stars": 29, "last_update": "2024-10-27 01:50:32", - "author_account_age_days": 4790 + "author_account_age_days": 4824 }, "https://github.com/WASasquatch/FreeU_Advanced": { - "stars": 111, + "stars": 115, "last_update": "2024-10-27 01:49:14", - "author_account_age_days": 4790 + "author_account_age_days": 4824 }, "https://github.com/WASasquatch/PPF_Noise_ComfyUI": { "stars": 23, "last_update": "2024-06-14 10:27:23", - "author_account_age_days": 4790 + "author_account_age_days": 4824 }, "https://github.com/WASasquatch/PowerNoiseSuite": { - "stars": 69, + "stars": 71, "last_update": "2024-07-31 13:48:33", - "author_account_age_days": 4790 + "author_account_age_days": 4824 }, "https://github.com/WASasquatch/WAS_Extras": { - "stars": 31, + "stars": 32, "last_update": "2024-06-17 04:08:37", - "author_account_age_days": 4790 + "author_account_age_days": 4824 }, "https://github.com/WASasquatch/was-node-suite-comfyui": { - "stars": 1241, - "last_update": "2024-11-05 15:31:25", - "author_account_age_days": 4790 + "stars": 1300, + "last_update": "2024-12-20 16:46:02", + "author_account_age_days": 4824 }, "https://github.com/WX-NPS1598/ComfyUI-Auto_Crop_By_NPS": { "stars": 6, "last_update": "2024-07-30 04:43:14", - "author_account_age_days": 140 + "author_account_age_days": 175 }, "https://github.com/WaddingtonHoldings/ComfyUI-InstaSD": { "stars": 2, - "last_update": "2024-11-27 20:04:15", - "author_account_age_days": 787 + "last_update": "2025-01-03 20:26:02", + "author_account_age_days": 821 + }, + "https://github.com/WainWong/ComfyUI-Loop-image": { + "stars": 24, + "last_update": "2025-01-01 04:32:57", + "author_account_age_days": 2822 }, "https://github.com/Wakfull33/ComfyUI-SaveImageCivitAI": { "stars": 2, "last_update": "2024-10-29 11:03:23", - "author_account_age_days": 3124 + "author_account_age_days": 3159 }, "https://github.com/WebDev9000/WebDev9000-Nodes": { "stars": 1, "last_update": "2024-06-14 10:28:22", - "author_account_age_days": 3916 + "author_account_age_days": 3951 }, "https://github.com/Wicloz/ComfyUI-Simply-Nodes": { - "stars": 1, - "last_update": "2024-07-06 22:35:50", - "author_account_age_days": 3808 + "stars": 2, + "last_update": "2025-01-05 01:44:38", + "author_account_age_days": 3843 }, "https://github.com/X-T-E-R/ComfyUI-EasyCivitai-XTNodes": { - "stars": 28, + "stars": 32, "last_update": "2024-09-04 11:37:04", - "author_account_age_days": 1327 + "author_account_age_days": 1362 }, "https://github.com/XLabs-AI/x-flux-comfyui": { - "stars": 1168, + "stars": 1256, "last_update": "2024-10-30 12:51:21", - "author_account_age_days": 122 + "author_account_age_days": 156 }, "https://github.com/Xclbr7/ComfyUI-Merlin": { - "stars": 24, + "stars": 26, "last_update": "2024-09-02 19:36:05", - "author_account_age_days": 101 + "author_account_age_days": 136 }, "https://github.com/XmYx/deforum-comfy-nodes": { - "stars": 163, - "last_update": "2024-11-22 09:25:26", - "author_account_age_days": 2770 + "stars": 167, + "last_update": "2024-12-05 21:10:04", + "author_account_age_days": 2805 }, "https://github.com/Xyem/Xycuno-Oobabooga": { "stars": 4, "last_update": "2024-05-23 00:14:14", - "author_account_age_days": 4488 + "author_account_age_days": 4523 }, "https://github.com/YMC-GitHub/ymc-node-as-x-type": { "stars": 1, "last_update": "2024-08-03 06:01:00", - "author_account_age_days": 2859 + "author_account_age_days": 2894 }, "https://github.com/YMC-GitHub/ymc-node-suite-comfyui": { "stars": 17, "last_update": "2024-05-22 21:15:51", - "author_account_age_days": 2859 + "author_account_age_days": 2894 }, "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes": { "stars": 14, "last_update": "2024-05-22 20:48:23", - "author_account_age_days": 3920 + "author_account_age_days": 3954 }, "https://github.com/Yanick112/ComfyUI-ToSVG": { - "stars": 97, + "stars": 117, "last_update": "2024-10-12 15:56:48", - "author_account_age_days": 978 + "author_account_age_days": 1013 }, "https://github.com/YarvixPA/ComfyUI-NeuralMedia": { "stars": 2, "last_update": "2024-12-03 23:05:03", - "author_account_age_days": 370 + "author_account_age_days": 405 }, "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI": { "stars": 16, - "last_update": "2024-08-22 04:57:12", - "author_account_age_days": 950 + "last_update": "2025-01-03 03:58:20", + "author_account_age_days": 985 }, "https://github.com/Yuan-ManX/ComfyUI-LLaMA-Mesh": { - "stars": 2, + "stars": 4, "last_update": "2024-11-29 09:52:04", - "author_account_age_days": 1604 + "author_account_age_days": 1639 }, "https://github.com/Yuan-ManX/ComfyUI-SoundHub": { "stars": 2, "last_update": "2024-11-27 08:00:48", - "author_account_age_days": 1604 + "author_account_age_days": 1639 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR": { - "stars": 349, + "stars": 354, "last_update": "2024-05-22 14:14:46", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions": { "stars": 20, "last_update": "2024-06-14 07:06:15", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery": { - "stars": 444, + "stars": 462, "last_update": "2024-06-12 04:40:50", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG": { - "stars": 716, + "stars": 738, "last_update": "2024-05-22 14:14:18", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM": { - "stars": 72, + "stars": 73, "last_update": "2024-05-22 14:14:03", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": { - "stars": 677, + "stars": 691, "last_update": "2024-05-22 14:15:11", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID": { - "stars": 1360, + "stars": 1368, "last_update": "2024-05-22 13:57:55", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini": { "stars": 198, "last_update": "2024-06-30 08:41:40", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO": { - "stars": 790, + "stars": 794, "last_update": "2024-05-22 14:13:49", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers": { "stars": 49, "last_update": "2024-05-22 13:40:58", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align": { "stars": 4, "last_update": "2024-05-22 14:15:52", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen": { - "stars": 93, + "stars": 95, "last_update": "2024-09-20 21:27:47", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": { - "stars": 199, + "stars": 200, "last_update": "2024-05-22 14:14:57", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO": { "stars": 107, "last_update": "2024-05-22 13:40:44", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE": { "stars": 80, "last_update": "2024-05-22 13:41:14", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite": { - "stars": 100, + "stars": 102, "last_update": "2024-05-31 12:03:55", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-UltraEdit-ZHO": { - "stars": 144, + "stars": 145, "last_update": "2024-07-11 14:59:07", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM": { - "stars": 627, + "stars": 648, "last_update": "2024-05-22 13:01:07", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn": { - "stars": 1618, + "stars": 1651, "last_update": "2024-06-14 09:00:04", - "author_account_age_days": 504 + "author_account_age_days": 539 }, "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ": { - "stars": 20, + "stars": 21, "last_update": "2024-07-19 06:38:39", - "author_account_age_days": 1437 + "author_account_age_days": 1472 }, "https://github.com/ZaneA/ComfyUI-ImageReward": { "stars": 28, "last_update": "2024-08-19 06:43:55", - "author_account_age_days": 5704 + "author_account_age_days": 5739 }, "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools": { "stars": 2, "last_update": "2024-06-23 19:19:40", - "author_account_age_days": 1358 + "author_account_age_days": 1393 }, "https://github.com/Zuellni/ComfyUI-Custom-Nodes": { "stars": 44, "last_update": "2023-09-19 12:11:26", - "author_account_age_days": 687 + "author_account_age_days": 721 }, "https://github.com/Zuellni/ComfyUI-ExLlama-Nodes": { - "stars": 111, - "last_update": "2024-09-22 06:44:30", - "author_account_age_days": 687 + "stars": 116, + "last_update": "2024-12-06 14:22:11", + "author_account_age_days": 721 }, "https://github.com/Zuellni/ComfyUI-PickScore-Nodes": { - "stars": 33, + "stars": 35, "last_update": "2024-09-08 09:17:04", - "author_account_age_days": 687 + "author_account_age_days": 721 }, "https://github.com/a1lazydog/ComfyUI-AudioScheduler": { - "stars": 101, + "stars": 102, "last_update": "2024-08-08 03:04:19", - "author_account_age_days": 4966 + "author_account_age_days": 5001 + }, + "https://github.com/abdozmantar/ComfyUI-DeepExtract": { + "stars": 7, + "last_update": "2024-12-07 11:44:06", + "author_account_age_days": 351 }, "https://github.com/aburahamu/ComfyUI-IsNiceParts": { "stars": 3, "last_update": "2024-06-14 12:01:40", - "author_account_age_days": 237 + "author_account_age_days": 272 }, "https://github.com/aburahamu/ComfyUI-RequestsPoster": { "stars": 2, "last_update": "2024-06-14 13:59:24", - "author_account_age_days": 237 + "author_account_age_days": 272 }, "https://github.com/abyz22/image_control": { - "stars": 14, + "stars": 15, "last_update": "2024-08-31 08:39:44", - "author_account_age_days": 326 + "author_account_age_days": 361 }, "https://github.com/acorderob/sd-webui-prompt-postprocessor": { - "stars": 27, + "stars": 28, "last_update": "2024-11-23 13:08:46", - "author_account_age_days": 3992 + "author_account_age_days": 4026 }, "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface": { "stars": 4, "last_update": "2024-05-22 23:24:45", - "author_account_age_days": 868 + "author_account_age_days": 902 }, "https://github.com/adieyal/comfyui-dynamicprompts": { - "stars": 253, + "stars": 263, "last_update": "2024-07-09 14:21:09", - "author_account_age_days": 5181 + "author_account_age_days": 5216 }, "https://github.com/adigayung/ComfyUI-Translator": { - "stars": 2, + "stars": 4, "last_update": "2024-09-09 03:36:52", - "author_account_age_days": 377 + "author_account_age_days": 412 }, "https://github.com/adriflex/ComfyUI_Blender_Texdiff": { "stars": 2, "last_update": "2024-05-22 23:14:18", - "author_account_age_days": 2386 + "author_account_age_days": 2421 }, "https://github.com/aegis72/aegisflow_utility_nodes": { - "stars": 30, + "stars": 31, "last_update": "2024-10-03 11:11:39", - "author_account_age_days": 747 + "author_account_age_days": 782 }, "https://github.com/aegis72/comfyui-styles-all": { - "stars": 45, + "stars": 48, "last_update": "2024-05-22 22:10:41", - "author_account_age_days": 747 + "author_account_age_days": 782 + }, + "https://github.com/ahernandezmiro/ComfyUI-GCP_Storage_tools": { + "stars": 1, + "last_update": "2025-01-03 18:48:03", + "author_account_age_days": 4195 }, "https://github.com/ai-liam/comfyui-liam": { "stars": 2, "last_update": "2024-06-22 03:27:52", - "author_account_age_days": 1685 + "author_account_age_days": 1720 }, "https://github.com/ai-liam/comfyui_liam_util": { "stars": 1, "last_update": "2024-05-22 22:21:23", - "author_account_age_days": 1685 + "author_account_age_days": 1720 }, "https://github.com/ai-shizuka/ComfyUI-tbox": { "stars": 4, - "last_update": "2024-10-14 12:49:17", - "author_account_age_days": 176 + "last_update": "2024-12-19 08:13:44", + "author_account_age_days": 211 }, "https://github.com/aianimation55/ComfyUI-FatLabels": { "stars": 5, "last_update": "2024-05-22 21:26:01", - "author_account_age_days": 438 + "author_account_age_days": 473 }, "https://github.com/aidenli/ComfyUI_NYJY": { - "stars": 84, - "last_update": "2024-11-24 08:21:25", - "author_account_age_days": 4712 + "stars": 92, + "last_update": "2024-12-31 10:12:40", + "author_account_age_days": 4747 }, "https://github.com/aimerib/ComfyUI_HigherBitDepthSaveImage": { - "stars": 2, + "stars": 3, "last_update": "2024-09-14 03:03:01", - "author_account_age_days": 2835 + "author_account_age_days": 2870 + }, + "https://github.com/ainewsto/comfyui-labs-google": { + "stars": 8, + "last_update": "2025-01-09 08:33:51", + "author_account_age_days": 853 }, "https://github.com/aisabervisionlab/ComfyUI_merge_ASVL": { "stars": 3, "last_update": "2024-07-31 13:39:36", - "author_account_age_days": 153 + "author_account_age_days": 188 }, "https://github.com/akatz-ai/ComfyUI-AKatz-Nodes": { - "stars": 19, + "stars": 23, "last_update": "2024-11-20 23:13:59", - "author_account_age_days": 199 + "author_account_age_days": 234 }, "https://github.com/akatz-ai/ComfyUI-DepthCrafter-Nodes": { - "stars": 186, - "last_update": "2024-11-27 23:40:30", - "author_account_age_days": 199 + "stars": 194, + "last_update": "2024-12-13 01:44:03", + "author_account_age_days": 234 }, "https://github.com/akatz-ai/ComfyUI-Depthflow-Nodes": { - "stars": 188, - "last_update": "2024-10-21 22:08:43", - "author_account_age_days": 199 + "stars": 210, + "last_update": "2024-12-26 22:37:39", + "author_account_age_days": 234 }, "https://github.com/akatz-ai/ComfyUI-X-Portrait-Nodes": { - "stars": 74, - "last_update": "2024-11-15 05:45:58", - "author_account_age_days": 199 + "stars": 78, + "last_update": "2024-12-13 01:44:29", + "author_account_age_days": 234 }, "https://github.com/akierson/ComfyUI-textnodes": { "stars": 1, "last_update": "2024-10-20 20:12:15", - "author_account_age_days": 2498 + "author_account_age_days": 2533 }, "https://github.com/akierson/comfyui-colornodes": { - "stars": 1, + "stars": 2, "last_update": "2024-10-20 20:14:09", - "author_account_age_days": 2498 + "author_account_age_days": 2533 }, "https://github.com/akspa0/ComfyUI-FapMixPlus": { "stars": 1, "last_update": "2024-11-11 02:59:10", - "author_account_age_days": 294 + "author_account_age_days": 329 }, "https://github.com/al-swaiti/All-IN-ONE-style": { - "stars": 5, + "stars": 6, "last_update": "2024-07-30 05:59:49", - "author_account_age_days": 1094 + "author_account_age_days": 1128 }, "https://github.com/al-swaiti/ComfyUI-CascadeResolutions": { "stars": 4, "last_update": "2024-07-31 13:48:47", - "author_account_age_days": 1094 + "author_account_age_days": 1128 }, "https://github.com/al-swaiti/ComfyUI-OllamaGemini": { - "stars": 26, + "stars": 28, "last_update": "2024-11-28 12:32:25", - "author_account_age_days": 1094 + "author_account_age_days": 1128 }, "https://github.com/alanhuang67/ComfyUI-FAI-Node": { - "stars": 10, + "stars": 11, "last_update": "2024-08-02 03:35:41", - "author_account_age_days": 3654 + "author_account_age_days": 3689 }, "https://github.com/alessandrozonta/ComfyUI-CenterNode": { "stars": 7, "last_update": "2024-11-14 12:20:40", - "author_account_age_days": 1361 + "author_account_age_days": 1396 }, "https://github.com/alessandrozonta/ComfyUI-Layers": { - "stars": 39, + "stars": 41, "last_update": "2024-07-31 13:46:32", - "author_account_age_days": 1361 + "author_account_age_days": 1396 }, "https://github.com/alessandrozonta/ComfyUI-OpenPose": { - "stars": 13, + "stars": 17, "last_update": "2024-07-31 13:51:14", - "author_account_age_days": 1361 + "author_account_age_days": 1396 }, "https://github.com/alexcong/ComfyUI_QwenVL": { - "stars": 25, - "last_update": "2024-09-22 17:15:44", - "author_account_age_days": 3751 + "stars": 32, + "last_update": "2024-12-28 23:17:34", + "author_account_age_days": 3785 }, "https://github.com/alexgenovese/ComfyUI_HF_Servelress_Inference": { - "stars": 4, + "stars": 6, "last_update": "2024-09-01 13:04:48", - "author_account_age_days": 5179 + "author_account_age_days": 5213 }, "https://github.com/alexisrolland/ComfyUI-Phi": { - "stars": 8, - "last_update": "2024-11-25 09:05:21", - "author_account_age_days": 3450 + "stars": 9, + "last_update": "2025-01-04 10:38:45", + "author_account_age_days": 3485 }, "https://github.com/alexopus/ComfyUI-Image-Saver": { - "stars": 53, - "last_update": "2024-10-30 11:02:15", - "author_account_age_days": 2844 + "stars": 57, + "last_update": "2024-12-08 20:23:34", + "author_account_age_days": 2878 }, "https://github.com/ali1234/comfyui-job-iterator": { - "stars": 94, + "stars": 101, "last_update": "2024-11-16 07:51:07", - "author_account_age_days": 5024 + "author_account_age_days": 5059 }, "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer": { - "stars": 54, - "last_update": "2024-12-03 13:53:21", - "author_account_age_days": 765 + "stars": 58, + "last_update": "2024-12-23 16:35:42", + "author_account_age_days": 799 }, "https://github.com/alpertunga-bile/image-caption-comfyui": { "stars": 10, "last_update": "2024-09-07 13:32:12", - "author_account_age_days": 1437 + "author_account_age_days": 1472 }, "https://github.com/alpertunga-bile/prompt-generator-comfyui": { - "stars": 86, + "stars": 87, "last_update": "2024-11-17 20:28:12", - "author_account_age_days": 1437 + "author_account_age_days": 1472 }, "https://github.com/alsritter/asymmetric-tiling-comfyui": { "stars": 16, "last_update": "2024-05-22 20:43:07", - "author_account_age_days": 2158 + "author_account_age_days": 2193 }, "https://github.com/alt-key-project/comfyui-dream-project": { - "stars": 89, - "last_update": "2024-12-01 09:08:59", - "author_account_age_days": 824 + "stars": 92, + "last_update": "2024-12-07 20:07:31", + "author_account_age_days": 859 }, "https://github.com/alt-key-project/comfyui-dream-video-batches": { - "stars": 64, - "last_update": "2024-11-17 06:52:57", - "author_account_age_days": 824 + "stars": 66, + "last_update": "2024-12-07 20:06:38", + "author_account_age_days": 859 }, "https://github.com/amaozhao/ComfyUI_DeployCash": { "stars": 2, - "last_update": "2024-12-02 03:48:37", - "author_account_age_days": 5196 + "last_update": "2024-12-16 12:40:50", + "author_account_age_days": 5231 }, "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes": { "stars": 0, "last_update": "2024-05-22 22:21:00", - "author_account_age_days": 353 + "author_account_age_days": 387 }, "https://github.com/andersxa/comfyui-PromptAttention": { "stars": 23, "last_update": "2024-06-20 11:09:25", - "author_account_age_days": 3117 + "author_account_age_days": 3152 + }, + "https://github.com/andygill/comfyui-sunflower-nodes": { + "stars": 2, + "last_update": "2025-01-02 04:23:22", + "author_account_age_days": 5991 }, "https://github.com/angeloshredder/StableCascadeResizer": { "stars": 2, "last_update": "2024-05-23 00:12:55", - "author_account_age_days": 1993 + "author_account_age_days": 2027 }, "https://github.com/anhkhoatranle30/Handy-Nodes-ComfyUI": { "stars": 2, "last_update": "2024-09-14 14:08:22", - "author_account_age_days": 1914 + "author_account_age_days": 1949 }, "https://github.com/antrobot1234/antrobots-comfyUI-nodepack": { - "stars": 15, - "last_update": "2024-12-03 21:21:35", - "author_account_age_days": 3027 + "stars": 16, + "last_update": "2025-01-04 05:56:24", + "author_account_age_days": 3061 }, "https://github.com/arcum42/ComfyUI_SageUtils": { - "stars": 1, - "last_update": "2024-12-03 07:06:13", - "author_account_age_days": 5912 + "stars": 4, + "last_update": "2025-01-05 04:51:48", + "author_account_age_days": 5947 }, "https://github.com/aria1th/ComfyUI-LogicUtils": { - "stars": 26, - "last_update": "2024-12-04 05:19:26", - "author_account_age_days": 2509 + "stars": 29, + "last_update": "2025-01-08 17:48:53", + "author_account_age_days": 2544 }, "https://github.com/asaddi/ComfyUI-YALLM-node": { - "stars": 2, - "last_update": "2024-11-30 06:09:35", - "author_account_age_days": 3698 + "stars": 3, + "last_update": "2024-12-29 01:08:36", + "author_account_age_days": 3733 }, "https://github.com/asagi4/ComfyUI-Adaptive-Guidance": { - "stars": 41, + "stars": 45, "last_update": "2024-11-23 17:37:39", - "author_account_age_days": 605 + "author_account_age_days": 640 }, "https://github.com/asagi4/ComfyUI-CADS": { "stars": 40, "last_update": "2024-07-31 16:02:55", - "author_account_age_days": 605 + "author_account_age_days": 640 + }, + "https://github.com/asagi4/ComfyUI-NPNet": { + "stars": 17, + "last_update": "2024-12-10 17:20:10", + "author_account_age_days": 640 }, "https://github.com/asagi4/comfyui-prompt-control": { - "stars": 211, - "last_update": "2024-12-05 19:54:10", - "author_account_age_days": 605 + "stars": 238, + "last_update": "2025-01-07 16:15:31", + "author_account_age_days": 640 }, "https://github.com/asagi4/comfyui-utility-nodes": { "stars": 7, "last_update": "2024-05-25 11:40:49", - "author_account_age_days": 605 + "author_account_age_days": 640 }, "https://github.com/aszc-dev/ComfyUI-CoreMLSuite": { - "stars": 132, + "stars": 140, "last_update": "2024-08-15 18:37:19", - "author_account_age_days": 2891 + "author_account_age_days": 2926 }, "https://github.com/atmaranto/ComfyUI-SaveAsScript": { - "stars": 105, + "stars": 117, "last_update": "2024-10-09 08:44:54", - "author_account_age_days": 2512 + "author_account_age_days": 2547 }, "https://github.com/audioscavenger/ComfyUI-Thumbnails": { - "stars": 15, - "last_update": "2024-09-07 00:30:17", - "author_account_age_days": 4285 + "stars": 20, + "last_update": "2025-01-06 23:41:08", + "author_account_age_days": 4320 }, "https://github.com/audioscavenger/save-image-extended-comfyui": { - "stars": 61, - "last_update": "2024-12-05 03:57:21", - "author_account_age_days": 4285 + "stars": 67, + "last_update": "2025-01-05 19:27:21", + "author_account_age_days": 4320 }, "https://github.com/avatechai/avatar-graph-comfyui": { - "stars": 248, + "stars": 254, "last_update": "2024-05-22 21:14:14", - "author_account_age_days": 1018 + "author_account_age_days": 1053 }, "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock": { "stars": 10, "last_update": "2024-08-20 10:23:09", - "author_account_age_days": 3723 + "author_account_age_days": 3757 }, "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes": { "stars": 3, "last_update": "2024-05-22 23:16:28", - "author_account_age_days": 465 + "author_account_age_days": 500 }, "https://github.com/badayvedat/ComfyUI-fal-Connector": { - "stars": 32, - "last_update": "2024-11-08 15:32:21", - "author_account_age_days": 1935 + "stars": 35, + "last_update": "2024-12-09 10:33:40", + "author_account_age_days": 1969 }, "https://github.com/badjeff/comfyui_lora_tag_loader": { - "stars": 61, + "stars": 64, "last_update": "2024-05-22 20:40:03", - "author_account_age_days": 5527 + "author_account_age_days": 5561 }, "https://github.com/baicai99/ComfyUI-FrameSkipping": { - "stars": 8, + "stars": 9, "last_update": "2024-12-03 09:26:50", - "author_account_age_days": 995 + "author_account_age_days": 1030 }, "https://github.com/bananasss00/ComfyUI-SP-Nodes": { - "stars": 11, - "last_update": "2024-11-23 14:41:28", - "author_account_age_days": 2698 + "stars": 13, + "last_update": "2024-12-23 14:15:20", + "author_account_age_days": 2733 }, "https://github.com/bananasss00/ComfyUI-flux_fill_patcher": { - "stars": 2, + "stars": 5, "last_update": "2024-11-25 20:04:20", - "author_account_age_days": 2698 + "author_account_age_days": 2733 }, "https://github.com/banodoco/steerable-motion": { - "stars": 850, + "stars": 858, "last_update": "2024-06-15 23:01:54", - "author_account_age_days": 566 + "author_account_age_days": 601 }, "https://github.com/banqingyuan/ComfyUI-text-replace": { "stars": 1, "last_update": "2024-09-22 16:14:22", - "author_account_age_days": 2463 + "author_account_age_days": 2498 }, "https://github.com/bartly/Comfyui_babel_removebg_api": { - "stars": 5, + "stars": 7, "last_update": "2024-10-14 00:48:34", - "author_account_age_days": 4291 + "author_account_age_days": 4326 }, "https://github.com/bash-j/mikey_nodes": { - "stars": 118, + "stars": 123, "last_update": "2024-11-02 07:57:28", - "author_account_age_days": 4351 + "author_account_age_days": 4386 + }, + "https://github.com/bear2b/comfyui-argo-nodes": { + "stars": 1, + "last_update": "2025-01-03 20:24:49", + "author_account_age_days": 3164 }, "https://github.com/bedovyy/ComfyUI_NAIDGenerator": { - "stars": 42, - "last_update": "2024-10-05 12:32:45", - "author_account_age_days": 527 + "stars": 49, + "last_update": "2024-12-23 19:50:16", + "author_account_age_days": 561 }, - "https://github.com/bentoml/ComfyUI-IDL": { - "stars": 3, - "last_update": "2024-12-05 01:59:17", - "author_account_age_days": 2074 + "https://github.com/bentoml/comfy-pack": { + "stars": 83, + "last_update": "2025-01-04 05:00:52", + "author_account_age_days": 2109 }, "https://github.com/bilal-arikan/ComfyUI_TextAssets": { "stars": 2, "last_update": "2024-05-22 23:23:50", - "author_account_age_days": 3672 + "author_account_age_days": 3706 + }, + "https://github.com/billwuhao/ComfyUI_OneButtonPrompt_Flux": { + "stars": 2, + "last_update": "2025-01-07 14:35:59", + "author_account_age_days": 2135 }, "https://github.com/bitaffinity/ComfyUI_HF_Inference": { - "stars": 1, + "stars": 2, "last_update": "2024-06-14 10:23:29", - "author_account_age_days": 221 + "author_account_age_days": 256 + }, + "https://github.com/black-forest-labs/bfl-comfy-nodes": { + "stars": 47, + "last_update": "2024-12-19 20:31:48", + "author_account_age_days": 295 }, "https://github.com/blackcodetavern/ComfyUI-Benripack": { "stars": 1, "last_update": "2024-09-07 09:06:00", - "author_account_age_days": 3038 + "author_account_age_days": 3072 }, "https://github.com/blepping/ComfyUI-bleh": { - "stars": 52, - "last_update": "2024-12-03 01:42:31", - "author_account_age_days": 318 + "stars": 64, + "last_update": "2024-12-28 09:27:09", + "author_account_age_days": 353 }, "https://github.com/blepping/ComfyUI-sonar": { - "stars": 36, - "last_update": "2024-12-05 10:57:19", - "author_account_age_days": 318 + "stars": 40, + "last_update": "2024-12-12 22:16:46", + "author_account_age_days": 353 }, "https://github.com/blepping/comfyui_jankdiffusehigh": { - "stars": 15, - "last_update": "2024-12-05 10:58:53", - "author_account_age_days": 318 + "stars": 20, + "last_update": "2025-01-09 10:08:42", + "author_account_age_days": 353 }, "https://github.com/blepping/comfyui_jankhidiffusion": { - "stars": 112, - "last_update": "2024-10-14 10:36:17", - "author_account_age_days": 318 + "stars": 118, + "last_update": "2024-12-25 04:47:01", + "author_account_age_days": 353 }, "https://github.com/blepping/comfyui_overly_complicated_sampling": { - "stars": 24, - "last_update": "2024-12-05 11:13:49", - "author_account_age_days": 318 + "stars": 25, + "last_update": "2024-12-07 21:16:44", + "author_account_age_days": 353 }, "https://github.com/blib-la/blibla-comfyui-extensions": { - "stars": 162, + "stars": 164, "last_update": "2024-08-20 14:47:54", - "author_account_age_days": 438 + "author_account_age_days": 472 }, "https://github.com/blob8/ComfyUI_sloppy-comic": { "stars": 5, "last_update": "2024-09-20 18:53:34", - "author_account_age_days": 232 + "author_account_age_days": 267 }, "https://github.com/blueraincoatli/comfyUI_SillyNodes": { "stars": 3, "last_update": "2024-06-09 13:30:57", - "author_account_age_days": 477 + "author_account_age_days": 511 }, "https://github.com/bluevisor/ComfyUI_PS_Blend_Node": { "stars": 2, "last_update": "2024-07-08 12:38:26", - "author_account_age_days": 4731 + "author_account_age_days": 4766 }, "https://github.com/bmad4ever/ComfyUI-Bmad-DirtyUndoRedo": { "stars": 49, "last_update": "2024-05-22 18:11:51", - "author_account_age_days": 3701 + "author_account_age_days": 3735 }, "https://github.com/bmad4ever/comfyui_ab_samplercustom": { - "stars": 8, + "stars": 9, "last_update": "2024-09-17 20:18:46", - "author_account_age_days": 3701 + "author_account_age_days": 3735 }, "https://github.com/bmad4ever/comfyui_lists_cartesian_product": { "stars": 3, "last_update": "2024-05-22 20:18:07", - "author_account_age_days": 3701 + "author_account_age_days": 3735 }, "https://github.com/bmad4ever/comfyui_quilting": { - "stars": 9, + "stars": 10, "last_update": "2024-10-18 19:41:01", - "author_account_age_days": 3701 + "author_account_age_days": 3735 }, "https://github.com/bmad4ever/comfyui_wfc_like": { "stars": 6, "last_update": "2024-08-02 22:01:12", - "author_account_age_days": 3701 + "author_account_age_days": 3735 }, "https://github.com/bobmagicii/comfykit-custom-nodes": { "stars": 2, "last_update": "2024-08-22 22:28:30", - "author_account_age_days": 4909 + "author_account_age_days": 4943 }, "https://github.com/bombax-xiaoice/ComfyUI-Allegro": { - "stars": 4, - "last_update": "2024-11-22 02:52:35", - "author_account_age_days": 72 + "stars": 5, + "last_update": "2024-12-26 04:45:26", + "author_account_age_days": 107 }, "https://github.com/bombax-xiaoice/ComfyUI-MagicDance": { "stars": 4, - "last_update": "2024-11-22 02:52:14", - "author_account_age_days": 72 + "last_update": "2024-12-26 04:43:40", + "author_account_age_days": 107 + }, + "https://github.com/bombax-xiaoice/ComfyUI-Open-Sora-I2V": { + "stars": 2, + "last_update": "2024-12-30 03:17:45", + "author_account_age_days": 107 + }, + "https://github.com/bombax-xiaoice/ComfyUI-OpenSoraPlan": { + "stars": 1, + "last_update": "2025-01-09 09:36:18", + "author_account_age_days": 107 + }, + "https://github.com/bombless/comfyUI-RememberingUtils": { + "stars": 1, + "last_update": "2024-12-25 01:31:05", + "author_account_age_days": 4758 + }, + "https://github.com/bongsang/ComfyUI-Bongsang": { + "stars": 1, + "last_update": "2025-01-05 05:42:30", + "author_account_age_days": 3802 }, "https://github.com/boredofnames/ComfyUI-ntfy": { "stars": 1, "last_update": "2024-08-27 03:47:58", - "author_account_age_days": 4262 + "author_account_age_days": 4297 }, "https://github.com/bradsec/ComfyUI_ResolutionSelector": { - "stars": 10, + "stars": 11, "last_update": "2024-07-07 12:15:49", - "author_account_age_days": 3820 + "author_account_age_days": 3855 }, "https://github.com/braintacles/braintacles-comfyui-nodes": { "stars": 1, "last_update": "2024-07-31 15:01:52", - "author_account_age_days": 595 + "author_account_age_days": 630 }, "https://github.com/brayevalerien/ComfyUI-resynthesizer": { - "stars": 16, - "last_update": "2024-10-28 15:28:37", - "author_account_age_days": 1758 + "stars": 18, + "last_update": "2025-01-04 00:25:23", + "author_account_age_days": 1793 }, "https://github.com/brianfitzgerald/style_aligned_comfy": { - "stars": 286, + "stars": 287, "last_update": "2024-05-30 14:23:40", - "author_account_age_days": 4404 + "author_account_age_days": 4438 }, "https://github.com/bronkula/comfyui-fitsize": { - "stars": 46, + "stars": 47, "last_update": "2024-05-22 21:32:34", - "author_account_age_days": 5319 + "author_account_age_days": 5354 }, "https://github.com/bruefire/ComfyUI-SeqImageLoader": { - "stars": 31, + "stars": 32, "last_update": "2024-11-10 19:10:50", - "author_account_age_days": 2530 + "author_account_age_days": 2565 }, "https://github.com/budihartono/comfyui_otonx_nodes": { "stars": 1, "last_update": "2024-07-31 16:01:47", - "author_account_age_days": 4850 + "author_account_age_days": 4885 }, "https://github.com/bvhari/ComfyUI_ImageProcessing": { - "stars": 20, + "stars": 21, "last_update": "2024-08-03 03:58:44", - "author_account_age_days": 1339 + "author_account_age_days": 1374 }, "https://github.com/bvhari/ComfyUI_PerpCFG": { "stars": 2, "last_update": "2024-10-07 20:34:34", - "author_account_age_days": 1339 + "author_account_age_days": 1374 }, "https://github.com/bvhari/ComfyUI_PerpWeight": { "stars": 13, "last_update": "2024-08-03 03:58:28", - "author_account_age_days": 1339 + "author_account_age_days": 1374 }, "https://github.com/bvhari/ComfyUI_SUNoise": { "stars": 11, "last_update": "2024-09-24 15:27:30", - "author_account_age_days": 1339 + "author_account_age_days": 1374 }, "https://github.com/c0ffymachyne/ComfyUI_BeatByte": { - "stars": 3, - "last_update": "2024-11-25 06:25:43", - "author_account_age_days": 4679 + "stars": 4, + "last_update": "2024-12-28 21:19:19", + "author_account_age_days": 4714 }, - "https://github.com/c0ffymachyne/ComfyUI_SingalProcessing": { - "stars": 2, - "last_update": "2024-11-21 07:12:34", - "author_account_age_days": 4679 + "https://github.com/c0ffymachyne/ComfyUI_SignalProcessing": { + "stars": 3, + "last_update": "2024-12-28 19:14:00", + "author_account_age_days": 4714 + }, + "https://github.com/calcuis/gguf": { + "stars": 1, + "last_update": "2025-01-08 23:40:45", + "author_account_age_days": 846 }, "https://github.com/caleboleary/ComfyUI-Arc2Face": { "stars": 41, "last_update": "2024-09-02 23:00:00", - "author_account_age_days": 3467 + "author_account_age_days": 3501 }, "https://github.com/caleboleary/Comfyui-calbenodes": { "stars": 2, "last_update": "2024-09-16 19:27:58", - "author_account_age_days": 3467 + "author_account_age_days": 3501 }, "https://github.com/camenduru/ComfyUI-TostAI": { "stars": 1, "last_update": "2024-08-22 04:04:06", - "author_account_age_days": 1933 + "author_account_age_days": 1967 }, "https://github.com/catboxanon/comfyui_stealth_pnginfo": { "stars": 0, - "last_update": "2024-11-19 05:25:40", - "author_account_age_days": 695 + "last_update": "2024-12-06 04:47:31", + "author_account_age_days": 730 }, "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": { - "stars": 377, + "stars": 391, "last_update": "2024-09-12 06:55:50", - "author_account_age_days": 1368 + "author_account_age_days": 1403 }, "https://github.com/cdb-boop/comfyui-image-round": { - "stars": 4, + "stars": 5, "last_update": "2024-05-23 00:09:02", - "author_account_age_days": 1368 + "author_account_age_days": 1403 }, "https://github.com/cdxOo/comfyui-text-node-with-comments": { "stars": 2, "last_update": "2024-08-03 00:54:38", - "author_account_age_days": 3460 + "author_account_age_days": 3495 }, "https://github.com/celoron/ComfyUI-VisualQueryTemplate": { - "stars": 13, + "stars": 12, "last_update": "2024-08-28 20:13:26", - "author_account_age_days": 5176 + "author_account_age_days": 5211 }, "https://github.com/celsojr2013/comfyui_jamworks_client": { "stars": 0, "last_update": "2024-06-23 12:35:44", - "author_account_age_days": 3563 + "author_account_age_days": 3598 }, "https://github.com/celsojr2013/comfyui_simpletools": { "stars": 2, "last_update": "2024-06-22 11:35:40", - "author_account_age_days": 3563 + "author_account_age_days": 3598 + }, + "https://github.com/cenzijing/ComfyUI-Markmap": { + "stars": 2, + "last_update": "2025-01-04 21:00:08", + "author_account_age_days": 1664 }, "https://github.com/cerspense/ComfyUI_cspnodes": { "stars": 32, - "last_update": "2024-11-15 01:51:15", - "author_account_age_days": 2846 + "last_update": "2024-12-17 04:07:09", + "author_account_age_days": 2881 }, "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner": { - "stars": 114, + "stars": 117, "last_update": "2024-08-03 16:22:31", - "author_account_age_days": 1317 + "author_account_age_days": 1352 }, "https://github.com/chakib-belgaid/ComfyUI-autosize": { "stars": 0, "last_update": "2024-06-14 07:13:20", - "author_account_age_days": 4000 + "author_account_age_days": 4035 }, "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": { "stars": 0, "last_update": "2024-07-01 12:40:52", - "author_account_age_days": 4000 + "author_account_age_days": 4035 }, "https://github.com/chandlergis/ComfyUI-IMG_Query": { "stars": 1, "last_update": "2024-05-23 01:25:57", - "author_account_age_days": 520 + "author_account_age_days": 555 }, "https://github.com/chandlergis/ComfyUI_EmojiOverlay": { "stars": 0, "last_update": "2024-06-14 09:05:03", - "author_account_age_days": 520 + "author_account_age_days": 555 }, "https://github.com/changwook987/ComfyUI-Small-Utility": { "stars": 1, - "last_update": "2024-11-16 16:03:42", - "author_account_age_days": 1357 + "last_update": "2024-12-30 00:39:14", + "author_account_age_days": 1392 }, "https://github.com/chaojie/ComfyUI-AniPortrait": { - "stars": 248, + "stars": 250, "last_update": "2024-05-22 22:26:03", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper": { - "stars": 18, + "stars": 19, "last_update": "2024-06-14 09:07:23", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Champ": { "stars": 24, "last_update": "2024-05-22 22:26:47", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-DragAnything": { "stars": 68, "last_update": "2024-06-14 10:23:53", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-DragNUWA": { - "stars": 394, + "stars": 397, "last_update": "2024-06-14 10:25:01", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-DynamiCrafter": { - "stars": 126, + "stars": 128, "last_update": "2024-06-14 10:23:59", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-EasyAnimate": { - "stars": 49, + "stars": 51, "last_update": "2024-05-22 22:24:00", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Gemma": { - "stars": 5, + "stars": 6, "last_update": "2024-05-22 22:27:47", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-I2VGEN-XL": { - "stars": 28, + "stars": 29, "last_update": "2024-06-14 09:06:10", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Img2Img-Turbo": { "stars": 35, "last_update": "2024-05-22 22:26:30", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-LaVIT": { "stars": 12, "last_update": "2024-06-14 10:27:44", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-LightGlue": { "stars": 50, "last_update": "2024-01-20 16:53:51", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": { "stars": 211, "last_update": "2024-06-10 20:16:06", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": { "stars": 1, "last_update": "2024-06-14 10:26:15", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-MotionCtrl": { "stars": 136, "last_update": "2024-06-14 10:26:02", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": { "stars": 83, "last_update": "2024-06-14 10:26:30", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-MuseTalk": { - "stars": 215, + "stars": 223, "last_update": "2024-05-22 22:25:07", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-MuseV": { - "stars": 147, + "stars": 152, "last_update": "2024-05-22 22:25:31", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Open-Sora": { "stars": 99, "last_update": "2024-07-19 05:13:25", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Open-Sora-Plan": { "stars": 51, "last_update": "2024-05-29 16:15:10", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Panda3d": { "stars": 14, "last_update": "2024-06-14 10:28:47", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Pymunk": { "stars": 16, "last_update": "2024-06-14 12:02:32", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-RAFT": { "stars": 26, "last_update": "2024-06-14 11:02:00", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-SimDA": { "stars": 13, "last_update": "2024-06-14 12:02:39", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Trajectory": { - "stars": 5, + "stars": 6, "last_update": "2024-05-22 22:27:12", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention": { "stars": 17, "last_update": "2024-06-14 10:28:16", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI-dust3r": { - "stars": 17, + "stars": 19, "last_update": "2024-05-22 22:27:33", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaojie/ComfyUI_StreamingT2V": { "stars": 37, "last_update": "2024-06-14 10:26:21", - "author_account_age_days": 4998 + "author_account_age_days": 5032 }, "https://github.com/chaosaiart/Chaosaiart-Nodes": { - "stars": 75, + "stars": 78, "last_update": "2024-10-03 16:28:57", - "author_account_age_days": 498 + "author_account_age_days": 533 }, "https://github.com/chenbaiyujason/ComfyUI_StepFun": { - "stars": 4, + "stars": 5, "last_update": "2024-12-05 14:45:27", - "author_account_age_days": 1899 + "author_account_age_days": 1933 }, "https://github.com/chenpx976/ComfyUI-RunRunRun": { "stars": 0, "last_update": "2024-05-23 01:19:37", - "author_account_age_days": 3579 + "author_account_age_days": 3614 + }, + "https://github.com/cherninlab/logo-generator-comfyui": { + "stars": 2, + "last_update": "2024-12-22 15:45:31", + "author_account_age_days": 296 }, "https://github.com/chesnokovivan/ComfyUI-Novakid": { "stars": 0, "last_update": "2024-06-10 20:15:56", - "author_account_age_days": 1694 + "author_account_age_days": 1729 }, "https://github.com/chflame163/ComfyUI_CatVTON_Wrapper": { - "stars": 253, - "last_update": "2024-09-29 04:09:10", - "author_account_age_days": 608 + "stars": 276, + "last_update": "2025-01-01 12:55:16", + "author_account_age_days": 643 }, "https://github.com/chflame163/ComfyUI_FaceSimilarity": { - "stars": 20, + "stars": 25, "last_update": "2024-05-23 12:48:18", - "author_account_age_days": 608 + "author_account_age_days": 643 }, "https://github.com/chflame163/ComfyUI_LayerStyle": { - "stars": 1617, - "last_update": "2024-12-05 16:09:19", - "author_account_age_days": 608 + "stars": 1754, + "last_update": "2024-12-29 12:31:22", + "author_account_age_days": 643 }, "https://github.com/chflame163/ComfyUI_LayerStyle_Advance": { - "stars": 13, - "last_update": "2024-12-05 15:30:26", - "author_account_age_days": 608 + "stars": 109, + "last_update": "2025-01-05 06:56:21", + "author_account_age_days": 643 }, "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": { "stars": 25, "last_update": "2024-05-25 02:39:56", - "author_account_age_days": 608 + "author_account_age_days": 643 }, "https://github.com/chflame163/ComfyUI_OmniGen_Wrapper": { - "stars": 121, + "stars": 128, "last_update": "2024-11-06 09:00:01", - "author_account_age_days": 608 + "author_account_age_days": 643 }, "https://github.com/chflame163/ComfyUI_WordCloud": { - "stars": 95, + "stars": 99, "last_update": "2024-05-25 02:41:06", - "author_account_age_days": 608 + "author_account_age_days": 643 }, "https://github.com/chibiace/ComfyUI-Chibi-Nodes": { - "stars": 48, + "stars": 53, "last_update": "2024-08-27 06:39:31", - "author_account_age_days": 3013 + "author_account_age_days": 3048 }, "https://github.com/choey/Comfy-Topaz": { - "stars": 64, + "stars": 140, "last_update": "2024-09-28 08:02:47", - "author_account_age_days": 5687 + "author_account_age_days": 5722 }, "https://github.com/chris-arsenault/ComfyUI-AharaNodes": { "stars": 1, - "last_update": "2024-10-25 19:13:30", - "author_account_age_days": 4137 + "last_update": "2024-12-25 16:45:58", + "author_account_age_days": 4171 }, "https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI": { "stars": 8, "last_update": "2024-07-31 13:51:59", - "author_account_age_days": 1961 + "author_account_age_days": 1995 }, "https://github.com/chrisfreilich/virtuoso-nodes": { - "stars": 70, + "stars": 71, "last_update": "2024-08-26 00:06:51", - "author_account_age_days": 896 + "author_account_age_days": 931 }, "https://github.com/chrisgoringe/cg-controller": { - "stars": 39, - "last_update": "2024-12-05 03:03:42", - "author_account_age_days": 4229 + "stars": 54, + "last_update": "2025-01-09 06:23:28", + "author_account_age_days": 4264 }, "https://github.com/chrisgoringe/cg-image-picker": { - "stars": 272, + "stars": 292, "last_update": "2024-11-29 02:05:30", - "author_account_age_days": 4229 + "author_account_age_days": 4264 }, "https://github.com/chrisgoringe/cg-noisetools": { "stars": 9, - "last_update": "2024-08-15 02:44:00", - "author_account_age_days": 4229 + "last_update": "2024-12-17 04:09:18", + "author_account_age_days": 4264 }, "https://github.com/chrisgoringe/cg-prompt-info": { "stars": 29, "last_update": "2024-05-22 21:07:33", - "author_account_age_days": 4229 + "author_account_age_days": 4264 }, "https://github.com/chrisgoringe/cg-use-everywhere": { - "stars": 518, - "last_update": "2024-11-28 01:29:32", - "author_account_age_days": 4229 + "stars": 560, + "last_update": "2024-12-30 03:55:54", + "author_account_age_days": 4264 }, "https://github.com/chrish-slingshot/CrasHUtils": { "stars": 12, "last_update": "2024-10-29 22:55:39", - "author_account_age_days": 765 + "author_account_age_days": 799 }, "https://github.com/chrissy0/chris-comfyui-nodes": { "stars": 1, "last_update": "2024-09-17 16:09:35", - "author_account_age_days": 2219 + "author_account_age_days": 2254 }, "https://github.com/christian-byrne/audio-separation-nodes-comfyui": { - "stars": 168, - "last_update": "2024-08-21 15:03:28", - "author_account_age_days": 1513 + "stars": 175, + "last_update": "2025-01-05 19:12:48", + "author_account_age_days": 1547 }, "https://github.com/christian-byrne/comfyui-default-values-manager": { "stars": 10, "last_update": "2024-07-28 20:52:51", - "author_account_age_days": 1513 + "author_account_age_days": 1547 }, "https://github.com/christian-byrne/comfyui-search-navigation": { "stars": 8, "last_update": "2024-06-26 04:41:12", - "author_account_age_days": 1513 + "author_account_age_days": 1547 }, "https://github.com/christian-byrne/img2colors-comfyui-node": { "stars": 9, - "last_update": "2024-08-18 07:00:11", - "author_account_age_days": 1513 + "last_update": "2025-01-05 18:48:59", + "author_account_age_days": 1547 }, "https://github.com/christian-byrne/img2txt-comfyui-nodes": { - "stars": 75, + "stars": 79, "last_update": "2024-08-09 11:19:02", - "author_account_age_days": 1513 + "author_account_age_days": 1547 }, "https://github.com/christian-byrne/size-match-compositing-nodes": { "stars": 5, - "last_update": "2024-07-23 23:26:48", - "author_account_age_days": 1513 + "last_update": "2025-01-05 17:45:02", + "author_account_age_days": 1547 }, "https://github.com/christian-byrne/youtube-dl-comfyui": { "stars": 4, "last_update": "2024-10-01 16:32:14", - "author_account_age_days": 1513 + "author_account_age_days": 1547 + }, + "https://github.com/ciga2011/ComfyUI-MarkItDown": { + "stars": 2, + "last_update": "2024-12-28 15:32:34", + "author_account_age_days": 4398 }, "https://github.com/ciri/comfyui-model-downloader": { - "stars": 28, - "last_update": "2024-11-07 15:29:52", - "author_account_age_days": 5535 + "stars": 34, + "last_update": "2025-01-04 08:32:06", + "author_account_age_days": 5569 }, "https://github.com/city96/ComfyUI-GGUF": { - "stars": 1119, - "last_update": "2024-12-05 02:19:12", - "author_account_age_days": 662 + "stars": 1294, + "last_update": "2025-01-08 15:35:24", + "author_account_age_days": 696 }, "https://github.com/city96/ComfyUI_ColorMod": { - "stars": 81, + "stars": 86, "last_update": "2024-08-06 22:38:54", - "author_account_age_days": 662 + "author_account_age_days": 696 }, "https://github.com/city96/ComfyUI_DiT": { "stars": 5, "last_update": "2024-08-06 22:44:33", - "author_account_age_days": 662 + "author_account_age_days": 696 }, "https://github.com/city96/ComfyUI_ExtraModels": { - "stars": 399, - "last_update": "2024-12-05 18:19:37", - "author_account_age_days": 662 + "stars": 448, + "last_update": "2024-12-17 06:44:05", + "author_account_age_days": 696 }, "https://github.com/city96/ComfyUI_NetDist": { - "stars": 352, + "stars": 375, "last_update": "2024-05-22 18:05:10", - "author_account_age_days": 662 + "author_account_age_days": 696 }, "https://github.com/city96/SD-Latent-Interposer": { - "stars": 250, + "stars": 263, "last_update": "2024-08-06 22:01:47", - "author_account_age_days": 662 + "author_account_age_days": 696 }, "https://github.com/city96/SD-Latent-Upscaler": { - "stars": 136, + "stars": 140, "last_update": "2024-05-22 18:05:50", - "author_account_age_days": 662 + "author_account_age_days": 696 }, "https://github.com/civen-cn/ComfyUI-PaddleOcr": { - "stars": 3, - "last_update": "2024-10-09 15:04:50", - "author_account_age_days": 2669 + "stars": 4, + "last_update": "2024-12-31 19:11:04", + "author_account_age_days": 2704 + }, + "https://github.com/civen-cn/ComfyUI-Whisper-Translator": { + "stars": 4, + "last_update": "2025-01-04 03:37:06", + "author_account_age_days": 2704 }, "https://github.com/civitai/civitai_comfy_nodes": { - "stars": 107, + "stars": 112, "last_update": "2024-08-25 03:32:49", - "author_account_age_days": 763 + "author_account_age_days": 797 }, "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes": { "stars": 1, "last_update": "2024-06-14 09:03:10", - "author_account_age_days": 2865 + "author_account_age_days": 2899 }, "https://github.com/clhui/ComfyUi-clh-Tool": { - "stars": 2, - "last_update": "2024-12-02 10:12:37", - "author_account_age_days": 2993 + "stars": 3, + "last_update": "2024-12-28 10:22:00", + "author_account_age_days": 3028 + }, + "https://github.com/cnbjjj/ComfyUI-Jtils": { + "stars": 3, + "last_update": "2024-12-17 04:00:58", + "author_account_age_days": 373 }, "https://github.com/codecringebinge/ComfyUI-Arrow-Key-Canvas-Navigation": { "stars": 3, "last_update": "2024-09-29 22:35:01", - "author_account_age_days": 2962 + "author_account_age_days": 2997 + }, + "https://github.com/codeprimate/ComfyUI-MaskContourProcessor": { + "stars": 3, + "last_update": "2024-12-16 06:53:08", + "author_account_age_days": 6048 }, "https://github.com/comfyanonymous/ComfyUI": { - "stars": 59092, - "last_update": "2024-12-05 08:14:47", - "author_account_age_days": 713 + "stars": 62915, + "last_update": "2025-01-09 12:12:32", + "author_account_age_days": 748 }, "https://github.com/comfyanonymous/ComfyUI_TensorRT": { - "stars": 526, + "stars": 537, "last_update": "2024-10-10 00:23:55", - "author_account_age_days": 713 + "author_account_age_days": 748 }, "https://github.com/comfyanonymous/ComfyUI_experiments": { - "stars": 164, + "stars": 169, "last_update": "2024-05-22 15:29:49", - "author_account_age_days": 713 + "author_account_age_days": 748 }, "https://github.com/concarne000/ConCarneNode": { "stars": 4, "last_update": "2024-05-22 22:10:18", - "author_account_age_days": 2065 + "author_account_age_days": 2100 }, "https://github.com/conquestace/ComfyUI-ImageUploader": { "stars": 2, "last_update": "2024-05-23 01:25:49", - "author_account_age_days": 4773 + "author_account_age_days": 4808 }, "https://github.com/coolzilj/ComfyUI-LJNodes": { - "stars": 81, + "stars": 83, "last_update": "2024-06-15 01:57:32", - "author_account_age_days": 4827 + "author_account_age_days": 4862 }, "https://github.com/coolzilj/ComfyUI-Photopea": { - "stars": 103, + "stars": 124, "last_update": "2024-06-14 08:10:57", - "author_account_age_days": 4827 + "author_account_age_days": 4862 }, "https://github.com/coreyryanhanson/ComfyQR": { - "stars": 67, + "stars": 68, "last_update": "2024-08-09 16:58:16", - "author_account_age_days": 3220 + "author_account_age_days": 3255 }, "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes": { "stars": 11, "last_update": "2024-08-09 16:59:00", - "author_account_age_days": 3220 + "author_account_age_days": 3255 }, "https://github.com/cozy-comfyui/cozy_comm": { "stars": 1, - "last_update": "2024-07-18 18:01:38", - "author_account_age_days": 230 + "last_update": "2024-12-28 00:30:43", + "author_account_age_days": 265 }, "https://github.com/cozy-comfyui/cozy_link_toggle": { "stars": 5, - "last_update": "2024-09-18 18:51:37", - "author_account_age_days": 230 + "last_update": "2025-01-09 05:07:57", + "author_account_age_days": 265 }, "https://github.com/cozymantis/cozy-utils-comfyui-nodes": { "stars": 3, "last_update": "2024-07-07 15:38:05", - "author_account_age_days": 272 + "author_account_age_days": 307 }, "https://github.com/cozymantis/human-parser-comfyui-node": { - "stars": 77, + "stars": 81, "last_update": "2024-07-07 15:31:17", - "author_account_age_days": 272 + "author_account_age_days": 307 }, "https://github.com/cozymantis/pose-generator-comfyui-node": { - "stars": 64, + "stars": 66, "last_update": "2024-07-07 15:22:45", - "author_account_age_days": 272 + "author_account_age_days": 307 }, "https://github.com/cr7Por/ComfyUI_DepthFlow": { "stars": 6, "last_update": "2024-09-16 09:10:08", - "author_account_age_days": 1289 + "author_account_age_days": 1324 }, "https://github.com/crystian/ComfyUI-Crystools": { - "stars": 851, + "stars": 909, "last_update": "2024-11-09 16:30:13", - "author_account_age_days": 4281 + "author_account_age_days": 4316 }, "https://github.com/crystian/ComfyUI-Crystools-save": { - "stars": 38, + "stars": 40, "last_update": "2024-09-24 23:39:03", - "author_account_age_days": 4281 + "author_account_age_days": 4316 }, "https://github.com/cubiq/Block_Patcher_ComfyUI": { - "stars": 71, + "stars": 75, "last_update": "2024-09-22 09:49:06", - "author_account_age_days": 5175 + "author_account_age_days": 5210 }, "https://github.com/cubiq/ComfyUI_FaceAnalysis": { - "stars": 347, + "stars": 370, "last_update": "2024-10-08 12:32:29", - "author_account_age_days": 5175 + "author_account_age_days": 5210 }, "https://github.com/cubiq/ComfyUI_IPAdapter_plus": { - "stars": 4243, + "stars": 4437, "last_update": "2024-09-13 13:04:50", - "author_account_age_days": 5175 + "author_account_age_days": 5210 }, "https://github.com/cubiq/ComfyUI_InstantID": { - "stars": 1331, + "stars": 1401, "last_update": "2024-09-30 08:54:05", - "author_account_age_days": 5175 + "author_account_age_days": 5210 }, "https://github.com/cubiq/ComfyUI_SimpleMath": { - "stars": 19, + "stars": 20, "last_update": "2024-06-14 09:02:50", - "author_account_age_days": 5175 + "author_account_age_days": 5210 }, "https://github.com/cubiq/ComfyUI_essentials": { - "stars": 626, - "last_update": "2024-11-20 14:32:02", - "author_account_age_days": 5175 + "stars": 667, + "last_update": "2024-12-07 09:40:28", + "author_account_age_days": 5210 }, "https://github.com/cubiq/PuLID_ComfyUI": { - "stars": 729, + "stars": 761, "last_update": "2024-10-05 16:21:01", - "author_account_age_days": 5175 + "author_account_age_days": 5210 }, "https://github.com/cuongloveit/comfy_http_request": { - "stars": 1, + "stars": 2, "last_update": "2024-06-14 11:00:11", - "author_account_age_days": 3416 + "author_account_age_days": 3451 }, "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations": { "stars": 5, "last_update": "2024-05-28 13:09:32", - "author_account_age_days": 2094 + "author_account_age_days": 2129 }, "https://github.com/czcz1024/Comfyui-FaceCompare": { "stars": 0, "last_update": "2024-06-14 07:13:32", - "author_account_age_days": 4398 + "author_account_age_days": 4433 }, "https://github.com/da2el-ai/ComfyUI-d2-send-eagle": { "stars": 12, - "last_update": "2024-11-23 16:59:58", - "author_account_age_days": 554 + "last_update": "2024-12-31 12:13:46", + "author_account_age_days": 588 }, "https://github.com/da2el-ai/ComfyUI-d2-size-selector": { "stars": 5, "last_update": "2024-10-02 14:04:20", - "author_account_age_days": 554 + "author_account_age_days": 588 }, "https://github.com/da2el-ai/ComfyUI-d2-steps": { "stars": 6, "last_update": "2024-10-02 14:03:14", - "author_account_age_days": 554 + "author_account_age_days": 588 }, "https://github.com/da2el-ai/ComfyUI-d2-xyplot-utils": { "stars": 6, "last_update": "2024-10-02 14:00:58", - "author_account_age_days": 554 + "author_account_age_days": 588 }, "https://github.com/da2el-ai/D2-nodes-ComfyUI": { - "stars": 14, - "last_update": "2024-12-05 04:41:09", - "author_account_age_days": 554 + "stars": 20, + "last_update": "2025-01-06 11:00:20", + "author_account_age_days": 588 }, "https://github.com/dadoirie/ComfyUI_Dados_Nodes": { "stars": 1, "last_update": "2024-08-23 20:46:12", - "author_account_age_days": 1754 + "author_account_age_days": 1789 }, "https://github.com/dafeng012/comfyui-imgmake": { - "stars": 9, + "stars": 10, "last_update": "2024-11-03 17:38:47", - "author_account_age_days": 840 + "author_account_age_days": 875 }, "https://github.com/dagthomas/comfyui_dagthomas": { - "stars": 206, - "last_update": "2024-10-06 20:44:01", - "author_account_age_days": 4236 + "stars": 223, + "last_update": "2024-12-20 22:53:53", + "author_account_age_days": 4271 }, "https://github.com/daniabib/ComfyUI_ProPainter_Nodes": { - "stars": 248, - "last_update": "2024-07-08 21:59:15", - "author_account_age_days": 2569 + "stars": 264, + "last_update": "2024-12-22 13:50:25", + "author_account_age_days": 2603 }, "https://github.com/daniel-lewis-ab/ComfyUI-Llama": { - "stars": 43, + "stars": 44, "last_update": "2024-06-29 19:55:42", - "author_account_age_days": 3516 + "author_account_age_days": 3551 }, "https://github.com/daniel-lewis-ab/ComfyUI-TTS": { "stars": 22, "last_update": "2024-06-14 08:09:49", - "author_account_age_days": 3516 + "author_account_age_days": 3551 }, "https://github.com/darkpixel/darkprompts": { "stars": 8, - "last_update": "2024-12-05 14:08:22", - "author_account_age_days": 5488 + "last_update": "2024-12-14 15:01:39", + "author_account_age_days": 5523 }, "https://github.com/darth-veitcher/comfydv": { "stars": 2, "last_update": "2024-10-20 12:43:46", - "author_account_age_days": 4593 + "author_account_age_days": 4627 }, "https://github.com/daryltucker/ComfyUI-LoadFiles": { "stars": 1, "last_update": "2024-08-31 23:59:44", - "author_account_age_days": 4629 + "author_account_age_days": 4663 }, "https://github.com/dave-palt/comfyui_DSP_imagehelpers": { "stars": 0, "last_update": "2024-05-22 23:12:11", - "author_account_age_days": 322 + "author_account_age_days": 357 }, "https://github.com/daxcay/ComfyUI-DataSet": { - "stars": 40, - "last_update": "2024-11-28 09:44:32", - "author_account_age_days": 259 + "stars": 42, + "last_update": "2024-12-06 16:03:18", + "author_account_age_days": 294 }, "https://github.com/daxcay/ComfyUI-JDCN": { - "stars": 93, + "stars": 100, "last_update": "2024-10-30 18:01:05", - "author_account_age_days": 259 + "author_account_age_days": 294 }, "https://github.com/daxcay/ComfyUI-NODEJS": { "stars": 10, "last_update": "2024-11-28 09:46:29", - "author_account_age_days": 259 + "author_account_age_days": 294 }, "https://github.com/daxcay/ComfyUI-Nexus": { - "stars": 74, + "stars": 78, "last_update": "2024-11-28 20:28:24", - "author_account_age_days": 259 + "author_account_age_days": 294 }, "https://github.com/daxcay/ComfyUI-TG": { - "stars": 12, + "stars": 14, "last_update": "2024-11-28 09:45:12", - "author_account_age_days": 259 + "author_account_age_days": 294 }, "https://github.com/daxcay/ComfyUI-WA": { "stars": 49, "last_update": "2024-11-28 09:44:50", - "author_account_age_days": 259 + "author_account_age_days": 294 }, "https://github.com/daxcay/ComfyUI-YouTubeVideoPlayer": { "stars": 6, "last_update": "2024-11-28 09:45:30", - "author_account_age_days": 259 + "author_account_age_days": 294 }, "https://github.com/dchatel/comfyui_davcha": { "stars": 2, - "last_update": "2024-11-28 17:51:33", - "author_account_age_days": 4700 + "last_update": "2024-12-13 15:07:29", + "author_account_age_days": 4734 }, "https://github.com/dchatel/comfyui_facetools": { - "stars": 81, - "last_update": "2024-08-06 17:11:56", - "author_account_age_days": 4700 + "stars": 87, + "last_update": "2025-01-06 11:51:33", + "author_account_age_days": 4734 }, "https://github.com/denfrost/Den_ComfyUI_Workflow": { "stars": 4, "last_update": "2024-06-20 14:57:57", - "author_account_age_days": 3661 + "author_account_age_days": 3696 }, "https://github.com/deroberon/StableZero123-comfyui": { - "stars": 153, + "stars": 157, "last_update": "2024-05-22 22:09:53", - "author_account_age_days": 5460 + "author_account_age_days": 5495 }, "https://github.com/deroberon/demofusion-comfyui": { "stars": 87, "last_update": "2024-05-22 22:09:42", - "author_account_age_days": 5460 + "author_account_age_days": 5495 }, "https://github.com/dfghsdh/ComfyUI_FluxPromptGen": { - "stars": 12, + "stars": 13, "last_update": "2024-09-23 07:51:56", - "author_account_age_days": 73 + "author_account_age_days": 108 }, "https://github.com/dfl/comfyui-clip-with-break": { - "stars": 11, + "stars": 10, "last_update": "2024-05-22 23:23:15", - "author_account_age_days": 6138 + "author_account_age_days": 6173 }, "https://github.com/dfl/comfyui-tcd-scheduler": { "stars": 83, "last_update": "2024-05-22 23:23:28", - "author_account_age_days": 6138 + "author_account_age_days": 6173 }, "https://github.com/diStyApps/ComfyUI-disty-Flow": { - "stars": 301, - "last_update": "2024-12-05 17:51:57", - "author_account_age_days": 4368 + "stars": 443, + "last_update": "2025-01-04 18:03:37", + "author_account_age_days": 4403 }, "https://github.com/diStyApps/ComfyUI_FrameMaker": { - "stars": 14, + "stars": 15, "last_update": "2024-05-23 00:11:33", - "author_account_age_days": 4368 + "author_account_age_days": 4403 }, "https://github.com/dicksondickson/ComfyUI-Dickson-Nodes": { "stars": 10, "last_update": "2024-09-18 04:30:33", - "author_account_age_days": 4155 + "author_account_age_days": 4190 }, "https://github.com/digitaljohn/comfyui-propost": { - "stars": 152, - "last_update": "2024-08-11 12:33:22", - "author_account_age_days": 4682 + "stars": 159, + "last_update": "2024-12-25 00:41:33", + "author_account_age_days": 4717 }, "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": { - "stars": 216, + "stars": 234, "last_update": "2024-07-31 13:44:39", - "author_account_age_days": 3579 + "author_account_age_days": 3613 }, "https://github.com/dionren/ComfyUI-Pro-Export-Tool": { "stars": 3, "last_update": "2024-10-11 08:26:18", - "author_account_age_days": 4050 + "author_account_age_days": 4085 }, "https://github.com/diontimmer/ComfyUI-Vextra-Nodes": { - "stars": 68, + "stars": 71, "last_update": "2024-06-20 16:48:44", - "author_account_age_days": 4935 + "author_account_age_days": 4970 }, "https://github.com/discopixel-studio/comfyui-discopixel": { "stars": 12, "last_update": "2024-09-30 00:46:13", - "author_account_age_days": 509 + "author_account_age_days": 544 }, "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5": { - "stars": 6, + "stars": 7, "last_update": "2024-06-14 08:12:05", - "author_account_age_days": 1634 + "author_account_age_days": 1669 }, "https://github.com/discus0434/comfyui-caching-embeddings": { "stars": 1, "last_update": "2024-06-14 08:59:36", - "author_account_age_days": 1634 + "author_account_age_days": 1669 }, "https://github.com/discus0434/comfyui-flux-accelerator": { - "stars": 110, - "last_update": "2024-10-21 07:57:15", - "author_account_age_days": 1634 + "stars": 118, + "last_update": "2024-12-19 14:39:39", + "author_account_age_days": 1669 }, "https://github.com/djbielejeski/a-person-mask-generator": { - "stars": 277, - "last_update": "2024-09-08 13:44:29", - "author_account_age_days": 4448 + "stars": 297, + "last_update": "2025-01-05 19:29:53", + "author_account_age_days": 4483 }, "https://github.com/dmMaze/sketch2manga": { - "stars": 38, + "stars": 39, "last_update": "2024-06-30 03:27:55", - "author_account_age_days": 2014 + "author_account_age_days": 2048 }, "https://github.com/dmarx/ComfyUI-AudioReactive": { "stars": 10, "last_update": "2024-05-22 22:12:53", - "author_account_age_days": 4669 + "author_account_age_days": 4703 }, "https://github.com/dmarx/ComfyUI-Keyframed": { "stars": 88, "last_update": "2024-07-01 01:41:23", - "author_account_age_days": 4669 - }, - "https://github.com/doomy23/ComfyUI-D00MYsNodes": { - "stars": 12, - "last_update": "2024-09-03 00:13:10", - "author_account_age_days": 4338 + "author_account_age_days": 4703 }, "https://github.com/drago87/ComfyUI_Dragos_Nodes": { "stars": 3, "last_update": "2024-05-22 21:32:15", - "author_account_age_days": 3934 + "author_account_age_days": 3969 }, "https://github.com/drmbt/comfyui-dreambait-nodes": { "stars": 3, - "last_update": "2024-11-08 10:21:53", - "author_account_age_days": 3942 + "last_update": "2025-01-07 16:45:44", + "author_account_age_days": 3976 }, "https://github.com/drustan-hawk/primitive-types": { "stars": 7, "last_update": "2024-08-01 17:44:51", - "author_account_age_days": 453 + "author_account_age_days": 488 }, "https://github.com/ducido/ObjectFusion_ComfyUI_nodes": { "stars": 2, "last_update": "2024-08-27 01:08:12", - "author_account_age_days": 693 + "author_account_age_days": 728 }, "https://github.com/dymokomi/comfyui_dygen": { "stars": 1, "last_update": "2024-11-28 20:08:13", - "author_account_age_days": 736 + "author_account_age_days": 771 }, "https://github.com/e7mac/ComfyUI-ShadertoyGL": { "stars": 2, "last_update": "2024-06-20 14:52:42", - "author_account_age_days": 4967 + "author_account_age_days": 5002 }, "https://github.com/ealkanat/comfyui-easy-padding": { - "stars": 15, - "last_update": "2024-07-31 18:03:33", - "author_account_age_days": 2627 + "stars": 16, + "last_update": "2024-12-31 02:38:22", + "author_account_age_days": 2662 }, "https://github.com/eastoc/ComfyUI_SemanticSAM": { "stars": 5, "last_update": "2024-08-13 19:24:33", - "author_account_age_days": 2882 + "author_account_age_days": 2917 }, "https://github.com/edelvarden/ComfyUI-ImageMetadataExtension": { - "stars": 9, - "last_update": "2024-11-12 12:43:52", - "author_account_age_days": 2297 + "stars": 12, + "last_update": "2025-01-05 02:37:30", + "author_account_age_days": 2332 }, "https://github.com/edenartlab/eden_comfy_pipelines": { - "stars": 67, - "last_update": "2024-12-04 19:53:51", - "author_account_age_days": 437 + "stars": 73, + "last_update": "2024-12-20 10:50:09", + "author_account_age_days": 471 }, "https://github.com/edenartlab/sd-lora-trainer": { - "stars": 26, - "last_update": "2024-09-12 08:06:41", - "author_account_age_days": 437 + "stars": 31, + "last_update": "2024-12-20 10:46:20", + "author_account_age_days": 471 }, "https://github.com/educator-art/ComfyUI-Load-DirectoryFiles": { "stars": 4, "last_update": "2024-10-11 17:31:45", - "author_account_age_days": 366 + "author_account_age_days": 400 }, "https://github.com/emojiiii/ComfyUI_Emojiiii_Custom_Nodes": { "stars": 1, "last_update": "2024-09-03 06:55:04", - "author_account_age_days": 2687 + "author_account_age_days": 2722 + }, + "https://github.com/envy-ai/ComfyUI-ConDelta": { + "stars": 167, + "last_update": "2024-12-10 19:10:11", + "author_account_age_days": 154 }, "https://github.com/erosDiffusion/ComfyUI-enricos-nodes": { - "stars": 329, - "last_update": "2024-09-24 15:03:43", - "author_account_age_days": 161 + "stars": 349, + "last_update": "2024-12-19 09:17:18", + "author_account_age_days": 196 }, "https://github.com/evanspearman/ComfyMath": { - "stars": 88, + "stars": 99, "last_update": "2024-09-02 17:24:27", - "author_account_age_days": 4403 + "author_account_age_days": 4437 }, "https://github.com/evolox/ComfyUI-GeneraNodes": { - "stars": 1, - "last_update": "2024-11-14 15:20:44", - "author_account_age_days": 448 + "stars": 2, + "last_update": "2025-01-08 16:09:12", + "author_account_age_days": 482 }, "https://github.com/exdysa/comfyui-selector": { "stars": 5, - "last_update": "2024-08-24 00:33:03", - "author_account_age_days": 1160 + "last_update": "2024-12-07 21:07:28", + "author_account_age_days": 1194 }, "https://github.com/exectails/comfyui-et_dynamicprompts": { "stars": 3, "last_update": "2024-11-29 22:37:19", - "author_account_age_days": 4082 + "author_account_age_days": 4117 }, "https://github.com/exectails/comfyui-et_infoutils": { - "stars": 2, + "stars": 3, "last_update": "2024-11-29 17:27:49", - "author_account_age_days": 4082 + "author_account_age_days": 4117 }, "https://github.com/exectails/comfyui-et_stringutils": { "stars": 1, "last_update": "2024-11-26 20:26:14", - "author_account_age_days": 4082 + "author_account_age_days": 4117 }, "https://github.com/ez-af/ComfyUI-EZ-AF-Nodes": { "stars": 2, "last_update": "2024-10-02 07:38:18", - "author_account_age_days": 98 + "author_account_age_days": 133 }, "https://github.com/fablestudio/ComfyUI-Showrunner-Utils": { "stars": 1, "last_update": "2024-11-16 21:13:22", - "author_account_age_days": 2213 + "author_account_age_days": 2247 + }, + "https://github.com/facok/ComfyUI-HunyuanVideoMultiLora": { + "stars": 45, + "last_update": "2025-01-08 11:57:35", + "author_account_age_days": 657 + }, + "https://github.com/facok/ComfyUI-TeaCacheHunyuanVideo": { + "stars": 36, + "last_update": "2025-01-08 10:34:12", + "author_account_age_days": 657 + }, + "https://github.com/fairy-root/ComfyUI-GLHF": { + "stars": 3, + "last_update": "2024-12-27 14:24:36", + "author_account_age_days": 2133 }, "https://github.com/fairy-root/Flux-Prompt-Generator": { - "stars": 130, + "stars": 150, "last_update": "2024-08-25 23:16:12", - "author_account_age_days": 2098 + "author_account_age_days": 2133 }, "https://github.com/fairy-root/comfyui-ollama-llms": { "stars": 12, - "last_update": "2024-08-21 03:39:13", - "author_account_age_days": 2098 + "last_update": "2024-12-29 12:20:04", + "author_account_age_days": 2133 }, "https://github.com/fallingmeteorite/nsfw-image-check-comfyui": { "stars": 3, - "last_update": "2024-11-26 10:23:09", - "author_account_age_days": 1253 + "last_update": "2024-12-23 23:47:08", + "author_account_age_days": 1287 }, "https://github.com/fashn-AI/ComfyUI-FASHN": { - "stars": 13, - "last_update": "2024-12-01 10:05:56", - "author_account_age_days": 520 + "stars": 17, + "last_update": "2024-12-23 14:07:26", + "author_account_age_days": 554 }, "https://github.com/fearnworks/ComfyUI_FearnworksNodes": { "stars": 20, "last_update": "2024-08-05 01:50:04", - "author_account_age_days": 726 + "author_account_age_days": 761 }, "https://github.com/fexli/fexli-util-node-comfyui": { "stars": 3, "last_update": "2024-05-22 21:27:36", - "author_account_age_days": 1723 + "author_account_age_days": 1758 }, "https://github.com/fexploit/ComfyUI-AutoLabel": { - "stars": 5, + "stars": 6, "last_update": "2024-06-14 08:09:41", - "author_account_age_days": 5208 + "author_account_age_days": 5243 }, "https://github.com/fexploit/ComfyUI-AutoTrimBG": { - "stars": 2, + "stars": 3, "last_update": "2024-05-24 20:38:15", - "author_account_age_days": 5208 + "author_account_age_days": 5243 }, "https://github.com/fexploit/ComfyUI-Classifier": { "stars": 1, "last_update": "2024-06-14 16:58:31", - "author_account_age_days": 5208 + "author_account_age_days": 5243 }, "https://github.com/filipemeneses/comfy_pixelization": { - "stars": 38, - "last_update": "2024-05-22 20:59:16", - "author_account_age_days": 3640 + "stars": 42, + "last_update": "2024-12-31 13:07:59", + "author_account_age_days": 3675 }, "https://github.com/filliptm/ComfyUI_FL-Trainer": { - "stars": 143, + "stars": 148, "last_update": "2024-10-18 00:20:18", - "author_account_age_days": 1900 + "author_account_age_days": 1935 }, "https://github.com/filliptm/ComfyUI_Fill-Nodes": { - "stars": 317, - "last_update": "2024-12-03 09:52:37", - "author_account_age_days": 1900 + "stars": 330, + "last_update": "2025-01-03 07:17:23", + "author_account_age_days": 1935 }, "https://github.com/florestefano1975/ComfyUI-Advanced-Sequence-Seed": { "stars": 2, "last_update": "2024-09-23 06:07:49", - "author_account_age_days": 358 + "author_account_age_days": 392 }, "https://github.com/florestefano1975/ComfyUI-CogVideoX": { - "stars": 11, + "stars": 12, "last_update": "2024-10-23 09:10:03", - "author_account_age_days": 358 + "author_account_age_days": 392 }, "https://github.com/florestefano1975/ComfyUI-HiDiffusion": { - "stars": 141, + "stars": 143, "last_update": "2024-05-22 00:33:06", - "author_account_age_days": 358 + "author_account_age_days": 392 }, "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite": { "stars": 4, "last_update": "2024-07-10 18:03:39", - "author_account_age_days": 358 + "author_account_age_days": 392 }, "https://github.com/florestefano1975/comfyui-portrait-master": { - "stars": 928, + "stars": 959, "last_update": "2024-11-19 12:32:15", - "author_account_age_days": 358 + "author_account_age_days": 392 }, "https://github.com/florestefano1975/comfyui-prompt-composer": { - "stars": 242, + "stars": 248, "last_update": "2024-10-03 14:30:34", - "author_account_age_days": 358 + "author_account_age_days": 392 }, "https://github.com/flowtyone/ComfyUI-Flowty-CRM": { - "stars": 144, + "stars": 147, "last_update": "2024-06-14 10:23:09", - "author_account_age_days": 438 + "author_account_age_days": 472 }, "https://github.com/flowtyone/ComfyUI-Flowty-LDSR": { - "stars": 211, + "stars": 215, "last_update": "2024-06-14 09:04:51", - "author_account_age_days": 438 + "author_account_age_days": 472 }, "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR": { - "stars": 445, + "stars": 462, "last_update": "2024-06-16 00:53:22", - "author_account_age_days": 438 + "author_account_age_days": 472 }, "https://github.com/flycarl/ComfyUI-Pixelate": { "stars": 1, "last_update": "2024-11-26 13:31:56", - "author_account_age_days": 5024 + "author_account_age_days": 5059 }, "https://github.com/flyingshutter/As_ComfyUI_CustomNodes": { "stars": 8, "last_update": "2024-05-22 18:07:19", - "author_account_age_days": 3659 + "author_account_age_days": 3694 }, "https://github.com/fmatray/ComfyUI_BattlemapGrid": { "stars": 0, "last_update": "2024-06-05 22:35:06", - "author_account_age_days": 3786 + "author_account_age_days": 3821 }, "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler": { "stars": 12, "last_update": "2024-06-20 11:51:50", - "author_account_age_days": 5272 + "author_account_age_days": 5306 }, "https://github.com/fofr/ComfyUI-Prompter-fofrAI": { - "stars": 59, + "stars": 63, "last_update": "2024-08-09 11:37:00", - "author_account_age_days": 5272 + "author_account_age_days": 5306 }, "https://github.com/fofr/comfyui-fofr-toolkit": { "stars": 5, "last_update": "2024-08-09 11:36:38", - "author_account_age_days": 5272 + "author_account_age_days": 5306 }, "https://github.com/forever22777/comfyui-self-guidance": { "stars": 8, "last_update": "2024-08-15 10:49:29", - "author_account_age_days": 489 + "author_account_age_days": 524 }, "https://github.com/foxtrot-roger/comfyui-rf-nodes": { "stars": 2, "last_update": "2024-08-13 22:01:40", - "author_account_age_days": 2485 + "author_account_age_days": 2520 }, "https://github.com/frankchieng/ComfyUI_Aniportrait": { - "stars": 53, + "stars": 55, "last_update": "2024-09-13 10:41:16", - "author_account_age_days": 605 + "author_account_age_days": 640 }, "https://github.com/frankchieng/ComfyUI_MagicClothing": { - "stars": 527, + "stars": 536, "last_update": "2024-09-04 04:57:15", - "author_account_age_days": 605 + "author_account_age_days": 640 }, "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": { "stars": 12, "last_update": "2024-06-26 03:13:32", - "author_account_age_days": 605 + "author_account_age_days": 640 }, "https://github.com/freelifehacker/ComfyUI-ImgMask2PNG": { "stars": 1, "last_update": "2024-08-28 08:32:23", - "author_account_age_days": 2322 + "author_account_age_days": 2357 }, "https://github.com/fsdymy1024/ComfyUI_fsdymy": { - "stars": 9, + "stars": 10, "last_update": "2024-07-01 17:58:52", - "author_account_age_days": 2370 + "author_account_age_days": 2405 }, "https://github.com/fssorc/ComfyUI_FFT": { - "stars": 7, + "stars": 10, "last_update": "2024-09-30 01:27:21", - "author_account_age_days": 4751 + "author_account_age_days": 4786 }, "https://github.com/fssorc/ComfyUI_FaceShaper": { - "stars": 102, + "stars": 118, "last_update": "2024-09-20 06:15:46", - "author_account_age_days": 4751 + "author_account_age_days": 4786 + }, + "https://github.com/fssorc/ComfyUI_RopeWrapper": { + "stars": 4, + "last_update": "2025-01-07 04:55:59", + "author_account_age_days": 4786 }, "https://github.com/fssorc/ComfyUI_pose_inter": { - "stars": 56, + "stars": 60, "last_update": "2024-08-28 07:25:07", - "author_account_age_days": 4751 + "author_account_age_days": 4786 }, "https://github.com/gelasdev/ComfyUI-FLUX-BFL-API": { - "stars": 22, + "stars": 26, "last_update": "2024-11-27 16:23:47", - "author_account_age_days": 2145 + "author_account_age_days": 2180 }, "https://github.com/gemell1/ComfyUI_GMIC": { "stars": 8, "last_update": "2024-05-22 21:28:51", - "author_account_age_days": 2121 + "author_account_age_days": 2156 }, "https://github.com/geocine/geocine-comfyui": { "stars": 1, "last_update": "2024-10-02 18:12:09", - "author_account_age_days": 5116 - }, - "https://github.com/get-salt-AI/SaltAI": { - "stars": 83, - "last_update": "2024-08-08 05:59:56", - "author_account_age_days": 280 - }, - "https://github.com/get-salt-AI/SaltAI_AudioViz": { - "stars": 22, - "last_update": "2024-06-29 16:16:46", - "author_account_age_days": 280 - }, - "https://github.com/get-salt-AI/SaltAI_Language_Toolkit": { - "stars": 320, - "last_update": "2024-08-15 00:30:10", - "author_account_age_days": 280 + "author_account_age_days": 5151 }, "https://github.com/ggarra13/ComfyUI-mrv2": { "stars": 3, - "last_update": "2024-11-04 10:52:05", - "author_account_age_days": 4023 + "last_update": "2024-12-29 09:24:04", + "author_account_age_days": 4058 }, "https://github.com/ginlov/segment_to_mask_comfyui": { "stars": 2, "last_update": "2024-06-14 10:23:23", - "author_account_age_days": 2176 + "author_account_age_days": 2210 }, "https://github.com/giriss/comfy-image-saver": { - "stars": 202, + "stars": 214, "last_update": "2024-05-22 20:40:55", - "author_account_age_days": 4402 + "author_account_age_days": 4437 }, "https://github.com/gisu/comfyui-foxpack": { "stars": 3, "last_update": "2024-08-20 06:43:22", - "author_account_age_days": 5163 + "author_account_age_days": 5198 }, "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER": { "stars": 0, "last_update": "2024-05-23 01:20:09", - "author_account_age_days": 4067 + "author_account_age_days": 4102 }, "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL": { "stars": 0, "last_update": "2024-05-23 01:19:47", - "author_account_age_days": 4067 + "author_account_age_days": 4102 }, "https://github.com/githubYiheng/comfyui_kmeans_filter": { "stars": 0, "last_update": "2024-06-14 09:01:24", - "author_account_age_days": 4067 + "author_account_age_days": 4102 }, "https://github.com/githubYiheng/comfyui_meanshift_filter": { "stars": 0, "last_update": "2024-06-14 10:59:43", - "author_account_age_days": 4067 + "author_account_age_days": 4102 }, "https://github.com/githubYiheng/comfyui_private_postprocessor": { "stars": 1, "last_update": "2024-06-14 08:09:39", - "author_account_age_days": 4067 + "author_account_age_days": 4102 }, "https://github.com/glibsonoran/Plush-for-ComfyUI": { - "stars": 154, - "last_update": "2024-12-03 02:24:41", - "author_account_age_days": 2662 + "stars": 156, + "last_update": "2025-01-09 00:49:41", + "author_account_age_days": 2696 }, "https://github.com/glifxyz/ComfyUI-GlifNodes": { - "stars": 40, + "stars": 50, "last_update": "2024-11-25 12:37:14", - "author_account_age_days": 738 + "author_account_age_days": 772 }, "https://github.com/glowcone/comfyui-base64-to-image": { - "stars": 12, + "stars": 13, "last_update": "2024-07-08 22:53:25", - "author_account_age_days": 3910 + "author_account_age_days": 3944 }, "https://github.com/glowcone/comfyui-string-converter": { "stars": 2, "last_update": "2024-07-31 13:40:48", - "author_account_age_days": 3910 + "author_account_age_days": 3944 }, "https://github.com/goburiin/nsfwrecog-comfyui": { "stars": 1, "last_update": "2024-08-14 02:17:15", - "author_account_age_days": 118 + "author_account_age_days": 153 }, "https://github.com/godmt/ComfyUI-List-Utils": { - "stars": 6, + "stars": 7, "last_update": "2024-11-13 14:48:56", - "author_account_age_days": 1894 + "author_account_age_days": 1928 }, "https://github.com/godspede/ComfyUI_Substring": { "stars": 1, "last_update": "2024-09-24 17:18:16", - "author_account_age_days": 3277 + "author_account_age_days": 3312 }, "https://github.com/gokayfem/ComfyUI-Depth-Visualization": { - "stars": 58, + "stars": 59, "last_update": "2024-10-31 23:50:57", - "author_account_age_days": 1222 + "author_account_age_days": 1257 }, "https://github.com/gokayfem/ComfyUI-Dream-Interpreter": { - "stars": 76, + "stars": 78, "last_update": "2024-07-31 16:11:04", - "author_account_age_days": 1222 + "author_account_age_days": 1257 }, "https://github.com/gokayfem/ComfyUI-Texture-Simple": { "stars": 43, "last_update": "2024-07-31 16:14:23", - "author_account_age_days": 1222 + "author_account_age_days": 1257 }, "https://github.com/gokayfem/ComfyUI_VLM_nodes": { - "stars": 423, + "stars": 447, "last_update": "2024-11-06 15:53:28", - "author_account_age_days": 1222 + "author_account_age_days": 1257 }, "https://github.com/gonzalu/ComfyUI_YFG_Comical": { "stars": 24, "last_update": "2024-07-31 15:02:48", - "author_account_age_days": 2625 + "author_account_age_days": 2660 }, "https://github.com/googincheng/ComfyUX": { "stars": 149, "last_update": "2024-08-22 09:47:17", - "author_account_age_days": 2953 + "author_account_age_days": 2988 }, "https://github.com/gorillaframeai/GF_nodes": { "stars": 19, "last_update": "2024-11-21 17:50:46", - "author_account_age_days": 397 + "author_account_age_days": 432 + }, + "https://github.com/gremlation/ComfyUI-ImageLabel": { + "stars": 2, + "last_update": "2025-01-08 09:01:37", + "author_account_age_days": 22 + }, + "https://github.com/gremlation/ComfyUI-JMESPath": { + "stars": 0, + "last_update": "2025-01-07 17:35:48", + "author_account_age_days": 22 + }, + "https://github.com/gremlation/ComfyUI-TrackAndWheel": { + "stars": 0, + "last_update": "2025-01-08 10:48:07", + "author_account_age_days": 22 + }, + "https://github.com/gremlation/ComfyUI-ViewData": { + "stars": 2, + "last_update": "2025-01-07 16:43:52", + "author_account_age_days": 22 + }, + "https://github.com/gremlation/ComfyUI-jq": { + "stars": 0, + "last_update": "2025-01-07 17:53:29", + "author_account_age_days": 22 }, "https://github.com/griptape-ai/ComfyUI-Griptape": { - "stars": 128, - "last_update": "2024-11-29 16:15:58", - "author_account_age_days": 685 + "stars": 144, + "last_update": "2025-01-08 20:08:16", + "author_account_age_days": 719 }, "https://github.com/gseth/ControlAltAI-Nodes": { - "stars": 45, - "last_update": "2024-11-03 21:16:07", - "author_account_age_days": 4011 + "stars": 73, + "last_update": "2024-12-20 21:17:15", + "author_account_age_days": 4045 }, "https://github.com/gt732/ComfyUI-DreamWaltz-G": { "stars": 3, "last_update": "2024-10-27 03:15:13", - "author_account_age_days": 1319 + "author_account_age_days": 1354 }, "https://github.com/guill/abracadabra-comfyui": { - "stars": 1, - "last_update": "2024-06-14 08:12:07", - "author_account_age_days": 4357 + "stars": 2, + "last_update": "2024-12-23 09:46:10", + "author_account_age_days": 4392 }, "https://github.com/guyaton/guy-nodes-comfyui": { "stars": 1, "last_update": "2024-10-02 13:15:26", - "author_account_age_days": 66 + "author_account_age_days": 101 }, "https://github.com/hackkhai/ComfyUI-Image-Matting": { "stars": 15, "last_update": "2024-07-31 15:02:56", - "author_account_age_days": 2015 + "author_account_age_days": 2050 }, "https://github.com/hanoixan/ComfyUI-DataBeast": { "stars": 2, "last_update": "2024-11-05 17:47:30", - "author_account_age_days": 5001 + "author_account_age_days": 5036 }, "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": { "stars": 0, "last_update": "2024-07-28 21:08:27", - "author_account_age_days": 269 + "author_account_age_days": 304 }, "https://github.com/hay86/ComfyUI_AceNodes": { - "stars": 17, - "last_update": "2024-09-09 06:32:49", - "author_account_age_days": 4831 + "stars": 44, + "last_update": "2024-12-31 08:39:13", + "author_account_age_days": 4866 }, "https://github.com/hay86/ComfyUI_DDColor": { "stars": 7, "last_update": "2024-06-14 08:12:13", - "author_account_age_days": 4831 + "author_account_age_days": 4866 }, "https://github.com/hay86/ComfyUI_Dreamtalk": { - "stars": 10, + "stars": 11, "last_update": "2024-08-15 03:37:37", - "author_account_age_days": 4831 + "author_account_age_days": 4866 }, "https://github.com/hay86/ComfyUI_Hallo": { - "stars": 20, + "stars": 21, "last_update": "2024-07-30 09:55:03", - "author_account_age_days": 4831 + "author_account_age_days": 4866 + }, + "https://github.com/hay86/ComfyUI_LatentSync": { + "stars": 7, + "last_update": "2025-01-06 07:47:40", + "author_account_age_days": 4866 }, "https://github.com/hay86/ComfyUI_MiniCPM-V": { "stars": 37, "last_update": "2024-08-09 07:52:59", - "author_account_age_days": 4831 + "author_account_age_days": 4866 }, "https://github.com/hay86/ComfyUI_OpenVoice": { - "stars": 12, + "stars": 14, "last_update": "2024-07-02 08:16:20", - "author_account_age_days": 4831 + "author_account_age_days": 4866 }, "https://github.com/hayden-fr/ComfyUI-Image-Browsing": { "stars": 11, - "last_update": "2024-11-12 09:17:03", - "author_account_age_days": 2101 + "last_update": "2025-01-09 02:43:56", + "author_account_age_days": 2136 }, "https://github.com/hayden-fr/ComfyUI-Model-Manager": { - "stars": 67, - "last_update": "2024-12-03 06:15:24", - "author_account_age_days": 2101 + "stars": 81, + "last_update": "2025-01-09 02:16:53", + "author_account_age_days": 2136 }, "https://github.com/hben35096/ComfyUI-ReplenishNodes": { "stars": 3, "last_update": "2024-11-03 20:04:38", - "author_account_age_days": 512 + "author_account_age_days": 546 }, "https://github.com/hben35096/ComfyUI-ToolBox": { - "stars": 6, + "stars": 7, "last_update": "2024-09-02 14:49:43", - "author_account_age_days": 512 + "author_account_age_days": 546 }, "https://github.com/heshengtao/comfyui_LLM_party": { - "stars": 1082, - "last_update": "2024-12-04 07:18:05", - "author_account_age_days": 3059 + "stars": 1204, + "last_update": "2025-01-09 10:59:55", + "author_account_age_days": 3094 }, "https://github.com/heshengtao/comfyui_LLM_schools": { - "stars": 8, + "stars": 9, "last_update": "2024-08-24 15:08:14", - "author_account_age_days": 3059 + "author_account_age_days": 3094 }, "https://github.com/hhhzzyang/Comfyui_Lama": { - "stars": 45, + "stars": 48, "last_update": "2024-05-22 21:13:19", - "author_account_age_days": 671 + "author_account_age_days": 706 + }, + "https://github.com/hieuck/ComfyUI-BiRefNet": { + "stars": 0, + "last_update": "2024-12-04 16:20:00", + "author_account_age_days": 2724 }, "https://github.com/hiforce/comfyui-hiforce-plugin": { - "stars": 4, + "stars": 5, "last_update": "2024-06-14 08:13:24", - "author_account_age_days": 1966 + "author_account_age_days": 2001 }, "https://github.com/hinablue/ComfyUI_3dPoseEditor": { - "stars": 162, + "stars": 172, "last_update": "2024-06-21 17:38:40", - "author_account_age_days": 5276 + "author_account_age_days": 5311 + }, + "https://github.com/hodanajan/optimal-crop-resolution": { + "stars": 1, + "last_update": "2025-01-06 20:41:35", + "author_account_age_days": 2528 }, "https://github.com/holchan/ComfyUI-ModelDownloader": { "stars": 4, "last_update": "2024-06-14 08:59:42", - "author_account_age_days": 1756 + "author_account_age_days": 1790 }, "https://github.com/hoveychen/ComfyUI-MusePose-Remaster": { - "stars": 2, + "stars": 3, "last_update": "2024-10-22 09:40:04", - "author_account_age_days": 4807 + "author_account_age_days": 4842 }, "https://github.com/huagetai/ComfyUI-Gaffer": { "stars": 47, "last_update": "2024-06-19 00:58:38", - "author_account_age_days": 4796 + "author_account_age_days": 4831 }, "https://github.com/huagetai/ComfyUI_LightGradient": { "stars": 9, "last_update": "2024-05-23 01:21:27", - "author_account_age_days": 4796 + "author_account_age_days": 4831 }, "https://github.com/huanngzh/ComfyUI-MVAdapter": { - "stars": 60, - "last_update": "2024-12-05 15:20:47", - "author_account_age_days": 1402 + "stars": 214, + "last_update": "2024-12-25 15:24:55", + "author_account_age_days": 1437 }, "https://github.com/huchenlei/ComfyUI-IC-Light-Native": { - "stars": 542, - "last_update": "2024-08-27 18:52:24", - "author_account_age_days": 3040 + "stars": 565, + "last_update": "2024-12-31 17:59:41", + "author_account_age_days": 3075 }, "https://github.com/huchenlei/ComfyUI-layerdiffuse": { - "stars": 1504, - "last_update": "2024-08-27 19:32:57", - "author_account_age_days": 3040 + "stars": 1540, + "last_update": "2025-01-05 19:53:01", + "author_account_age_days": 3075 }, "https://github.com/huchenlei/ComfyUI-openpose-editor": { - "stars": 56, + "stars": 65, "last_update": "2024-07-31 13:44:16", - "author_account_age_days": 3040 + "author_account_age_days": 3075 }, "https://github.com/huchenlei/ComfyUI_DanTagGen": { - "stars": 59, + "stars": 61, "last_update": "2024-08-01 01:42:14", - "author_account_age_days": 3040 + "author_account_age_days": 3075 }, "https://github.com/huchenlei/ComfyUI_densediffusion": { - "stars": 118, - "last_update": "2024-07-27 18:33:35", - "author_account_age_days": 3040 + "stars": 123, + "last_update": "2024-12-26 17:46:42", + "author_account_age_days": 3075 }, "https://github.com/huchenlei/ComfyUI_omost": { - "stars": 424, + "stars": 427, "last_update": "2024-08-04 18:51:27", - "author_account_age_days": 3040 + "author_account_age_days": 3075 }, "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": { - "stars": 21, + "stars": 26, "last_update": "2024-09-26 21:14:35", - "author_account_age_days": 5804 + "author_account_age_days": 5839 }, "https://github.com/humgate/simplecomfy": { "stars": 0, "last_update": "2024-06-14 08:58:21", - "author_account_age_days": 1530 + "author_account_age_days": 1565 }, "https://github.com/hustille/ComfyUI_Fooocus_KSampler": { "stars": 60, "last_update": "2024-05-22 20:39:48", - "author_account_age_days": 604 + "author_account_age_days": 639 }, "https://github.com/hustille/ComfyUI_hus_utils": { - "stars": 6, + "stars": 5, "last_update": "2024-05-22 20:39:34", - "author_account_age_days": 604 + "author_account_age_days": 639 }, "https://github.com/hwhaocool/ComfyUI-Select-Any": { "stars": 3, "last_update": "2024-07-31 13:52:47", - "author_account_age_days": 3052 + "author_account_age_days": 3087 }, "https://github.com/hylarucoder/comfyui-copilot": { - "stars": 14, + "stars": 16, "last_update": "2024-06-28 04:43:18", - "author_account_age_days": 4077 + "author_account_age_days": 4112 }, "https://github.com/hyunamy/comfy-ui-on-complete-email-me": { "stars": 2, "last_update": "2024-07-01 18:44:18", - "author_account_age_days": 3274 + "author_account_age_days": 3309 + }, + "https://github.com/hzane/OmniGen-ComfyUI": { + "stars": 1, + "last_update": "2024-12-26 04:51:32", + "author_account_age_days": 4668 }, "https://github.com/iFREEGROUP/comfyui-undistort": { "stars": 2, "last_update": "2024-06-14 08:59:52", - "author_account_age_days": 1721 + "author_account_age_days": 1756 }, "https://github.com/iamandeepsandhu/ComfyUI-NSFW-Check": { - "stars": 9, + "stars": 10, "last_update": "2024-11-26 07:32:18", - "author_account_age_days": 2370 + "author_account_age_days": 2405 }, "https://github.com/icesun963/ComfyUI_HFDownLoad": { "stars": 0, "last_update": "2024-07-18 12:13:23", - "author_account_age_days": 4270 + "author_account_age_days": 4305 }, "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words": { - "stars": 155, + "stars": 157, "last_update": "2024-10-31 18:53:15", - "author_account_age_days": 3213 + "author_account_age_days": 3248 }, "https://github.com/iemesowum/ComfyUI_IsaacNodes": { "stars": 2, "last_update": "2024-08-22 17:23:13", - "author_account_age_days": 5456 + "author_account_age_days": 5490 }, "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode": { "stars": 17, - "last_update": "2024-12-04 22:16:11", - "author_account_age_days": 3026 + "last_update": "2024-12-29 11:09:57", + "author_account_age_days": 3061 }, "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode": { - "stars": 37, + "stars": 41, "last_update": "2024-10-01 08:47:47", - "author_account_age_days": 3026 + "author_account_age_days": 3061 }, "https://github.com/if-ai/ComfyUI-IF_AI_tools": { - "stars": 538, - "last_update": "2024-11-27 00:40:21", - "author_account_age_days": 3026 + "stars": 577, + "last_update": "2025-01-03 10:36:18", + "author_account_age_days": 3061 + }, + "https://github.com/if-ai/ComfyUI-IF_MemoAvatar": { + "stars": 132, + "last_update": "2024-12-18 22:34:21", + "author_account_age_days": 3061 + }, + "https://github.com/if-ai/ComfyUI-IF_Trellis": { + "stars": 302, + "last_update": "2025-01-06 14:11:10", + "author_account_age_days": 3061 }, "https://github.com/ihmily/ComfyUI-Light-Tool": { "stars": 9, - "last_update": "2024-11-28 06:05:45", - "author_account_age_days": 793 + "last_update": "2024-12-13 10:17:53", + "author_account_age_days": 828 }, "https://github.com/imb101/ComfyUI-FaceSwap": { "stars": 30, "last_update": "2024-05-22 18:22:29", - "author_account_age_days": 1053 + "author_account_age_days": 1087 + }, + "https://github.com/inflamously/comfyui-prompt-enhancer": { + "stars": 1, + "last_update": "2025-01-06 23:39:15", + "author_account_age_days": 3979 }, "https://github.com/injet-zhou/comfyui_extra_api": { "stars": 6, - "last_update": "2024-12-05 09:17:10", - "author_account_age_days": 2391 + "last_update": "2024-12-31 01:53:17", + "author_account_age_days": 2426 + }, + "https://github.com/inventorado/ComfyUI_NNT": { + "stars": 47, + "last_update": "2025-01-08 17:22:46", + "author_account_age_days": 3085 }, "https://github.com/iwanders/ComfyUI_nodes": { - "stars": 0, + "stars": 1, "last_update": "2024-07-11 01:06:26", - "author_account_age_days": 4590 + "author_account_age_days": 4625 }, "https://github.com/jacklukai/ComfyUI_DeployCash": { "stars": 1, "last_update": "2024-12-02 03:49:49", - "author_account_age_days": 147 + "author_account_age_days": 182 }, "https://github.com/jags111/ComfyUI_Jags_Audiotools": { - "stars": 61, + "stars": 62, "last_update": "2024-08-01 05:37:19", - "author_account_age_days": 4035 + "author_account_age_days": 4070 }, "https://github.com/jags111/ComfyUI_Jags_VectorMagic": { - "stars": 70, + "stars": 73, "last_update": "2024-10-16 07:22:46", - "author_account_age_days": 4035 + "author_account_age_days": 4070 }, "https://github.com/jags111/efficiency-nodes-comfyui": { - "stars": 1015, + "stars": 1066, "last_update": "2024-08-26 04:49:54", - "author_account_age_days": 4035 + "author_account_age_days": 4070 }, "https://github.com/jakechai/ComfyUI-JakeUpgrade": { - "stars": 41, - "last_update": "2024-11-14 07:12:08", - "author_account_age_days": 1736 + "stars": 47, + "last_update": "2025-01-04 02:02:59", + "author_account_age_days": 1771 }, "https://github.com/jamal-alkharrat/ComfyUI_rotate_image": { "stars": 0, "last_update": "2024-05-22 23:19:02", - "author_account_age_days": 1141 + "author_account_age_days": 1176 }, "https://github.com/jamesWalker55/comfyui-p2ldgan": { - "stars": 16, + "stars": 17, "last_update": "2024-05-22 18:19:04", - "author_account_age_days": 2691 + "author_account_age_days": 2726 }, "https://github.com/jamesWalker55/comfyui-various": { - "stars": 66, + "stars": 70, "last_update": "2024-09-19 04:58:35", - "author_account_age_days": 2691 + "author_account_age_days": 2726 + }, + "https://github.com/jammyfu/ComfyUI_PaintingCoderUtils": { + "stars": 8, + "last_update": "2025-01-09 13:24:22", + "author_account_age_days": 4677 + }, + "https://github.com/jax-explorer/comfyui-model-dynamic-loader": { + "stars": 2, + "last_update": "2025-01-06 12:57:36", + "author_account_age_days": 776 }, "https://github.com/jax-explorer/fast_video_comfyui": { "stars": 0, "last_update": "2024-05-23 01:17:35", - "author_account_age_days": 741 + "author_account_age_days": 776 }, "https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt": { "stars": 2, "last_update": "2024-10-26 05:38:07", - "author_account_age_days": 4635 + "author_account_age_days": 4670 }, "https://github.com/jeffy5/comfyui-faceless-node": { - "stars": 37, + "stars": 39, "last_update": "2024-07-29 08:00:20", - "author_account_age_days": 3095 + "author_account_age_days": 3130 + }, + "https://github.com/jerrylongyan/ComfyUI-My-Mask": { + "stars": 1, + "last_update": "2025-01-08 08:39:19", + "author_account_age_days": 4131 }, "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": { - "stars": 131, + "stars": 134, "last_update": "2024-11-19 01:16:54", - "author_account_age_days": 3816 + "author_account_age_days": 3851 }, "https://github.com/jianzhichun/ComfyUI-Easyai": { - "stars": 6, + "stars": 7, "last_update": "2024-10-27 03:29:53", - "author_account_age_days": 3201 + "author_account_age_days": 3236 + }, + "https://github.com/jiaqianjing/ComfyUI-MidjourneyHub": { + "stars": 6, + "last_update": "2024-12-13 03:03:41", + "author_account_age_days": 3328 }, "https://github.com/jiaxiangc/ComfyUI-ResAdapter": { - "stars": 290, + "stars": 292, "last_update": "2024-05-23 00:22:23", - "author_account_age_days": 1450 + "author_account_age_days": 1485 }, "https://github.com/jitcoder/lora-info": { - "stars": 69, + "stars": 72, "last_update": "2024-09-08 19:14:17", - "author_account_age_days": 4205 + "author_account_age_days": 4239 }, "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": { - "stars": 7, + "stars": 11, "last_update": "2024-05-22 20:44:56", - "author_account_age_days": 3813 + "author_account_age_days": 3848 }, "https://github.com/jkrauss82/ultools-comfyui": { "stars": 6, "last_update": "2024-09-15 07:35:53", - "author_account_age_days": 4376 + "author_account_age_days": 4410 }, "https://github.com/jmkl/ComfyUI-ricing": { "stars": 11, "last_update": "2024-10-16 15:38:08", - "author_account_age_days": 4761 + "author_account_age_days": 4796 }, "https://github.com/jn-jairo/jn_comfyui": { "stars": 5, "last_update": "2024-08-16 18:09:12", - "author_account_age_days": 4148 + "author_account_age_days": 4183 }, "https://github.com/john-mnz/ComfyUI-Inspyrenet-Rembg": { - "stars": 387, + "stars": 419, "last_update": "2024-07-31 13:54:32", - "author_account_age_days": 372 + "author_account_age_days": 407 }, "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative": { - "stars": 129, + "stars": 130, "last_update": "2024-08-02 08:23:26", - "author_account_age_days": 4962 + "author_account_age_days": 4997 }, "https://github.com/jordoh/ComfyUI-Deepface": { - "stars": 19, + "stars": 21, "last_update": "2024-08-04 18:18:05", - "author_account_age_days": 5157 + "author_account_age_days": 5192 }, "https://github.com/jroc22/ComfyUI-CSV-prompt-builder": { "stars": 7, "last_update": "2024-08-01 19:39:30", - "author_account_age_days": 853 + "author_account_age_days": 888 }, "https://github.com/jstit/comfyui_custom_node_image": { "stars": 1, "last_update": "2024-08-27 05:10:12", - "author_account_age_days": 2028 + "author_account_age_days": 2063 }, "https://github.com/jtrue/ComfyUI-JaRue": { "stars": 7, "last_update": "2024-06-14 09:01:12", - "author_account_age_days": 4094 + "author_account_age_days": 4129 }, "https://github.com/jtydhr88/ComfyUI-Hunyuan3D-1-wrapper": { - "stars": 16, + "stars": 19, "last_update": "2024-11-13 11:50:46", - "author_account_age_days": 4917 + "author_account_age_days": 4952 }, "https://github.com/jtydhr88/ComfyUI-LayerDivider": { - "stars": 66, + "stars": 67, "last_update": "2024-07-06 01:43:45", - "author_account_age_days": 4917 + "author_account_age_days": 4952 }, "https://github.com/jtydhr88/ComfyUI-Workflow-Encrypt": { - "stars": 27, + "stars": 29, "last_update": "2024-07-31 13:45:53", - "author_account_age_days": 4917 + "author_account_age_days": 4952 }, "https://github.com/juehackr/comfyui_fk_server": { - "stars": 169, - "last_update": "2024-12-05 02:42:13", - "author_account_age_days": 1276 + "stars": 194, + "last_update": "2025-01-09 09:23:46", + "author_account_age_days": 1311 + }, + "https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node": { + "stars": 2, + "last_update": "2024-12-29 00:21:53", + "author_account_age_days": 110 }, "https://github.com/justUmen/Bjornulf_custom_nodes": { - "stars": 62, - "last_update": "2024-11-27 13:53:18", - "author_account_age_days": 2953 + "stars": 79, + "last_update": "2024-12-24 07:02:51", + "author_account_age_days": 2988 }, "https://github.com/k-komarov/comfyui-bunny-cdn-storage": { "stars": 1, "last_update": "2024-08-31 20:59:08", - "author_account_age_days": 3639 + "author_account_age_days": 3674 }, "https://github.com/ka-puna/comfyui-yanc": { "stars": 7, "last_update": "2024-07-18 04:28:44", - "author_account_age_days": 2371 + "author_account_age_days": 2406 }, "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats": { - "stars": 5, + "stars": 6, "last_update": "2024-10-30 14:53:11", - "author_account_age_days": 1431 + "author_account_age_days": 1466 }, "https://github.com/kadirnar/ComfyUI-Transformers": { - "stars": 21, + "stars": 22, "last_update": "2024-06-22 22:44:39", - "author_account_age_days": 2494 + "author_account_age_days": 2528 }, "https://github.com/kadirnar/ComfyUI-YOLO": { - "stars": 49, + "stars": 53, "last_update": "2024-11-29 15:22:15", - "author_account_age_days": 2494 + "author_account_age_days": 2528 }, "https://github.com/kaibioinfo/ComfyUI_AdvancedRefluxControl": { - "stars": 257, + "stars": 373, "last_update": "2024-11-24 20:25:04", - "author_account_age_days": 4846 + "author_account_age_days": 4880 }, "https://github.com/kale4eat/ComfyUI-path-util": { "stars": 0, "last_update": "2024-05-25 05:44:11", - "author_account_age_days": 1776 + "author_account_age_days": 1811 }, "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit": { "stars": 15, "last_update": "2024-09-27 12:39:38", - "author_account_age_days": 1776 + "author_account_age_days": 1811 }, "https://github.com/kale4eat/ComfyUI-string-util": { "stars": 2, "last_update": "2024-05-23 00:24:40", - "author_account_age_days": 1776 + "author_account_age_days": 1811 }, "https://github.com/kale4eat/ComfyUI-text-file-util": { "stars": 0, "last_update": "2024-05-23 00:24:51", - "author_account_age_days": 1776 + "author_account_age_days": 1811 }, "https://github.com/kappa54m/ComfyUI_Usability": { "stars": 1, "last_update": "2024-08-08 15:31:47", - "author_account_age_days": 1675 + "author_account_age_days": 1710 }, "https://github.com/kasukanra/ComfyUI_StringToHex": { "stars": 2, "last_update": "2024-08-20 04:52:06", - "author_account_age_days": 2825 + "author_account_age_days": 2860 }, "https://github.com/katalist-ai/comfyUI-nsfw-detection": { "stars": 1, "last_update": "2024-05-23 01:23:32", - "author_account_age_days": 918 + "author_account_age_days": 952 + }, + "https://github.com/kazeyori/ComfyUI-QuickImageSequenceProcess": { + "stars": 1, + "last_update": "2024-12-24 16:48:11", + "author_account_age_days": 927 }, "https://github.com/kealiu/ComfyUI-S3-Tools": { "stars": 7, "last_update": "2024-07-04 10:13:07", - "author_account_age_days": 4292 + "author_account_age_days": 4327 }, "https://github.com/kealiu/ComfyUI-Zero123-Porting": { "stars": 21, "last_update": "2024-08-22 07:07:57", - "author_account_age_days": 4292 + "author_account_age_days": 4327 }, "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans": { - "stars": 162, + "stars": 164, "last_update": "2024-07-04 10:12:32", - "author_account_age_days": 4292 + "author_account_age_days": 4327 }, "https://github.com/kenjiqq/qq-nodes-comfyui": { "stars": 41, "last_update": "2024-10-01 19:14:55", - "author_account_age_days": 5053 + "author_account_age_days": 5088 + }, + "https://github.com/kevinmcmahondev/comfyui-skin-tone-detector": { + "stars": 2, + "last_update": "2024-12-22 06:44:20", + "author_account_age_days": 952 }, "https://github.com/kft334/Knodes": { "stars": 3, "last_update": "2024-06-14 08:12:06", - "author_account_age_days": 1123 + "author_account_age_days": 1158 }, "https://github.com/kijai/ComfyUI-ADMotionDirector": { - "stars": 168, + "stars": 171, "last_update": "2024-11-07 07:20:23", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-APISR-KJ": { "stars": 62, "last_update": "2024-05-21 16:30:21", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-BrushNet-Wrapper": { - "stars": 135, + "stars": 136, "last_update": "2024-06-20 12:15:16", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-CCSR": { - "stars": 190, + "stars": 199, "last_update": "2024-06-28 11:13:33", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-CogVideoXWrapper": { - "stars": 1095, - "last_update": "2024-12-01 16:45:14", - "author_account_age_days": 2347 + "stars": 1249, + "last_update": "2024-12-24 00:09:15", + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-ControlNeXt-SVD": { - "stars": 159, + "stars": 168, "last_update": "2024-08-15 08:26:15", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-DDColor": { - "stars": 122, + "stars": 127, "last_update": "2024-05-21 16:04:26", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-DepthAnythingV2": { - "stars": 212, + "stars": 227, "last_update": "2024-10-21 11:43:57", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-DiffusionLight": { - "stars": 58, + "stars": 61, "last_update": "2024-05-21 16:16:52", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper": { - "stars": 636, + "stars": 646, "last_update": "2024-08-15 21:17:07", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-ELLA-wrapper": { "stars": 111, "last_update": "2024-05-21 16:47:28", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-Florence2": { - "stars": 787, + "stars": 868, "last_update": "2024-11-27 14:05:12", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-FluxTrainer": { - "stars": 532, + "stars": 609, "last_update": "2024-12-04 10:24:34", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-GIMM-VFI": { - "stars": 171, + "stars": 190, "last_update": "2024-11-19 14:31:22", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-Geowizard": { - "stars": 93, - "last_update": "2024-05-28 14:08:34", - "author_account_age_days": 2347 + "stars": 103, + "last_update": "2024-12-16 19:33:54", + "author_account_age_days": 2382 + }, + "https://github.com/kijai/ComfyUI-HunyuanVideoWrapper": { + "stars": 1483, + "last_update": "2025-01-06 22:39:12", + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-IC-Light": { - "stars": 806, + "stars": 860, "last_update": "2024-10-31 11:40:56", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-KJNodes": { - "stars": 699, - "last_update": "2024-11-26 12:49:40", - "author_account_age_days": 2347 + "stars": 773, + "last_update": "2025-01-08 20:48:57", + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper": { - "stars": 564, + "stars": 572, "last_update": "2024-10-18 08:47:45", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-LLaVA-OneVision": { - "stars": 78, + "stars": 81, "last_update": "2024-08-25 14:04:22", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-LVCDWrapper": { - "stars": 55, + "stars": 56, "last_update": "2024-09-30 11:49:12", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper": { "stars": 21, "last_update": "2024-05-21 16:41:18", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-LivePortraitKJ": { - "stars": 1682, + "stars": 1761, "last_update": "2024-08-05 21:39:49", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-Lotus": { - "stars": 94, + "stars": 100, "last_update": "2024-10-13 12:33:24", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-LuminaWrapper": { - "stars": 185, + "stars": 186, "last_update": "2024-07-31 13:52:06", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-Marigold": { - "stars": 475, + "stars": 487, "last_update": "2024-11-02 17:51:42", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-MimicMotionWrapper": { - "stars": 342, + "stars": 377, "last_update": "2024-08-07 06:48:40", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-MoGe": { "stars": 33, "last_update": "2024-11-03 21:28:03", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-OpenDiTWrapper": { - "stars": 41, + "stars": 42, "last_update": "2024-07-03 14:59:13", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-PyramidFlowWrapper": { - "stars": 324, + "stars": 343, "last_update": "2024-11-15 13:28:18", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-SUPIR": { - "stars": 1618, + "stars": 1691, "last_update": "2024-08-01 23:03:53", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-SVD": { - "stars": 159, + "stars": 161, "last_update": "2024-05-22 21:09:54", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-depth-fm": { - "stars": 66, + "stars": 68, "last_update": "2024-05-22 21:10:15", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-moondream": { - "stars": 96, + "stars": 98, "last_update": "2024-08-12 16:30:11", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kijai/ComfyUI-segment-anything-2": { - "stars": 670, + "stars": 719, "last_update": "2024-10-03 18:41:02", - "author_account_age_days": 2347 + "author_account_age_days": 2382 }, "https://github.com/kimara-ai/ComfyUI-Kimara-AI-Advanced-Watermarks": { - "stars": 8, - "last_update": "2024-12-03 12:43:24", - "author_account_age_days": 21 + "stars": 10, + "last_update": "2025-01-08 12:50:40", + "author_account_age_days": 55 }, "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink": { - "stars": 24, + "stars": 25, "last_update": "2024-05-22 21:25:13", - "author_account_age_days": 632 + "author_account_age_days": 667 }, "https://github.com/kinfolk0117/ComfyUI_GridSwapper": { - "stars": 27, + "stars": 28, "last_update": "2024-10-27 09:04:20", - "author_account_age_days": 632 + "author_account_age_days": 667 }, "https://github.com/kinfolk0117/ComfyUI_Pilgram": { "stars": 7, "last_update": "2024-05-22 21:25:24", - "author_account_age_days": 632 + "author_account_age_days": 667 }, "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": { - "stars": 47, + "stars": 48, "last_update": "2024-05-22 21:25:01", - "author_account_age_days": 632 + "author_account_age_days": 667 }, "https://github.com/kk8bit/KayTool": { - "stars": 4, + "stars": 8, "last_update": "2024-11-08 12:51:52", - "author_account_age_days": 521 + "author_account_age_days": 556 }, "https://github.com/klinter007/klinter_nodes": { - "stars": 17, - "last_update": "2024-12-03 05:42:16", - "author_account_age_days": 589 + "stars": 18, + "last_update": "2024-12-27 20:03:35", + "author_account_age_days": 624 }, "https://github.com/knuknX/ComfyUI-Image-Tools": { "stars": 3, "last_update": "2024-06-14 09:05:58", - "author_account_age_days": 364 + "author_account_age_days": 399 }, "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI": { - "stars": 175, + "stars": 177, "last_update": "2024-05-22 20:44:44", - "author_account_age_days": 1973 + "author_account_age_days": 2008 }, "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes": { "stars": 3, "last_update": "2024-05-22 21:34:27", - "author_account_age_days": 747 + "author_account_age_days": 782 }, "https://github.com/komojini/komojini-comfyui-nodes": { "stars": 71, "last_update": "2024-05-22 21:34:39", - "author_account_age_days": 747 + "author_account_age_days": 782 + }, + "https://github.com/kostenickj/jk-comfyui-helpers": { + "stars": 4, + "last_update": "2024-12-19 10:22:42", + "author_account_age_days": 3248 + }, + "https://github.com/kraglik/prompt_collapse": { + "stars": 6, + "last_update": "2024-12-15 08:39:51", + "author_account_age_days": 2656 + }, + "https://github.com/krich-cto/ComfyUI-Flow-Control": { + "stars": 2, + "last_update": "2024-12-19 04:44:00", + "author_account_age_days": 1464 }, "https://github.com/kunieone/ComfyUI_alkaid": { "stars": 0, "last_update": "2024-05-23 01:10:21", - "author_account_age_days": 2684 + "author_account_age_days": 2719 }, "https://github.com/kwaroran/abg-comfyui": { "stars": 22, "last_update": "2024-05-22 18:19:51", - "author_account_age_days": 772 + "author_account_age_days": 806 }, "https://github.com/kycg/comfyui-Lora-auto-downloader": { "stars": 1, "last_update": "2024-11-08 19:57:23", - "author_account_age_days": 1105 + "author_account_age_days": 1139 }, "https://github.com/l1yongch1/ComfyUI_PhiCaption": { "stars": 1, "last_update": "2024-10-10 07:28:29", - "author_account_age_days": 940 + "author_account_age_days": 975 }, "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage": { "stars": 2, "last_update": "2024-06-22 16:53:47", - "author_account_age_days": 1331 + "author_account_age_days": 1366 }, "https://github.com/laksjdjf/Batch-Condition-ComfyUI": { "stars": 6, "last_update": "2024-05-22 20:42:42", - "author_account_age_days": 2995 + "author_account_age_days": 3030 }, "https://github.com/laksjdjf/LCMSampler-ComfyUI": { "stars": 15, "last_update": "2024-05-22 20:42:17", - "author_account_age_days": 2995 + "author_account_age_days": 3030 }, "https://github.com/laksjdjf/LoRTnoC-ComfyUI": { "stars": 13, "last_update": "2024-05-22 20:42:29", - "author_account_age_days": 2995 + "author_account_age_days": 3030 }, "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": { - "stars": 21, + "stars": 22, "last_update": "2024-05-22 20:42:04", - "author_account_age_days": 2995 + "author_account_age_days": 3030 }, "https://github.com/laksjdjf/cgem156-ComfyUI": { - "stars": 51, + "stars": 52, "last_update": "2024-09-12 12:07:30", - "author_account_age_days": 2995 + "author_account_age_days": 3030 }, "https://github.com/laksjdjf/pfg-ComfyUI": { "stars": 12, "last_update": "2024-05-22 20:41:41", - "author_account_age_days": 2995 + "author_account_age_days": 3030 }, "https://github.com/larsupb/LoRA-Merger-ComfyUI": { - "stars": 28, + "stars": 30, "last_update": "2024-10-24 11:28:08", - "author_account_age_days": 3240 + "author_account_age_days": 3275 }, "https://github.com/latenightlabs/ComfyUI-LNL": { - "stars": 22, + "stars": 23, "last_update": "2024-10-07 20:09:43", - "author_account_age_days": 315 + "author_account_age_days": 349 }, "https://github.com/lazniak/Head-Orientation-Node-for-ComfyUI---by-PabloGFX": { - "stars": 8, + "stars": 9, "last_update": "2024-09-25 15:02:14", - "author_account_age_days": 2445 + "author_account_age_days": 2480 }, "https://github.com/lazniak/LiquidTime-Interpolation": { - "stars": 6, + "stars": 7, "last_update": "2024-11-14 18:11:23", - "author_account_age_days": 2445 + "author_account_age_days": 2480 }, "https://github.com/lazniak/comfyui-google-photos-loader": { "stars": 4, "last_update": "2024-09-26 16:32:32", - "author_account_age_days": 2445 + "author_account_age_days": 2480 }, "https://github.com/leeguandong/ComfyUI_CompareModelWeights": { "stars": 3, - "last_update": "2024-09-22 13:13:07", - "author_account_age_days": 2958 + "last_update": "2025-01-09 02:43:41", + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_CrossImageAttention": { "stars": 4, "last_update": "2024-08-16 11:59:42", - "author_account_age_days": 2958 + "author_account_age_days": 2993 + }, + "https://github.com/leeguandong/ComfyUI_FluxCustomId": { + "stars": 6, + "last_update": "2025-01-06 01:12:44", + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_InternVL2": { - "stars": 12, + "stars": 14, "last_update": "2024-08-10 11:00:11", - "author_account_age_days": 2958 + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_LLaSM": { - "stars": 3, + "stars": 4, "last_update": "2024-08-10 10:58:17", - "author_account_age_days": 2958 + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_M3Net": { "stars": 10, "last_update": "2024-08-16 00:03:21", - "author_account_age_days": 2958 + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_MasaCtrl": { "stars": 4, "last_update": "2024-09-01 03:47:35", - "author_account_age_days": 2958 + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_Style_Aligned": { - "stars": 3, + "stars": 4, "last_update": "2024-08-16 11:59:33", - "author_account_age_days": 2958 + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_VideoEditing": { "stars": 3, "last_update": "2024-08-14 16:59:49", - "author_account_age_days": 2958 + "author_account_age_days": 2993 }, "https://github.com/leeguandong/ComfyUI_VisualAttentionMap": { - "stars": 7, + "stars": 8, "last_update": "2024-08-26 05:15:14", - "author_account_age_days": 2958 + "author_account_age_days": 2993 }, "https://github.com/leestuartx/ComfyUI-GG": { "stars": 3, "last_update": "2024-07-23 04:13:09", - "author_account_age_days": 3943 - }, - "https://github.com/leiweiqiang/ComfyUI-TRA": { - "stars": 13, - "last_update": "2024-12-04 22:16:03", - "author_account_age_days": 2774 + "author_account_age_days": 3978 }, "https://github.com/lenskikh/ComfyUI-Prompt-Worker": { - "stars": 7, - "last_update": "2024-08-27 22:08:40", - "author_account_age_days": 3661 + "stars": 9, + "last_update": "2025-01-08 04:10:35", + "author_account_age_days": 3695 }, "https://github.com/leoleelxh/ComfyUI-LLMs": { - "stars": 22, - "last_update": "2024-06-14 10:24:23", - "author_account_age_days": 4239 + "stars": 32, + "last_update": "2024-12-11 05:09:29", + "author_account_age_days": 4274 }, "https://github.com/lgldlk/ComfyUI-PC-ding-dong": { - "stars": 44, - "last_update": "2024-10-30 14:52:42", - "author_account_age_days": 1854 + "stars": 45, + "last_update": "2024-12-27 03:25:38", + "author_account_age_days": 1889 }, "https://github.com/liangt/comfyui-loadimagewithsubfolder": { "stars": 3, "last_update": "2024-07-28 08:23:11", - "author_account_age_days": 4223 + "author_account_age_days": 4257 }, "https://github.com/licyk/ComfyUI-HakuImg": { - "stars": 5, - "last_update": "2024-12-05 01:02:44", - "author_account_age_days": 1432 + "stars": 6, + "last_update": "2024-12-31 14:25:36", + "author_account_age_days": 1467 }, "https://github.com/licyk/ComfyUI-Restart-Sampler": { - "stars": 6, + "stars": 9, "last_update": "2024-10-23 10:13:08", - "author_account_age_days": 1432 + "author_account_age_days": 1467 + }, + "https://github.com/licyk/ComfyUI-TCD-Sampler": { + "stars": 3, + "last_update": "2024-12-24 05:33:45", + "author_account_age_days": 1467 }, "https://github.com/lilly1987/ComfyUI_node_Lilly": { - "stars": 52, - "last_update": "2024-05-22 17:53:19", - "author_account_age_days": 3074 + "stars": 54, + "last_update": "2024-12-21 01:50:03", + "author_account_age_days": 3109 }, "https://github.com/linshier/comfyui-remote-tools": { - "stars": 1, + "stars": 2, "last_update": "2024-05-28 07:44:23", - "author_account_age_days": 3956 + "author_account_age_days": 3991 }, "https://github.com/liuqianhonga/ComfyUI-Html2Image": { - "stars": 4, - "last_update": "2024-12-04 01:40:06", - "author_account_age_days": 351 + "stars": 9, + "last_update": "2025-01-06 01:47:59", + "author_account_age_days": 386 }, "https://github.com/liuqianhonga/ComfyUI-Image-Compressor": { - "stars": 6, - "last_update": "2024-12-03 06:44:02", - "author_account_age_days": 351 + "stars": 9, + "last_update": "2024-12-21 11:56:05", + "author_account_age_days": 386 + }, + "https://github.com/liuqianhonga/ComfyUI-String-Helper": { + "stars": 2, + "last_update": "2025-01-02 07:23:01", + "author_account_age_days": 386 }, "https://github.com/liushuchun/ComfyUI_Lora_List_With_Url_Loader": { "stars": 2, "last_update": "2024-09-26 12:38:32", - "author_account_age_days": 4211 + "author_account_age_days": 4246 }, "https://github.com/liusida/ComfyUI-AutoCropFaces": { - "stars": 60, + "stars": 66, "last_update": "2024-08-12 17:38:17", - "author_account_age_days": 3372 + "author_account_age_days": 3407 }, "https://github.com/liusida/ComfyUI-B-LoRA": { - "stars": 67, + "stars": 69, "last_update": "2024-06-18 03:17:46", - "author_account_age_days": 3372 + "author_account_age_days": 3407 }, "https://github.com/liusida/ComfyUI-Debug": { - "stars": 7, + "stars": 9, "last_update": "2024-06-14 10:25:26", - "author_account_age_days": 3372 + "author_account_age_days": 3407 }, "https://github.com/liusida/ComfyUI-Login": { - "stars": 97, + "stars": 108, "last_update": "2024-11-15 01:35:25", - "author_account_age_days": 3372 + "author_account_age_days": 3407 }, "https://github.com/liusida/ComfyUI-SD3-nodes": { "stars": 5, "last_update": "2024-06-14 13:01:41", - "author_account_age_days": 3372 + "author_account_age_days": 3407 }, "https://github.com/ljleb/comfy-mecha": { "stars": 58, - "last_update": "2024-11-09 23:42:33", - "author_account_age_days": 2628 + "last_update": "2025-01-07 15:41:48", + "author_account_age_days": 2662 }, "https://github.com/lks-ai/ComfyUI-StableAudioSampler": { - "stars": 227, - "last_update": "2024-06-17 18:54:17", - "author_account_age_days": 263 + "stars": 230, + "last_update": "2025-01-07 08:33:57", + "author_account_age_days": 298 }, "https://github.com/lks-ai/anynode": { - "stars": 503, + "stars": 514, "last_update": "2024-07-07 03:45:48", - "author_account_age_days": 263 + "author_account_age_days": 298 }, "https://github.com/lldacing/ComfyUI_BiRefNet_ll": { - "stars": 95, - "last_update": "2024-11-18 06:35:22", - "author_account_age_days": 2257 + "stars": 112, + "last_update": "2025-01-07 02:36:44", + "author_account_age_days": 2292 }, "https://github.com/lldacing/ComfyUI_StableDelight_ll": { - "stars": 4, + "stars": 8, "last_update": "2024-11-29 11:37:27", - "author_account_age_days": 2257 + "author_account_age_days": 2292 }, "https://github.com/lldacing/ComfyUI_StableHair_ll": { - "stars": 34, + "stars": 44, "last_update": "2024-12-01 11:57:50", - "author_account_age_days": 2257 + "author_account_age_days": 2292 }, "https://github.com/lldacing/comfyui-easyapi-nodes": { - "stars": 54, - "last_update": "2024-12-03 06:56:41", - "author_account_age_days": 2257 + "stars": 56, + "last_update": "2024-12-21 02:44:42", + "author_account_age_days": 2292 }, "https://github.com/lo-th/Comfyui_three_js": { - "stars": 10, - "last_update": "2024-12-05 15:38:14", - "author_account_age_days": 4644 + "stars": 12, + "last_update": "2024-12-09 22:37:22", + "author_account_age_days": 4678 }, "https://github.com/lodestone-rock/ComfyUI_FluxMod": { - "stars": 22, - "last_update": "2024-11-25 20:56:04", - "author_account_age_days": 748 + "stars": 28, + "last_update": "2025-01-06 02:33:33", + "author_account_age_days": 782 }, "https://github.com/logtd/ComfyUI-4DHumans": { - "stars": 4, + "stars": 5, "last_update": "2024-08-30 21:12:55", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-APGScaling": { - "stars": 28, + "stars": 30, "last_update": "2024-10-06 20:51:27", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-DiLightNet": { - "stars": 8, + "stars": 10, "last_update": "2024-10-06 03:48:15", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-FLATTEN": { - "stars": 105, + "stars": 107, "last_update": "2024-08-30 21:18:55", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-Fluxtapoz": { - "stars": 723, - "last_update": "2024-12-03 02:36:52", - "author_account_age_days": 286 + "stars": 984, + "last_update": "2025-01-09 02:38:40", + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-InstanceDiffusion": { "stars": 173, "last_update": "2024-08-30 21:17:51", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-InversedNoise": { "stars": 11, "last_update": "2024-05-22 00:10:18", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-LTXTricks": { - "stars": 193, - "last_update": "2024-12-03 02:27:21", - "author_account_age_days": 286 + "stars": 399, + "last_update": "2024-12-21 06:04:48", + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-MochiEdit": { - "stars": 262, + "stars": 273, "last_update": "2024-11-03 18:38:16", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-MotionThiefExperiment": { "stars": 40, "last_update": "2024-08-30 21:19:48", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-RAVE_ATTN": { "stars": 14, "last_update": "2024-05-22 00:20:03", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-ReNoise": { "stars": 6, "last_update": "2024-09-01 22:17:49", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-RefSampling": { "stars": 6, "last_update": "2024-09-11 20:56:01", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-RefUNet": { "stars": 42, "last_update": "2024-08-30 21:20:20", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-SEGAttention": { "stars": 34, "last_update": "2024-09-11 20:55:00", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-SSREncoder": { "stars": 2, "last_update": "2024-08-24 23:33:09", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-SeeCoder": { "stars": 1, "last_update": "2024-08-24 23:31:10", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-TrackingNodes": { "stars": 18, "last_update": "2024-05-22 00:03:27", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/logtd/ComfyUI-ViewCrafter": { - "stars": 9, + "stars": 10, "last_update": "2024-09-30 19:32:41", - "author_account_age_days": 286 + "author_account_age_days": 321 }, "https://github.com/longgui0318/comfyui-common-util": { "stars": 2, "last_update": "2024-11-28 20:55:56", - "author_account_age_days": 4329 + "author_account_age_days": 4364 }, "https://github.com/longgui0318/comfyui-llm-assistant": { "stars": 8, "last_update": "2024-09-17 13:12:43", - "author_account_age_days": 4329 + "author_account_age_days": 4364 }, "https://github.com/longgui0318/comfyui-magic-clothing": { - "stars": 74, + "stars": 75, "last_update": "2024-08-08 14:42:04", - "author_account_age_days": 4329 + "author_account_age_days": 4364 }, "https://github.com/longgui0318/comfyui-mask-util": { "stars": 7, "last_update": "2024-06-30 03:43:58", - "author_account_age_days": 4329 + "author_account_age_days": 4364 }, "https://github.com/lordgasmic/comfyui_save_image_with_options": { "stars": 0, "last_update": "2024-06-20 16:39:23", - "author_account_age_days": 4931 + "author_account_age_days": 4966 }, "https://github.com/lordgasmic/comfyui_wildcards": { "stars": 6, "last_update": "2024-06-20 16:52:14", - "author_account_age_days": 4931 + "author_account_age_days": 4966 }, "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": { - "stars": 408, + "stars": 455, "last_update": "2024-11-30 07:01:55", - "author_account_age_days": 4215 + "author_account_age_days": 4250 }, "https://github.com/lquesada/ComfyUI-Interactive": { - "stars": 28, + "stars": 31, "last_update": "2024-11-23 07:25:20", - "author_account_age_days": 4215 + "author_account_age_days": 4250 }, "https://github.com/lquesada/ComfyUI-Prompt-Combinator": { "stars": 32, "last_update": "2024-08-14 20:12:51", - "author_account_age_days": 4215 + "author_account_age_days": 4250 }, "https://github.com/lrzjason/Comfyui-In-Context-Lora-Utils": { - "stars": 81, - "last_update": "2024-12-05 08:25:10", - "author_account_age_days": 3827 + "stars": 143, + "last_update": "2024-12-25 07:12:24", + "author_account_age_days": 3862 }, "https://github.com/lrzjason/Comfyui-Kolors-Utils": { - "stars": 18, + "stars": 17, "last_update": "2024-07-26 11:12:25", - "author_account_age_days": 3827 + "author_account_age_days": 3862 }, "https://github.com/ltdrdata/ComfyUI-Impact-Pack": { - "stars": 1941, - "last_update": "2024-11-30 17:02:31", - "author_account_age_days": 626 + "stars": 2045, + "last_update": "2025-01-06 13:59:38", + "author_account_age_days": 661 + }, + "https://github.com/ltdrdata/ComfyUI-Impact-Subpack": { + "stars": 94, + "last_update": "2025-01-03 18:27:59", + "author_account_age_days": 661 }, "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": { - "stars": 449, - "last_update": "2024-11-30 16:28:22", - "author_account_age_days": 626 + "stars": 474, + "last_update": "2025-01-04 01:09:37", + "author_account_age_days": 661 }, "https://github.com/ltdrdata/ComfyUI-Manager": { - "stars": 7273, - "last_update": "2024-12-05 20:07:47", - "author_account_age_days": 626 + "stars": 7822, + "last_update": "2025-01-09 13:47:27", + "author_account_age_days": 661 }, "https://github.com/luandev/ComfyUI-CrewAI": { - "stars": 33, + "stars": 34, "last_update": "2024-08-01 18:44:41", - "author_account_age_days": 3972 + "author_account_age_days": 4006 }, "https://github.com/lucafoscili/comfyui-lf": { - "stars": 40, - "last_update": "2024-11-28 21:50:29", - "author_account_age_days": 2199 + "stars": 45, + "last_update": "2024-12-10 18:46:04", + "author_account_age_days": 2233 }, "https://github.com/lujiazho/ComfyUI-CatvtonFluxWrapper": { - "stars": 27, + "stars": 48, "last_update": "2024-12-02 22:10:41", - "author_account_age_days": 1601 + "author_account_age_days": 1636 }, "https://github.com/lumalabs/ComfyUI-LumaAI-API": { - "stars": 182, - "last_update": "2024-12-03 21:34:50", - "author_account_age_days": 1275 + "stars": 192, + "last_update": "2024-12-10 02:29:05", + "author_account_age_days": 1310 }, "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": { "stars": 1, "last_update": "2024-05-22 20:36:07", - "author_account_age_days": 479 + "author_account_age_days": 514 }, "https://github.com/madtunebk/ComfyUI-ControlnetAux": { "stars": 13, "last_update": "2024-06-28 16:16:51", - "author_account_age_days": 625 + "author_account_age_days": 660 }, "https://github.com/maepopi/Diffusers-in-ComfyUI": { - "stars": 3, - "last_update": "2024-08-27 13:15:51", - "author_account_age_days": 2522 + "stars": 6, + "last_update": "2024-12-07 17:27:17", + "author_account_age_days": 2557 + }, + "https://github.com/magic-quill/ComfyUI_MagicQuill": { + "stars": 82, + "last_update": "2024-12-16 04:15:45", + "author_account_age_days": 119 }, "https://github.com/maludwig/basix_image_filters": { "stars": 2, "last_update": "2024-11-06 20:38:07", - "author_account_age_days": 3670 + "author_account_age_days": 3705 }, "https://github.com/mape/ComfyUI-mape-Helpers": { - "stars": 166, + "stars": 172, "last_update": "2024-06-27 16:30:32", - "author_account_age_days": 5918 + "author_account_age_days": 5953 }, "https://github.com/maracman/ComfyUI-SubjectStyle-CSV": { "stars": 4, "last_update": "2024-06-24 13:53:39", - "author_account_age_days": 1331 + "author_account_age_days": 1366 + }, + "https://github.com/marcoc2/ComfyUI-AnotherUtils": { + "stars": 1, + "last_update": "2024-12-20 04:34:13", + "author_account_age_days": 5383 }, "https://github.com/marduk191/ComfyUI-Fluxpromptenhancer": { - "stars": 60, + "stars": 68, "last_update": "2024-11-01 22:09:01", - "author_account_age_days": 4579 + "author_account_age_days": 4614 }, "https://github.com/marduk191/comfyui-marnodes": { "stars": 4, "last_update": "2024-09-11 06:05:49", - "author_account_age_days": 4579 + "author_account_age_days": 4614 }, "https://github.com/marhensa/sdxl-recommended-res-calc": { - "stars": 78, + "stars": 79, "last_update": "2024-07-07 09:20:15", - "author_account_age_days": 4939 + "author_account_age_days": 4974 }, "https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver": { "stars": 10, "last_update": "2024-10-30 10:25:15", - "author_account_age_days": 3042 + "author_account_age_days": 3077 }, "https://github.com/martijnat/comfyui-previewlatent": { "stars": 32, "last_update": "2024-05-22 21:28:39", - "author_account_age_days": 2995 + "author_account_age_days": 3030 }, "https://github.com/massao000/ComfyUI_aspect_ratios": { "stars": 10, "last_update": "2024-05-22 22:23:10", - "author_account_age_days": 1571 + "author_account_age_days": 1606 }, "https://github.com/matan1905/ComfyUI-Serving-Toolkit": { - "stars": 59, + "stars": 61, "last_update": "2024-10-17 18:59:44", - "author_account_age_days": 2904 + "author_account_age_days": 2939 }, "https://github.com/mattjohnpowell/comfyui-lmstudio-image-to-text-node": { "stars": 6, "last_update": "2024-08-28 09:50:09", - "author_account_age_days": 4714 + "author_account_age_days": 4749 }, "https://github.com/mav-rik/facerestore_cf": { - "stars": 223, + "stars": 234, "last_update": "2024-05-22 20:53:23", - "author_account_age_days": 3085 + "author_account_age_days": 3119 }, "https://github.com/mbrostami/ComfyUI-HF": { "stars": 18, "last_update": "2024-05-27 21:45:33", - "author_account_age_days": 4486 + "author_account_age_days": 4521 }, "https://github.com/mbrostami/ComfyUI-TITrain": { "stars": 8, "last_update": "2024-08-14 02:19:27", - "author_account_age_days": 4486 + "author_account_age_days": 4521 }, "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": { - "stars": 1141, + "stars": 1160, "last_update": "2024-08-10 12:59:59", - "author_account_age_days": 2266 + "author_account_age_days": 2301 }, "https://github.com/meap158/ComfyUI-Background-Replacement": { - "stars": 53, - "last_update": "2024-05-22 20:43:52", - "author_account_age_days": 3367 + "stars": 56, + "last_update": "2025-01-06 23:45:28", + "author_account_age_days": 3402 }, "https://github.com/meap158/ComfyUI-GPU-temperature-protection": { "stars": 3, "last_update": "2024-05-22 20:43:21", - "author_account_age_days": 3367 + "author_account_age_days": 3402 }, "https://github.com/meap158/ComfyUI-Prompt-Expansion": { - "stars": 70, + "stars": 73, "last_update": "2024-05-22 20:43:37", - "author_account_age_days": 3367 + "author_account_age_days": 3402 }, "https://github.com/mech-tools/comfyui-checkpoint-automatic-config": { "stars": 4, "last_update": "2024-09-05 14:23:29", - "author_account_age_days": 4604 + "author_account_age_days": 4639 }, "https://github.com/melMass/comfy_mtb": { - "stars": 465, - "last_update": "2024-12-04 01:11:08", - "author_account_age_days": 3909 + "stars": 490, + "last_update": "2025-01-09 14:04:19", + "author_account_age_days": 3944 }, "https://github.com/mephisto83/petty-paint-comfyui-node": { "stars": 3, "last_update": "2024-10-23 22:23:03", - "author_account_age_days": 3837 + "author_account_age_days": 3871 }, "https://github.com/meshmesh-io/ComfyUI-MeshMesh": { "stars": 0, "last_update": "2024-05-23 00:10:09", - "author_account_age_days": 392 + "author_account_age_days": 427 }, "https://github.com/meshmesh-io/mm-comfyui-loopback": { "stars": 1, "last_update": "2024-05-23 00:09:57", - "author_account_age_days": 392 + "author_account_age_days": 427 }, "https://github.com/meshmesh-io/mm-comfyui-megamask": { "stars": 0, "last_update": "2024-05-23 00:09:47", - "author_account_age_days": 392 + "author_account_age_days": 427 }, "https://github.com/metal3d/ComfyUI_Human_Parts": { - "stars": 18, + "stars": 22, "last_update": "2024-09-13 05:15:40", - "author_account_age_days": 5638 + "author_account_age_days": 5672 }, "https://github.com/metncelik/comfyui_met_suite": { "stars": 1, "last_update": "2024-07-07 13:40:26", - "author_account_age_days": 787 + "author_account_age_days": 822 }, "https://github.com/mfg637/ComfyUI-ScheduledGuider-Ext": { "stars": 2, "last_update": "2024-11-29 13:12:52", - "author_account_age_days": 2482 + "author_account_age_days": 2516 }, "https://github.com/mgfxer/ComfyUI-FrameFX": { "stars": 23, "last_update": "2024-07-20 13:58:46", - "author_account_age_days": 166 + "author_account_age_days": 201 }, "https://github.com/miaoshouai/ComfyUI-Miaoshouai-Tagger": { - "stars": 281, + "stars": 318, "last_update": "2024-11-05 00:07:48", - "author_account_age_days": 632 + "author_account_age_days": 667 }, "https://github.com/microbote/ComfyUI-StyledCLIPTextEncode": { "stars": 2, "last_update": "2024-08-27 03:37:29", - "author_account_age_days": 2172 + "author_account_age_days": 2207 }, "https://github.com/mihaiiancu/ComfyUI_Inpaint": { "stars": 9, "last_update": "2024-05-22 18:19:38", - "author_account_age_days": 2825 + "author_account_age_days": 2860 }, "https://github.com/mikebilly/Transparent-background-comfyUI": { "stars": 1, "last_update": "2024-07-17 15:59:31", - "author_account_age_days": 2728 + "author_account_age_days": 2763 }, "https://github.com/mikkel/ComfyUI-text-overlay": { - "stars": 51, + "stars": 53, "last_update": "2024-08-17 16:09:41", - "author_account_age_days": 6080 + "author_account_age_days": 6115 }, "https://github.com/mikkel/comfyui-mask-boundingbox": { "stars": 28, "last_update": "2024-05-22 21:26:23", - "author_account_age_days": 6080 + "author_account_age_days": 6115 }, "https://github.com/mingsky-ai/ComfyUI-MingNodes": { - "stars": 194, + "stars": 232, "last_update": "2024-10-18 16:51:14", - "author_account_age_days": 85 + "author_account_age_days": 120 + }, + "https://github.com/mira-6/comfyui-sasolver": { + "stars": 2, + "last_update": "2025-01-09 04:21:01", + "author_account_age_days": 591 }, "https://github.com/mirabarukaso/ComfyUI_Mira": { - "stars": 50, - "last_update": "2024-11-08 10:02:39", - "author_account_age_days": 1385 + "stars": 62, + "last_update": "2024-12-28 09:33:14", + "author_account_age_days": 1419 }, "https://github.com/misterjoessef/MLTask_ComfyUI": { "stars": 1, "last_update": "2024-08-17 16:45:24", - "author_account_age_days": 902 + "author_account_age_days": 937 }, "https://github.com/mithamunda/ComfyUI-SD3.5-Latent-Size-Picker": { "stars": 1, - "last_update": "2024-10-29 12:04:37", - "author_account_age_days": 135 + "last_update": "2024-12-25 14:09:38", + "author_account_age_days": 170 }, "https://github.com/mithamunda/ComfyUI-TogetherVision": { - "stars": 0, - "last_update": "2024-12-04 13:44:59", - "author_account_age_days": 135 + "stars": 1, + "last_update": "2025-01-02 09:11:02", + "author_account_age_days": 170 }, "https://github.com/mithamunda/ComfyUI-ollama_killer": { "stars": 2, - "last_update": "2024-10-27 13:47:22", - "author_account_age_days": 135 + "last_update": "2024-12-25 13:10:30", + "author_account_age_days": 170 }, "https://github.com/mittimi/ComfyUI_mittimiLoadPreset2": { "stars": 3, "last_update": "2024-11-02 15:01:29", - "author_account_age_days": 4174 + "author_account_age_days": 4209 }, "https://github.com/mittimi/ComfyUI_mittimiRecalculateSize": { "stars": 1, "last_update": "2024-09-07 07:43:41", - "author_account_age_days": 4174 + "author_account_age_days": 4209 }, "https://github.com/mittimi/ComfyUI_mittimiWidthHeight": { "stars": 2, "last_update": "2024-09-07 07:48:03", - "author_account_age_days": 4174 + "author_account_age_days": 4209 }, "https://github.com/modelscope/comfyscope": { - "stars": 3, + "stars": 4, "last_update": "2024-11-20 08:48:36", - "author_account_age_days": 864 + "author_account_age_days": 899 }, "https://github.com/modelscope/scepter": { - "stars": 434, - "last_update": "2024-12-05 08:12:12", - "author_account_age_days": 864 + "stars": 448, + "last_update": "2024-12-07 16:31:54", + "author_account_age_days": 899 }, "https://github.com/modusCell/ComfyUI-dimension-node-modusCell": { "stars": 1, "last_update": "2024-05-22 22:08:50", - "author_account_age_days": 4768 + "author_account_age_days": 4803 }, "https://github.com/morino-kumasan/comfyui-toml-prompt": { "stars": 1, - "last_update": "2024-12-02 10:21:17", - "author_account_age_days": 1488 + "last_update": "2024-12-07 11:19:40", + "author_account_age_days": 1522 }, "https://github.com/motivated3/comfyui-shua-creator": { - "stars": 1, + "stars": 7, "last_update": "2024-12-05 10:39:52", - "author_account_age_days": 2970 + "author_account_age_days": 3005 }, "https://github.com/moustafa-nasr/ComfyUI-SimpleLogger": { - "stars": 1, + "stars": 2, "last_update": "2024-10-24 13:44:41", - "author_account_age_days": 3635 + "author_account_age_days": 3670 }, "https://github.com/moyi7712/ComfyUI_Seamless_Patten": { "stars": 16, "last_update": "2024-08-06 15:37:47", - "author_account_age_days": 2465 + "author_account_age_days": 2500 }, "https://github.com/mozman/ComfyUI_mozman_nodes": { "stars": 0, "last_update": "2024-05-22 22:13:32", - "author_account_age_days": 4244 + "author_account_age_days": 4279 + }, + "https://github.com/mrchipset/ComfyUI-SaveImageS3": { + "stars": 1, + "last_update": "2024-12-28 05:34:06", + "author_account_age_days": 2510 }, "https://github.com/mrhan1993/ComfyUI-Fooocus": { - "stars": 2, - "last_update": "2024-12-01 14:12:22", - "author_account_age_days": 2031 + "stars": 5, + "last_update": "2025-01-05 09:19:59", + "author_account_age_days": 2066 + }, + "https://github.com/muhammederem/blip-comfyui": { + "stars": 1, + "last_update": "2024-12-10 15:55:58", + "author_account_age_days": 2294 }, "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes": { "stars": 0, "last_update": "2024-07-15 14:13:58", - "author_account_age_days": 4102 + "author_account_age_days": 4137 + }, + "https://github.com/muxueChen/ComfyUI_NTCosyVoice": { + "stars": 20, + "last_update": "2025-01-04 02:48:08", + "author_account_age_days": 3160 }, "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": { "stars": 7, "last_update": "2024-07-31 13:49:27", - "author_account_age_days": 3110 + "author_account_age_days": 3145 }, "https://github.com/my-opencode/ComfyUI_IndustrialMagick": { "stars": 2, "last_update": "2024-07-31 14:04:26", - "author_account_age_days": 1544 + "author_account_age_days": 1579 }, "https://github.com/my-opencode/ComfyUI_KSamplerTimer": { "stars": 2, "last_update": "2024-07-31 14:13:17", - "author_account_age_days": 1544 + "author_account_age_days": 1579 }, "https://github.com/myshell-ai/ComfyUI-ShellAgent-Plugin": { - "stars": 6, - "last_update": "2024-12-03 07:20:20", - "author_account_age_days": 633 + "stars": 7, + "last_update": "2024-12-30 06:55:30", + "author_account_age_days": 668 }, "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL": { - "stars": 4, + "stars": 3, "last_update": "2024-07-19 14:46:14", - "author_account_age_days": 3838 + "author_account_age_days": 3873 }, "https://github.com/nagolinc/comfyui_openai_node": { "stars": 1, "last_update": "2024-06-15 15:59:07", - "author_account_age_days": 3838 + "author_account_age_days": 3873 }, "https://github.com/nat-chan/ComfyUI-graphToPrompt": { "stars": 2, "last_update": "2024-05-23 01:16:40", - "author_account_age_days": 3157 + "author_account_age_days": 3192 }, "https://github.com/nat-chan/comfyui-transceiver": { "stars": 5, "last_update": "2024-05-23 01:16:28", - "author_account_age_days": 3157 + "author_account_age_days": 3192 }, "https://github.com/nathannlu/ComfyUI-Cloud": { - "stars": 183, + "stars": 190, "last_update": "2024-07-31 18:05:55", - "author_account_age_days": 2889 + "author_account_age_days": 2924 }, "https://github.com/nathannlu/ComfyUI-Pets": { - "stars": 44, + "stars": 45, "last_update": "2024-06-14 11:00:42", - "author_account_age_days": 2889 + "author_account_age_days": 2924 }, "https://github.com/natto-maki/ComfyUI-NegiTools": { "stars": 30, "last_update": "2024-09-15 05:11:18", - "author_account_age_days": 442 + "author_account_age_days": 477 }, "https://github.com/nchenevey1/comfyui-gimp-nodes": { "stars": 8, "last_update": "2024-10-26 09:11:34", - "author_account_age_days": 814 + "author_account_age_days": 848 }, "https://github.com/neph1/comfyui-smooth-step-lora-loader": { - "stars": 6, - "last_update": "2024-12-04 16:41:23", - "author_account_age_days": 3816 + "stars": 7, + "last_update": "2024-12-25 18:40:01", + "author_account_age_days": 3850 + }, + "https://github.com/neverbiasu/ComfyUI-Dashscope": { + "stars": 1, + "last_update": "2024-12-28 10:11:48", + "author_account_age_days": 1218 }, "https://github.com/neverbiasu/ComfyUI-Image-Captioner": { - "stars": 5, - "last_update": "2024-08-01 03:33:01", - "author_account_age_days": 1183 + "stars": 6, + "last_update": "2024-12-12 06:33:15", + "author_account_age_days": 1218 }, "https://github.com/neverbiasu/ComfyUI-SAM2": { - "stars": 87, - "last_update": "2024-11-29 03:13:39", - "author_account_age_days": 1183 + "stars": 104, + "last_update": "2025-01-02 04:13:53", + "author_account_age_days": 1218 }, "https://github.com/neverbiasu/ComfyUI-StyleShot": { - "stars": 8, + "stars": 9, "last_update": "2024-11-24 09:40:44", - "author_account_age_days": 1183 + "author_account_age_days": 1218 }, "https://github.com/nicehero/comfyui-SegGPT": { - "stars": 1, + "stars": 5, "last_update": "2024-08-26 06:05:35", - "author_account_age_days": 4174 + "author_account_age_days": 4208 }, "https://github.com/nickve28/ComfyUI-Nich-Utils": { "stars": 9, "last_update": "2024-09-05 03:39:09", - "author_account_age_days": 4193 + "author_account_age_days": 4228 }, "https://github.com/nicofdga/DZ-FaceDetailer": { - "stars": 161, + "stars": 168, "last_update": "2024-06-17 10:00:30", - "author_account_age_days": 1395 + "author_account_age_days": 1430 }, "https://github.com/niknah/ComfyUI-F5-TTS": { - "stars": 36, - "last_update": "2024-11-14 02:12:13", - "author_account_age_days": 4884 + "stars": 73, + "last_update": "2024-12-09 03:31:43", + "author_account_age_days": 4919 }, "https://github.com/niknah/quick-connections": { - "stars": 138, - "last_update": "2024-11-19 12:39:37", - "author_account_age_days": 4884 + "stars": 159, + "last_update": "2024-12-15 03:01:31", + "author_account_age_days": 4919 }, "https://github.com/nilor-corp/nilor-nodes": { "stars": 3, "last_update": "2024-11-15 03:30:08", - "author_account_age_days": 379 + "author_account_age_days": 414 }, "https://github.com/ningxiaoxiao/comfyui-NDI": { - "stars": 53, + "stars": 54, "last_update": "2024-07-02 09:03:11", - "author_account_age_days": 3152 + "author_account_age_days": 3187 }, "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI": { "stars": 1, "last_update": "2024-07-31 08:34:48", - "author_account_age_days": 500 + "author_account_age_days": 534 }, "https://github.com/nirex0/ComfyUI_pytorch_openpose": { "stars": 2, "last_update": "2024-06-14 12:01:07", - "author_account_age_days": 3667 + "author_account_age_days": 3702 }, "https://github.com/nkchocoai/ComfyUI-Dart": { - "stars": 22, + "stars": 24, "last_update": "2024-08-17 03:08:51", - "author_account_age_days": 324 + "author_account_age_days": 359 }, "https://github.com/nkchocoai/ComfyUI-PromptUtilities": { - "stars": 9, + "stars": 10, "last_update": "2024-10-19 14:44:42", - "author_account_age_days": 324 + "author_account_age_days": 359 }, "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData": { - "stars": 36, - "last_update": "2024-10-27 05:44:41", - "author_account_age_days": 324 + "stars": 46, + "last_update": "2024-12-30 12:15:57", + "author_account_age_days": 359 }, "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": { - "stars": 5, + "stars": 7, "last_update": "2024-08-17 03:08:42", - "author_account_age_days": 324 + "author_account_age_days": 359 }, "https://github.com/nkchocoai/ComfyUI-TextOnSegs": { - "stars": 10, + "stars": 11, "last_update": "2024-06-23 04:52:29", - "author_account_age_days": 324 + "author_account_age_days": 359 + }, + "https://github.com/nmlen/comfyui-mosaic-blur": { + "stars": 1, + "last_update": "2025-01-07 23:16:26", + "author_account_age_days": 476 }, "https://github.com/noarche/sd-webui-color-enhance": { "stars": 4, "last_update": "2024-08-04 08:11:53", - "author_account_age_days": 1827 + "author_account_age_days": 1861 }, "https://github.com/noembryo/ComfyUI-noEmbryo": { - "stars": 21, + "stars": 24, "last_update": "2024-10-24 20:22:13", - "author_account_age_days": 2907 + "author_account_age_days": 2942 }, "https://github.com/nonnonstop/comfyui-faster-loading": { - "stars": 6, + "stars": 8, "last_update": "2024-06-13 15:37:45", - "author_account_age_days": 2286 + "author_account_age_days": 2321 }, "https://github.com/nosiu/comfyui-instantId-faceswap": { - "stars": 201, + "stars": 208, "last_update": "2024-10-20 21:07:49", - "author_account_age_days": 4069 + "author_account_age_days": 4104 }, "https://github.com/noxinias/ComfyUI_NoxinNodes": { "stars": 10, "last_update": "2024-05-22 21:24:24", - "author_account_age_days": 2725 + "author_account_age_days": 2759 + }, + "https://github.com/nsdtcloud3d/ComfyUI-3D-Convert": { + "stars": 10, + "last_update": "2024-12-23 07:46:17", + "author_account_age_days": 274 }, "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": { - "stars": 28, + "stars": 29, "last_update": "2024-05-22 22:22:14", - "author_account_age_days": 1882 + "author_account_age_days": 1916 }, "https://github.com/nuanarchy/ComfyUI-NuA-BIRD": { - "stars": 8, + "stars": 9, "last_update": "2024-06-18 05:35:49", - "author_account_age_days": 1256 + "author_account_age_days": 1291 }, "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": { "stars": 22, "last_update": "2024-07-31 13:54:00", - "author_account_age_days": 1256 + "author_account_age_days": 1291 }, "https://github.com/nullquant/ComfyUI-BrushNet": { - "stars": 671, + "stars": 707, "last_update": "2024-11-11 16:15:51", - "author_account_age_days": 1340 + "author_account_age_days": 1375 }, "https://github.com/numz/ComfyUI-FlowChain": { - "stars": 95, + "stars": 101, "last_update": "2024-10-19 21:20:45", - "author_account_age_days": 4948 + "author_account_age_days": 4982 }, "https://github.com/nux1111/ComfyUI_NetDist_Plus": { - "stars": 18, + "stars": 21, "last_update": "2024-08-27 23:15:18", - "author_account_age_days": 717 + "author_account_age_days": 751 }, "https://github.com/okgo4/ComfyUI-Mosaic-Mask": { - "stars": 2, + "stars": 3, "last_update": "2024-08-15 01:51:13", - "author_account_age_days": 2851 + "author_account_age_days": 2886 }, "https://github.com/olduvai-jp/ComfyUI-HfLoader": { "stars": 4, "last_update": "2024-05-23 00:14:52", - "author_account_age_days": 1040 + "author_account_age_days": 1075 }, "https://github.com/oleksandr612/ComfyUI-Counter": { "stars": 1, "last_update": "2024-08-05 16:18:48", - "author_account_age_days": 126 + "author_account_age_days": 161 }, "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92": { - "stars": 134, + "stars": 140, "last_update": "2024-09-10 14:16:30", - "author_account_age_days": 4671 + "author_account_age_days": 4705 }, "https://github.com/opvelll/ComfyUI_TextListProduct": { "stars": 2, "last_update": "2024-10-30 16:00:09", - "author_account_age_days": 1718 + "author_account_age_days": 1753 }, "https://github.com/osi1880vr/prompt_quill_comfyui": { - "stars": 14, + "stars": 15, "last_update": "2024-06-13 17:24:12", - "author_account_age_days": 1241 + "author_account_age_days": 1275 }, "https://github.com/ostris/ostris_nodes_comfyui": { - "stars": 26, + "stars": 28, "last_update": "2024-08-20 10:40:03", - "author_account_age_days": 2567 + "author_account_age_days": 2601 }, "https://github.com/ownimage/ComfyUI-ownimage": { "stars": 0, "last_update": "2024-05-22 22:22:37", - "author_account_age_days": 2947 + "author_account_age_days": 2982 }, "https://github.com/oyvindg/ComfyUI-TrollSuite": { "stars": 2, "last_update": "2024-08-15 10:37:43", - "author_account_age_days": 2494 + "author_account_age_days": 2529 }, "https://github.com/oztrkoguz/ComfyUI_StoryCreator": { - "stars": 24, + "stars": 25, "last_update": "2024-05-23 12:18:45", - "author_account_age_days": 1006 + "author_account_age_days": 1040 }, "https://github.com/palant/image-resize-comfyui": { - "stars": 79, + "stars": 77, "last_update": "2024-01-18 20:59:55", - "author_account_age_days": 5217 + "author_account_age_days": 5252 }, "https://github.com/palant/integrated-nodes-comfyui": { "stars": 36, "last_update": "2023-12-27 22:52:00", - "author_account_age_days": 5217 + "author_account_age_days": 5252 }, "https://github.com/pamparamm/ComfyUI-ppm": { - "stars": 119, - "last_update": "2024-12-04 16:49:53", - "author_account_age_days": 2295 + "stars": 143, + "last_update": "2025-01-03 07:53:12", + "author_account_age_days": 2330 }, "https://github.com/pamparamm/ComfyUI-vectorscope-cc": { - "stars": 12, + "stars": 14, "last_update": "2024-09-01 05:22:43", - "author_account_age_days": 2295 + "author_account_age_days": 2330 }, "https://github.com/pamparamm/sd-perturbed-attention": { - "stars": 223, + "stars": 230, "last_update": "2024-11-30 06:34:59", - "author_account_age_days": 2295 + "author_account_age_days": 2330 + }, + "https://github.com/pandaer119/ComfyUI_pandai": { + "stars": 4, + "last_update": "2025-01-07 13:01:42", + "author_account_age_days": 205 }, "https://github.com/pants007/comfy-pants": { "stars": 2, "last_update": "2024-05-22 18:16:04", - "author_account_age_days": 2481 + "author_account_age_days": 2516 }, "https://github.com/patriciogonzalezvivo/comfyui_glslnodes": { - "stars": 184, + "stars": 188, "last_update": "2024-08-28 08:07:53", - "author_account_age_days": 5244 + "author_account_age_days": 5279 }, "https://github.com/paulo-coronado/comfy_clip_blip_node": { "stars": 29, "last_update": "2024-05-22 17:39:09", - "author_account_age_days": 2851 + "author_account_age_days": 2886 }, "https://github.com/pbpbpb2705/ComfyUI-LyraVSIH": { "stars": 1, "last_update": "2024-08-30 07:52:11", - "author_account_age_days": 1394 + "author_account_age_days": 1429 + }, + "https://github.com/pharmapsychotic/comfy-cliption": { + "stars": 37, + "last_update": "2025-01-04 05:06:11", + "author_account_age_days": 1113 }, "https://github.com/phazei/ConfyUI-node-prompt-stash-saver": { - "stars": 1, - "last_update": "2024-11-13 02:49:48", - "author_account_age_days": 5173 + "stars": 2, + "last_update": "2024-12-28 07:07:26", + "author_account_age_days": 5207 }, "https://github.com/philz1337x/ComfyUI-ClarityAI": { - "stars": 151, + "stars": 157, "last_update": "2024-09-25 08:48:51", - "author_account_age_days": 828 + "author_account_age_days": 862 }, "https://github.com/phineas-pta/comfyui-auto-nodes-layout": { - "stars": 38, + "stars": 41, "last_update": "2024-08-02 17:31:24", - "author_account_age_days": 2453 + "author_account_age_days": 2487 + }, + "https://github.com/phuvinh010701/ComfyUI-Nudenet": { + "stars": 8, + "last_update": "2025-01-06 11:49:33", + "author_account_age_days": 1873 }, "https://github.com/phyblas/paint-by-example_comfyui": { "stars": 7, "last_update": "2024-08-24 23:46:13", - "author_account_age_days": 3217 + "author_account_age_days": 3252 }, "https://github.com/picturesonpictures/comfy_PoP": { - "stars": 15, + "stars": 17, "last_update": "2024-07-05 07:32:50", - "author_account_age_days": 751 + "author_account_age_days": 786 }, "https://github.com/pikenrover/ComfyUI_PRNodes": { "stars": 3, "last_update": "2024-10-08 17:29:07", - "author_account_age_days": 134 + "author_account_age_days": 169 }, "https://github.com/pkpkTech/ComfyUI-SaveAVIF": { "stars": 2, "last_update": "2024-05-22 22:19:21", - "author_account_age_days": 1667 + "author_account_age_days": 1702 }, "https://github.com/pkpkTech/ComfyUI-SaveQueues": { "stars": 3, "last_update": "2024-05-22 22:19:54", - "author_account_age_days": 1667 + "author_account_age_days": 1702 }, "https://github.com/pkpkTech/ComfyUI-TemporaryLoader": { "stars": 1, "last_update": "2024-05-22 22:19:44", - "author_account_age_days": 1667 + "author_account_age_days": 1702 }, "https://github.com/pkpkTech/ComfyUI-ngrok": { "stars": 4, "last_update": "2024-05-22 22:19:32", - "author_account_age_days": 1667 + "author_account_age_days": 1702 }, "https://github.com/playbook3d/playbook3d-comfyui-nodes": { "stars": 20, - "last_update": "2024-11-30 06:24:29", - "author_account_age_days": 1664 + "last_update": "2025-01-09 09:58:00", + "author_account_age_days": 1699 }, "https://github.com/plugcrypt/CRT-Nodes": { "stars": 2, "last_update": "2024-10-01 07:58:40", - "author_account_age_days": 1226 + "author_account_age_days": 1261 + }, + "https://github.com/pollockjj/ComfyUI-MultiGPU": { + "stars": 21, + "last_update": "2025-01-07 18:18:12", + "author_account_age_days": 3705 }, "https://github.com/portu-sim/comfyui_bmab": { - "stars": 95, + "stars": 99, "last_update": "2024-10-07 16:39:03", - "author_account_age_days": 486 + "author_account_age_days": 521 }, "https://github.com/prodogape/ComfyUI-EasyOCR": { - "stars": 25, + "stars": 27, "last_update": "2024-08-05 07:03:20", - "author_account_age_days": 1194 + "author_account_age_days": 1229 }, "https://github.com/prodogape/ComfyUI-Minio": { "stars": 2, "last_update": "2024-05-23 00:13:38", - "author_account_age_days": 1194 + "author_account_age_days": 1229 }, "https://github.com/prodogape/ComfyUI-OmDet": { "stars": 2, "last_update": "2024-06-14 13:01:34", - "author_account_age_days": 1194 + "author_account_age_days": 1229 }, "https://github.com/prodogape/Comfyui-Yolov8-JSON": { - "stars": 20, + "stars": 21, "last_update": "2024-08-28 02:10:39", - "author_account_age_days": 1194 + "author_account_age_days": 1229 }, "https://github.com/prozacgod/comfyui-pzc-multiworkspace": { "stars": 7, "last_update": "2024-05-22 23:11:46", - "author_account_age_days": 5732 + "author_account_age_days": 5767 }, "https://github.com/pschroedl/ComfyUI-SAM2-Realtime": { "stars": 8, - "last_update": "2024-12-03 17:47:10", - "author_account_age_days": 4152 + "last_update": "2024-12-10 07:58:22", + "author_account_age_days": 4186 }, "https://github.com/purpen/ComfyUI-AIRedoon": { - "stars": 2, - "last_update": "2024-11-28 02:01:46", - "author_account_age_days": 5102 + "stars": 3, + "last_update": "2024-12-11 09:38:42", + "author_account_age_days": 5137 }, "https://github.com/purpen/ComfyUI-ImageTagger": { "stars": 3, "last_update": "2024-11-27 17:20:49", - "author_account_age_days": 5102 + "author_account_age_days": 5137 }, "https://github.com/pydn/ComfyUI-to-Python-Extension": { - "stars": 1294, + "stars": 1385, "last_update": "2024-09-16 04:37:55", - "author_account_age_days": 2861 + "author_account_age_days": 2895 }, "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": { - "stars": 1898, - "last_update": "2024-11-07 20:47:25", - "author_account_age_days": 662 + "stars": 1991, + "last_update": "2025-01-02 20:10:04", + "author_account_age_days": 696 }, "https://github.com/pythongosssss/ComfyUI-WD14-Tagger": { - "stars": 676, + "stars": 723, "last_update": "2024-10-23 19:52:57", - "author_account_age_days": 662 + "author_account_age_days": 696 }, "https://github.com/pzc163/Comfyui-CatVTON": { - "stars": 143, + "stars": 144, "last_update": "2024-10-03 12:50:42", - "author_account_age_days": 941 + "author_account_age_days": 976 }, "https://github.com/pzc163/Comfyui_MiniCPMv2_6-prompt-generator": { - "stars": 70, + "stars": 71, "last_update": "2024-08-30 08:37:48", - "author_account_age_days": 941 + "author_account_age_days": 976 }, "https://github.com/qwixiwp/queuetools": { "stars": 0, "last_update": "2024-06-14 10:27:57", - "author_account_age_days": 775 + "author_account_age_days": 810 }, "https://github.com/ramesh-x90/ComfyUI_pyannote": { "stars": 2, "last_update": "2024-11-23 09:42:16", - "author_account_age_days": 1486 + "author_account_age_days": 1521 }, "https://github.com/ramyma/A8R8_ComfyUI_nodes": { - "stars": 49, - "last_update": "2024-08-18 11:59:42", - "author_account_age_days": 3381 + "stars": 51, + "last_update": "2024-12-09 16:06:25", + "author_account_age_days": 3416 }, "https://github.com/randjtw/advance-aesthetic-score": { "stars": 0, "last_update": "2024-05-23 01:14:47", - "author_account_age_days": 925 + "author_account_age_days": 960 + }, + "https://github.com/randomnoner11/ComfyUI-MistralAI-API": { + "stars": 2, + "last_update": "2024-12-28 19:31:31", + "author_account_age_days": 18 }, "https://github.com/raspie10032/ComfyUI_RS_NAI_Local_Prompt_converter": { "stars": 1, - "last_update": "2024-11-07 13:39:12", - "author_account_age_days": 200 + "last_update": "2024-12-26 10:23:16", + "author_account_age_days": 235 }, "https://github.com/ratulrafsan/Comfyui-SAL-VTON": { - "stars": 80, + "stars": 81, "last_update": "2024-08-26 09:52:06", - "author_account_age_days": 4658 + "author_account_age_days": 4693 }, "https://github.com/raysers/Mflux-ComfyUI": { - "stars": 37, + "stars": 47, "last_update": "2024-12-05 08:42:13", - "author_account_age_days": 2169 + "author_account_age_days": 2203 }, "https://github.com/rcfcu2000/zhihuige-nodes-comfyui": { "stars": 1, "last_update": "2024-05-22 22:13:55", - "author_account_age_days": 3589 + "author_account_age_days": 3623 }, "https://github.com/rcsaquino/comfyui-custom-nodes": { "stars": 2, "last_update": "2024-08-26 10:08:29", - "author_account_age_days": 1675 + "author_account_age_days": 1710 }, "https://github.com/rdancer/ComfyUI_Florence2SAM2": { - "stars": 19, + "stars": 26, "last_update": "2024-10-25 09:09:43", - "author_account_age_days": 5785 + "author_account_age_days": 5820 }, "https://github.com/receyuki/comfyui-prompt-reader-node": { - "stars": 297, + "stars": 312, "last_update": "2024-09-06 11:40:48", - "author_account_age_days": 2757 + "author_account_age_days": 2792 }, "https://github.com/recraft-ai/ComfyUI-RecraftAI": { - "stars": 35, + "stars": 41, "last_update": "2024-11-06 13:54:26", - "author_account_age_days": 887 + "author_account_age_days": 921 }, "https://github.com/redhottensors/ComfyUI-Prediction": { - "stars": 12, + "stars": 14, "last_update": "2024-07-14 21:19:01", - "author_account_age_days": 303 + "author_account_age_days": 338 + }, + "https://github.com/regiellis/ComfyUI-EasyNoobai": { + "stars": 7, + "last_update": "2025-01-06 18:38:11", + "author_account_age_days": 4826 }, "https://github.com/regiellis/ComfyUI-EasyPony": { - "stars": 6, + "stars": 7, "last_update": "2024-12-01 20:36:54", - "author_account_age_days": 4791 + "author_account_age_days": 4826 }, "https://github.com/replicate/comfyui-replicate": { - "stars": 160, + "stars": 168, "last_update": "2024-11-05 15:26:20", - "author_account_age_days": 1772 + "author_account_age_days": 1807 }, "https://github.com/revirevy/Comfyui_saveimage_imgbb": { "stars": 1, "last_update": "2024-11-30 15:31:52", - "author_account_age_days": 4649 + "author_account_age_days": 4684 }, "https://github.com/rgthree/rgthree-comfy": { - "stars": 1258, - "last_update": "2024-11-29 20:04:49", - "author_account_age_days": 5138 + "stars": 1387, + "last_update": "2024-12-31 04:01:59", + "author_account_age_days": 5173 }, "https://github.com/rhdunn/comfyui-audio-processing": { - "stars": 5, + "stars": 6, "last_update": "2024-08-22 19:11:01", - "author_account_age_days": 5801 + "author_account_age_days": 5836 }, "https://github.com/rhdunn/comfyui-bus-plugin": { - "stars": 2, + "stars": 3, "last_update": "2024-08-22 19:00:56", - "author_account_age_days": 5801 + "author_account_age_days": 5836 + }, + "https://github.com/rhplus0831/ComfyMepi": { + "stars": 1, + "last_update": "2025-01-01 15:58:13", + "author_account_age_days": 352 }, "https://github.com/richinsley/Comfy-LFO": { "stars": 5, "last_update": "2024-05-22 20:46:30", - "author_account_age_days": 2844 + "author_account_age_days": 2879 }, "https://github.com/ricklove/comfyui-ricklove": { "stars": 2, "last_update": "2024-10-05 03:12:28", - "author_account_age_days": 4997 + "author_account_age_days": 5031 + }, + "https://github.com/risunobushi/ComfyUI-Similarity-Score": { + "stars": 2, + "last_update": "2025-01-03 15:27:06", + "author_account_age_days": 846 }, "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": { - "stars": 21, + "stars": 28, "last_update": "2024-06-14 10:28:04", - "author_account_age_days": 811 + "author_account_age_days": 846 }, "https://github.com/rnbwdsh/ComfyUI-LatentWalk": { - "stars": 6, + "stars": 7, "last_update": "2024-08-20 22:39:19", - "author_account_age_days": 3711 + "author_account_age_days": 3745 }, "https://github.com/robertvoy/ComfyUI-Flux-Continuum": { - "stars": 104, + "stars": 123, "last_update": "2024-12-03 19:25:59", - "author_account_age_days": 4269 + "author_account_age_days": 4304 }, "https://github.com/robtl2/ComfyUI-ComfyBridge": { "stars": 1, "last_update": "2024-11-18 23:28:13", - "author_account_age_days": 616 + "author_account_age_days": 651 + }, + "https://github.com/rohitsainier/ComfyUI-InstagramDownloader": { + "stars": 12, + "last_update": "2025-01-02 08:47:22", + "author_account_age_days": 3352 }, "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": { - "stars": 6, + "stars": 7, "last_update": "2024-05-22 21:29:25", - "author_account_age_days": 455 + "author_account_age_days": 489 }, "https://github.com/ronaldzgithub/ComfyUI_Appstore": { - "stars": 3, + "stars": 4, "last_update": "2024-12-04 15:02:42", - "author_account_age_days": 2474 + "author_account_age_days": 2509 }, "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration": { - "stars": 96, + "stars": 100, "last_update": "2024-11-18 05:08:11", - "author_account_age_days": 4319 + "author_account_age_days": 4354 + }, + "https://github.com/ronsantash/Comfyui-flexi-lora-loader": { + "stars": 2, + "last_update": "2024-12-24 00:16:52", + "author_account_age_days": 1216 }, "https://github.com/royceschultz/ComfyUI-Notifications": { - "stars": 8, - "last_update": "2024-05-23 01:23:16", - "author_account_age_days": 2694 + "stars": 10, + "last_update": "2024-12-31 16:13:21", + "author_account_age_days": 2728 }, "https://github.com/royceschultz/ComfyUI-TranscriptionTools": { - "stars": 15, + "stars": 18, "last_update": "2024-05-23 01:10:10", - "author_account_age_days": 2694 + "author_account_age_days": 2728 }, - "https://github.com/rubi-du/ComfyUI-BiRefNet-lite": { - "stars": 5, - "last_update": "2024-11-22 06:22:54", - "author_account_age_days": 346 + "https://github.com/rubi-du/ComfyUI-BiRefNet-Super": { + "stars": 7, + "last_update": "2025-01-02 02:39:10", + "author_account_age_days": 381 }, "https://github.com/rubi-du/ComfyUI-Flux-Inpainting": { - "stars": 5, - "last_update": "2024-11-28 08:51:05", - "author_account_age_days": 346 + "stars": 15, + "last_update": "2024-12-27 05:08:40", + "author_account_age_days": 381 }, "https://github.com/rubi-du/ComfyUI-ICC-nodes": { - "stars": 1, + "stars": 2, "last_update": "2024-12-05 08:27:40", - "author_account_age_days": 346 + "author_account_age_days": 381 }, "https://github.com/rui40000/RUI-Nodes": { "stars": 15, "last_update": "2024-05-22 22:12:26", - "author_account_age_days": 638 + "author_account_age_days": 673 }, "https://github.com/ruiqutech/ComfyUI-RuiquNodes": { "stars": 0, "last_update": "2024-05-23 01:21:50", - "author_account_age_days": 234 + "author_account_age_days": 269 }, "https://github.com/runtime44/comfyui_r44_nodes": { "stars": 40, "last_update": "2024-07-01 08:02:04", - "author_account_age_days": 332 + "author_account_age_days": 367 }, "https://github.com/ruucm/ruucm-comfy": { "stars": 2, "last_update": "2024-10-12 10:31:49", - "author_account_age_days": 2585 + "author_account_age_days": 2619 }, "https://github.com/ryanontheinside/ComfyUI_Doom": { - "stars": 4, + "stars": 5, "last_update": "2024-11-08 17:58:21", - "author_account_age_days": 3853 + "author_account_age_days": 3888 + }, + "https://github.com/ryanontheinside/ComfyUI_EfficientTAM": { + "stars": 3, + "last_update": "2024-12-21 20:25:05", + "author_account_age_days": 3888 + }, + "https://github.com/ryanontheinside/ComfyUI_RealTimeNodes": { + "stars": 12, + "last_update": "2025-01-09 00:34:28", + "author_account_age_days": 3888 }, "https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside": { - "stars": 316, - "last_update": "2024-11-25 20:40:17", - "author_account_age_days": 3853 + "stars": 359, + "last_update": "2025-01-09 01:17:04", + "author_account_age_days": 3888 }, "https://github.com/saftle/uber_comfy_nodes": { "stars": 2, "last_update": "2024-08-24 02:42:40", - "author_account_age_days": 4921 + "author_account_age_days": 4956 }, "https://github.com/sakura1bgx/ComfyUI_FlipStreamViewer": { "stars": 3, "last_update": "2024-11-04 04:39:41", - "author_account_age_days": 102 + "author_account_age_days": 137 + }, + "https://github.com/sanbuphy/ComfyUI-AudioLDM": { + "stars": 1, + "last_update": "2025-01-02 02:01:12", + "author_account_age_days": 1121 }, "https://github.com/sdfxai/SDFXBridgeForComfyUI": { "stars": 11, "last_update": "2024-06-14 10:26:56", - "author_account_age_days": 399 + "author_account_age_days": 434 }, "https://github.com/seanlynch/comfyui-optical-flow": { - "stars": 31, + "stars": 32, "last_update": "2024-05-22 20:52:17", - "author_account_age_days": 5469 + "author_account_age_days": 5504 }, "https://github.com/seanlynch/srl-nodes": { - "stars": 4, + "stars": 7, "last_update": "2024-06-30 13:47:38", - "author_account_age_days": 5469 + "author_account_age_days": 5504 + }, + "https://github.com/sebord/ComfyUI-LMCQ": { + "stars": 30, + "last_update": "2025-01-08 12:10:06", + "author_account_age_days": 986 }, "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": { "stars": 3, "last_update": "2024-05-22 21:34:15", - "author_account_age_days": 3497 + "author_account_age_days": 3531 + }, + "https://github.com/sh570655308/ComfyUI-GigapixelAI": { + "stars": 105, + "last_update": "2025-01-07 14:16:36", + "author_account_age_days": 2701 + }, + "https://github.com/sh570655308/ComfyUI-TopazVideoAI": { + "stars": 80, + "last_update": "2025-01-08 05:49:33", + "author_account_age_days": 2701 }, "https://github.com/shadowcz007/comfyui-Image-reward": { - "stars": 28, + "stars": 29, "last_update": "2024-06-14 10:24:49", - "author_account_age_days": 3479 + "author_account_age_days": 3514 }, "https://github.com/shadowcz007/comfyui-consistency-decoder": { "stars": 2, "last_update": "2024-06-14 10:23:35", - "author_account_age_days": 3479 + "author_account_age_days": 3514 }, "https://github.com/shadowcz007/comfyui-edit-mask": { "stars": 6, "last_update": "2024-06-20 01:42:48", - "author_account_age_days": 3479 + "author_account_age_days": 3514 }, "https://github.com/shadowcz007/comfyui-liveportrait": { - "stars": 428, + "stars": 435, "last_update": "2024-09-01 10:34:41", - "author_account_age_days": 3479 + "author_account_age_days": 3514 }, "https://github.com/shadowcz007/comfyui-mixlab-nodes": { - "stars": 1332, + "stars": 1391, "last_update": "2024-11-26 11:59:58", - "author_account_age_days": 3479 + "author_account_age_days": 3514 }, "https://github.com/shadowcz007/comfyui-sound-lab": { - "stars": 102, + "stars": 105, "last_update": "2024-07-04 12:53:38", - "author_account_age_days": 3479 + "author_account_age_days": 3514 }, "https://github.com/shadowcz007/comfyui-try-on": { - "stars": 12, + "stars": 13, "last_update": "2024-08-15 10:50:22", - "author_account_age_days": 3479 + "author_account_age_days": 3514 }, "https://github.com/shadowcz007/comfyui-ultralytics-yolo": { "stars": 27, "last_update": "2024-06-22 09:06:04", - "author_account_age_days": 3479 + "author_account_age_days": 3514 + }, + "https://github.com/shahkoorosh/ComfyUI-KGnodes": { + "stars": 1, + "last_update": "2024-12-27 17:55:11", + "author_account_age_days": 392 }, "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": { "stars": 2, "last_update": "2024-05-23 00:14:25", - "author_account_age_days": 5257 + "author_account_age_days": 5292 }, "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus": { - "stars": 245, + "stars": 253, "last_update": "2024-12-01 18:40:16", - "author_account_age_days": 1929 + "author_account_age_days": 1964 }, "https://github.com/shiimizu/ComfyUI-TiledDiffusion": { - "stars": 333, + "stars": 355, "last_update": "2024-12-02 22:41:52", - "author_account_age_days": 1929 + "author_account_age_days": 1964 }, "https://github.com/shiimizu/ComfyUI-semantic-aware-guidance": { - "stars": 8, + "stars": 9, "last_update": "2024-08-08 19:59:57", - "author_account_age_days": 1929 + "author_account_age_days": 1964 }, "https://github.com/shiimizu/ComfyUI_smZNodes": { - "stars": 222, - "last_update": "2024-12-01 22:22:26", - "author_account_age_days": 1929 + "stars": 233, + "last_update": "2024-12-29 10:24:12", + "author_account_age_days": 1964 }, "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage": { "stars": 34, "last_update": "2024-05-22 20:41:29", - "author_account_age_days": 2387 + "author_account_age_days": 2422 }, "https://github.com/shingo1228/ComfyUI-send-eagle-slim": { - "stars": 29, + "stars": 30, "last_update": "2024-07-30 22:28:41", - "author_account_age_days": 2387 + "author_account_age_days": 2422 }, "https://github.com/shinich39/comfyui-connect-from-afar": { "stars": 1, "last_update": "2024-08-15 21:10:31", - "author_account_age_days": 476 + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-group-selection": { "stars": 2, "last_update": "2024-08-16 06:01:35", - "author_account_age_days": 476 + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-load-image-in-seq": { "stars": 6, "last_update": "2024-08-23 11:51:31", - "author_account_age_days": 476 - }, - "https://github.com/shinich39/comfyui-load-image-with-cmd": { - "stars": 1, - "last_update": "2024-08-20 09:30:07", - "author_account_age_days": 476 + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-local-db": { "stars": 3, "last_update": "2024-08-03 15:45:29", - "author_account_age_days": 476 + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-model-db": { "stars": 1, "last_update": "2024-07-27 18:32:45", - "author_account_age_days": 476 + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-parse-image": { - "stars": 2, - "last_update": "2024-09-20 19:12:36", - "author_account_age_days": 476 + "stars": 3, + "last_update": "2024-12-19 18:25:27", + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-put-image": { - "stars": 2, - "last_update": "2024-09-20 19:12:27", - "author_account_age_days": 476 + "stars": 3, + "last_update": "2024-12-12 13:06:43", + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-ramdom-node": { "stars": 3, "last_update": "2024-07-31 13:47:50", - "author_account_age_days": 476 + "author_account_age_days": 511 }, "https://github.com/shinich39/comfyui-target-search": { "stars": 2, "last_update": "2024-08-15 23:12:25", - "author_account_age_days": 476 + "author_account_age_days": 511 }, - "https://github.com/shinich39/comfyui-textarea-keybindings": { - "stars": 1, - "last_update": "2024-08-27 05:44:22", - "author_account_age_days": 476 + "https://github.com/shinich39/comfyui-textarea-command": { + "stars": 2, + "last_update": "2024-12-25 05:36:46", + "author_account_age_days": 511 + }, + "https://github.com/shinich39/comfyui-view-recommendations": { + "stars": 3, + "last_update": "2024-12-28 08:28:51", + "author_account_age_days": 511 }, "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": { "stars": 3, "last_update": "2024-06-20 13:57:29", - "author_account_age_days": 4472 + "author_account_age_days": 4506 }, "https://github.com/shockz0rz/comfy-easy-grids": { "stars": 21, "last_update": "2024-05-22 18:14:05", - "author_account_age_days": 1790 + "author_account_age_days": 1825 }, "https://github.com/siliconflow/BizyAir": { - "stars": 406, - "last_update": "2024-12-05 10:10:11", - "author_account_age_days": 470 + "stars": 471, + "last_update": "2025-01-09 10:38:43", + "author_account_age_days": 505 }, "https://github.com/siliconflow/onediff_comfy_nodes": { "stars": 19, "last_update": "2024-06-24 10:08:11", - "author_account_age_days": 470 + "author_account_age_days": 505 }, "https://github.com/silveroxides/ComfyUI_bnb_nf4_fp4_Loaders": { - "stars": 7, + "stars": 10, "last_update": "2024-09-17 18:44:57", - "author_account_age_days": 1665 + "author_account_age_days": 1700 }, "https://github.com/sipherxyz/comfyui-art-venture": { - "stars": 167, + "stars": 188, "last_update": "2024-11-04 14:05:29", - "author_account_age_days": 1271 + "author_account_age_days": 1306 }, "https://github.com/sipie800/ComfyUI-PuLID-Flux-Enhanced": { - "stars": 83, - "last_update": "2024-11-23 08:23:56", - "author_account_age_days": 2291 + "stars": 134, + "last_update": "2025-01-04 12:41:20", + "author_account_age_days": 2326 }, "https://github.com/skfoo/ComfyUI-Coziness": { "stars": 28, "last_update": "2024-08-16 03:10:43", - "author_account_age_days": 2246 + "author_account_age_days": 2281 }, "https://github.com/slyt/comfyui-ollama-nodes": { "stars": 0, "last_update": "2024-07-31 13:52:27", - "author_account_age_days": 4104 + "author_account_age_days": 4138 }, "https://github.com/smagnetize/kb-comfyui-nodes": { "stars": 0, "last_update": "2024-06-14 12:00:45", - "author_account_age_days": 2879 + "author_account_age_days": 2913 }, "https://github.com/smlbiobot/ComfyUI-Flux-Replicate-API": { - "stars": 16, - "last_update": "2024-10-22 06:58:00", - "author_account_age_days": 2886 + "stars": 19, + "last_update": "2024-12-26 16:21:00", + "author_account_age_days": 2920 }, "https://github.com/smthemex/ComfyUI_AnyDoor": { - "stars": 52, + "stars": 53, "last_update": "2024-10-05 00:22:07", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_CSGO_Wrapper": { - "stars": 14, + "stars": 15, "last_update": "2024-09-07 06:13:48", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_ChatGLM_API": { "stars": 24, "last_update": "2024-07-31 13:53:41", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_CustomNet": { "stars": 10, "last_update": "2024-08-11 08:58:37", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_DeepFakeDefenders": { - "stars": 35, + "stars": 36, "last_update": "2024-09-14 00:17:59", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Demucs": { - "stars": 5, + "stars": 7, "last_update": "2024-11-06 10:06:01", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Diffree": { - "stars": 28, - "last_update": "2024-10-30 12:39:57", - "author_account_age_days": 518 + "stars": 29, + "last_update": "2024-12-17 00:47:19", + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_EchoMimic": { - "stars": 396, - "last_update": "2024-12-05 11:53:06", - "author_account_age_days": 518 + "stars": 488, + "last_update": "2025-01-05 05:40:26", + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Face_Anon_Simple": { - "stars": 8, + "stars": 11, "last_update": "2024-11-20 01:14:37", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_FoleyCrafter": { - "stars": 48, + "stars": 53, "last_update": "2024-09-06 02:36:44", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_FollowYourEmoji": { "stars": 16, "last_update": "2024-07-21 06:01:11", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Hallo2": { - "stars": 54, + "stars": 65, "last_update": "2024-11-19 01:00:07", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro": { - "stars": 52, + "stars": 53, "last_update": "2024-09-09 14:06:25", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_ID_Animator": { - "stars": 24, + "stars": 25, "last_update": "2024-07-31 13:53:27", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_InstantIR_Wrapper": { - "stars": 178, + "stars": 206, "last_update": "2024-11-15 12:16:19", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Llama3_8B": { "stars": 26, "last_update": "2024-06-25 00:49:01", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_MS_Diffusion": { - "stars": 49, + "stars": 52, "last_update": "2024-09-10 09:50:19", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_MooER": { "stars": 6, "last_update": "2024-09-03 13:41:15", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_OmniParser": { - "stars": 28, - "last_update": "2024-11-28 00:29:01", - "author_account_age_days": 518 + "stars": 30, + "last_update": "2024-12-06 01:07:38", + "author_account_age_days": 553 + }, + "https://github.com/smthemex/ComfyUI_PBR_Maker": { + "stars": 13, + "last_update": "2024-12-09 05:34:53", + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_ParlerTTS": { - "stars": 32, - "last_update": "2024-08-10 02:09:04", - "author_account_age_days": 518 + "stars": 34, + "last_update": "2024-12-25 06:26:03", + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Pic2Story": { - "stars": 8, - "last_update": "2024-08-11 09:35:21", - "author_account_age_days": 518 + "stars": 9, + "last_update": "2024-12-06 12:12:19", + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Pipeline_Tool": { - "stars": 10, + "stars": 11, "last_update": "2024-08-05 06:14:57", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Pops": { "stars": 22, "last_update": "2024-08-12 09:11:49", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Sapiens": { - "stars": 113, + "stars": 132, "last_update": "2024-12-05 12:00:37", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_StableAudio_Open": { - "stars": 18, + "stars": 19, "last_update": "2024-08-10 03:45:47", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Stable_Makeup": { - "stars": 71, + "stars": 76, "last_update": "2024-09-07 00:55:07", - "author_account_age_days": 518 + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_StoryDiffusion": { - "stars": 244, - "last_update": "2024-11-29 13:22:40", - "author_account_age_days": 518 + "stars": 263, + "last_update": "2025-01-02 12:37:24", + "author_account_age_days": 553 }, "https://github.com/smthemex/ComfyUI_Streamv2v_Plus": { "stars": 11, "last_update": "2024-09-06 08:20:59", - "author_account_age_days": 518 + "author_account_age_days": 553 + }, + "https://github.com/smthemex/ComfyUI_TRELLIS": { + "stars": 97, + "last_update": "2024-12-27 03:35:57", + "author_account_age_days": 553 }, "https://github.com/sn0w12/ComfyUI-Sn0w-Scripts": { "stars": 9, - "last_update": "2024-11-16 20:42:59", - "author_account_age_days": 938 + "last_update": "2025-01-08 15:53:43", + "author_account_age_days": 972 }, "https://github.com/sneccc/comfyui-snek-nodes": { "stars": 1, "last_update": "2024-11-09 19:28:50", - "author_account_age_days": 1732 + "author_account_age_days": 1766 + }, + "https://github.com/solution9th/Comfyui_mobilesam": { + "stars": 1, + "last_update": "2024-12-24 09:27:31", + "author_account_age_days": 2271 }, "https://github.com/souki202/ComfyUI-LoadImage-Advanced": { "stars": 2, "last_update": "2024-08-29 14:03:52", - "author_account_age_days": 3424 + "author_account_age_days": 3459 }, "https://github.com/sourceful-official/LoadLoraModelOnlyWithUrl": { - "stars": 0, + "stars": 2, "last_update": "2024-12-04 12:14:51", - "author_account_age_days": 1647 + "author_account_age_days": 1682 }, "https://github.com/sousakujikken/ComfyUI-PixydustQuantizer": { "stars": 26, "last_update": "2024-12-01 15:14:40", - "author_account_age_days": 572 + "author_account_age_days": 607 }, "https://github.com/space-nuko/ComfyUI-Disco-Diffusion": { - "stars": 48, + "stars": 49, "last_update": "2024-08-07 11:51:17", - "author_account_age_days": 2889 + "author_account_age_days": 2923 }, "https://github.com/space-nuko/ComfyUI-OpenPose-Editor": { - "stars": 185, + "stars": 189, "last_update": "2024-05-22 18:10:49", - "author_account_age_days": 2889 + "author_account_age_days": 2923 }, "https://github.com/space-nuko/nui-suite": { "stars": 11, "last_update": "2024-05-22 18:11:04", - "author_account_age_days": 2889 + "author_account_age_days": 2923 }, "https://github.com/spacepxl/ComfyUI-Depth-Pro": { - "stars": 148, + "stars": 157, "last_update": "2024-10-23 20:05:56", - "author_account_age_days": 458 + "author_account_age_days": 493 }, "https://github.com/spacepxl/ComfyUI-Florence-2": { - "stars": 71, + "stars": 73, "last_update": "2024-07-20 19:44:33", - "author_account_age_days": 458 + "author_account_age_days": 493 }, "https://github.com/spacepxl/ComfyUI-HQ-Image-Save": { - "stars": 45, + "stars": 46, "last_update": "2024-10-28 17:18:44", - "author_account_age_days": 458 + "author_account_age_days": 493 }, "https://github.com/spacepxl/ComfyUI-Image-Filters": { - "stars": 169, - "last_update": "2024-10-30 16:02:55", - "author_account_age_days": 458 + "stars": 178, + "last_update": "2024-12-16 22:42:50", + "author_account_age_days": 493 }, "https://github.com/spacepxl/ComfyUI-RAVE": { "stars": 86, "last_update": "2024-05-22 20:56:19", - "author_account_age_days": 458 + "author_account_age_days": 493 }, "https://github.com/spacepxl/ComfyUI-StyleGan": { "stars": 11, "last_update": "2024-06-10 20:16:34", - "author_account_age_days": 458 + "author_account_age_days": 493 }, "https://github.com/spinagon/ComfyUI-seam-carving": { "stars": 19, "last_update": "2024-08-04 19:13:25", - "author_account_age_days": 4905 + "author_account_age_days": 4939 }, "https://github.com/spinagon/ComfyUI-seamless-tiling": { - "stars": 162, + "stars": 171, "last_update": "2024-09-25 05:22:05", - "author_account_age_days": 4905 + "author_account_age_days": 4939 }, "https://github.com/spro/comfyui-mirror": { "stars": 5, "last_update": "2024-05-22 20:50:25", - "author_account_age_days": 5396 + "author_account_age_days": 5430 }, "https://github.com/ssitu/ComfyUI_UltimateSDUpscale": { - "stars": 891, - "last_update": "2024-10-11 05:02:38", - "author_account_age_days": 1853 + "stars": 931, + "last_update": "2025-01-06 19:06:53", + "author_account_age_days": 1888 }, "https://github.com/ssitu/ComfyUI_fabric": { - "stars": 87, + "stars": 88, "last_update": "2024-05-22 18:10:19", - "author_account_age_days": 1853 + "author_account_age_days": 1888 }, "https://github.com/ssitu/ComfyUI_restart_sampling": { - "stars": 83, + "stars": 85, "last_update": "2024-05-22 18:09:49", - "author_account_age_days": 1853 + "author_account_age_days": 1888 }, "https://github.com/ssitu/ComfyUI_roop": { - "stars": 66, + "stars": 70, "last_update": "2024-05-22 18:10:03", - "author_account_age_days": 1853 + "author_account_age_days": 1888 }, "https://github.com/stavsap/comfyui-ollama": { - "stars": 391, + "stars": 420, "last_update": "2024-12-05 13:43:22", - "author_account_age_days": 4248 + "author_account_age_days": 4283 }, "https://github.com/steelan9199/ComfyUI-Teeth": { - "stars": 1, - "last_update": "2024-12-02 18:16:31", - "author_account_age_days": 1018 + "stars": 6, + "last_update": "2025-01-01 07:02:30", + "author_account_age_days": 1053 }, "https://github.com/stormcenter/ComfyUI-AutoSplitGridImage": { - "stars": 21, - "last_update": "2024-11-11 12:14:38", - "author_account_age_days": 4292 + "stars": 25, + "last_update": "2025-01-06 12:02:58", + "author_account_age_days": 4327 }, "https://github.com/stormcenter/ComfyUI-LivePhotoCreator": { - "stars": 16, - "last_update": "2024-11-03 12:22:12", - "author_account_age_days": 4292 + "stars": 21, + "last_update": "2025-01-06 12:03:42", + "author_account_age_days": 4327 }, "https://github.com/stormcenter/ComfyUI-SVGFullfill": { "stars": 6, - "last_update": "2024-11-24 15:58:45", - "author_account_age_days": 4292 + "last_update": "2025-01-06 12:04:18", + "author_account_age_days": 4327 }, "https://github.com/storyicon/comfyui_musev_evolved": { - "stars": 22, + "stars": 23, "last_update": "2024-06-14 11:02:40", - "author_account_age_days": 2716 + "author_account_age_days": 2751 }, "https://github.com/storyicon/comfyui_segment_anything": { - "stars": 764, + "stars": 802, "last_update": "2024-07-12 10:17:33", - "author_account_age_days": 2716 + "author_account_age_days": 2751 }, "https://github.com/strimmlarn/ComfyUI-Strimmlarns-Aesthetic-Score": { "stars": 29, "last_update": "2024-06-17 10:01:44", - "author_account_age_days": 2791 + "author_account_age_days": 2826 }, "https://github.com/styler00dollar/ComfyUI-deepcache": { "stars": 8, "last_update": "2024-05-22 22:18:18", - "author_account_age_days": 2010 + "author_account_age_days": 2045 }, "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale": { - "stars": 37, + "stars": 39, "last_update": "2024-05-22 22:18:07", - "author_account_age_days": 2010 + "author_account_age_days": 2045 }, "https://github.com/subtleGradient/TinkerBot-tech-for-ComfyUI-Touchpad": { - "stars": 28, + "stars": 30, "last_update": "2024-08-16 01:18:03", - "author_account_age_days": 6095 + "author_account_age_days": 6129 }, "https://github.com/sugarkwork/comfyui_cohere": { "stars": 2, "last_update": "2024-07-22 08:42:31", - "author_account_age_days": 1040 + "author_account_age_days": 1074 }, "https://github.com/sugarkwork/comfyui_tag_fillter": { - "stars": 29, - "last_update": "2024-11-06 03:28:20", - "author_account_age_days": 1040 + "stars": 33, + "last_update": "2025-01-09 02:36:09", + "author_account_age_days": 1074 }, "https://github.com/superyoman/comfyui_lumaAPI": { - "stars": 20, + "stars": 21, "last_update": "2024-06-17 21:00:05", - "author_account_age_days": 613 + "author_account_age_days": 648 }, "https://github.com/sweetndata/ComfyUI-Image-Harmonizer": { "stars": 2, "last_update": "2024-11-20 06:10:34", - "author_account_age_days": 896 + "author_account_age_days": 931 }, "https://github.com/sweetndata/ComfyUI-googletrans": { "stars": 2, "last_update": "2024-11-20 04:53:19", - "author_account_age_days": 896 + "author_account_age_days": 931 + }, + "https://github.com/sweetndata/ComfyUI_Sticker_Compositer": { + "stars": 2, + "last_update": "2025-01-02 06:54:51", + "author_account_age_days": 931 }, "https://github.com/syaofox/ComfyUI_fnodes": { - "stars": 7, + "stars": 8, "last_update": "2024-10-15 09:38:25", - "author_account_age_days": 3320 + "author_account_age_days": 3355 }, "https://github.com/syllebra/bilbox-comfyui": { - "stars": 112, - "last_update": "2024-09-13 01:46:14", - "author_account_age_days": 3300 + "stars": 119, + "last_update": "2024-12-06 23:51:55", + "author_account_age_days": 3335 }, "https://github.com/sylym/comfy_vid2vid": { "stars": 69, "last_update": "2024-05-22 17:53:40", - "author_account_age_days": 2062 + "author_account_age_days": 2097 }, "https://github.com/szhublox/ambw_comfyui": { "stars": 16, "last_update": "2024-05-22 18:04:57", - "author_account_age_days": 1171 + "author_account_age_days": 1206 }, "https://github.com/taabata/ComfyCanvas": { - "stars": 73, - "last_update": "2024-11-25 20:15:00", - "author_account_age_days": 1847 + "stars": 78, + "last_update": "2024-12-15 00:59:25", + "author_account_age_days": 1882 }, "https://github.com/taabata/LCM_Inpaint_Outpaint_Comfy": { - "stars": 254, + "stars": 257, "last_update": "2024-11-18 00:45:28", - "author_account_age_days": 1847 + "author_account_age_days": 1882 + }, + "https://github.com/taabata/SANA_LOWVRAM": { + "stars": 6, + "last_update": "2024-12-28 01:16:29", + "author_account_age_days": 1882 }, "https://github.com/taches-ai/comfyui-scene-composer": { - "stars": 16, + "stars": 44, "last_update": "2024-11-17 20:49:23", - "author_account_age_days": 71 + "author_account_age_days": 106 }, "https://github.com/tachyon-beep/comfyui-simplefeed": { - "stars": 7, + "stars": 8, "last_update": "2024-10-16 09:19:29", - "author_account_age_days": 5085 + "author_account_age_days": 5120 }, "https://github.com/takemetosiberia/ComfyUI-SAMURAI--SAM2-": { - "stars": 10, + "stars": 22, "last_update": "2024-12-01 13:06:02", - "author_account_age_days": 549 + "author_account_age_days": 584 }, "https://github.com/talesofai/comfyui-browser": { - "stars": 510, + "stars": 525, "last_update": "2024-11-11 01:42:30", - "author_account_age_days": 720 + "author_account_age_days": 755 }, "https://github.com/tanglaoya321/ComfyUI-StoryMaker": { - "stars": 14, + "stars": 16, "last_update": "2024-10-01 01:20:00", - "author_account_age_days": 4136 - }, - "https://github.com/tanglup/Comfyui-Ycnode": { - "stars": 39, - "last_update": "2024-11-25 01:28:58", - "author_account_age_days": 289 - }, - "https://github.com/tanglup/Comfyui_Flux_Style_Adjust": { - "stars": 176, - "last_update": "2024-12-03 03:09:24", - "author_account_age_days": 289 + "author_account_age_days": 4170 }, "https://github.com/teward/Comfy-Sentry": { "stars": 1, "last_update": "2024-07-31 21:37:42", - "author_account_age_days": 5262 + "author_account_age_days": 5297 }, "https://github.com/teward/ComfyUI-Helper-Nodes": { "stars": 4, "last_update": "2024-05-23 01:22:01", - "author_account_age_days": 5262 + "author_account_age_days": 5297 }, "https://github.com/theUpsider/ComfyUI-Logic": { - "stars": 152, + "stars": 157, "last_update": "2024-08-16 12:20:56", - "author_account_age_days": 2887 + "author_account_age_days": 2921 }, "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader": { - "stars": 42, + "stars": 44, "last_update": "2024-08-02 14:06:54", - "author_account_age_days": 2887 + "author_account_age_days": 2921 }, "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows": { - "stars": 49, + "stars": 53, "last_update": "2024-05-22 21:33:47", - "author_account_age_days": 2587 + "author_account_age_days": 2621 }, "https://github.com/thecooltechguy/ComfyUI-MagicAnimate": { - "stars": 219, + "stars": 220, "last_update": "2024-05-22 21:33:35", - "author_account_age_days": 2587 + "author_account_age_days": 2621 }, "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion": { - "stars": 336, + "stars": 342, "last_update": "2024-05-24 22:14:42", - "author_account_age_days": 2587 + "author_account_age_days": 2621 }, "https://github.com/thoddnn/ComfyUI-MLX": { - "stars": 74, + "stars": 96, "last_update": "2024-10-22 06:41:22", - "author_account_age_days": 428 + "author_account_age_days": 462 }, "https://github.com/tianguanggliu/Utools": { "stars": 1, "last_update": "2024-08-29 09:45:03", - "author_account_age_days": 2504 + "author_account_age_days": 2539 }, "https://github.com/tiankuan93/ComfyUI-V-Express": { - "stars": 109, + "stars": 111, "last_update": "2024-06-26 02:41:00", - "author_account_age_days": 3114 + "author_account_age_days": 3149 }, "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": { - "stars": 19, + "stars": 21, "last_update": "2024-12-01 11:46:58", - "author_account_age_days": 3489 + "author_account_age_days": 3524 }, "https://github.com/tkreuziger/comfyui-claude": { "stars": 3, "last_update": "2024-12-03 13:37:24", - "author_account_age_days": 700 + "author_account_age_days": 735 }, "https://github.com/tmagara/ComfyUI-Prediction-Boost": { "stars": 2, "last_update": "2024-07-31 13:51:19", - "author_account_age_days": 4539 + "author_account_age_days": 4574 }, "https://github.com/tocubed/ComfyUI-AudioReactor": { "stars": 8, "last_update": "2024-05-22 22:21:57", - "author_account_age_days": 4023 + "author_account_age_days": 4058 + }, + "https://github.com/tocubed/ComfyUI-EvTexture": { + "stars": 5, + "last_update": "2025-01-05 23:21:23", + "author_account_age_days": 4058 }, "https://github.com/tomudo/ComfyUI-ascii-art": { "stars": 4, "last_update": "2024-11-21 05:24:12", - "author_account_age_days": 3067 + "author_account_age_days": 3102 }, "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": { "stars": 6, "last_update": "2024-06-14 13:59:48", - "author_account_age_days": 4482 + "author_account_age_days": 4516 }, "https://github.com/toxicwind/ComfyUI-TTools": { "stars": 1, "last_update": "2024-07-04 20:07:35", - "author_account_age_days": 4534 + "author_account_age_days": 4569 }, "https://github.com/toyxyz/ComfyUI_rgbx_Wrapper": { - "stars": 42, - "last_update": "2024-11-28 18:52:07", - "author_account_age_days": 3814 + "stars": 64, + "last_update": "2024-12-25 02:02:16", + "author_account_age_days": 3849 }, "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": { - "stars": 526, + "stars": 535, "last_update": "2024-11-15 19:13:08", - "author_account_age_days": 3814 + "author_account_age_days": 3849 }, "https://github.com/traugdor/ComfyUI-quadMoons-nodes": { "stars": 13, "last_update": "2024-11-03 00:10:00", - "author_account_age_days": 3984 + "author_account_age_days": 4019 }, "https://github.com/tritant/ComfyUI_CreaPrompt": { - "stars": 39, - "last_update": "2024-11-19 15:33:13", - "author_account_age_days": 3305 + "stars": 42, + "last_update": "2024-12-11 09:08:22", + "author_account_age_days": 3340 }, "https://github.com/trojblue/trNodes": { "stars": 8, "last_update": "2024-05-22 18:04:36", - "author_account_age_days": 2422 + "author_account_age_days": 2457 }, "https://github.com/troyxmccall/ComfyUI-ScaleToTargetMegapixels": { - "stars": 1, + "stars": 2, "last_update": "2024-11-11 00:07:25", - "author_account_age_days": 5553 + "author_account_age_days": 5588 }, "https://github.com/trumanwong/ComfyUI-NSFW-Detection": { - "stars": 24, + "stars": 26, "last_update": "2024-08-03 05:16:33", - "author_account_age_days": 3124 + "author_account_age_days": 3159 }, "https://github.com/tsogzark/ComfyUI-load-image-from-url": { - "stars": 15, + "stars": 16, "last_update": "2024-06-14 13:59:05", - "author_account_age_days": 1693 + "author_account_age_days": 1728 }, "https://github.com/ttulttul/ComfyUI-Iterative-Mixer": { - "stars": 117, + "stars": 118, "last_update": "2024-07-09 14:56:02", - "author_account_age_days": 4921 + "author_account_age_days": 4956 }, "https://github.com/ttulttul/ComfyUI-Tensor-Operations": { "stars": 5, "last_update": "2024-06-12 21:55:39", - "author_account_age_days": 4921 + "author_account_age_days": 4956 }, "https://github.com/tungdop2/Comfyui_face_restorer": { "stars": 2, "last_update": "2024-11-21 15:53:59", - "author_account_age_days": 1588 + "author_account_age_days": 1623 }, "https://github.com/tungdop2/Comfyui_joy-caption-alpha-two": { - "stars": 2, + "stars": 3, "last_update": "2024-11-26 07:47:26", - "author_account_age_days": 1588 + "author_account_age_days": 1623 }, "https://github.com/turkyden/ComfyUI-SmartCrop": { "stars": 4, "last_update": "2024-10-08 09:36:34", - "author_account_age_days": 2913 + "author_account_age_days": 2948 }, "https://github.com/tusharbhutt/Endless-Nodes": { "stars": 26, "last_update": "2024-08-20 02:23:16", - "author_account_age_days": 2829 + "author_account_age_days": 2864 }, "https://github.com/twri/sdxl_prompt_styler": { - "stars": 769, + "stars": 789, "last_update": "2024-05-22 18:16:58", - "author_account_age_days": 4232 + "author_account_age_days": 4267 }, "https://github.com/txt2any/ComfyUI-PromptOrganizer": { "stars": 0, "last_update": "2024-05-23 01:10:33", - "author_account_age_days": 248 + "author_account_age_days": 283 }, "https://github.com/ty0x2333/ComfyUI-Dev-Utils": { - "stars": 95, + "stars": 106, "last_update": "2024-10-03 23:26:45", - "author_account_age_days": 3867 + "author_account_age_days": 3902 }, "https://github.com/tzwm/comfyui-profiler": { - "stars": 141, + "stars": 145, "last_update": "2024-08-28 14:27:12", - "author_account_age_days": 4933 + "author_account_age_days": 4968 }, "https://github.com/uarefans/ComfyUI-Fans": { "stars": 16, "last_update": "2024-07-14 15:00:38", - "author_account_age_days": 1436 + "author_account_age_days": 1471 }, "https://github.com/uetuluk/comfyui-webcam-node": { "stars": 3, "last_update": "2024-06-14 08:25:13", - "author_account_age_days": 2478 + "author_account_age_days": 2513 + }, + "https://github.com/umiyuki/comfyui-pad-to-eight": { + "stars": 1, + "last_update": "2025-01-07 09:58:36", + "author_account_age_days": 3953 }, "https://github.com/un-seen/comfyui-tensorops": { "stars": 14, "last_update": "2024-10-26 00:04:07", - "author_account_age_days": 1480 + "author_account_age_days": 1515 }, "https://github.com/un-seen/comfyui_segment_anything_plus": { "stars": 5, "last_update": "2024-07-29 06:21:54", - "author_account_age_days": 1480 + "author_account_age_days": 1515 }, "https://github.com/unwdef/unwdef-nodes-comfyui": { "stars": 2, "last_update": "2024-07-31 13:39:39", - "author_account_age_days": 238 + "author_account_age_days": 272 }, "https://github.com/valofey/Openrouter-Node": { "stars": 2, "last_update": "2024-09-26 14:38:37", - "author_account_age_days": 1548 + "author_account_age_days": 1582 }, "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": { "stars": 3, "last_update": "2024-06-25 04:48:19", - "author_account_age_days": 3122 + "author_account_age_days": 3157 }, "https://github.com/vanillacode314/SimpleWildcardsComfyUI": { "stars": 4, "last_update": "2024-07-31 13:39:43", - "author_account_age_days": 1021 + "author_account_age_days": 1056 }, "https://github.com/var1ableX/ComfyUI_Accessories": { "stars": 1, "last_update": "2024-09-14 01:23:16", - "author_account_age_days": 4928 + "author_account_age_days": 4963 }, "https://github.com/vault-developer/comfyui-image-blender": { "stars": 20, "last_update": "2024-08-03 19:30:31", - "author_account_age_days": 2778 + "author_account_age_days": 2812 }, "https://github.com/veighnsche/comfyui_gr85": { "stars": 2, "last_update": "2024-11-26 17:26:48", - "author_account_age_days": 3264 + "author_account_age_days": 3299 }, "https://github.com/victorchall/comfyui_webcamcapture": { - "stars": 9, + "stars": 12, "last_update": "2024-06-22 18:59:10", - "author_account_age_days": 3309 + "author_account_age_days": 3344 }, "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": { "stars": 31, "last_update": "2024-05-22 22:11:14", - "author_account_age_days": 3591 + "author_account_age_days": 3626 }, "https://github.com/violet-chen/comfyui-psd2png": { "stars": 15, "last_update": "2024-06-12 15:30:14", - "author_account_age_days": 1562 + "author_account_age_days": 1597 }, "https://github.com/viperyl/ComfyUI-BiRefNet": { - "stars": 239, + "stars": 245, "last_update": "2024-08-17 16:38:15", - "author_account_age_days": 2197 + "author_account_age_days": 2232 }, "https://github.com/viperyl/ComfyUI-RGT": { "stars": 6, "last_update": "2024-06-20 15:33:50", - "author_account_age_days": 2197 + "author_account_age_days": 2232 }, "https://github.com/vivax3794/ComfyUI-Sub-Nodes": { - "stars": 152, + "stars": 156, "last_update": "2024-11-03 04:06:08", - "author_account_age_days": 2003 + "author_account_age_days": 2037 }, "https://github.com/vivax3794/ComfyUI-Vivax-Nodes": { "stars": 4, "last_update": "2024-09-07 18:42:27", - "author_account_age_days": 2003 + "author_account_age_days": 2037 }, "https://github.com/vkff5833/ComfyUI-PromptConverter": { "stars": 1, "last_update": "2024-12-05 07:51:51", - "author_account_age_days": 459 + "author_account_age_days": 494 }, "https://github.com/vsevolod-oparin/comfyui-kandinsky22": { "stars": 10, "last_update": "2024-07-31 16:03:48", - "author_account_age_days": 5148 + "author_account_age_days": 5183 }, "https://github.com/vuongminh1907/ComfyUI_ZenID": { - "stars": 67, - "last_update": "2024-11-20 11:33:48", - "author_account_age_days": 736 + "stars": 104, + "last_update": "2024-12-22 06:45:45", + "author_account_age_days": 771 }, "https://github.com/wTechArtist/ComfyUI-CustomNodes": { "stars": 3, "last_update": "2024-08-21 03:03:16", - "author_account_age_days": 1525 + "author_account_age_days": 1560 }, "https://github.com/wTechArtist/ComfyUI-StableDelight-weiweiliang": { "stars": 2, "last_update": "2024-11-08 15:37:40", - "author_account_age_days": 1525 + "author_account_age_days": 1560 }, "https://github.com/wallish77/wlsh_nodes": { - "stars": 101, + "stars": 104, "last_update": "2024-06-19 12:01:29", - "author_account_age_days": 2384 + "author_account_age_days": 2419 }, "https://github.com/wandbrandon/comfyui-pixel": { "stars": 4, "last_update": "2024-06-14 07:07:09", - "author_account_age_days": 3548 + "author_account_age_days": 3582 }, "https://github.com/waterminer/ComfyUI-tagcomplete": { - "stars": 3, - "last_update": "2024-10-28 08:18:15", - "author_account_age_days": 2276 + "stars": 5, + "last_update": "2025-01-06 00:13:57", + "author_account_age_days": 2311 }, "https://github.com/web3nomad/ComfyUI_Invisible_Watermark": { "stars": 1, "last_update": "2024-05-23 01:16:54", - "author_account_age_days": 1132 + "author_account_age_days": 1166 }, "https://github.com/webfiltered/DebugNode-ComfyUI": { - "stars": 4, + "stars": 5, "last_update": "2024-09-10 13:08:51", - "author_account_age_days": 138 + "author_account_age_days": 173 }, "https://github.com/wei30172/comfygen": { - "stars": 7, + "stars": 8, "last_update": "2024-11-07 22:10:50", - "author_account_age_days": 1777 + "author_account_age_days": 1812 + }, + "https://github.com/weilin9999/WeiLin-ComfyUI-prompt-all-in-one": { + "stars": 141, + "last_update": "2024-12-23 13:50:29", + "author_account_age_days": 2107 + }, + "https://github.com/welltop-cn/ComfyUI-TeaCache": { + "stars": 166, + "last_update": "2025-01-09 11:40:26", + "author_account_age_days": 1771 }, "https://github.com/wentao-uw/ComfyUI-template-matching": { "stars": 1, "last_update": "2024-11-06 06:52:30", - "author_account_age_days": 1944 + "author_account_age_days": 1978 }, "https://github.com/whatbirdisthat/cyberdolphin": { "stars": 14, "last_update": "2024-07-31 13:40:12", - "author_account_age_days": 5651 + "author_account_age_days": 5686 }, "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus": { - "stars": 35, + "stars": 37, "last_update": "2024-06-20 13:52:34", - "author_account_age_days": 616 + "author_account_age_days": 651 }, "https://github.com/willchil/ComfyUI-Environment-Visualizer": { - "stars": 8, + "stars": 9, "last_update": "2024-10-09 02:48:18", - "author_account_age_days": 2802 + "author_account_age_days": 2837 }, "https://github.com/windfancy/zsq_prompt": { "stars": 1, - "last_update": "2024-12-05 12:51:30", - "author_account_age_days": 1701 + "last_update": "2024-12-15 14:58:52", + "author_account_age_days": 1736 + }, + "https://github.com/wjl0313/ComfyUI_KimNodes": { + "stars": 13, + "last_update": "2025-01-09 05:00:12", + "author_account_age_days": 2070 }, "https://github.com/wmatson/easy-comfy-nodes": { "stars": 16, "last_update": "2024-10-08 01:54:33", - "author_account_age_days": 4282 + "author_account_age_days": 4316 }, - "https://github.com/wmpmiles/ComfyUI-GTF-Utilities": { - "stars": 2, - "last_update": "2024-10-19 07:05:09", - "author_account_age_days": 3194 + "https://github.com/wmpmiles/comfyui-some-image-processing-stuff": { + "stars": 3, + "last_update": "2024-12-23 02:43:14", + "author_account_age_days": 3229 }, "https://github.com/wolfden/ComfyUi_PromptStylers": { - "stars": 81, + "stars": 84, "last_update": "2024-09-03 18:33:52", - "author_account_age_days": 5885 + "author_account_age_days": 5920 }, "https://github.com/wolfden/ComfyUi_String_Function_Tree": { "stars": 9, "last_update": "2024-05-22 18:29:16", - "author_account_age_days": 5885 + "author_account_age_days": 5920 }, "https://github.com/wootwootwootwoot/ComfyUI-RK-Sampler": { - "stars": 51, + "stars": 53, "last_update": "2024-08-17 21:12:43", - "author_account_age_days": 1732 + "author_account_age_days": 1767 + }, + "https://github.com/wqjuser/ComfyUI-Chat-Image": { + "stars": 1, + "last_update": "2024-12-26 07:00:30", + "author_account_age_days": 3133 }, "https://github.com/wu12023/ComfyUI-Image-Evaluation": { "stars": 3, - "last_update": "2024-12-05 09:53:56", - "author_account_age_days": 481 + "last_update": "2024-12-06 06:51:15", + "author_account_age_days": 516 }, "https://github.com/wujm424606/ComfyUi-Ollama-YN": { - "stars": 72, + "stars": 74, "last_update": "2024-09-17 13:20:02", - "author_account_age_days": 2427 + "author_account_age_days": 2462 }, "https://github.com/wutipong/ComfyUI-TextUtils": { "stars": 1, "last_update": "2024-06-14 09:34:31", - "author_account_age_days": 4349 + "author_account_age_days": 4384 }, "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio": { "stars": 1, "last_update": "2024-05-22 22:22:25", - "author_account_age_days": 5214 + "author_account_age_days": 5249 }, "https://github.com/xXAdonesXx/NodeGPT": { - "stars": 339, + "stars": 341, "last_update": "2024-06-20 11:41:30", - "author_account_age_days": 1643 + "author_account_age_days": 1678 + }, + "https://github.com/xfgexo/EXO-Custom-ComfyUI-Nodes": { + "stars": 2, + "last_update": "2024-12-24 14:07:18", + "author_account_age_days": 628 }, "https://github.com/xiaoxiaodesha/hd_node": { - "stars": 13, + "stars": 14, "last_update": "2024-06-11 02:36:48", - "author_account_age_days": 3039 + "author_account_age_days": 3073 }, "https://github.com/xlinx/ComfyUI-decadetw-auto-messaging-realtime": { "stars": 6, "last_update": "2024-08-30 17:38:52", - "author_account_age_days": 4663 + "author_account_age_days": 4698 }, "https://github.com/xlinx/ComfyUI-decadetw-auto-prompt-llm": { - "stars": 16, + "stars": 19, "last_update": "2024-08-30 17:39:03", - "author_account_age_days": 4663 + "author_account_age_days": 4698 }, "https://github.com/xlinx/ComfyUI-decadetw-spout-syphon-im-vj": { - "stars": 8, + "stars": 10, "last_update": "2024-09-03 08:55:08", - "author_account_age_days": 4663 + "author_account_age_days": 4698 }, "https://github.com/xliry/ComfyUI_SendDiscord": { "stars": 0, "last_update": "2024-05-23 02:21:38", - "author_account_age_days": 1437 + "author_account_age_days": 1472 }, "https://github.com/xobiomesh/ComfyUI_xObiomesh": { "stars": 3, "last_update": "2024-11-08 17:10:40", - "author_account_age_days": 1853 + "author_account_age_days": 1888 }, "https://github.com/xs315431/Comfyui_Get_promptId": { - "stars": 0, + "stars": 1, "last_update": "2024-12-02 09:30:53", - "author_account_age_days": 1439 + "author_account_age_days": 1474 }, "https://github.com/xuhongming251/ComfyUI-GPEN": { - "stars": 2, + "stars": 4, "last_update": "2024-06-15 14:33:37", - "author_account_age_days": 4270 + "author_account_age_days": 4305 }, "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils": { - "stars": 18, + "stars": 19, "last_update": "2024-06-15 14:32:32", - "author_account_age_days": 4270 + "author_account_age_days": 4305 }, "https://github.com/xuhongming251/ComfyUI_Camera": { "stars": 2, - "last_update": "2024-11-21 10:47:22", - "author_account_age_days": 4270 + "last_update": "2024-12-25 07:31:32", + "author_account_age_days": 4305 }, "https://github.com/yanlang0123/ComfyUI_Lam": { - "stars": 12, + "stars": 14, "last_update": "2024-11-30 08:19:45", - "author_account_age_days": 2972 + "author_account_age_days": 3007 }, "https://github.com/ycchanau/ComfyUI_Preview_Magnifier": { "stars": 3, "last_update": "2024-07-31 13:59:12", - "author_account_age_days": 2281 + "author_account_age_days": 2316 }, "https://github.com/ycyy/ComfyUI-YCYY-LoraInfo": { "stars": 6, "last_update": "2024-09-30 02:33:25", - "author_account_age_days": 3589 + "author_account_age_days": 3623 }, "https://github.com/yffyhk/comfyui_auto_danbooru": { "stars": 1, "last_update": "2024-05-22 23:23:03", - "author_account_age_days": 3886 + "author_account_age_days": 3921 }, "https://github.com/yhayano-ponotech/ComfyUI-Fal-API-Flux": { - "stars": 30, - "last_update": "2024-11-26 07:27:26", - "author_account_age_days": 735 + "stars": 34, + "last_update": "2024-12-29 04:32:45", + "author_account_age_days": 769 + }, + "https://github.com/yichengup/Comfyui-Ycanvas": { + "stars": 58, + "last_update": "2024-12-22 01:26:50", + "author_account_age_days": 323 + }, + "https://github.com/yichengup/Comfyui_Flux_Style_Adjust": { + "stars": 226, + "last_update": "2024-12-12 08:22:38", + "author_account_age_days": 323 + }, + "https://github.com/yichengup/Comfyui_Redux_Advanced": { + "stars": 33, + "last_update": "2025-01-08 20:53:45", + "author_account_age_days": 323 }, "https://github.com/yiwangsimple/ComfyUI_DW_Chat": { - "stars": 85, + "stars": 86, "last_update": "2024-11-08 08:42:14", - "author_account_age_days": 716 + "author_account_age_days": 751 }, "https://github.com/yiwangsimple/florence_dw": { - "stars": 29, + "stars": 34, "last_update": "2024-10-21 06:40:25", - "author_account_age_days": 716 + "author_account_age_days": 751 }, "https://github.com/yolain/ComfyUI-Easy-Use": { - "stars": 1115, - "last_update": "2024-12-04 08:41:51", - "author_account_age_days": 1505 + "stars": 1202, + "last_update": "2025-01-08 04:22:33", + "author_account_age_days": 1539 + }, + "https://github.com/yolanother/ComfyUI-Save16bitPng": { + "stars": 4, + "last_update": "2024-12-23 01:50:04", + "author_account_age_days": 5062 }, "https://github.com/yolanother/DTAIComfyImageSubmit": { "stars": 1, "last_update": "2024-09-25 04:40:23", - "author_account_age_days": 5028 + "author_account_age_days": 5062 }, "https://github.com/yolanother/DTAIComfyLoaders": { "stars": 1, "last_update": "2024-11-18 09:35:46", - "author_account_age_days": 5028 + "author_account_age_days": 5062 }, "https://github.com/yolanother/DTAIComfyPromptAgent": { "stars": 5, "last_update": "2024-05-22 18:14:18", - "author_account_age_days": 5028 + "author_account_age_days": 5062 }, "https://github.com/yolanother/DTAIComfyQRCodes": { "stars": 3, "last_update": "2024-05-22 18:15:09", - "author_account_age_days": 5028 + "author_account_age_days": 5062 }, "https://github.com/yolanother/DTAIComfyVariables": { "stars": 10, "last_update": "2024-05-22 18:15:21", - "author_account_age_days": 5028 + "author_account_age_days": 5062 }, "https://github.com/yolanother/DTAIImageToTextNode": { - "stars": 18, + "stars": 19, "last_update": "2024-05-22 18:14:31", - "author_account_age_days": 5028 + "author_account_age_days": 5062 }, "https://github.com/yondonfu/ComfyUI-Background-Edit": { - "stars": 16, - "last_update": "2024-11-18 16:43:25", - "author_account_age_days": 4039 + "stars": 19, + "last_update": "2024-12-31 23:15:33", + "author_account_age_days": 4074 + }, + "https://github.com/yondonfu/ComfyUI-Torch-Compile": { + "stars": 3, + "last_update": "2024-12-25 18:42:17", + "author_account_age_days": 4074 }, "https://github.com/yorkane/ComfyUI-KYNode": { - "stars": 1, - "last_update": "2024-12-03 07:08:06", - "author_account_age_days": 3554 + "stars": 4, + "last_update": "2024-12-26 14:25:21", + "author_account_age_days": 3588 }, "https://github.com/youyegit/tdxh_node_comfyui": { "stars": 3, "last_update": "2024-10-23 01:56:00", - "author_account_age_days": 593 + "author_account_age_days": 627 }, "https://github.com/yuan199696/add_text_2_img": { "stars": 7, "last_update": "2024-08-15 02:51:45", - "author_account_age_days": 2607 + "author_account_age_days": 2642 }, "https://github.com/yuan199696/chinese_clip_encode": { - "stars": 5, + "stars": 6, "last_update": "2024-08-15 02:47:23", - "author_account_age_days": 2607 + "author_account_age_days": 2642 }, "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt": { - "stars": 85, + "stars": 90, "last_update": "2024-12-02 18:15:56", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-Dwpose-Tensorrt": { - "stars": 20, + "stars": 21, "last_update": "2024-10-01 11:19:11", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-Facerestore-Tensorrt": { - "stars": 10, + "stars": 15, "last_update": "2024-09-22 13:07:19", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-PiperTTS": { "stars": 29, "last_update": "2024-05-22 23:17:27", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-Pronodes": { - "stars": 1, - "last_update": "2024-05-22 23:16:51", - "author_account_age_days": 2317 + "stars": 2, + "last_update": "2025-01-05 10:06:31", + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-Rife-Tensorrt": { - "stars": 8, + "stars": 9, "last_update": "2024-10-04 10:23:26", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt": { - "stars": 74, + "stars": 75, "last_update": "2024-09-24 17:35:22", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-Vsgan": { "stars": 3, "last_update": "2024-05-22 23:17:02", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-Whisper": { - "stars": 77, + "stars": 79, "last_update": "2024-08-06 05:31:10", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt": { - "stars": 9, + "stars": 11, "last_update": "2024-06-28 15:59:14", - "author_account_age_days": 2317 + "author_account_age_days": 2351 }, "https://github.com/yvann-ba/ComfyUI_Yvann-Nodes": { - "stars": 225, + "stars": 324, "last_update": "2024-11-19 21:42:23", - "author_account_age_days": 1064 + "author_account_age_days": 1099 }, "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes": { "stars": 7, "last_update": "2024-10-19 12:15:24", - "author_account_age_days": 752 + "author_account_age_days": 787 }, "https://github.com/zcfrank1st/Comfyui-Toolbox": { "stars": 6, "last_update": "2024-05-22 22:08:07", - "author_account_age_days": 4579 + "author_account_age_days": 4614 }, "https://github.com/zcfrank1st/Comfyui-Yolov8": { - "stars": 21, + "stars": 23, "last_update": "2024-06-14 07:08:40", - "author_account_age_days": 4579 + "author_account_age_days": 4614 }, "https://github.com/zcfrank1st/comfyui_visual_anagrams": { - "stars": 7, + "stars": 8, "last_update": "2024-06-14 07:07:27", - "author_account_age_days": 4579 + "author_account_age_days": 4614 }, "https://github.com/zer0TF/cute-comfy": { - "stars": 32, + "stars": 35, "last_update": "2024-05-22 21:18:53", - "author_account_age_days": 2834 + "author_account_age_days": 2869 }, "https://github.com/zer0thgear/zer0-comfy-utils": { "stars": 0, "last_update": "2024-11-16 23:48:18", - "author_account_age_days": 281 + "author_account_age_days": 315 }, "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer": { - "stars": 69, + "stars": 70, "last_update": "2024-08-15 03:56:51", - "author_account_age_days": 2607 + "author_account_age_days": 2642 }, "https://github.com/zfkun/ComfyUI_zfkun": { - "stars": 21, - "last_update": "2024-05-27 11:21:51", - "author_account_age_days": 5027 + "stars": 22, + "last_update": "2025-01-01 13:48:04", + "author_account_age_days": 5062 }, "https://github.com/zhangp365/ComfyUI-utils-nodes": { - "stars": 40, - "last_update": "2024-11-22 12:02:57", - "author_account_age_days": 455 + "stars": 44, + "last_update": "2024-12-26 02:46:11", + "author_account_age_days": 490 }, "https://github.com/zhangp365/ComfyUI_photomakerV2_native": { - "stars": 4, + "stars": 6, "last_update": "2024-11-09 03:17:11", - "author_account_age_days": 455 + "author_account_age_days": 490 + }, + "https://github.com/zhilemann/ComfyUI-moondream2": { + "stars": 1, + "last_update": "2024-12-29 13:17:31", + "author_account_age_days": 492 }, "https://github.com/zhiselfly/ComfyUI-Alimama-ControlNet-compatible": { "stars": 18, "last_update": "2024-09-14 13:46:05", - "author_account_age_days": 3514 + "author_account_age_days": 3548 }, "https://github.com/zhongpei/ComfyUI-InstructIR": { "stars": 69, "last_update": "2024-05-22 23:19:43", - "author_account_age_days": 3623 + "author_account_age_days": 3658 }, "https://github.com/zhuanqianfish/ComfyUI-EasyNode": { - "stars": 63, + "stars": 65, "last_update": "2024-06-14 07:10:18", - "author_account_age_days": 4399 + "author_account_age_days": 4434 }, "https://github.com/zhulu111/ComfyUI_Bxb": { - "stars": 1190, - "last_update": "2024-11-12 11:23:17", - "author_account_age_days": 203 + "stars": 1244, + "last_update": "2024-12-13 08:42:11", + "author_account_age_days": 238 + }, + "https://github.com/zmwv823/ComfyUI_Anytext": { + "stars": 33, + "last_update": "2025-01-01 01:41:26", + "author_account_age_days": 3468 }, "https://github.com/zmwv823/ComfyUI_Ctrlora": { "stars": 16, "last_update": "2024-12-03 06:48:08", - "author_account_age_days": 3433 + "author_account_age_days": 3468 }, "https://github.com/zohac/ComfyUI_ZC_DrawShape": { "stars": 3, "last_update": "2024-06-25 15:05:28", - "author_account_age_days": 2826 + "author_account_age_days": 2860 }, "https://github.com/zombieyang/sd-ppp": { - "stars": 306, - "last_update": "2024-12-05 16:54:25", - "author_account_age_days": 4082 + "stars": 559, + "last_update": "2024-12-31 12:27:33", + "author_account_age_days": 4116 }, "https://github.com/zubenelakrab/ComfyUI-ASV-Nodes": { "stars": 2, "last_update": "2024-11-04 00:51:29", - "author_account_age_days": 5126 + "author_account_age_days": 5160 } } \ No newline at end of file diff --git a/glob/cnr_utils.py b/glob/cnr_utils.py new file mode 100644 index 00000000..3c6431e8 --- /dev/null +++ b/glob/cnr_utils.py @@ -0,0 +1,154 @@ +import requests +from dataclasses import dataclass +from typing import List +import manager_util +import toml +import os + +base_url = "https://api.comfy.org" + + +async def get_cnr_data(page=1, limit=1000, cache_mode=True): + try: + uri = f'{base_url}/nodes?page={page}&limit={limit}' + json_obj = await manager_util.get_data_with_cache(uri, cache_mode=cache_mode) + + for v in json_obj['nodes']: + if 'latest_version' not in v: + v['latest_version'] = dict(version='nightly') + + return json_obj['nodes'] + except: + res = {} + print("Cannot connect to comfyregistry.") + + return res + + +@dataclass +class NodeVersion: + changelog: str + dependencies: List[str] + deprecated: bool + id: str + version: str + download_url: str + + +def map_node_version(api_node_version): + """ + Maps node version data from API response to NodeVersion dataclass. + + Args: + api_data (dict): The 'node_version' part of the API response. + + Returns: + NodeVersion: An instance of NodeVersion dataclass populated with data from the API. + """ + return NodeVersion( + changelog=api_node_version.get( + "changelog", "" + ), # Provide a default value if 'changelog' is missing + dependencies=api_node_version.get( + "dependencies", [] + ), # Provide a default empty list if 'dependencies' is missing + deprecated=api_node_version.get( + "deprecated", False + ), # Assume False if 'deprecated' is not specified + id=api_node_version[ + "id" + ], # 'id' should be mandatory; raise KeyError if missing + version=api_node_version[ + "version" + ], # 'version' should be mandatory; raise KeyError if missing + download_url=api_node_version.get( + "downloadUrl", "" + ), # Provide a default value if 'downloadUrl' is missing + ) + + +def install_node(node_id, version=None): + """ + Retrieves the node version for installation. + + Args: + node_id (str): The unique identifier of the node. + version (str, optional): Specific version of the node to retrieve. If omitted, the latest version is returned. + + Returns: + NodeVersion: Node version data or error message. + """ + if version is None: + url = f"{base_url}/nodes/{node_id}/install" + else: + url = f"{base_url}/nodes/{node_id}/install?version={version}" + + response = requests.get(url) + if response.status_code == 200: + # Convert the API response to a NodeVersion object + return map_node_version(response.json()) + else: + return None + + +def all_versions_of_node(node_id): + url = f"https://api.comfy.org/nodes/{node_id}/versions?statuses=NodeVersionStatusActive&statuses=NodeVersionStatusPending" + + response = requests.get(url) + if response.status_code == 200: + return response.json() + else: + return None + + +def read_cnr_info(fullpath): + try: + toml_path = os.path.join(fullpath, 'pyproject.toml') + tracking_path = os.path.join(fullpath, '.tracking') + + if not os.path.exists(toml_path) or not os.path.exists(tracking_path): + return None # not valid CNR node pack + + with open(toml_path, "r", encoding="utf-8") as f: + data = toml.load(f) + + project = data.get('project', {}) + name = project.get('name') + version = project.get('version') + + urls = project.get('urls', {}) + repository = urls.get('Repository') + + if name and version: # repository is optional + return { + "id": name, + "version": version, + "url": repository + } + + return None + except Exception: + return None # not valid CNR node pack + + +def generate_cnr_id(fullpath, cnr_id): + cnr_id_path = os.path.join(fullpath, '.git', '.cnr-id') + try: + if not os.path.exists(cnr_id_path): + with open(cnr_id_path, "w") as f: + return f.write(cnr_id) + except: + print(f"[ComfyUI Manager] unable to create file: {cnr_id_path}") + + +def read_cnr_id(fullpath): + cnr_id_path = os.path.join(fullpath, '.git', '.cnr-id') + try: + if os.path.exists(cnr_id_path): + with open(cnr_id_path) as f: + return f.read().strip() + except: + pass + + return None + diff --git a/glob/git_utils.py b/glob/git_utils.py new file mode 100644 index 00000000..720edd4b --- /dev/null +++ b/glob/git_utils.py @@ -0,0 +1,61 @@ +import os +import configparser + + +def is_git_repo(path: str) -> bool: + """ Check if the path is a git repository. """ + # NOTE: Checking it through `git.Repo` must be avoided. + # It locks the file, causing issues on Windows. + return os.path.exists(os.path.join(path, '.git')) + + +def get_commit_hash(fullpath): + git_head = os.path.join(fullpath, '.git', 'HEAD') + if os.path.exists(git_head): + with open(git_head) as f: + line = f.readline() + + if line.startswith("ref: "): + ref = os.path.join(fullpath, '.git', line[5:].strip()) + if os.path.exists(ref): + with open(ref) as f2: + return f2.readline().strip() + else: + return "unknown" + else: + return line + + return "unknown" + + +def git_url(fullpath): + """ + resolve version of unclassified custom node based on remote url in .git/config + """ + git_config_path = os.path.join(fullpath, '.git', 'config') + + if not os.path.exists(git_config_path): + return None + + config = configparser.ConfigParser() + config.read(git_config_path) + + for k, v in config.items(): + if k.startswith('remote ') and 'url' in v: + return v['url'] + + return None + +def normalize_url(url) -> str: + url = url.replace("git@github.com:", "https://github.com/") + if url.endswith('.git'): + url = url[:-4] + + return url + +def normalize_url_http(url) -> str: + url = url.replace("https://github.com/", "git@github.com:") + if url.endswith('.git'): + url = url[:-4] + + return url \ No newline at end of file diff --git a/glob/manager_core.py b/glob/manager_core.py index a61d19be..1ff608e9 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -1,3 +1,9 @@ +""" +description: + `manager_core` contains the core implementation of the management functions in ComfyUI-Manager. +""" + +import json import os import sys import subprocess @@ -6,32 +12,45 @@ import shutil import configparser import platform from datetime import datetime + import git from git.remote import RemoteProgress from urllib.parse import urlparse from tqdm.auto import tqdm -import aiohttp -import threading -import json import time import yaml import zipfile +import traceback +from concurrent.futures import ThreadPoolExecutor, as_completed + +orig_print = print + +from rich import print +from packaging import version + +import uuid glob_path = os.path.join(os.path.dirname(__file__)) # ComfyUI-Manager/glob sys.path.append(glob_path) import cm_global -from manager_util import * - -version = [2, 55, 4] -version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') +import cnr_utils +import manager_util +import git_utils +import manager_downloader +from node_package import InstalledNodePackage -comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) -custom_nodes_path = os.path.abspath(os.path.join(comfyui_manager_path, '..')) +version_code = [3, 5, 1] +version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '') + + +DEFAULT_CHANNEL = "https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main" + default_custom_nodes_path = None + def get_default_custom_nodes_path(): global default_custom_nodes_path if default_custom_nodes_path is None: @@ -39,7 +58,7 @@ def get_default_custom_nodes_path(): import folder_paths default_custom_nodes_path = folder_paths.get_folder_paths("custom_nodes")[0] except: - default_custom_nodes_path = custom_nodes_path + default_custom_nodes_path = os.path.abspath(os.path.join(manager_util.comfyui_manager_path, '..')) return default_custom_nodes_path @@ -49,6 +68,7 @@ def get_custom_nodes_paths(): import folder_paths return folder_paths.get_folder_paths("custom_nodes") except: + custom_nodes_path = os.path.abspath(os.path.join(manager_util.comfyui_manager_path, '..')) return [custom_nodes_path] @@ -60,19 +80,134 @@ def get_comfyui_tag(): return None +def get_script_env(): + copied = os.environ.copy() + git_exe = get_config().get('git_exe') + if git_exe is not None: + copied['GIT_EXE_PATH'] = git_exe + copied['COMFYUI_PATH'] = comfy_path + + return copied + + +invalid_nodes = {} + + +def extract_base_custom_nodes_dir(x:str): + if os.path.dirname(x).endswith('.disabled'): + return os.path.dirname(os.path.dirname(x)) + elif x.endswith('.disabled'): + return os.path.dirname(x) + else: + return os.path.dirname(x) + + +def check_invalid_nodes(): + global invalid_nodes + + try: + import folder_paths + except: + try: + sys.path.append(comfy_path) + import folder_paths + except: + raise Exception(f"Invalid COMFYUI_PATH: {comfy_path}") + + def check(root): + global invalid_nodes + + subdirs = [d for d in os.listdir(root) if os.path.isdir(os.path.join(root, d))] + for subdir in subdirs: + if subdir in ['.disabled', '__pycache__']: + continue + + + package = unified_manager.installed_node_packages.get(subdir) + if not package: + continue + + if not package.isValid(): + invalid_nodes[subdir] = package.fullpath + + node_paths = folder_paths.get_folder_paths("custom_nodes") + for x in node_paths: + check(x) + + disabled_dir = os.path.join(x, '.disabled') + if os.path.exists(disabled_dir): + check(disabled_dir) + + if len(invalid_nodes): + print("\n-------------------- ComfyUI-Manager invalid nodes notice ----------------") + print("\nNodes requiring reinstallation have been detected:\n(Directly delete the corresponding path and reinstall.)\n") + + for x in invalid_nodes.values(): + print(x) + + print("\n---------------------------------------------------------------------------\n") + + comfy_path = os.environ.get('COMFYUI_PATH') if comfy_path is None: try: import folder_paths comfy_path = os.path.join(os.path.dirname(folder_paths.__file__)) except: - comfy_path = os.path.abspath(os.path.join(custom_nodes_path, '..')) + comfy_path = os.path.abspath(os.path.join(manager_util.comfyui_manager_path, '..', '..')) + + +channel_list_template_path = os.path.join(manager_util.comfyui_manager_path, 'channels.list.template') +git_script_path = os.path.join(manager_util.comfyui_manager_path, "git_helper.py") + +manager_files_path = None +manager_config_path = None +manager_channel_list_path = None +manager_startup_script_path = None +manager_snapshot_path = None +manager_pip_overrides_path = None +manager_components_path = None + +def update_user_directory(user_dir): + global manager_files_path + global manager_config_path + global manager_channel_list_path + global manager_startup_script_path + global manager_snapshot_path + global manager_pip_overrides_path + global manager_components_path + + manager_files_path = os.path.abspath(os.path.join(user_dir, 'default', 'ComfyUI-Manager')) + if not os.path.exists(manager_files_path): + os.makedirs(manager_files_path) + + manager_snapshot_path = os.path.join(manager_files_path, "snapshots") + if not os.path.exists(manager_snapshot_path): + os.makedirs(manager_snapshot_path) + + manager_startup_script_path = os.path.join(manager_files_path, "startup-scripts") + if not os.path.exists(manager_startup_script_path): + os.makedirs(manager_startup_script_path) + + manager_config_path = os.path.join(manager_files_path, 'config.ini') + manager_channel_list_path = os.path.join(manager_files_path, 'channels.list') + manager_pip_overrides_path = os.path.join(manager_files_path, "pip_overrides.json") + manager_components_path = os.path.join(manager_files_path, "components") + manager_util.cache_dir = os.path.join(manager_files_path, "cache") + + if not os.path.exists(manager_util.cache_dir): + os.makedirs(manager_util.cache_dir) + +try: + import folder_paths + update_user_directory(folder_paths.get_user_directory()) + +except Exception: + # fallback: + # This case is only possible when running with cm-cli, and in practice, this case is not actually used. + update_user_directory(os.path.abspath(manager_util.comfyui_manager_path)) + -channel_list_path = os.path.join(comfyui_manager_path, 'channels.list') -config_path = os.path.join(comfyui_manager_path, "config.ini") -startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts") -git_script_path = os.path.join(comfyui_manager_path, "git_helper.py") -cache_dir = os.path.join(comfyui_manager_path, '.cache') cached_config = None js_path = None @@ -82,13 +217,8 @@ comfy_ui_required_commit_datetime = datetime(2024, 1, 24, 0, 0, 0) comfy_ui_revision = "Unknown" comfy_ui_commit_datetime = datetime(1900, 1, 1, 0, 0, 0) - -cache_lock = threading.Lock() - - channel_dict = None channel_list = None -pip_map = None def remap_pip_package(pkg): @@ -100,34 +230,6 @@ def remap_pip_package(pkg): return pkg -def get_installed_packages(): - global pip_map - - if pip_map is None: - try: - result = subprocess.check_output([sys.executable, '-m', 'pip', 'list'], universal_newlines=True) - - pip_map = {} - for line in result.split('\n'): - x = line.strip() - if x: - y = line.split() - if y[0] == 'Package' or y[0].startswith('-'): - continue - - pip_map[y[0]] = y[1] - except subprocess.CalledProcessError as e: - print(f"[ComfyUI-Manager] Failed to retrieve the information of installed pip packages.") - return set() - - return pip_map - - -def clear_pip_cache(): - global pip_map - pip_map = None - - def is_blacklisted(name): name = name.strip() @@ -141,14 +243,14 @@ def is_blacklisted(name): return True if name in cm_global.pip_downgrade_blacklist: - pips = get_installed_packages() + pips = manager_util.get_installed_packages() if match is None: if name in pips: return True elif match.group(2) in ['<=', '==', '<']: if name in pips: - if StrictVersion(pips[name]) >= StrictVersion(match.group(3)): + if manager_util.StrictVersion(pips[name]) >= manager_util.StrictVersion(match.group(3)): return True return False @@ -170,18 +272,1181 @@ def is_installed(name): return True if name in cm_global.pip_downgrade_blacklist: - pips = get_installed_packages() + pips = manager_util.get_installed_packages() if match is None: if name in pips: return True elif match.group(2) in ['<=', '==', '<']: if name in pips: - if StrictVersion(pips[name]) >= StrictVersion(match.group(3)): + if manager_util.StrictVersion(pips[name]) >= manager_util.StrictVersion(match.group(3)): print(f"[ComfyUI-Manager] skip black listed pip installation: '{name}'") return True - return name.lower() in get_installed_packages() + pkg = manager_util.get_installed_packages().get(name.lower()) + if pkg is None: + return False # update if not installed + + if match is None: + return True # don't update if version is not specified + + if match.group(2) in ['>', '>=']: + if manager_util.StrictVersion(pkg) < manager_util.StrictVersion(match.group(3)): + return False + elif manager_util.StrictVersion(pkg) > manager_util.StrictVersion(match.group(3)): + print(f"[SKIP] Downgrading pip package isn't allowed: {name.lower()} (cur={pkg})") + + if match.group(2) == '==': + if manager_util.StrictVersion(pkg) < manager_util.StrictVersion(match.group(3)): + return False + + if match.group(2) == '~=': + if manager_util.StrictVersion(pkg) == manager_util.StrictVersion(match.group(3)): + return False + + return name.lower() in manager_util.get_installed_packages() + + +def normalize_channel(channel): + if channel == 'local': + return channel + elif channel is None: + return None + elif channel.startswith('https://'): + return channel + + tmp_dict = get_channel_dict() + channel_url = tmp_dict.get(channel) + if channel_url: + return channel_url + + raise Exception(f"Invalid channel name '{channel}'") + + +class ManagedResult: + def __init__(self, action): + self.action = action + self.items = [] + self.result = True + self.to_path = None + self.msg = None + self.target = None + self.postinstall = lambda: True + + def append(self, item): + self.items.append(item) + + def fail(self, msg): + self.result = False + self.msg = msg + return self + + def with_target(self, target): + self.target = target + return self + + def with_msg(self, msg): + self.msg = msg + return self + + def with_postinstall(self, postinstall): + self.postinstall = postinstall + return self + + +class UnifiedManager: + def __init__(self): + self.installed_node_packages: dict[str, InstalledNodePackage] = {} + + self.cnr_inactive_nodes = {} # node_id -> node_version -> fullpath + self.nightly_inactive_nodes = {} # node_id -> fullpath + self.unknown_inactive_nodes = {} # node_id -> repo url * fullpath + self.active_nodes = {} # node_id -> node_version * fullpath + self.unknown_active_nodes = {} # node_id -> repo url * fullpath + self.cnr_map = {} # node_id -> cnr info + self.repo_cnr_map = {} # repo_url -> cnr info + self.custom_node_map_cache = {} # (channel, mode) -> augmented custom node list json + self.processed_install = set() + + + def get_cnr_by_repo(self, url): + return self.repo_cnr_map.get(git_utils.normalize_url(url)) + + def resolve_unspecified_version(self, node_name, guess_mode=None): + if guess_mode == 'active': + # priority: + # 1. CNR/nightly active nodes + # 2. unknown + # 3. Fail + + if node_name in self.cnr_map: + version_spec = self.get_from_cnr_active_nodes(node_name) + + if version_spec is None: + if node_name in self.unknown_active_nodes: + version_spec = "unknown" + else: + return None + + elif node_name in self.unknown_active_nodes: + version_spec = "unknown" + else: + return None + + elif guess_mode == 'inactive': + # priority: + # 1. CNR latest in inactive + # 2. nightly + # 3. unknown + # 4. Fail + + if node_name in self.cnr_map: + latest = self.get_from_cnr_inactive_nodes(node_name) + + if latest is not None: + version_spec = str(latest[0]) + else: + if node_name in self.nightly_inactive_nodes: + version_spec = "nightly" + else: + version_spec = "unknown" + + elif node_name in self.unknown_inactive_nodes: + version_spec = "unknown" + else: + return None + + else: + # priority: + # 1. CNR latest in world + # 2. unknown + + if node_name in self.cnr_map: + version_spec = self.cnr_map[node_name]['latest_version']['version'] + else: + version_spec = "unknown" + + return version_spec + + def resolve_node_spec(self, node_name, guess_mode=None): + """ + resolve to 'node_name, version_spec' from version string + + version string: + node_name@latest + node_name@nightly + node_name@unknown + node_name@ + node_name + + if guess_mode is 'active' or 'inactive' + return can be 'None' based on state check + otherwise + return 'unknown' version when failed to guess + """ + + spec = node_name.split('@') + + if len(spec) == 2: + node_name = spec[0] + version_spec = spec[1] + + if version_spec == 'latest': + if node_name not in self.cnr_map: + print(f"ERROR: '{node_name}' is not a CNR node.") + return None + else: + version_spec = self.cnr_map[node_name]['latest_version']['version'] + + elif guess_mode in ['active', 'inactive']: + node_name = spec[0] + version_spec = self.resolve_unspecified_version(node_name, guess_mode=guess_mode) + if version_spec is None: + return None + else: + node_name = spec[0] + version_spec = self.resolve_unspecified_version(node_name) + if version_spec is None: + return None + + return node_name, version_spec, len(spec) > 1 + + def resolve_from_path(self, fullpath): + url = git_utils.git_url(fullpath) + if url: + cnr = self.get_cnr_by_repo(url) + commit_hash = git_utils.get_commit_hash(fullpath) + if cnr: + cnr_utils.generate_cnr_id(fullpath, cnr['id']) + return {'id': cnr['id'], 'cnr': cnr, 'ver': 'nightly', 'hash': commit_hash} + else: + url = os.path.basename(url) + if url.endswith('.git'): + url = url[:-4] + return {'id': url, 'ver': 'unknown', 'hash': commit_hash} + else: + info = cnr_utils.read_cnr_info(fullpath) + + if info: + cnr = self.cnr_map.get(info['id']) + if cnr: + return {'id': cnr['id'], 'cnr': cnr, 'ver': info['version']} + else: + return None + else: + return None + + def update_cache_at_path(self, fullpath): + node_package = InstalledNodePackage.from_fullpath(fullpath, self.resolve_from_path) + self.installed_node_packages[node_package.id] = node_package + + if node_package.is_disabled and node_package.is_unknown: + # NOTE: unknown package does not have an url. + self.unknown_inactive_nodes[node_package.id] = ('', node_package.fullpath) + + if node_package.is_disabled and node_package.is_nightly: + self.nightly_inactive_nodes[node_package.id] = node_package.fullpath + + if node_package.is_enabled: + self.active_nodes[node_package.id] = node_package.version, node_package.fullpath + + if node_package.is_enabled and node_package.is_unknown: + # NOTE: unknown package does not have an url. + self.unknown_active_nodes[node_package.id] = ('', node_package.fullpath) + + if node_package.is_from_cnr and node_package.is_disabled: + self.add_to_cnr_inactive_nodes(node_package.id, node_package.version, node_package.fullpath) + + def is_updatable(self, node_id): + cur_ver = self.get_cnr_active_version(node_id) + latest_ver = self.cnr_map[node_id]['latest_version']['version'] + + if cur_ver and latest_ver: + return self.safe_version(latest_ver) > self.safe_version(cur_ver) + + return False + + def fetch_or_pull_git_repo(self, is_pull=False): + updated = set() + failed = set() + + def check_update(node_name, fullpath, ver_spec): + try: + if is_pull: + is_updated, success = git_repo_update_check_with(fullpath, do_update=True) + else: + is_updated, success = git_repo_update_check_with(fullpath, do_fetch=True) + + return f"{node_name}@{ver_spec}", is_updated, success + except Exception: + traceback.print_exc() + + return f"{node_name}@{ver_spec}", False, False + + with ThreadPoolExecutor() as executor: + futures = [] + + for k, v in self.unknown_active_nodes.items(): + futures.append(executor.submit(check_update, k, v[1], 'unknown')) + + for k, v in self.active_nodes.items(): + if v[0] == 'nightly': + futures.append(executor.submit(check_update, k, v[1], 'nightly')) + + for future in as_completed(futures): + item, is_updated, success = future.result() + + if is_updated: + updated.add(item) + + if not success: + failed.add(item) + + return dict(updated=list(updated), failed=list(failed)) + + def is_enabled(self, node_id, version_spec=None): + """ + 1. true if node_id@ is enabled + 2. true if node_id@ is enabled and version_spec==None + 3. false otherwise + + remark: latest version_spec is not allowed. Must be resolved before call. + """ + if version_spec == "cnr": + return self.get_cnr_active_version(node_id) not in [None, 'nightly'] + elif version_spec == 'unknown' and self.is_unknown_active(node_id): + return True + elif version_spec is not None and self.get_cnr_active_version(node_id) == version_spec: + return True + elif version_spec is None and (node_id in self.active_nodes or node_id in self.unknown_active_nodes): + return True + return False + + def is_disabled(self, node_id, version_spec=None): + """ + 1. node_id@unknown is disabled if version_spec is @unknown + 2. node_id@nightly is disabled if version_spec is @nightly + 4. node_id@ is disabled if version_spec is not None + 5. not exists (active node_id) if version_spec is None + + remark: latest version_spec is not allowed. Must be resolved before call. + """ + if version_spec == "unknown": + return node_id in self.unknown_inactive_nodes + elif version_spec == "nightly": + return node_id in self.nightly_inactive_nodes + elif version_spec == "cnr": + res = self.cnr_inactive_nodes.get(node_id, None) + if res is None: + return False + + res = [x for x in res.keys() if x != 'nightly'] + return len(res) > 0 + elif version_spec is not None: + return version_spec in self.cnr_inactive_nodes.get(node_id, []) + + if node_id in self.nightly_inactive_nodes: + return True + elif node_id in self.unknown_inactive_nodes: + return True + + target = self.cnr_inactive_nodes.get(node_id, None) + if target is not None and target == version_spec: + return True + + return False + + def is_registered_in_cnr(self, node_id): + return node_id in self.cnr_map + + def get_cnr_active_version(self, node_id): + res = self.active_nodes.get(node_id) + if res: + return res[0] + else: + return None + + def is_unknown_active(self, node_id): + return node_id in self.unknown_active_nodes + + def add_to_cnr_inactive_nodes(self, node_id, ver, fullpath): + ver_map = self.cnr_inactive_nodes.get(node_id) + if ver_map is None: + ver_map = {} + self.cnr_inactive_nodes[node_id] = ver_map + + ver_map[ver] = fullpath + + def get_from_cnr_active_nodes(self, node_id): + ver_path = self.active_nodes.get(node_id) + if ver_path is None: + return None + + return ver_path[0] + + def get_from_cnr_inactive_nodes(self, node_id, ver=None): + ver_map = self.cnr_inactive_nodes.get(node_id) + if ver_map is None: + return None + + if ver is not None: + return ver_map.get(ver) + + latest = None + for k, v in ver_map.items(): + if latest is None: + latest = self.safe_version(k), v + continue + + cur_ver = self.safe_version(k) + if cur_ver > latest[0]: + latest = cur_ver, v + + return latest + + async def reload(self, cache_mode): + self.custom_node_map_cache = {} + self.cnr_inactive_nodes = {} # node_id -> node_version -> fullpath + self.nightly_inactive_nodes = {} # node_id -> fullpath + self.unknown_inactive_nodes = {} # node_id -> repo url * fullpath + self.unknown_active_nodes = {} # node_id -> repo url * fullpath + self.active_nodes = {} # node_id -> node_version * fullpath + + # reload 'cnr_map' and 'repo_cnr_map' + cnrs = await cnr_utils.get_cnr_data(cache_mode=cache_mode) + + for x in cnrs: + self.cnr_map[x['id']] = x + + if 'repository' in x: + normalized_url = git_utils.normalize_url(x['repository']) + self.repo_cnr_map[normalized_url] = x + + # reload node status info from custom_nodes/* + for custom_nodes_path in folder_paths.get_folder_paths('custom_nodes'): + for x in os.listdir(custom_nodes_path): + fullpath = os.path.join(custom_nodes_path, x) + if os.path.isdir(fullpath): + if x not in ['__pycache__', '.disabled']: + self.update_cache_at_path(fullpath) + + # reload node status info from custom_nodes/.disabled/* + for custom_nodes_path in folder_paths.get_folder_paths('custom_nodes'): + disabled_dir = os.path.join(custom_nodes_path, '.disabled') + if os.path.exists(disabled_dir): + for x in os.listdir(disabled_dir): + fullpath = os.path.join(disabled_dir, x) + if os.path.isdir(fullpath): + self.update_cache_at_path(fullpath) + + @staticmethod + async def load_nightly(channel, mode): + res = {} + + channel_url = normalize_channel(channel) + if channel_url: + if mode not in ['remote', 'local', 'cache']: + print(f"[bold red]ERROR: Invalid mode is specified `--mode {mode}`[/bold red]", file=sys.stderr) + return {} + + json_obj = await get_data_by_mode(mode, 'custom-node-list.json', channel_url=channel_url) + for x in json_obj['custom_nodes']: + for y in x['files']: + if 'github.com' in y and not (y.endswith('.py') or y.endswith('.js')): + repo_name = y.split('/')[-1] + res[repo_name] = (x, False) + + if 'id' in x: + if x['id'] not in res: + res[x['id']] = (x, True) + + return res + + async def get_custom_nodes(self, channel, mode): + default_channel = normalize_channel('default') + cache = self.custom_node_map_cache.get((default_channel, mode)) # CNR/nightly should always be based on the default channel. + + if cache is not None: + return cache + + channel = normalize_channel(channel) + print(f"nightly_channel: {channel}/{mode}") + nodes = await self.load_nightly(channel, mode) + + res = {} + added_cnr = set() + for v in nodes.values(): + v = v[0] + if len(v['files']) == 1: + cnr = self.get_cnr_by_repo(v['files'][0]) + if cnr: + if 'latest_version' not in cnr: + v['cnr_latest'] = '0.0.0' + else: + v['cnr_latest'] = cnr['latest_version']['version'] + v['id'] = cnr['id'] + v['author'] = cnr['publisher']['name'] + v['title'] = cnr['name'] + v['description'] = cnr['description'] + v['health'] = '-' + added_cnr.add(cnr['id']) + node_id = v['id'] + else: + node_id = v['files'][0].split('/')[-1] + res[node_id] = v + elif len(v['files']) > 1: + res[v['files'][0]] = v # A custom node composed of multiple url is treated as a single repository with one representative path + + self.custom_node_map_cache[(channel, mode)] = res + return res + + @staticmethod + def safe_version(ver_str): + try: + return version.parse(ver_str) + except: + return version.parse("0.0.0") + + def execute_install_script(self, url, repo_path, instant_execution=False, lazy_mode=False, no_deps=False): + install_script_path = os.path.join(repo_path, "install.py") + requirements_path = os.path.join(repo_path, "requirements.txt") + + if lazy_mode: + install_cmd = ["#LAZY-INSTALL-SCRIPT", sys.executable] + return try_install_script(url, repo_path, install_cmd) + else: + if os.path.exists(requirements_path) and not no_deps: + print("Install: pip packages") + pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages()) + res = True + with open(requirements_path, "r") as requirements_file: + for line in requirements_file: + package_name = remap_pip_package(line.strip()) + if package_name and not package_name.startswith('#') and package_name not in self.processed_install: + self.processed_install.add(package_name) + install_cmd = [sys.executable, "-m", "pip", "install", package_name] + if package_name.strip() != "" and not package_name.startswith('#'): + res = res and try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution) + + pip_fixer.fix_broken() + return res + + if os.path.exists(install_script_path) and install_script_path not in self.processed_install: + self.processed_install.add(install_script_path) + print("Install: install script") + install_cmd = [sys.executable, "install.py"] + return try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution) + + return True + + def reserve_cnr_switch(self, target, zip_url, from_path, to_path, no_deps): + script_path = os.path.join(manager_startup_script_path, "install-scripts.txt") + with open(script_path, "a") as file: + obj = [target, "#LAZY-CNR-SWITCH-SCRIPT", zip_url, from_path, to_path, no_deps, get_default_custom_nodes_path(), sys.executable] + file.write(f"{obj}\n") + + print(f"Installation reserved: {target}") + + return True + + def reserve_migration(self, moves): + script_path = os.path.join(manager_startup_script_path, "install-scripts.txt") + with open(script_path, "a") as file: + obj = ["", "#LAZY-MIGRATION", moves] + file.write(f"{obj}\n") + + return True + + def unified_fix(self, node_id, version_spec, instant_execution=False, no_deps=False): + """ + fix dependencies + """ + + result = ManagedResult('fix') + + info = self.active_nodes.get(node_id) + if info is None or not os.path.exists(info[1]): + return result.fail(f'not found: {node_id}@{version_spec}') + + self.execute_install_script(node_id, info[1], instant_execution=instant_execution, no_deps=no_deps) + + return result + + def cnr_switch_version(self, node_id, version_spec=None, instant_execution=False, no_deps=False, return_postinstall=False): + if instant_execution: + return self.cnr_switch_version_instant(node_id, version_spec, instant_execution, no_deps, return_postinstall) + else: + return self.cnr_switch_version_lazy(node_id, version_spec, no_deps, return_postinstall) + + def cnr_switch_version_lazy(self, node_id, version_spec=None, no_deps=False, return_postinstall=False): + """ + switch between cnr version (lazy mode) + """ + + result = ManagedResult('switch-cnr') + + node_info = cnr_utils.install_node(node_id, version_spec) + if node_info is None or not node_info.download_url: + return result.fail(f'not available node: {node_id}@{version_spec}') + + version_spec = node_info.version + + if self.active_nodes[node_id][0] == version_spec: + return ManagedResult('skip').with_msg("Up to date") + + zip_url = node_info.download_url + from_path = self.active_nodes[node_id][1] + target = node_id + to_path = os.path.join(get_default_custom_nodes_path(), target) + + def postinstall(): + return self.reserve_cnr_switch(target, zip_url, from_path, to_path, no_deps) + + if return_postinstall: + return result.with_postinstall(postinstall) + else: + if not postinstall(): + return result.fail(f"Failed to execute install script: {node_id}@{version_spec}") + + return result + + def cnr_switch_version_instant(self, node_id, version_spec=None, instant_execution=True, no_deps=False, return_postinstall=False): + """ + switch between cnr version + """ + + # 1. download + result = ManagedResult('switch-cnr') + + node_info = cnr_utils.install_node(node_id, version_spec) + if node_info is None or not node_info.download_url: + return result.fail(f'not available node: {node_id}@{version_spec}') + + version_spec = node_info.version + + if self.active_nodes[node_id][0] == version_spec: + return ManagedResult('skip').with_msg("Up to date") + + archive_name = f"CNR_temp_{str(uuid.uuid4())}.zip" # should be unpredictable name - security precaution + download_path = os.path.join(get_default_custom_nodes_path(), archive_name) + manager_downloader.download_url(node_info.download_url, get_default_custom_nodes_path(), archive_name) + + # 2. extract files into + install_path = self.active_nodes[node_id][1] + extracted = manager_util.extract_package_as_zip(download_path, install_path) + os.remove(download_path) + + if extracted is None: + if len(os.listdir(install_path)) == 0: + shutil.rmtree(install_path) + + return result.fail(f'Empty archive file: {node_id}@{version_spec}') + + # 3. calculate garbage files (.tracking - extracted) + tracking_info_file = os.path.join(install_path, '.tracking') + prev_files = set() + with open(tracking_info_file, 'r') as f: + for line in f: + prev_files.add(line.strip()) + garbage = prev_files.difference(extracted) + garbage = [os.path.join(install_path, x) for x in garbage] + + # 4-1. remove garbage files + for x in garbage: + if os.path.isfile(x): + os.remove(x) + + # 4-2. remove garbage dir if empty + for x in garbage: + if os.path.isdir(x): + if not os.listdir(x): + os.rmdir(x) + + # 5. create .tracking file + tracking_info_file = os.path.join(install_path, '.tracking') + with open(tracking_info_file, "w", encoding='utf-8') as file: + file.write('\n'.join(list(extracted))) + + # 6. post install + result.target = version_spec + + def postinstall(): + res = self.execute_install_script(f"{node_id}@{version_spec}", install_path, instant_execution=instant_execution, no_deps=no_deps) + return res + + if return_postinstall: + return result.with_postinstall(postinstall) + else: + if not postinstall(): + return result.fail(f"Failed to execute install script: {node_id}@{version_spec}") + + return result + + def unified_enable(self, node_id, version_spec=None): + """ + priority if version_spec == None + 1. CNR latest in disk + 2. nightly + 3. unknown + + remark: latest version_spec is not allowed. Must be resolved before call. + """ + + result = ManagedResult('enable') + + if version_spec is None: + version_spec = self.resolve_unspecified_version(node_id, guess_mode='inactive') + if version is None: + return result.fail(f'Specified inactive node not exists: {node_id}') + + if self.is_enabled(node_id, version_spec): + return ManagedResult('skip').with_msg('Already enabled') + + if not self.is_disabled(node_id, version_spec): + return ManagedResult('skip').with_msg('Not installed') + + from_path = None + to_path = None + + if version_spec == 'unknown': + repo_and_path = self.unknown_inactive_nodes.get(node_id) + if repo_and_path is None: + return result.fail(f'Specified inactive node not exists: {node_id}@unknown') + from_path = repo_and_path[1] + + base_path = extract_base_custom_nodes_dir(from_path) + to_path = os.path.join(base_path, node_id) + elif version_spec == 'nightly': + self.unified_disable(node_id, False) + from_path = self.nightly_inactive_nodes.get(node_id) + if from_path is None: + return result.fail(f'Specified inactive node not exists: {node_id}@nightly') + base_path = extract_base_custom_nodes_dir(from_path) + to_path = os.path.join(base_path, node_id) + elif version_spec is not None: + self.unified_disable(node_id, False) + cnr_info = self.cnr_inactive_nodes.get(node_id) + + if cnr_info is None or len(cnr_info) == 0: + return result.fail(f'Specified inactive cnr node not exists: {node_id}') + + if version_spec == "cnr": + version_spec = next(iter(cnr_info)) + + if version_spec not in cnr_info: + return result.fail(f'Specified inactive node not exists: {node_id}@{version_spec}') + + from_path = cnr_info[version_spec] + base_path = extract_base_custom_nodes_dir(from_path) + to_path = os.path.join(base_path, node_id) + + if from_path is None or not os.path.exists(from_path): + return result.fail(f'Specified inactive node path not exists: {from_path}') + + # move from disk + shutil.move(from_path, to_path) + + # update cache + if version_spec == 'unknown': + del self.unknown_inactive_nodes[node_id] + self.unknown_active_nodes[node_id] = to_path + return result.with_target(to_path) + elif version_spec == 'nightly': + del self.nightly_inactive_nodes[node_id] + else: + del self.cnr_inactive_nodes[node_id][version_spec] + + self.active_nodes[node_id] = version_spec, to_path + return result.with_target(to_path) + + def unified_disable(self, node_id, is_unknown): + result = ManagedResult('disable') + + if is_unknown: + version_spec = 'unknown' + else: + version_spec = None + + if not self.is_enabled(node_id, version_spec): + if not self.is_disabled(node_id, version_spec): + return ManagedResult('skip').with_msg('Not installed') + else: + return ManagedResult('skip').with_msg('Already disabled') + + if is_unknown: + repo_and_path = self.unknown_active_nodes.get(node_id) + + if repo_and_path is None or not os.path.exists(repo_and_path[1]): + return result.fail(f'Specified active node not exists: {node_id}') + + base_path = extract_base_custom_nodes_dir(repo_and_path[1]) + to_path = os.path.join(base_path, '.disabled', node_id) + + shutil.move(repo_and_path[1], to_path) + result.append((repo_and_path[1], to_path)) + + self.unknown_inactive_nodes[node_id] = repo_and_path[0], to_path + del self.unknown_active_nodes[node_id] + + return result + + ver_and_path = self.active_nodes.get(node_id) + + if ver_and_path is None or not os.path.exists(ver_and_path[1]): + return result.fail(f'Specified active node not exists: {node_id}') + + base_path = extract_base_custom_nodes_dir(ver_and_path[1]) + + # NOTE: A disabled node may have multiple versions, so preserve it using the `@ suffix`. + to_path = os.path.join(base_path, '.disabled', f"{node_id}@{ver_and_path[0].replace('.', '_')}") + shutil.move(ver_and_path[1], to_path) + result.append((ver_and_path[1], to_path)) + + if ver_and_path[0] == 'nightly': + self.nightly_inactive_nodes[node_id] = to_path + else: + self.add_to_cnr_inactive_nodes(node_id, ver_and_path[0], to_path) + + del self.active_nodes[node_id] + + return result + + def unified_uninstall(self, node_id: str, is_unknown: bool): + """ + Remove whole installed custom nodes including inactive nodes + """ + result = ManagedResult('uninstall') + + if is_unknown: + # remove from actives + repo_and_path = self.unknown_active_nodes.get(node_id) + + is_removed = False + + if repo_and_path is not None and os.path.exists(repo_and_path[1]): + rmtree(repo_and_path[1]) + result.append(repo_and_path[1]) + del self.unknown_active_nodes[node_id] + + is_removed = True + + # remove from inactives + repo_and_path = self.unknown_inactive_nodes.get(node_id) + + if repo_and_path is not None and os.path.exists(repo_and_path[1]): + rmtree(repo_and_path[1]) + result.append(repo_and_path[1]) + del self.unknown_inactive_nodes[node_id] + + is_removed = True + + if is_removed: + return result + else: + return ManagedResult('skip') + + # remove from actives + ver_and_path = self.active_nodes.get(node_id) + + if ver_and_path is not None and os.path.exists(ver_and_path[1]): + shutil.rmtree(ver_and_path[1]) + result.items.append(ver_and_path) + del self.active_nodes[node_id] + + # remove from nightly inactives + fullpath = self.nightly_inactive_nodes.get(node_id) + if fullpath is not None and os.path.exists(fullpath): + shutil.rmtree(fullpath) + result.items.append(('nightly', fullpath)) + del self.nightly_inactive_nodes[node_id] + + # remove from cnr inactives + ver_map = self.cnr_inactive_nodes.get(node_id) + if ver_map is not None: + for key, fullpath in ver_map.items(): + shutil.rmtree(fullpath) + result.items.append((key, fullpath)) + del self.cnr_inactive_nodes[node_id] + + if len(result.items) == 0: + return ManagedResult('skip').with_msg('Not installed') + + return result + + def cnr_install(self, node_id, version_spec=None, instant_execution=False, no_deps=False, return_postinstall=False): + result = ManagedResult('install-cnr') + + node_info = cnr_utils.install_node(node_id, version_spec) + if node_info is None or not node_info.download_url: + return result.fail(f'not available node: {node_id}@{version_spec}') + + archive_name = f"CNR_temp_{str(uuid.uuid4())}.zip" # should be unpredictable name - security precaution + download_path = os.path.join(get_default_custom_nodes_path(), archive_name) + + # re-download. I cannot trust existing file. + if os.path.exists(download_path): + os.remove(download_path) + + # install_path + install_path = os.path.join(get_default_custom_nodes_path(), node_id) + if os.path.exists(install_path): + return result.fail(f'Install path already exists: {install_path}') + + manager_downloader.download_url(node_info.download_url, get_default_custom_nodes_path(), archive_name) + os.makedirs(install_path, exist_ok=True) + extracted = manager_util.extract_package_as_zip(download_path, install_path) + os.remove(download_path) + result.to_path = install_path + + if extracted is None: + shutil.rmtree(install_path) + return result.fail(f'Empty archive file: {node_id}@{version_spec}') + + # create .tracking file + tracking_info_file = os.path.join(install_path, '.tracking') + with open(tracking_info_file, "w", encoding='utf-8') as file: + file.write('\n'.join(extracted)) + + result.target = version_spec + + def postinstall(): + return self.execute_install_script(node_id, install_path, instant_execution=instant_execution, no_deps=no_deps) + + if return_postinstall: + return result.with_postinstall(postinstall) + else: + if not postinstall(): + return result.fail(f"Failed to execute install script: {node_id}@{version_spec}") + + return result + + def repo_install(self, url, repo_path, instant_execution=False, no_deps=False, return_postinstall=False): + result = ManagedResult('install-git') + result.append(url) + + if not is_valid_url(url): + return result.fail(f"Invalid git url: {url}") + + if url.endswith("/"): + url = url[:-1] + try: + print(f"Download: git clone '{url}'") + + # Clone the repository from the remote URL + if not instant_execution and platform.system() == 'Windows': + res = manager_funcs.run_script([sys.executable, git_script_path, "--clone", get_default_custom_nodes_path(), url, repo_path], cwd=get_default_custom_nodes_path()) + if res != 0: + return result.fail(f"Failed to clone repo: {url}") + else: + repo = git.Repo.clone_from(url, repo_path, recursive=True, progress=GitProgress()) + repo.git.clear_cache() + repo.close() + + def postinstall(): + return self.execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps) + + if return_postinstall: + return result.with_postinstall(postinstall) + else: + if not postinstall(): + return result.fail(f"Failed to execute install script: {url}") + + except Exception as e: + return result.fail(f"Install(git-clone) error: {url} / {e}") + + print("Installation was successful.") + return result + + def repo_update(self, repo_path, instant_execution=False, no_deps=False, return_postinstall=False): + result = ManagedResult('update-git') + + if not os.path.exists(os.path.join(repo_path, '.git')): + return result.fail(f'Path not found: {repo_path}') + + # version check + repo = git.Repo(repo_path) + + if repo.head.is_detached: + switch_to_default_branch(repo) + + current_branch = repo.active_branch + branch_name = current_branch.name + + if current_branch.tracking_branch() is None: + print(f"[ComfyUI-Manager] There is no tracking branch ({current_branch})") + remote_name = 'origin' + else: + remote_name = current_branch.tracking_branch().remote_name + remote = repo.remote(name=remote_name) + + try: + remote.fetch() + except Exception as e: + if 'detected dubious' in str(e): + print("[ComfyUI-Manager] Try fixing 'dubious repository' error on 'ComfyUI' repository") + safedir_path = comfy_path.replace('\\', '/') + subprocess.run(['git', 'config', '--global', '--add', 'safe.directory', safedir_path]) + try: + remote.fetch() + except Exception: + print("\n[ComfyUI-Manager] Failed to fixing repository setup. Please execute this command on cmd: \n" + "-----------------------------------------------------------------------------------------\n" + f'git config --global --add safe.directory "{safedir_path}"\n' + "-----------------------------------------------------------------------------------------\n") + + commit_hash = repo.head.commit.hexsha + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + + if commit_hash != remote_commit_hash: + git_pull(repo_path) + + if len(repo.remotes) > 0: + url = repo.remotes[0].url + else: + url = "unknown repo" + + def postinstall(): + return self.execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps) + + if return_postinstall: + return result.with_postinstall(postinstall) + else: + if not postinstall(): + return result.fail(f"Failed to execute install script: {url}") + + return result + else: + return ManagedResult('skip').with_msg('Up to date') + + def unified_update(self, node_id, version_spec=None, instant_execution=False, no_deps=False, return_postinstall=False): + orig_print(f"\x1b[2K\rUpdating: {node_id}", end='') + + if version_spec is None: + version_spec = self.resolve_unspecified_version(node_id, guess_mode='active') + + if version_spec is None: + return ManagedResult('update').fail(f'Update not available: {node_id}@{version_spec}') + + if version_spec == 'nightly': + return self.repo_update(self.active_nodes[node_id][1], instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_target('nightly') + elif version_spec == 'unknown': + return self.repo_update(self.unknown_active_nodes[node_id][1], instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_target('unknown') + else: + return self.cnr_switch_version(node_id, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall) + + async def install_by_id(self, node_id, version_spec=None, channel=None, mode=None, instant_execution=False, no_deps=False, return_postinstall=False): + """ + priority if version_spec == None + 1. CNR latest + 2. unknown + + remark: latest version_spec is not allowed. Must be resolved before call. + """ + + repo_url = None + if version_spec is None: + if self.is_enabled(node_id): + return ManagedResult('skip') + elif self.is_disabled(node_id): + return self.unified_enable(node_id) + else: + version_spec = self.resolve_unspecified_version(node_id) + + if version_spec == 'unknown' or version_spec == 'nightly': + custom_nodes = await self.get_custom_nodes(channel, mode) + the_node = custom_nodes.get(node_id) + if the_node is not None: + repo_url = the_node['files'][0] + else: + result = ManagedResult('install') + return result.fail(f"Node '{node_id}@{version_spec}' not found in [{channel}, {mode}]") + + if self.is_enabled(node_id, version_spec): + return ManagedResult('skip').with_target(f"{node_id}@{version_spec}") + + elif self.is_disabled(node_id, version_spec): + return self.unified_enable(node_id, version_spec) + + elif version_spec == 'unknown' or version_spec == 'nightly': + if version_spec == 'nightly': + # disable cnr nodes + if self.is_enabled(node_id, 'cnr'): + self.unified_disable(node_id, False) + + to_path = os.path.abspath(os.path.join(get_default_custom_nodes_path(), node_id)) + res = self.repo_install(repo_url, to_path, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall) + if res.result: + if version_spec == 'unknown': + self.unknown_active_nodes[node_id] = to_path + elif version_spec == 'nightly': + cnr_utils.generate_cnr_id(to_path, node_id) + self.active_nodes[node_id] = 'nightly', to_path + + return res.with_target(version_spec) + + if self.is_enabled(node_id, 'nightly'): + # disable nightly nodes + self.unified_disable(node_id, False) # NOTE: don't return from here + + if self.is_disabled(node_id, version_spec): + # enable and return if specified version is disabled + return self.unified_enable(node_id, version_spec) + + if self.is_disabled(node_id, "cnr"): + # enable and switch version if cnr is disabled (not specified version) + self.unified_enable(node_id, "cnr") + return self.cnr_switch_version(node_id, version_spec, no_deps=no_deps, return_postinstall=return_postinstall) + + if self.is_enabled(node_id, "cnr"): + return self.cnr_switch_version(node_id, version_spec, no_deps=no_deps, return_postinstall=return_postinstall) + + res = self.cnr_install(node_id, version_spec, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall) + if res.result: + self.active_nodes[node_id] = version_spec, res.to_path + + return res + + async def migrate_unmanaged_nodes(self): + """ + fix path for nightly and unknown nodes of unmanaged nodes + """ + await self.reload('cache') + await self.get_custom_nodes('default', 'cache') + + print("Migration: STAGE 1") + moves = [] + + # migrate nightly inactive + for x, v in self.nightly_inactive_nodes.items(): + if v.endswith('@nightly'): + continue + + new_path = os.path.join(get_default_custom_nodes_path(), '.disabled', f"{x}@nightly") + moves.append((v, new_path)) + + self.reserve_migration(moves) + + print("DONE (Migration reserved)") + + +unified_manager = UnifiedManager() + + +def identify_node_pack_from_path(fullpath): + module_name = os.path.basename(fullpath) + if module_name.endswith('.git'): + module_name = module_name[:-4] + + repo_url = git_utils.git_url(fullpath) + if repo_url is None: + # cnr + cnr = cnr_utils.read_cnr_info(fullpath) + if cnr is not None: + return module_name, cnr['version'], cnr['id'] + + return None + else: + # nightly or unknown + cnr_id = cnr_utils.read_cnr_id(fullpath) + commit_hash = git_utils.get_commit_hash(fullpath) + + if cnr_id is not None: + return module_name, commit_hash, cnr_id + else: + return module_name, commit_hash, '' + + +def get_installed_node_packs(): + res = {} + + for x in get_custom_nodes_paths(): + for y in os.listdir(x): + if y == '__pycache__' or y == '.disabled': + continue + + fullpath = os.path.join(x, y) + info = identify_node_pack_from_path(fullpath) + if info is None: + continue + + is_disabled = not y.endswith('.disabled') + + res[info[0]] = { 'ver': info[1], 'cnr_id': info[2], 'enabled': is_disabled } + + disabled_dirs = os.path.join(x, '.disabled') + if os.path.exists(disabled_dirs): + for y in os.listdir(disabled_dirs): + if y == '__pycache__': + continue + + fullpath = os.path.join(disabled_dirs, y) + info = identify_node_pack_from_path(fullpath) + if info is None: + continue + + res[info[0]] = { 'ver': info[1], 'cnr_id': info[2], 'enabled': False } + + return res def get_channel_dict(): @@ -190,10 +1455,10 @@ def get_channel_dict(): if channel_dict is None: channel_dict = {} - if not os.path.exists(channel_list_path): - shutil.copy(channel_list_path+'.template', channel_list_path) + if not os.path.exists(manager_channel_list_path): + shutil.copy(channel_list_template_path, manager_channel_list_path) - with open(os.path.join(comfyui_manager_path, 'channels.list'), 'r') as file: + with open(manager_channel_list_path, 'r') as file: channels = file.read() for x in channels.split('\n'): channel_info = x.split("::") @@ -226,9 +1491,7 @@ class ManagerFuncs: print(f"[ComfyUI-Manager] Unexpected behavior: `{cmd}`") return 0 - new_env = os.environ.copy() - new_env["COMFYUI_PATH"] = comfy_path - subprocess.check_call(cmd, cwd=cwd, env=new_env) + subprocess.check_call(cmd, cwd=cwd, env=get_script_env()) return 0 @@ -240,7 +1503,6 @@ def write_config(): config = configparser.ConfigParser() config['default'] = { 'preview_method': manager_funcs.get_current_preview_method(), - 'badge_mode': get_config()['badge_mode'], 'git_exe': get_config()['git_exe'], 'channel_url': get_config()['channel_url'], 'share_option': get_config()['share_option'], @@ -253,15 +1515,21 @@ def write_config(): 'model_download_by_agent': get_config()['model_download_by_agent'], 'downgrade_blacklist': get_config()['downgrade_blacklist'], 'security_level': get_config()['security_level'], + 'skip_migration_check': get_config()['skip_migration_check'], } - with open(config_path, 'w') as configfile: + + directory = os.path.dirname(manager_config_path) + if not os.path.exists(directory): + os.makedirs(directory) + + with open(manager_config_path, 'w') as configfile: config.write(configfile) def read_config(): try: config = configparser.ConfigParser() - config.read(config_path) + config.read(manager_config_path) default_conf = config['default'] # policy migration: disable_unsecure_features -> security_level @@ -275,9 +1543,8 @@ def read_config(): return { 'preview_method': default_conf['preview_method'] if 'preview_method' in default_conf else manager_funcs.get_current_preview_method(), - 'badge_mode': default_conf['badge_mode'] if 'badge_mode' in default_conf else 'none', 'git_exe': default_conf['git_exe'] if 'git_exe' in default_conf else '', - 'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', + 'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else DEFAULT_CHANNEL, 'share_option': default_conf['share_option'] if 'share_option' in default_conf else 'all', 'bypass_ssl': default_conf['bypass_ssl'].lower() == 'true' if 'bypass_ssl' in default_conf else False, 'file_logging': default_conf['file_logging'].lower() == 'true' if 'file_logging' in default_conf else True, @@ -287,15 +1554,15 @@ def read_config(): 'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'].lower() == 'true' if 'windows_selector_event_loop_policy' in default_conf else False, 'model_download_by_agent': default_conf['model_download_by_agent'].lower() == 'true' if 'model_download_by_agent' in default_conf else False, 'downgrade_blacklist': default_conf['downgrade_blacklist'] if 'downgrade_blacklist' in default_conf else '', + 'skip_migration_check': default_conf['skip_migration_check'].lower() == 'true' if 'skip_migration_check' in default_conf else False, 'security_level': security_level } except Exception: return { 'preview_method': manager_funcs.get_current_preview_method(), - 'badge_mode': 'none', 'git_exe': '', - 'channel_url': 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', + 'channel_url': DEFAULT_CHANNEL, 'share_option': 'all', 'bypass_ssl': False, 'file_logging': True, @@ -305,6 +1572,7 @@ def read_config(): 'windows_selector_event_loop_policy': False, 'model_download_by_agent': False, 'downgrade_blacklist': '', + 'skip_migration_check': False, 'security_level': 'normal', } @@ -319,19 +1587,25 @@ def get_config(): def switch_to_default_branch(repo): - show_result = repo.git.remote("show", "origin") - matches = re.search(r"\s*HEAD branch:\s*(.*)", show_result) - if matches: - default_branch = matches.group(1) + try: + default_branch = repo.git.symbolic_ref('refs/remotes/origin/HEAD').replace('refs/remotes/origin/', '') repo.git.checkout(default_branch) + except: + try: + repo.git.checkout(repo.heads.master) + except: + try: + repo.git.checkout('-b', 'master', 'origin/master') + except: + print("[ComfyUI Manager] Failed to switch to the default branch") def try_install_script(url, repo_path, install_cmd, instant_execution=False): if not instant_execution and ((len(install_cmd) > 0 and install_cmd[0].startswith('#')) or (platform.system() == "Windows" and comfy_ui_commit_datetime.date() >= comfy_ui_required_commit_datetime.date())): - if not os.path.exists(startup_script_path): - os.makedirs(startup_script_path) + if not os.path.exists(manager_startup_script_path): + os.makedirs(manager_startup_script_path) - script_path = os.path.join(startup_script_path, "install-scripts.txt") + script_path = os.path.join(manager_startup_script_path, "install-scripts.txt") with open(script_path, "a") as file: obj = [repo_path] + install_cmd file.write(f"{obj}\n") @@ -351,7 +1625,7 @@ def try_install_script(url, repo_path, install_cmd, instant_execution=False): if comfy_ui_commit_datetime.date() < comfy_ui_required_commit_datetime.date(): print("\n\n###################################################################") print(f"[WARN] ComfyUI-Manager: Your ComfyUI version ({comfy_ui_revision})[{comfy_ui_commit_datetime.date()}] is too old. Please update to the latest version.") - print(f"[WARN] The extension installation feature may not work properly in the current installed ComfyUI version on Windows environment.") + print("[WARN] The extension installation feature may not work properly in the current installed ComfyUI version on Windows environment.") print("###################################################################\n\n") except: pass @@ -362,6 +1636,8 @@ def try_install_script(url, repo_path, install_cmd, instant_execution=False): print(f"install script failed: {url}") return False + return True + # use subprocess to avoid file system lock by git (Windows) def __win_check_git_update(path, do_fetch=False, do_update=False): @@ -372,9 +1648,8 @@ def __win_check_git_update(path, do_fetch=False, do_update=False): else: command = [sys.executable, git_script_path, "--check", path] - new_env = os.environ.copy() - new_env["COMFYUI_PATH"] = comfy_path - process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=get_default_custom_nodes_path()) + new_env = get_script_env() + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=get_default_custom_nodes_path(), env=new_env) output, _ = process.communicate() output = output.decode('utf-8').strip() @@ -390,7 +1665,7 @@ def __win_check_git_update(path, do_fetch=False, do_update=False): output, _ = process.communicate() output = output.decode('utf-8').strip() except Exception: - print(f'[ComfyUI-Manager] failed to fixing') + print('[ComfyUI-Manager] failed to fixing') if 'detected dubious' in output: print(f'\n[ComfyUI-Manager] Failed to fixing repository setup. Please execute this command on cmd: \n' @@ -425,14 +1700,13 @@ def __win_check_git_update(path, do_fetch=False, do_update=False): def __win_check_git_pull(path): - new_env = os.environ.copy() - new_env["COMFYUI_PATH"] = comfy_path command = [sys.executable, git_script_path, "--pull", path] - process = subprocess.Popen(command, env=new_env, cwd=get_default_custom_nodes_path()) + process = subprocess.Popen(command, env=get_script_env(), cwd=get_default_custom_nodes_path()) process.wait() -def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=False): +def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=False, no_deps=False): + # import ipdb; ipdb.set_trace() install_script_path = os.path.join(repo_path, "install.py") requirements_path = os.path.join(repo_path, "requirements.txt") @@ -440,9 +1714,9 @@ def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=Fa install_cmd = ["#LAZY-INSTALL-SCRIPT", sys.executable] try_install_script(url, repo_path, install_cmd) else: - if os.path.exists(requirements_path): + if os.path.exists(requirements_path) and not no_deps: print("Install: pip packages") - pip_fixer = PIPFixer(get_installed_packages()) + pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages()) with open(requirements_path, "r") as requirements_file: for line in requirements_file: #handle comments @@ -464,42 +1738,61 @@ def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=Fa if package_name.strip() != "" and not package_name.startswith('#'): try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution) - pip_fixer.fix_broken() if os.path.exists(install_script_path): - print(f"Install: install script") + print("Install: install script") install_cmd = [sys.executable, "install.py"] try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution) return True -def git_repo_has_updates(path, do_fetch=False, do_update=False): +def git_repo_update_check_with(path, do_fetch=False, do_update=False, no_deps=False): + """ + + perform update check for git custom node + and fetch or update if flag is on + + :param path: path to git custom node + :param do_fetch: do fetch during check + :param do_update: do update during check + :param no_deps: don't install dependencies + :return: update state * success + """ if do_fetch: - print(f"\x1b[2K\rFetching: {path}", end='') + orig_print(f"\x1b[2K\rFetching: {path}", end='') elif do_update: - print(f"\x1b[2K\rUpdating: {path}", end='') + orig_print(f"\x1b[2K\rUpdating: {path}", end='') # Check if the path is a git repository if not os.path.exists(os.path.join(path, '.git')): - raise ValueError('Not a git repository') + raise ValueError(f'[ComfyUI-Manager] Not a valid git repository: {path}') if platform.system() == "Windows": updated, success = __win_check_git_update(path, do_fetch, do_update) if updated and success: - execute_install_script(None, path, lazy_mode=True) + execute_install_script(None, path, lazy_mode=True, no_deps=no_deps) return updated, success else: # Fetch the latest commits from the remote repository repo = git.Repo(path) - current_branch = repo.active_branch - branch_name = current_branch.name - remote_name = 'origin' remote = repo.remote(name=remote_name) + if not do_update and repo.head.is_detached: + if do_fetch: + remote.fetch() + + return True, True # detached branch is treated as updatable + + if repo.head.is_detached: + switch_to_default_branch(repo) + + current_branch = repo.active_branch + branch_name = current_branch.name + # Get the current commit hash commit_hash = repo.head.commit.hexsha @@ -507,8 +1800,14 @@ def git_repo_has_updates(path, do_fetch=False, do_update=False): remote.fetch() if do_update: - if repo.head.is_detached: + if repo.is_dirty(): + print(f"\nSTASH: '{path}' is dirty.") + repo.git.stash() + + if f'{remote_name}/{branch_name}' not in repo.refs: switch_to_default_branch(repo) + current_branch = repo.active_branch + branch_name = current_branch.name remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha @@ -522,7 +1821,7 @@ def git_repo_has_updates(path, do_fetch=False, do_update=False): new_commit_hash = repo.head.commit.hexsha if commit_hash != new_commit_hash: - execute_install_script(None, path) + execute_install_script(None, path, no_deps=no_deps) print(f"\x1b[2K\rUpdated: {path}") return True, True else: @@ -540,7 +1839,10 @@ def git_repo_has_updates(path, do_fetch=False, do_update=False): current_branch = repo.active_branch branch_name = current_branch.name - remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + if f'{remote_name}/{branch_name}' in repo.refs: + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + else: + return True, True # Assuming there's an update if it's not the default branch. # Compare the commit hashes to determine if the local repository is behind the remote repository if commit_hash != remote_commit_hash: @@ -578,45 +1880,72 @@ def is_valid_url(url): return True finally: # Check for SSH git URL format - pattern = re.compile(r"^(.+@|ssh:\/\/).+:.+$") + pattern = re.compile(r"^(.+@|ssh://).+:.+$") if pattern.match(url): return True return False -def gitclone_install(files, instant_execution=False, msg_prefix=''): - print(f"{msg_prefix}Install: {files}") - for url in files: - if not is_valid_url(url): - print(f"Invalid git url: '{url}'") - return False +async def gitclone_install(url, instant_execution=False, msg_prefix='', no_deps=False): + await unified_manager.reload('cache') + await unified_manager.get_custom_nodes('default', 'cache') - if url.endswith("/"): - url = url[:-1] - try: - print(f"Download: git clone '{url}'") + print(f"{msg_prefix}Install: {url}") + + result = ManagedResult('install-git') + + if not is_valid_url(url): + return result.fail(f"Invalid git url: '{url}'") + + if url.endswith("/"): + url = url[:-1] + try: + cnr = unified_manager.get_cnr_by_repo(url) + if cnr: + cnr_id = cnr['id'] + return await unified_manager.install_by_id(cnr_id, version_spec='nightly') + else: repo_name = os.path.splitext(os.path.basename(url))[0] - repo_path = os.path.join(get_default_custom_nodes_path(), repo_name) + + # NOTE: Keep original name as possible if unknown node + # node_dir = f"{repo_name}@unknown" + node_dir = repo_name + + repo_path = os.path.join(get_default_custom_nodes_path(), node_dir) + + if os.path.exists(repo_path): + return result.fail(f"Already exists: '{repo_path}'") + + for custom_nodes_dir in get_custom_nodes_paths(): + disabled_repo_path1 = os.path.join(custom_nodes_dir, '.disabled', node_dir) + disabled_repo_path2 = os.path.join(custom_nodes_dir, repo_name+'.disabled') # old style + + if os.path.exists(disabled_repo_path1): + return result.fail(f"Already exists (disabled): '{disabled_repo_path1}'") + + if os.path.exists(disabled_repo_path2): + return result.fail(f"Already exists (disabled): '{disabled_repo_path2}'") + + print(f"CLONE into '{repo_path}'") # Clone the repository from the remote URL if not instant_execution and platform.system() == 'Windows': - res = manager_funcs.run_script([sys.executable, git_script_path, "--clone", get_default_custom_nodes_path(), url], cwd=get_default_custom_nodes_path()) + res = manager_funcs.run_script([sys.executable, git_script_path, "--clone", get_default_custom_nodes_path(), url, repo_path], cwd=get_default_custom_nodes_path()) if res != 0: - return False + return result.fail(f"Failed to clone '{url}' into '{repo_path}'") else: repo = git.Repo.clone_from(url, repo_path, recursive=True, progress=GitProgress()) repo.git.clear_cache() repo.close() - if not execute_install_script(url, repo_path, instant_execution=instant_execution): - return False + execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps) + print("Installation was successful.") + return result.with_target(repo_path) - except Exception as e: - print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr) - return False - - print("Installation was successful.") - return True + except Exception as e: + traceback.print_exc() + print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr) + return result.fail(f"Install(git-clone) error: {url} / {e}") def git_pull(path): @@ -631,6 +1960,7 @@ def git_pull(path): repo = git.Repo(path) if repo.is_dirty(): + print(f"STASH: '{path}' is dirty.") repo.git.stash() if repo.head.is_detached: @@ -648,99 +1978,45 @@ def git_pull(path): return True -async def get_data(uri, silent=False): - if not silent: - print(f"FETCH DATA from: {uri}", end="") - - if uri.startswith("http"): - async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session: - async with session.get(uri) as resp: - json_text = await resp.text() - else: - with cache_lock: - with open(uri, "r", encoding="utf-8") as f: - json_text = f.read() - - json_obj = json.loads(json_text) - if not silent: - print(f" [DONE]") - return json_obj - - -def simple_hash(input_string): - hash_value = 0 - for char in input_string: - hash_value = (hash_value * 31 + ord(char)) % (2**32) - - return hash_value - - -def is_file_created_within_one_day(file_path): - if not os.path.exists(file_path): - return False - - file_creation_time = os.path.getctime(file_path) - current_time = datetime.now().timestamp() - time_difference = current_time - file_creation_time - - return time_difference <= 86400 - - async def get_data_by_mode(mode, filename, channel_url=None): if channel_url in get_channel_dict(): channel_url = get_channel_dict()[channel_url] try: if mode == "local": - uri = os.path.join(comfyui_manager_path, filename) - json_obj = await get_data(uri) + uri = os.path.join(manager_util.comfyui_manager_path, filename) + json_obj = await manager_util.get_data(uri) else: if channel_url is None: uri = get_config()['channel_url'] + '/' + filename else: uri = channel_url + '/' + filename - cache_uri = str(simple_hash(uri))+'_'+filename - cache_uri = os.path.join(cache_dir, cache_uri) + cache_uri = str(manager_util.simple_hash(uri))+'_'+filename + cache_uri = os.path.join(manager_util.cache_dir, cache_uri) if mode == "cache": - if is_file_created_within_one_day(cache_uri): - json_obj = await get_data(cache_uri) + if manager_util.is_file_created_within_one_day(cache_uri): + json_obj = await manager_util.get_data(cache_uri) else: - json_obj = await get_data(uri) - with cache_lock: + json_obj = await manager_util.get_data(uri) + with manager_util.cache_lock: with open(cache_uri, "w", encoding='utf-8') as file: json.dump(json_obj, file, indent=4, sort_keys=True) else: - json_obj = await get_data(uri) - with cache_lock: + json_obj = await manager_util.get_data(uri) + with manager_util.cache_lock: with open(cache_uri, "w", encoding='utf-8') as file: json.dump(json_obj, file, indent=4, sort_keys=True) except Exception as e: print(f"[ComfyUI-Manager] Due to a network error, switching to local mode.\n=> {filename}\n=> {e}") - uri = os.path.join(comfyui_manager_path, filename) - json_obj = await get_data(uri) + uri = os.path.join(manager_util.comfyui_manager_path, filename) + json_obj = await manager_util.get_data(uri) return json_obj -def lookup_installed_custom_nodes(repo_name): - try: - import folder_paths - base_paths = folder_paths.get_folder_paths("custom_nodes") - except: - base_paths = [custom_nodes_path] - - for base_path in base_paths: - repo_path = os.path.join(base_path, repo_name) - if os.path.exists(repo_path): - return True, repo_path - elif os.path.exists(repo_path+'.disabled'): - return False, repo_path - - return None - -def gitclone_fix(files, instant_execution=False): +def gitclone_fix(files, instant_execution=False, no_deps=False): print(f"Try fixing: {files}") for url in files: if not is_valid_url(url): @@ -751,15 +2027,13 @@ def gitclone_fix(files, instant_execution=False): url = url[:-1] try: repo_name = os.path.splitext(os.path.basename(url))[0] - repo_path = lookup_installed_custom_nodes(repo_name) + repo_path = os.path.join(get_default_custom_nodes_path(), repo_name) - if repo_path is not None: - repo_path = repo_path[1] + if os.path.exists(repo_path+'.disabled'): + repo_path = repo_path+'.disabled' - if not execute_install_script(url, repo_path, instant_execution=instant_execution): - return False - else: - print(f"Custom node not found: {repo_name}") + if not execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps): + return False except Exception as e: print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr) @@ -805,29 +2079,33 @@ def gitclone_uninstall(files): if url.endswith("/"): url = url[:-1] try: - dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") - repo_path = lookup_installed_custom_nodes(dir_name) + for custom_nodes_dir in get_custom_nodes_paths(): + dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_dir, dir_name) - if repo_path is None: - continue - - dir_path = repo_path[1] + # safety check + if dir_path == '/' or dir_path[1:] == ":/" or dir_path == '': + print(f"Uninstall(git-clone) error: invalid path '{dir_path}' for '{url}'") + return False - install_script_path = os.path.join(dir_path, "uninstall.py") - disable_script_path = os.path.join(dir_path, "disable.py") - if os.path.exists(install_script_path): - uninstall_cmd = [sys.executable, "uninstall.py"] - code = manager_funcs.run_script(uninstall_cmd, cwd=dir_path) + install_script_path = os.path.join(dir_path, "uninstall.py") + disable_script_path = os.path.join(dir_path, "disable.py") + if os.path.exists(install_script_path): + uninstall_cmd = [sys.executable, "uninstall.py"] + code = manager_funcs.run_script(uninstall_cmd, cwd=dir_path) - if code != 0: - print(f"An error occurred during the execution of the uninstall.py script. Only the '{dir_path}' will be deleted.") - elif os.path.exists(disable_script_path): - disable_script = [sys.executable, "disable.py"] - code = manager_funcs.run_script(disable_script, cwd=dir_path) - if code != 0: - print(f"An error occurred during the execution of the disable.py script. Only the '{dir_path}' will be deleted.") + if code != 0: + print(f"An error occurred during the execution of the uninstall.py script. Only the '{dir_path}' will be deleted.") + elif os.path.exists(disable_script_path): + disable_script = [sys.executable, "disable.py"] + code = manager_funcs.run_script(disable_script, cwd=dir_path) + if code != 0: + print(f"An error occurred during the execution of the disable.py script. Only the '{dir_path}' will be deleted.") - rmtree(dir_path) + if os.path.exists(dir_path): + rmtree(dir_path) + elif os.path.exists(dir_path + ".disabled"): + rmtree(dir_path + ".disabled") except Exception as e: print(f"Uninstall(git-clone) error: {url} / {e}", file=sys.stderr) return False @@ -849,31 +2127,48 @@ def gitclone_set_active(files, is_disable): if url.endswith("/"): url = url[:-1] try: - dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") - repo_path = lookup_installed_custom_nodes(dir_name) + for custom_nodes_dir in get_custom_nodes_paths(): + dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_dir, dir_name) - if repo_path is None: - continue + # safety check + if dir_path == '/' or dir_path[1:] == ":/" or dir_path == '': + print(f"{action_name}(git-clone) error: invalid path '{dir_path}' for '{url}'") + return False - dir_path = repo_path[1] - - if is_disable: - current_path = dir_path - new_path = dir_path + ".disabled" - else: - current_path = dir_path + ".disabled" - new_path = dir_path + if is_disable: + current_path = dir_path + base_path = extract_base_custom_nodes_dir(current_path) + new_path = os.path.join(base_path, ".disabled", dir_name) - os.rename(current_path, new_path) + if not os.path.exists(current_path): + continue + else: + current_path1 = os.path.join(get_default_custom_nodes_path(), ".disabled", dir_name) + current_path2 = dir_path + ".disabled" - if is_disable: - if os.path.exists(os.path.join(new_path, "disable.py")): - disable_script = [sys.executable, "disable.py"] - try_install_script(url, new_path, disable_script) - else: - if os.path.exists(os.path.join(new_path, "enable.py")): - enable_script = [sys.executable, "enable.py"] - try_install_script(url, new_path, enable_script) + if os.path.exists(current_path1): + current_path = current_path1 + elif os.path.exists(current_path2): + current_path = current_path2 + else: + continue + + base_path = extract_base_custom_nodes_dir(current_path) + new_path = os.path.join(base_path, dir_name) + + shutil.move(current_path, new_path) + + if is_disable: + if os.path.exists(os.path.join(new_path, "disable.py")): + disable_script = [sys.executable, "disable.py"] + try_install_script(url, new_path, disable_script) + else: + if os.path.exists(os.path.join(new_path, "enable.py")): + enable_script = [sys.executable, "enable.py"] + try_install_script(url, new_path, enable_script) + + break # for safety except Exception as e: print(f"{action_name}(git-clone) error: {url} / {e}", file=sys.stderr) @@ -883,7 +2178,7 @@ def gitclone_set_active(files, is_disable): return True -def gitclone_update(files, instant_execution=False, skip_script=False, msg_prefix=""): +def gitclone_update(files, instant_execution=False, skip_script=False, msg_prefix="", no_deps=False): import os print(f"{msg_prefix}Update: {files}") @@ -891,23 +2186,30 @@ def gitclone_update(files, instant_execution=False, skip_script=False, msg_prefi if url.endswith("/"): url = url[:-1] try: - repo_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") - repo_path = lookup_installed_custom_nodes(repo_name) + for custom_nodes_dir in get_default_custom_nodes_path(): + repo_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + repo_path = os.path.join(custom_nodes_dir, repo_name) - if repo_path is None: - continue + if os.path.exists(repo_path+'.disabled'): + repo_path = repo_path+'.disabled' - repo_path = repo_path[1] - - git_pull(repo_path) + elif os.path.exists(os.path.join(get_default_custom_nodes_path(), "disabled", repo_name)): + repo_path = os.path.join(get_default_custom_nodes_path(), "disabled", repo_name) - if not skip_script: - if instant_execution: - if not execute_install_script(url, repo_path, lazy_mode=False, instant_execution=True): - return False - else: - if not execute_install_script(url, repo_path, lazy_mode=True): - return False + if not os.path.exists(repo_path): + continue + + git_pull(repo_path) + + if not skip_script: + if instant_execution: + if not execute_install_script(url, repo_path, lazy_mode=False, instant_execution=True, no_deps=no_deps): + return False + else: + if not execute_install_script(url, repo_path, lazy_mode=True, no_deps=no_deps): + return False + + break # for safety except Exception as e: print(f"Update(git-clone) error: {url} / {e}", file=sys.stderr) @@ -918,7 +2220,7 @@ def gitclone_update(files, instant_execution=False, skip_script=False, msg_prefi return True -def update_path(repo_path, instant_execution=False): +def update_path(repo_path, instant_execution=False, no_deps=False): if not os.path.exists(os.path.join(repo_path, '.git')): return "fail" @@ -942,7 +2244,7 @@ def update_path(repo_path, instant_execution=False): remote.fetch() except Exception as e: if 'detected dubious' in str(e): - print(f"[ComfyUI-Manager] Try fixing 'dubious repository' error on 'ComfyUI' repository") + print("[ComfyUI-Manager] Try fixing 'dubious repository' error on 'ComfyUI' repository") safedir_path = comfy_path.replace('\\', '/') subprocess.run(['git', 'config', '--global', '--add', 'safe.directory', safedir_path]) try: @@ -958,7 +2260,7 @@ def update_path(repo_path, instant_execution=False): if commit_hash != remote_commit_hash: git_pull(repo_path) - execute_install_script("ComfyUI", repo_path, instant_execution=instant_execution) + execute_install_script("ComfyUI", repo_path, instant_execution=instant_execution, no_deps=no_deps) return "updated" else: return "skipped" @@ -967,98 +2269,65 @@ def update_path(repo_path, instant_execution=False): def lookup_customnode_by_url(data, target): for x in data['custom_nodes']: if target in x['files']: - dir_name = os.path.splitext(os.path.basename(target))[0].replace(".git", "") - repo_path = lookup_installed_custom_nodes(dir_name) + for custom_nodes_dir in get_custom_nodes_paths(): + dir_name = os.path.splitext(os.path.basename(target))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_dir, dir_name) + if os.path.exists(dir_path): + x['installed'] = 'True' + else: + disabled_path1 = os.path.join(custom_nodes_dir, '.disabled', dir_name) + disabled_path2 = dir_path + ".disabled" - if repo_path is None: - continue + if os.path.exists(disabled_path1) or os.path.exists(disabled_path2): + x['installed'] = 'Disabled' + else: + continue - if repo_path[0]: - x['installed'] = 'True' - else: - x['installed'] = 'Disabled' - return x + return x + + return None + + +def lookup_installed_custom_nodes_legacy(repo_name): + base_paths = get_custom_nodes_paths() + + for base_path in base_paths: + repo_path = os.path.join(base_path, repo_name) + if os.path.exists(repo_path): + return True, repo_path + elif os.path.exists(repo_path + '.disabled'): + return False, repo_path return None def simple_check_custom_node(url): dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") - repo_path = lookup_installed_custom_nodes(dir_name) - - if repo_path is None: - return 'not-installed' - - if repo_path[0]: + dir_path = os.path.join(get_default_custom_nodes_path(), dir_name) + if os.path.exists(dir_path): return 'installed' - else: + elif os.path.exists(dir_path+'.disabled'): return 'disabled' + return 'not-installed' -def check_a_custom_node_installed(item, do_fetch=False, do_update_check=True, do_update=False): - item['installed'] = 'None' - if item['install_type'] == 'git-clone' and len(item['files']) == 1: - url = item['files'][0] +def check_state_of_git_node_pack_single(item, do_fetch=False, do_update_check=True, do_update=False): + if item['version'] == 'unknown': + dir_path = unified_manager.unknown_active_nodes.get(item['id'])[1] + elif item['version'] == 'nightly': + dir_path = unified_manager.active_nodes.get(item['id'])[1] + else: + # skip CNR nodes + dir_path = None - if url.endswith("/"): - url = url[:-1] - - dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") - repo_path = lookup_installed_custom_nodes(dir_name) - - if repo_path is None: - item['installed'] = 'False' - elif repo_path[0]: - dir_path = repo_path[1] - try: - item['installed'] = 'True' # default - - if cm_global.try_call(api="cm.is_import_failed_extension", name=dir_name): - item['installed'] = 'Fail' - - if do_update_check: - update_state, success = git_repo_has_updates(dir_path, do_fetch, do_update) - if (do_update_check or do_update) and update_state: - item['installed'] = 'Update' - elif do_update and not success: - item['installed'] = 'Fail' - except: - if cm_global.try_call(api="cm.is_import_failed_extension", name=dir_name): - item['installed'] = 'Fail' - else: - item['installed'] = 'True' - - else: - item['installed'] = 'Disabled' - - elif item['install_type'] == 'copy' and len(item['files']) == 1: - dir_name = os.path.basename(item['files'][0]) - - if item['files'][0].endswith('.py'): - base_path = lookup_installed_custom_nodes(item['files'][0]) - if base_path is None: - item['installed'] = 'False' - return - elif base_path[0]: - item['installed'] = 'True' - else: - item['installed'] = 'Disabled' - - return - elif 'js_path' in item: - base_path = os.path.join(js_path, item['js_path']) - else: - base_path = js_path - - file_path = os.path.join(base_path, dir_name) - if os.path.exists(file_path): - if cm_global.try_call(api="cm.is_import_failed_extension", name=dir_name): - item['installed'] = 'Fail' - else: - item['installed'] = 'True' - else: - item['installed'] = 'False' + if dir_path and os.path.exists(dir_path): + if do_update_check: + update_state, success = git_repo_update_check_with(dir_path, do_fetch, do_update) + if (do_update_check or do_update) and update_state: + item['update-state'] = 'true' + elif do_update and not success: + item['update-state'] = 'fail' def get_installed_pip_packages(): @@ -1079,48 +2348,58 @@ def get_installed_pip_packages(): return res -def get_current_snapshot(): +async def get_current_snapshot(): + await unified_manager.reload('cache') + await unified_manager.get_custom_nodes('default', 'cache') + # Get ComfyUI hash repo_path = comfy_path if not os.path.exists(os.path.join(repo_path, '.git')): - print(f"ComfyUI update fail: The installed ComfyUI does not have a Git repository.") + print("ComfyUI update fail: The installed ComfyUI does not have a Git repository.") return {} repo = git.Repo(repo_path) comfyui_commit_hash = repo.head.commit.hexsha git_custom_nodes = {} + cnr_custom_nodes = {} file_custom_nodes = [] - try: - import folder_paths - base_paths = folder_paths.get_folder_paths("custom_nodes") - except: - base_paths = [custom_nodes_path] - # Get custom nodes hash - for base_path in base_paths: - for path in os.listdir(base_path): - fullpath = os.path.join(base_path, path) + for custom_nodes_dir in get_custom_nodes_paths(): + paths = os.listdir(custom_nodes_dir) + + disabled_path = os.path.join(custom_nodes_dir, '.disabled') + if os.path.exists(disabled_path): + for x in os.listdir(disabled_path): + paths.append(os.path.join(disabled_path, x)) + + for path in paths: + if path in ['.disabled', '__pycache__']: + continue + + fullpath = os.path.join(custom_nodes_dir, path) if os.path.isdir(fullpath): - is_disabled = path.endswith(".disabled") + is_disabled = path.endswith(".disabled") or os.path.basename(os.path.dirname(fullpath)) == ".disabled" try: - git_dir = os.path.join(fullpath, '.git') + info = unified_manager.resolve_from_path(fullpath) - if not os.path.exists(git_dir): + if info is None: continue - repo = git.Repo(fullpath) - commit_hash = repo.head.commit.hexsha - url = repo.remotes.origin.url - git_custom_nodes[url] = { - 'hash': commit_hash, - 'disabled': is_disabled - } + if info['ver'] not in ['nightly', 'latest', 'unknown']: + if is_disabled: + continue # don't restore disabled state of CNR node. + cnr_custom_nodes[info['id']] = info['ver'] + else: + repo = git.Repo(fullpath) + commit_hash = repo.head.commit.hexsha + url = repo.remotes.origin.url + git_custom_nodes[url] = dict(hash=commit_hash, disabled=is_disabled) except: print(f"Failed to extract snapshots for the custom node '{path}'.") @@ -1139,24 +2418,25 @@ def get_current_snapshot(): return { 'comfyui': comfyui_commit_hash, 'git_custom_nodes': git_custom_nodes, + 'cnr_custom_nodes': cnr_custom_nodes, 'file_custom_nodes': file_custom_nodes, 'pips': pip_packages, } -def save_snapshot_with_postfix(postfix, path=None): +async def save_snapshot_with_postfix(postfix, path=None): if path is None: now = datetime.now() date_time_format = now.strftime("%Y-%m-%d_%H-%M-%S") file_name = f"{date_time_format}_{postfix}" - path = os.path.join(comfyui_manager_path, 'snapshots', f"{file_name}.json") + path = os.path.join(manager_snapshot_path, f"{file_name}.json") else: file_name = path.replace('\\', '/').split('/')[-1] file_name = file_name.split('.')[-2] - snapshot = get_current_snapshot() + snapshot = await get_current_snapshot() if path.endswith('.json'): with open(path, "w") as json_file: json.dump(snapshot, json_file, indent=4) @@ -1311,3 +2591,518 @@ def unzip(model_path): return True +def map_to_unified_keys(json_obj): + res = {} + for k, v in json_obj.items(): + cnr = unified_manager.get_cnr_by_repo(k) + if cnr: + res[cnr['id']] = v + else: + res[k] = v + + return res + + +async def get_unified_total_nodes(channel, mode): + await unified_manager.reload(mode) + + res = await unified_manager.get_custom_nodes(channel, mode) + + # collect pure cnr ids (i.e. not exists in custom-node-list.json) + # populate state/updatable field to non-pure cnr nodes + cnr_ids = set(unified_manager.cnr_map.keys()) + for k, v in res.items(): + # resolve cnr_id from repo url + files_in_json = v.get('files', []) + cnr_id = None + if len(files_in_json) == 1: + cnr = unified_manager.get_cnr_by_repo(files_in_json[0]) + if cnr: + cnr_id = cnr['id'] + + if cnr_id is not None: + # cnr or nightly version + cnr_ids.remove(cnr_id) + updatable = False + cnr = unified_manager.cnr_map[cnr_id] + + if cnr_id in invalid_nodes: + v['invalid-installation'] = True + + if cnr_id in unified_manager.active_nodes: + # installed + v['state'] = 'enabled' + if unified_manager.active_nodes[cnr_id][0] != 'nightly': + updatable = unified_manager.is_updatable(cnr_id) + else: + updatable = False + v['active_version'] = unified_manager.active_nodes[cnr_id][0] + v['version'] = v['active_version'] + + if cm_global.try_call(api="cm.is_import_failed_extension", name=unified_manager.active_nodes[cnr_id][1]): + v['import-fail'] = True + + elif cnr_id in unified_manager.cnr_inactive_nodes: + # disabled + v['state'] = 'disabled' + cnr_ver = unified_manager.get_from_cnr_inactive_nodes(cnr_id) + if cnr_ver is not None: + v['version'] = str(cnr_ver[0]) + else: + v['version'] = '0' + + elif cnr_id in unified_manager.nightly_inactive_nodes: + # disabled + v['state'] = 'disabled' + v['version'] = 'nightly' + else: + # not installed + v['state'] = 'not-installed' + + if 'version' not in v: + v['version'] = cnr['latest_version']['version'] + + v['update-state'] = 'true' if updatable else 'false' + else: + # unknown version + v['version'] = 'unknown' + + if unified_manager.is_enabled(k, 'unknown'): + v['state'] = 'enabled' + v['active_version'] = 'unknown' + + if cm_global.try_call(api="cm.is_import_failed_extension", name=unified_manager.unknown_active_nodes[k][1]): + v['import-fail'] = True + + elif unified_manager.is_disabled(k, 'unknown'): + v['state'] = 'disabled' + else: + v['state'] = 'not-installed' + + # add items for pure cnr nodes + if normalize_channel(channel) == DEFAULT_CHANNEL: + # Don't show CNR nodes unless default channel + for cnr_id in cnr_ids: + cnr = unified_manager.cnr_map[cnr_id] + author = cnr['publisher']['name'] + title = cnr['name'] + reference = f"https://registry.comfy.org/nodes/{cnr['id']}" + install_type = "cnr" + description = cnr.get('description', '') + + ver = None + active_version = None + updatable = False + import_fail = None + if cnr_id in unified_manager.active_nodes: + # installed + state = 'enabled' + updatable = unified_manager.is_updatable(cnr_id) + active_version = unified_manager.active_nodes[cnr['id']][0] + ver = active_version + + if cm_global.try_call(api="cm.is_import_failed_extension", name=unified_manager.active_nodes[cnr_id][1]): + import_fail = True + + elif cnr['id'] in unified_manager.cnr_inactive_nodes: + # disabled + state = 'disabled' + elif cnr['id'] in unified_manager.nightly_inactive_nodes: + # disabled + state = 'disabled' + ver = 'nightly' + else: + # not installed + state = 'not-installed' + + if ver is None: + ver = cnr['latest_version']['version'] + + item = dict(author=author, title=title, reference=reference, install_type=install_type, + description=description, state=state, updatable=updatable, version=ver) + + if active_version: + item['active_version'] = active_version + + if import_fail: + item['import-fail'] = True + + res[cnr_id] = item + + return res + + +def populate_github_stats(node_packs, json_obj_github): + for k, v in node_packs.items(): + url = v['reference'] + if url in json_obj_github: + v['stars'] = json_obj_github[url]['stars'] + v['last_update'] = json_obj_github[url]['last_update'] + v['trust'] = json_obj_github[url]['author_account_age_days'] > 600 + else: + v['stars'] = -1 + v['last_update'] = -1 + v['trust'] = False + + +def populate_favorites(node_packs, json_obj_extras): + favorites = set(json_obj_extras['favorites']) + + for k, v in node_packs.items(): + if v.get('version') != 'unknown': + if k in favorites: + v['is_favorite'] = True + + +async def restore_snapshot(snapshot_path, git_helper_extras=None): + cloned_repos = [] + checkout_repos = [] + enabled_repos = [] + disabled_repos = [] + skip_node_packs = [] + + await unified_manager.reload('cache') + await unified_manager.get_custom_nodes('default', 'cache') + + cnr_repo_map = {} + for k, v in unified_manager.repo_cnr_map.items(): + cnr_repo_map[v['id']] = k + + print("Restore snapshot.") + + postinstalls = [] + + with open(snapshot_path, 'r', encoding="UTF-8") as snapshot_file: + if snapshot_path.endswith('.json'): + info = json.load(snapshot_file) + elif snapshot_path.endswith('.yaml'): + info = yaml.load(snapshot_file, Loader=yaml.SafeLoader) + info = info['custom_nodes'] + + # for cnr restore + cnr_info = info.get('cnr_custom_nodes') + if cnr_info is not None: + # disable not listed cnr nodes + todo_disable = [] + todo_checkout = [] + + for k, v in unified_manager.active_nodes.items(): + if 'comfyui-manager' in k: + continue + + if v[0] != 'nightly': + if k not in cnr_info: + todo_disable.append(k) + else: + cnr_ver = cnr_info[k] + if v[1] != cnr_ver: + todo_checkout.append((k, cnr_ver)) + else: + skip_node_packs.append(k) + + for x in todo_disable: + unified_manager.unified_disable(x, False) + disabled_repos.append(x) + + for x in todo_checkout: + unified_manager.cnr_switch_version(x[0], x[1], instant_execution=True, no_deps=True, return_postinstall=False) + checkout_repos.append(x[1]) + + # install listed cnr nodes + for k, v in cnr_info.items(): + if 'comfyui-manager' in k: + continue + + ps = await unified_manager.install_by_id(k, version_spec=v, instant_execution=True, return_postinstall=True) + cloned_repos.append(k) + if ps is not None and ps.result: + if hasattr(ps, 'postinstall'): + postinstalls.append(ps.postinstall) + else: + print("cm-cli: unexpected [0001]") + + # for nightly restore + git_info = info.get('git_custom_nodes') + if git_info is not None: + todo_disable = [] + todo_enable = [] + todo_checkout = [] + processed_urls = [] + + for k, v in unified_manager.active_nodes.items(): + if 'comfyui-manager' in k: + continue + + if v[0] == 'nightly' and cnr_repo_map.get(k): + repo_url = cnr_repo_map.get(k) + + normalized_url1 = git_utils.normalize_url(repo_url) + normalized_url2 = git_utils.normalize_url_http(repo_url) + + if normalized_url1 not in git_info and normalized_url2 not in git_info: + todo_disable.append(k) + else: + if normalized_url1 in git_info: + commit_hash = git_info[normalized_url1]['hash'] + todo_checkout.append((v[1], commit_hash)) + + if normalized_url2 in git_info: + commit_hash = git_info[normalized_url2]['hash'] + todo_checkout.append((v[1], commit_hash)) + + for k, v in unified_manager.nightly_inactive_nodes.items(): + if 'comfyui-manager' in k: + continue + + if cnr_repo_map.get(k): + repo_url = cnr_repo_map.get(k) + normalized_url1 = git_utils.normalize_url(repo_url) + normalized_url2 = git_utils.normalize_url_http(repo_url) + + if normalized_url1 in git_info: + commit_hash = git_info[normalized_url1]['hash'] + todo_enable.append((k, commit_hash)) + processed_urls.append(normalized_url1) + + if normalized_url2 in git_info: + commit_hash = git_info[normalized_url2]['hash'] + todo_enable.append((k, commit_hash)) + processed_urls.append(normalized_url2) + + for x in todo_disable: + unified_manager.unified_disable(x, False) + disabled_repos.append(x) + + for x in todo_enable: + res = unified_manager.unified_enable(x, 'nightly') + + is_switched = False + if res and res.target: + is_switched = repo_switch_commit(res.target, x[1]) + + if is_switched: + checkout_repos.append(x) + else: + enabled_repos.append(x) + + for x in todo_checkout: + is_switched = repo_switch_commit(x[0], x[1]) + + if is_switched: + checkout_repos.append(x) + else: + skip_node_packs.append(x[0]) + + for x in git_info.keys(): + normalized_url = git_utils.normalize_url(x) + cnr = unified_manager.repo_cnr_map.get(normalized_url) + if cnr is not None: + pack_id = cnr['id'] + await unified_manager.install_by_id(pack_id, 'nightly', instant_execution=True, no_deps=False, return_postinstall=False) + cloned_repos.append(pack_id) + processed_urls.append(x) + + for x in processed_urls: + if x in git_info: + del git_info[x] + + # remained nightly will be installed and migrated + + # for unknown restore + todo_disable = [] + todo_enable = [] + todo_checkout = [] + processed_urls = [] + + for k2, v2 in unified_manager.unknown_active_nodes.items(): + repo_url = resolve_giturl_from_path(v2[1]) + + if repo_url is None: + continue + + normalized_url1 = git_utils.normalize_url(repo_url) + normalized_url2 = git_utils.normalize_url_http(repo_url) + + if normalized_url1 not in git_info and normalized_url2 not in git_info: + todo_disable.append(k2) + else: + if normalized_url1 in git_info: + commit_hash = git_info[normalized_url1]['hash'] + todo_checkout.append((k2, commit_hash)) + processed_urls.append(normalized_url1) + + if normalized_url2 in git_info: + commit_hash = git_info[normalized_url2]['hash'] + todo_checkout.append((k2, commit_hash)) + processed_urls.append(normalized_url2) + + for k2, v2 in unified_manager.unknown_inactive_nodes.items(): + repo_url = resolve_giturl_from_path(v2[1]) + + if repo_url is None: + continue + + normalized_url1 = git_utils.normalize_url(repo_url) + normalized_url2 = git_utils.normalize_url_http(repo_url) + + if normalized_url1 in git_info: + commit_hash = git_info[normalized_url1]['hash'] + todo_enable.append((k2, commit_hash)) + processed_urls.append(normalized_url1) + + if normalized_url2 in git_info: + commit_hash = git_info[normalized_url2]['hash'] + todo_enable.append((k2, commit_hash)) + processed_urls.append(normalized_url2) + + for x in todo_disable: + unified_manager.unified_disable(x, True) + disabled_repos.append(x) + + for x in todo_enable: + res = unified_manager.unified_enable(x[0], 'unknown') + + is_switched = False + if res and res.target: + is_switched = repo_switch_commit(res.target, x[1]) + + if is_switched: + checkout_repos.append(x) + else: + enabled_repos.append(x) + + for x in todo_checkout: + is_switched = repo_switch_commit(x[0], x[1]) + + if is_switched: + checkout_repos.append(x) + else: + skip_node_packs.append(x[0]) + + for x in processed_urls: + if x in git_info: + del git_info[x] + + for repo_url in git_info.keys(): + repo_name = os.path.basename(repo_url) + if repo_name.endswith('.git'): + repo_name = repo_name[:-4] + + to_path = os.path.join(get_default_custom_nodes_path(), repo_name) + unified_manager.repo_install(repo_url, to_path, instant_execution=True, no_deps=False, return_postinstall=False) + cloned_repos.append(repo_name) + + # reload + await unified_manager.migrate_unmanaged_nodes() + + # print summary + for x in cloned_repos: + print(f"[ INSTALLED ] {x}") + for x in checkout_repos: + print(f"[ CHECKOUT ] {x}") + for x in enabled_repos: + print(f"[ ENABLED ] {x}") + for x in disabled_repos: + print(f"[ DISABLED ] {x}") + for x in skip_node_packs: + print(f"[ SKIPPED ] {x}") + + # if is_failed: + # print("[bold red]ERROR: Failed to restore snapshot.[/bold red]") + + +# check need to migrate +need_to_migrate = False + + +async def check_need_to_migrate(): + global need_to_migrate + + await unified_manager.reload('cache') + await unified_manager.load_nightly(channel='default', mode='cache') + + legacy_custom_nodes = [] + + for x in unified_manager.active_nodes.values(): + if x[0] == 'nightly' and not x[1].endswith('@nightly'): + legacy_custom_nodes.append(x[1]) + + for x in unified_manager.nightly_inactive_nodes.values(): + if not x.endswith('@nightly'): + legacy_custom_nodes.append(x) + + if len(legacy_custom_nodes) > 0: + print("\n--------------------- ComfyUI-Manager migration notice --------------------") + print("The following custom nodes were installed using the old management method and require migration:\n") + print("\n".join(legacy_custom_nodes)) + print("---------------------------------------------------------------------------\n") + need_to_migrate = True + + +def get_comfyui_versions(): + repo = git.Repo(comfy_path) + versions = [x.name for x in repo.tags if x.name.startswith('v')] + versions.reverse() # nearest tag + + versions = versions[:4] + + current_tag = repo.git.describe('--tags') + + if current_tag not in versions: + versions = sorted(versions + [current_tag], reverse=True) + versions = versions[:4] + + main_branch = repo.heads.master + latest_commit = main_branch.commit + latest_tag = repo.git.describe('--tags', latest_commit.hexsha) + + if latest_tag != versions[0]: + versions.insert(0, 'nightly') + else: + versions[0] = 'nightly' + current_tag = 'nightly' + + return versions, current_tag + + +def switch_comfyui(tag): + repo = git.Repo(comfy_path) + + if tag == 'nightly': + repo.git.checkout('main') + repo.remotes.origin.pull() + print("[ComfyUI-Manager] ComfyUI version is switched to the latest 'main' version") + else: + repo.git.checkout(tag) + print(f"[ComfyUI-Manager] ComfyUI version is switched to '{tag}'") + + +def resolve_giturl_from_path(fullpath): + """ + resolve giturl path of unclassified custom node based on remote url in .git/config + """ + git_config_path = os.path.join(fullpath, '.git', 'config') + + if not os.path.exists(git_config_path): + return "unknown" + + config = configparser.ConfigParser() + config.read(git_config_path) + + for k, v in config.items(): + if k.startswith('remote ') and 'url' in v: + return v['url'].replace("git@github.com:", "https://github.com/") + + return None + + +def repo_switch_commit(repo_path, commit_hash): + try: + repo = git.Repo(repo_path) + if repo.head.commit.hexsha == commit_hash: + return False + + repo.git.checkout(commit_hash) + return True + except: + return None diff --git a/glob/manager_downloader.py b/glob/manager_downloader.py index 8a8c73c0..715bf65f 100644 --- a/glob/manager_downloader.py +++ b/glob/manager_downloader.py @@ -1,5 +1,7 @@ import os from urllib.parse import urlparse +import urllib +import sys aria2 = os.getenv('COMFYUI_MANAGER_ARIA2_SERVER') HF_ENDPOINT = os.getenv('HF_ENDPOINT') @@ -14,12 +16,34 @@ if aria2 is not None: aria2 = aria2p.API(aria2p.Client(host=host, port=port, secret=secret)) +def basic_download_url(url, dest_folder, filename): + import requests + + # Ensure the destination folder exists + if not os.path.exists(dest_folder): + os.makedirs(dest_folder) + + # Full path to save the file + dest_path = os.path.join(dest_folder, filename) + + # Download the file + response = requests.get(url, stream=True) + if response.status_code == 200: + with open(dest_path, 'wb') as file: + for chunk in response.iter_content(chunk_size=1024): + if chunk: + file.write(chunk) + else: + raise Exception(f"Failed to download file from {url}") + + def download_url(model_url: str, model_dir: str, filename: str): + if HF_ENDPOINT: + model_url = model_url.replace('https://huggingface.co', HF_ENDPOINT) if aria2: return aria2_download_url(model_url, model_dir, filename) else: from torchvision.datasets.utils import download_url as torchvision_download_url - return torchvision_download_url(model_url, model_dir, filename) @@ -44,9 +68,6 @@ def aria2_download_url(model_url: str, model_dir: str, filename: str): if model_dir.startswith(core.comfy_path): model_dir = model_dir[len(core.comfy_path) :] - if HF_ENDPOINT: - model_url = model_url.replace('https://huggingface.co', HF_ENDPOINT) - download_dir = model_dir if model_dir.startswith('/') else os.path.join('/models', model_dir) download = aria2_find_task(download_dir, filename) @@ -68,3 +89,26 @@ def aria2_download_url(model_url: str, model_dir: str, filename: str): progress_bar.update(download.completed_length - progress_bar.n) time.sleep(1) download.update() + + +def download_url_with_agent(url, save_path): + try: + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} + + req = urllib.request.Request(url, headers=headers) + response = urllib.request.urlopen(req) + data = response.read() + + if not os.path.exists(os.path.dirname(save_path)): + os.makedirs(os.path.dirname(save_path)) + + with open(save_path, 'wb') as f: + f.write(data) + + except Exception as e: + print(f"Download error: {url} / {e}", file=sys.stderr) + return False + + print("Installation was successful.") + return True \ No newline at end of file diff --git a/glob/manager_server.py b/glob/manager_server.py index 2449c04a..94ec3dab 100644 --- a/glob/manager_server.py +++ b/glob/manager_server.py @@ -11,18 +11,26 @@ import threading import re import shutil import git +from datetime import datetime from server import PromptServer import manager_core as core +import manager_util import cm_global +import logging -print(f"### Loading: ComfyUI-Manager ({core.version_str})") + +logging.info(f"### Loading: ComfyUI-Manager ({core.version_str})") comfy_ui_hash = "-" +comfyui_tag = None + +SECURITY_MESSAGE_MIDDLE_OR_BELOW = "ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy" +SECURITY_MESSAGE_NORMAL_MINUS = "ERROR: To use this feature, you must either set '--listen' to a local IP and set the security level to 'normal-' or lower, or set the security level to 'middle' or 'weak'. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy" +SECURITY_MESSAGE_GENERAL = "ERROR: This installation is not allowed in this security_level. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy" + +routes = PromptServer.instance.routes -SECURITY_MESSAGE_MIDDLE_OR_BELOW = f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy" -SECURITY_MESSAGE_NORMAL_MINUS = f"ERROR: To use this feature, you must either set '--listen' to a local IP and set the security level to 'normal-' or lower, or set the security level to 'middle' or 'weak'. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy" -SECURITY_MESSAGE_GENERAL = f"ERROR: This installation is not allowed in this security_level. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy" def handle_stream(stream, prefix): stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace') @@ -97,10 +105,10 @@ class ManagerFuncsInComfyUI(core.ManagerFuncs): def run_script(self, cmd, cwd='.'): if len(cmd) > 0 and cmd[0].startswith("#"): - print(f"[ComfyUI-Manager] Unexpected behavior: `{cmd}`") + logging.error(f"[ComfyUI-Manager] Unexpected behavior: `{cmd}`") return 0 - process = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1) + process = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1, env=core.get_script_env()) stdout_thread = threading.Thread(target=handle_stream, args=(process.stdout, "")) stderr_thread = threading.Thread(target=handle_stream, args=(process.stderr, "[!]")) @@ -118,16 +126,15 @@ core.manager_funcs = ManagerFuncsInComfyUI() sys.path.append('../..') -from manager_downloader import download_url +from manager_downloader import download_url, download_url_with_agent core.comfy_path = os.path.dirname(folder_paths.__file__) core.js_path = os.path.join(core.comfy_path, "web", "extensions") -local_db_model = os.path.join(core.comfyui_manager_path, "model-list.json") -local_db_alter = os.path.join(core.comfyui_manager_path, "alter-list.json") -local_db_custom_node_list = os.path.join(core.comfyui_manager_path, "custom-node-list.json") -local_db_extension_node_mappings = os.path.join(core.comfyui_manager_path, "extension-node-map.json") -components_path = os.path.join(core.comfyui_manager_path, 'components') +local_db_model = os.path.join(manager_util.comfyui_manager_path, "model-list.json") +local_db_alter = os.path.join(manager_util.comfyui_manager_path, "alter-list.json") +local_db_custom_node_list = os.path.join(manager_util.comfyui_manager_path, "custom-node-list.json") +local_db_extension_node_mappings = os.path.join(manager_util.comfyui_manager_path, "extension-node-map.json") def set_preview_method(method): @@ -146,10 +153,6 @@ def set_preview_method(method): set_preview_method(core.get_config()['preview_method']) -def set_badge_mode(mode): - core.get_config()['badge_mode'] = mode - - def set_default_ui_mode(mode): core.get_config()['default_ui'] = mode @@ -164,6 +167,7 @@ def set_double_click_policy(mode): def print_comfyui_version(): global comfy_ui_hash + global comfyui_tag is_detached = False try: @@ -179,9 +183,11 @@ def print_comfyui_version(): is_detached = repo.head.is_detached current_branch = repo.active_branch.name + comfyui_tag = core.get_comfyui_tag() + try: if core.comfy_ui_commit_datetime.date() < core.comfy_ui_required_commit_datetime.date(): - print(f"\n\n## [WARN] ComfyUI-Manager: Your ComfyUI version ({core.get_comfyui_tag()})[{core.comfy_ui_commit_datetime.date()}] is too old. Please update to the latest version. ##\n\n") + logging.warning(f"\n\n## [WARN] ComfyUI-Manager: Your ComfyUI version ({core.comfy_ui_revision})[{core.comfy_ui_commit_datetime.date()}] is too old. Please update to the latest version. ##\n\n") except: pass @@ -191,46 +197,35 @@ def print_comfyui_version(): try: f(core.comfy_ui_revision) except Exception: - print(f"[ERROR] '{k}' on_revision_detected_handler") + logging.error(f"[ERROR] '{k}' on_revision_detected_handler") traceback.print_exc() del cm_global.variables['cm.on_revision_detected_handler'] else: - print(f"[ComfyUI-Manager] Some features are restricted due to your ComfyUI being outdated.") + logging.warning("[ComfyUI-Manager] Some features are restricted due to your ComfyUI being outdated.") # <-- if current_branch == "master": - version_tag = core.get_comfyui_tag() - if version_tag is None: - print(f"### ComfyUI Revision: {core.comfy_ui_revision} [{comfy_ui_hash[:8]}] | Released on '{core.comfy_ui_commit_datetime.date()}'") + if comfyui_tag: + logging.info(f"### ComfyUI Version: {comfyui_tag} | Released on '{core.comfy_ui_commit_datetime.date()}'") else: - print(f"### ComfyUI Version: {core.get_comfyui_tag()} | Released on '{core.comfy_ui_commit_datetime.date()}'") + logging.info(f"### ComfyUI Revision: {core.comfy_ui_revision} [{comfy_ui_hash[:8]}] | Released on '{core.comfy_ui_commit_datetime.date()}'") else: - print(f"### ComfyUI Revision: {core.comfy_ui_revision} on '{current_branch}' [{comfy_ui_hash[:8]}] | Released on '{core.comfy_ui_commit_datetime.date()}'") + if comfyui_tag: + logging.info(f"### ComfyUI Version: {comfyui_tag} on '{current_branch}' | Released on '{core.comfy_ui_commit_datetime.date()}'") + else: + logging.info(f"### ComfyUI Revision: {core.comfy_ui_revision} on '{current_branch}' [{comfy_ui_hash[:8]}] | Released on '{core.comfy_ui_commit_datetime.date()}'") except: if is_detached: - print(f"### ComfyUI Revision: {core.comfy_ui_revision} [{comfy_ui_hash[:8]}] *DETACHED | Released on '{core.comfy_ui_commit_datetime.date()}'") + logging.info(f"### ComfyUI Revision: {core.comfy_ui_revision} [{comfy_ui_hash[:8]}] *DETACHED | Released on '{core.comfy_ui_commit_datetime.date()}'") else: - print("### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)") + logging.info("### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)") print_comfyui_version() +core.check_invalid_nodes() -async def populate_github_stats(json_obj, json_obj_github): - if 'custom_nodes' in json_obj: - for i, node in enumerate(json_obj['custom_nodes']): - url = node['reference'] - if url in json_obj_github: - json_obj['custom_nodes'][i]['stars'] = json_obj_github[url]['stars'] - json_obj['custom_nodes'][i]['last_update'] = json_obj_github[url]['last_update'] - json_obj['custom_nodes'][i]['trust'] = json_obj_github[url]['author_account_age_days'] > 180 - else: - json_obj['custom_nodes'][i]['stars'] = -1 - json_obj['custom_nodes'][i]['last_update'] = -1 - json_obj['custom_nodes'][i]['trust'] = False - return json_obj - def setup_environment(): git_exe = core.get_config()['git_exe'] @@ -243,7 +238,6 @@ setup_environment() # Expand Server api -import server from aiohttp import web import aiohttp import json @@ -251,7 +245,7 @@ import zipfile import urllib.request -def get_model_dir(data): +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] else: @@ -260,7 +254,9 @@ def get_model_dir(data): def resolve_custom_node(save_path): save_path = save_path[13:] # remove 'custom_nodes/' repo_name = save_path.replace('\\','/').split('/')[0] # get custom node repo name - repo_path = core.lookup_installed_custom_nodes(repo_name) + + # NOTE: The creation of files within the custom node path should be removed in the future. + repo_path = core.lookup_installed_custom_nodes_legacy(repo_name) if repo_path is not None and repo_path[0]: # Returns the retargeted path based on the actually installed repository return os.path.join(os.path.dirname(repo_path[1]), save_path) @@ -269,13 +265,15 @@ def get_model_dir(data): if data['save_path'] != 'default': if '..' in data['save_path'] or data['save_path'].startswith('/'): - print(f"[WARN] '{data['save_path']}' is not allowed path. So it will be saved into 'models/etc'.") + if show_log: + logging.info(f"[WARN] '{data['save_path']}' is not allowed path. So it will be saved into 'models/etc'.") base_model = os.path.join(models_base, "etc") else: if data['save_path'].startswith("custom_nodes"): base_model = resolve_custom_node(data['save_path']) if base_model is None: - print(f"[ComfyUI-Manager] The target custom node for model download is not installed: {data['save_path']}") + if show_log: + logging.info(f"[ComfyUI-Manager] The target custom node for model download is not installed: {data['save_path']}") return None else: base_model = os.path.join(models_base, data['save_path']) @@ -289,7 +287,8 @@ def get_model_dir(data): if folder_paths.folder_names_and_paths.get("text_encoders"): base_model = folder_paths.folder_names_and_paths["text_encoders"][0][0] else: - print(f"[ComfyUI-Manager] Your ComfyUI is outdated version.") + if show_log: + logging.info("[ComfyUI-Manager] Your ComfyUI is outdated version.") base_model = folder_paths.folder_names_and_paths["clip"][0][0] # outdated version elif model_type == "VAE": base_model = folder_paths.folder_names_and_paths["vae"][0][0] @@ -313,7 +312,8 @@ def get_model_dir(data): if folder_paths.folder_names_and_paths.get("diffusion_models"): base_model = folder_paths.folder_names_and_paths["diffusion_models"][0][1] else: - print(f"[ComfyUI-Manager] Your ComfyUI is outdated version.") + if show_log: + logging.info("[ComfyUI-Manager] Your ComfyUI is outdated version.") base_model = folder_paths.folder_names_and_paths["unet"][0][0] # outdated version else: base_model = os.path.join(models_base, "etc") @@ -321,15 +321,15 @@ def get_model_dir(data): return base_model -def get_model_path(data): - base_model = get_model_dir(data) +def get_model_path(data, show_log=False): + base_model = get_model_dir(data, show_log) if base_model is None: return None else: return os.path.join(base_model, data['filename']) -def check_custom_nodes_installed(json_obj, do_fetch=False, do_update_check=True, do_update=False): +def check_state_of_git_node_pack(node_packs, do_fetch=False, do_update_check=True, do_update=False): if do_fetch: print("Start fetching...", end="") elif do_update: @@ -338,22 +338,23 @@ def check_custom_nodes_installed(json_obj, do_fetch=False, do_update_check=True, print("Start update check...", end="") def process_custom_node(item): - core.check_a_custom_node_installed(item, do_fetch, do_update_check, do_update) + core.check_state_of_git_node_pack_single(item, do_fetch, do_update_check, do_update) with concurrent.futures.ThreadPoolExecutor(4) as executor: - for item in json_obj['custom_nodes']: - executor.submit(process_custom_node, item) + for k, v in node_packs.items(): + if v.get('active_version') in ['unknown', 'nightly']: + executor.submit(process_custom_node, v) if do_fetch: - print(f"\x1b[2K\rFetching done.") + print("\x1b[2K\rFetching done.") elif do_update: - update_exists = any(item['installed'] == 'Update' for item in json_obj['custom_nodes']) + update_exists = any(item.get('updatable', False) for item in node_packs.values()) if update_exists: - print(f"\x1b[2K\rUpdate done.") + print("\x1b[2K\rUpdate done.") else: - print(f"\x1b[2K\rAll extensions are already up-to-date.") + print("\x1b[2K\rAll extensions are already up-to-date.") elif do_update_check: - print(f"\x1b[2K\rUpdate check done.") + print("\x1b[2K\rUpdate check done.") def nickname_filter(json_obj): @@ -384,8 +385,11 @@ def nickname_filter(json_obj): return json_obj -@PromptServer.instance.routes.get("/customnode/getmappings") +@routes.get("/customnode/getmappings") async def fetch_customnode_mappings(request): + """ + provide unified (node -> node pack) mapping list + """ mode = request.rel_url.query["mode"] nickname_mode = False @@ -394,6 +398,7 @@ async def fetch_customnode_mappings(request): nickname_mode = True json_obj = await core.get_data_by_mode(mode, 'extension-node-map.json') + json_obj = core.map_to_unified_keys(json_obj) if nickname_mode: json_obj = nickname_filter(json_obj) @@ -416,58 +421,82 @@ async def fetch_customnode_mappings(request): return web.json_response(json_obj, content_type='application/json') -@PromptServer.instance.routes.get("/customnode/fetch_updates") +@routes.get("/customnode/fetch_updates") async def fetch_updates(request): try: - json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') + if request.rel_url.query["mode"] == "local": + channel = 'local' + else: + channel = core.get_config()['channel_url'] - check_custom_nodes_installed(json_obj, True) + await core.unified_manager.reload(request.rel_url.query["mode"]) + await core.unified_manager.get_custom_nodes(channel, request.rel_url.query["mode"]) - update_exists = any('custom_nodes' in json_obj and 'installed' in node and node['installed'] == 'Update' for node in - json_obj['custom_nodes']) + res = core.unified_manager.fetch_or_pull_git_repo(is_pull=False) - if update_exists: + for x in res['failed']: + logging.error(f"FETCH FAILED: {x}") + + logging.info("\nDone.") + + if len(res['updated']) > 0: return web.Response(status=201) return web.Response(status=200) except: + traceback.print_exc() return web.Response(status=400) -@PromptServer.instance.routes.get("/customnode/update_all") +@routes.get("/customnode/update_all") async def update_all(request): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) return web.Response(status=403) try: - core.save_snapshot_with_postfix('autosave') + await core.save_snapshot_with_postfix('autosave') - json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') + if request.rel_url.query["mode"] == "local": + channel = 'local' + else: + channel = core.get_config()['channel_url'] - check_custom_nodes_installed(json_obj, do_update=True) + await core.unified_manager.reload(request.rel_url.query["mode"]) + await core.unified_manager.get_custom_nodes(channel, request.rel_url.query["mode"]) - updated = [item['title'] for item in json_obj['custom_nodes'] if item['installed'] == 'Update'] - failed = [item['title'] for item in json_obj['custom_nodes'] if item['installed'] == 'Fail'] + updated_cnr = [] + for k, v in core.unified_manager.active_nodes.items(): + if v[0] != 'nightly': + res = core.unified_manager.unified_update(k, v[0]) + if res.action == 'switch-cnr' and res: + updated_cnr.append(k) - res = {'updated': updated, 'failed': failed} + res = core.unified_manager.fetch_or_pull_git_repo(is_pull=True) - if len(updated) == 0 and len(failed) == 0: + res['updated'] += updated_cnr + + for x in res['failed']: + logging.error(f"PULL FAILED: {x}") + + if len(res['updated']) == 0 and len(res['failed']) == 0: status = 200 else: status = 201 + logging.info("\nDone.") return web.json_response(res, status=status, content_type='application/json') except: + traceback.print_exc() return web.Response(status=400) finally: - core.clear_pip_cache() + manager_util.clear_pip_cache() def convert_markdown_to_html(input_text): - pattern_a = re.compile(r'\[a/([^]]+)\]\(([^)]+)\)') - pattern_w = re.compile(r'\[w/([^]]+)\]') - pattern_i = re.compile(r'\[i/([^]]+)\]') + pattern_a = re.compile(r'\[a/([^]]+)]\(([^)]+)\)') + pattern_w = re.compile(r'\[w/([^]]+)]') + pattern_i = re.compile(r'\[i/([^]]+)]') pattern_bold = re.compile(r'\*\*([^*]+)\*\*') pattern_white = re.compile(r'%%([^*]+)%%') @@ -499,17 +528,34 @@ def convert_markdown_to_html(input_text): def populate_markdown(x): if 'description' in x: - x['description'] = convert_markdown_to_html(x['description']) + x['description'] = convert_markdown_to_html(manager_util.sanitize_tag(x['description'])) if 'name' in x: - x['name'] = x['name'].replace('<', '<').replace('>', '>') + x['name'] = manager_util.sanitize_tag(x['name']) if 'title' in x: - x['title'] = x['title'].replace('<', '<').replace('>', '>') + x['title'] = manager_util.sanitize_tag(x['title']) -@PromptServer.instance.routes.get("/customnode/getlist") +# freeze imported version +startup_time_installed_node_packs = core.get_installed_node_packs() +@routes.get("/customnode/installed") +async def installed_list(request): + mode = request.query.get('mode', 'default') + + if mode == 'imported': + res = startup_time_installed_node_packs + else: + res = core.get_installed_node_packs() + + return web.json_response(res, content_type='application/json') + + +@routes.get("/customnode/getlist") async def fetch_customnode_list(request): + """ + provide unified custom node list + """ if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true": skip_update = True else: @@ -520,26 +566,17 @@ async def fetch_customnode_list(request): else: channel = core.get_config()['channel_url'] - json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') - json_obj_github = await core.get_data_by_mode(request.rel_url.query["mode"], 'github-stats.json', 'default') - json_obj = await populate_github_stats(json_obj, json_obj_github) + node_packs = await core.get_unified_total_nodes(channel, request.rel_url.query["mode"]) + json_obj_github = core.get_data_by_mode(request.rel_url.query["mode"], 'github-stats.json', 'default') + json_obj_extras = core.get_data_by_mode(request.rel_url.query["mode"], 'extras.json', 'default') - def is_ignored_notice(code): - if code is not None and code.startswith('#NOTICE_'): - try: - notice_version = [int(x) for x in code[8:].split('.')] - return notice_version[0] < core.version[0] or (notice_version[0] == core.version[0] and notice_version[1] <= core.version[1]) - except Exception: - return False - else: - return False + core.populate_github_stats(node_packs, await json_obj_github) + core.populate_favorites(node_packs, await json_obj_extras) - json_obj['custom_nodes'] = [record for record in json_obj['custom_nodes'] if not is_ignored_notice(record.get('author'))] + check_state_of_git_node_pack(node_packs, False, do_update_check=not skip_update) - check_custom_nodes_installed(json_obj, False, not skip_update) - - for x in json_obj['custom_nodes']: - populate_markdown(x) + for v in node_packs.values(): + populate_markdown(v) if channel != 'local': found = 'custom' @@ -551,53 +588,29 @@ async def fetch_customnode_list(request): channel = found - json_obj['channel'] = channel + result = dict(channel=channel, node_packs=node_packs) - return web.json_response(json_obj, content_type='application/json') + return web.json_response(result, content_type='application/json') -@PromptServer.instance.routes.get("/customnode/alternatives") +@routes.get("/customnode/alternatives") async def fetch_customnode_alternatives(request): alter_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'alter-list.json') + res = {} + for item in alter_json['items']: populate_markdown(item) - - return web.json_response(alter_json, content_type='application/json') + res[item['id']] = item + res = core.map_to_unified_keys(res) -@PromptServer.instance.routes.get("/alternatives/getlist") -async def fetch_alternatives_list(request): - if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true": - skip_update = True - else: - skip_update = False - - alter_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'alter-list.json') - custom_node_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') - - fileurl_to_custom_node = {} - - for item in custom_node_json['custom_nodes']: - for fileurl in item['files']: - fileurl_to_custom_node[fileurl] = item - - for item in alter_json['items']: - fileurl = item['id'] - if fileurl in fileurl_to_custom_node: - custom_node = fileurl_to_custom_node[fileurl] - core.check_a_custom_node_installed(custom_node, not skip_update) - - populate_markdown(item) - populate_markdown(custom_node) - item['custom_node'] = custom_node - - return web.json_response(alter_json, content_type='application/json') + return web.json_response(res, content_type='application/json') def check_model_installed(json_obj): def process_model(item): - model_path = get_model_path(item) + model_path = get_model_path(item, False) item['installed'] = 'None' if model_path is not None: @@ -616,7 +629,7 @@ def check_model_installed(json_obj): executor.submit(process_model, item) -@PromptServer.instance.routes.get("/externalmodel/getlist") +@routes.get("/externalmodel/getlist") async def fetch_externalmodel_list(request): json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'model-list.json') @@ -630,22 +643,21 @@ async def fetch_externalmodel_list(request): @PromptServer.instance.routes.get("/snapshot/getlist") async def get_snapshot_list(request): - snapshots_directory = os.path.join(core.comfyui_manager_path, 'snapshots') - items = [f[:-5] for f in os.listdir(snapshots_directory) if f.endswith('.json')] + items = [f[:-5] for f in os.listdir(core.manager_snapshot_path) if f.endswith('.json')] items.sort(reverse=True) return web.json_response({'items': items}, content_type='application/json') -@PromptServer.instance.routes.get("/snapshot/remove") +@routes.get("/snapshot/remove") async def remove_snapshot(request): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) return web.Response(status=403) - + try: target = request.rel_url.query["target"] - path = os.path.join(core.comfyui_manager_path, 'snapshots', f"{target}.json") + path = os.path.join(core.manager_snapshot_path, f"{target}.json") if os.path.exists(path): os.remove(path) @@ -654,44 +666,44 @@ async def remove_snapshot(request): return web.Response(status=400) -@PromptServer.instance.routes.get("/snapshot/restore") -async def remove_snapshot(request): +@routes.get("/snapshot/restore") +async def restore_snapshot(request): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) return web.Response(status=403) - + try: target = request.rel_url.query["target"] - path = os.path.join(core.comfyui_manager_path, 'snapshots', f"{target}.json") + path = os.path.join(core.manager_snapshot_path, f"{target}.json") if os.path.exists(path): - if not os.path.exists(core.startup_script_path): - os.makedirs(core.startup_script_path) + if not os.path.exists(core.manager_startup_script_path): + os.makedirs(core.manager_startup_script_path) - target_path = os.path.join(core.startup_script_path, "restore-snapshot.json") + target_path = os.path.join(core.manager_startup_script_path, "restore-snapshot.json") shutil.copy(path, target_path) - print(f"Snapshot restore scheduled: `{target}`") + logging.info(f"Snapshot restore scheduled: `{target}`") return web.Response(status=200) - print(f"Snapshot file not found: `{path}`") + logging.error(f"Snapshot file not found: `{path}`") return web.Response(status=400) except: return web.Response(status=400) -@PromptServer.instance.routes.get("/snapshot/get_current") +@routes.get("/snapshot/get_current") async def get_current_snapshot_api(request): try: - return web.json_response(core.get_current_snapshot(), content_type='application/json') + return web.json_response(await core.get_current_snapshot(), content_type='application/json') except: return web.Response(status=400) -@PromptServer.instance.routes.get("/snapshot/save") +@routes.get("/snapshot/save") async def save_snapshot(request): try: - core.save_snapshot_with_postfix('snapshot') + await core.save_snapshot_with_postfix('snapshot') return web.Response(status=200) except: return web.Response(status=400) @@ -714,37 +726,14 @@ def unzip_install(files): f.write(data) with zipfile.ZipFile(temp_filename, 'r') as zip_ref: - zip_ref.extractall(core.custom_nodes_path) + zip_ref.extractall(core.get_default_custom_nodes_path()) os.remove(temp_filename) except Exception as e: - print(f"Install(unzip) error: {url} / {e}", file=sys.stderr) + logging.error(f"Install(unzip) error: {url} / {e}", file=sys.stderr) return False - print("Installation was successful.") - return True - - -def download_url_with_agent(url, save_path): - try: - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} - - req = urllib.request.Request(url, headers=headers) - response = urllib.request.urlopen(req) - data = response.read() - - if not os.path.exists(os.path.dirname(save_path)): - os.makedirs(os.path.dirname(save_path)) - - with open(save_path, 'wb') as f: - f.write(data) - - except Exception as e: - print(f"Download error: {url} / {e}", file=sys.stderr) - return False - - print("Installation was successful.") + logging.info("Installation was successful.") return True @@ -755,7 +744,7 @@ def copy_install(files, js_path_name=None): try: filename = os.path.basename(url) if url.endswith(".py"): - download_url(url, core.custom_nodes_path, filename) + download_url(url, core.get_default_custom_nodes_path(), filename) else: path = os.path.join(core.js_path, js_path_name) if js_path_name is not None else core.js_path if not os.path.exists(path): @@ -763,10 +752,10 @@ def copy_install(files, js_path_name=None): download_url(url, path, filename) except Exception as e: - print(f"Install(copy) error: {url} / {e}", file=sys.stderr) + logging.error(f"Install(copy) error: {url} / {e}", file=sys.stderr) return False - print("Installation was successful.") + logging.info("Installation was successful.") return True @@ -775,7 +764,7 @@ def copy_uninstall(files, js_path_name='.'): if url.endswith("/"): url = url[:-1] dir_name = os.path.basename(url) - base_path = core.custom_nodes_path if url.endswith('.py') else os.path.join(core.js_path, js_path_name) + base_path = core.get_default_custom_nodes_path() if url.endswith('.py') else os.path.join(core.js_path, js_path_name) file_path = os.path.join(base_path, dir_name) try: @@ -784,10 +773,10 @@ def copy_uninstall(files, js_path_name='.'): elif os.path.exists(file_path + ".disabled"): os.remove(file_path + ".disabled") except Exception as e: - print(f"Uninstall(copy) error: {url} / {e}", file=sys.stderr) + logging.error(f"Uninstall(copy) error: {url} / {e}", file=sys.stderr) return False - print("Uninstallation was successful.") + logging.info("Uninstallation was successful.") return True @@ -801,7 +790,7 @@ def copy_set_active(files, is_disable, js_path_name='.'): if url.endswith("/"): url = url[:-1] dir_name = os.path.basename(url) - base_path = core.custom_nodes_path if url.endswith('.py') else os.path.join(core.js_path, js_path_name) + base_path = core.get_default_custom_nodes_path() if url.endswith('.py') else os.path.join(core.js_path, js_path_name) file_path = os.path.join(base_path, dir_name) try: @@ -815,130 +804,145 @@ def copy_set_active(files, is_disable, js_path_name='.'): os.rename(current_name, new_name) except Exception as e: - print(f"{action_name}(copy) error: {url} / {e}", file=sys.stderr) + logging.error(f"{action_name}(copy) error: {url} / {e}", file=sys.stderr) return False - print(f"{action_name} was successful.") + logging.info(f"{action_name} was successful.") return True -@PromptServer.instance.routes.post("/customnode/install") +@routes.get("/customnode/versions/{node_name}") +async def get_cnr_versions(request): + node_name = request.match_info.get("node_name", None) + versions = core.cnr_utils.all_versions_of_node(node_name) + + if versions is not None: + return web.json_response(versions, content_type='application/json') + + return web.Response(status=400) + + +@routes.get("/customnode/disabled_versions/{node_name}") +async def get_disabled_versions(request): + node_name = request.match_info.get("node_name", None) + versions = [] + if node_name in core.unified_manager.nightly_inactive_nodes: + versions.append(dict(version='nightly')) + + for v in core.unified_manager.cnr_inactive_nodes.get(node_name, {}).keys(): + versions.append(dict(version=v)) + + if versions: + return web.json_response(versions, content_type='application/json') + + return web.Response(status=400) + + +@routes.post("/customnode/reinstall") +async def reinstall_custom_node(request): + await uninstall_custom_node(request) + await install_custom_node(request) + + +@routes.post("/customnode/install") async def install_custom_node(request): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) - return web.Response(status=403) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + return web.Response(status=403, text="A security error has occurred. Please check the terminal logs") json_data = await request.json() - risky_level = await get_risky_level(json_data['files'], json_data.get('pip', [])) - if not is_allowed_security_level(risky_level): - print(SECURITY_MESSAGE_GENERAL) - return web.Response(status=404) + # non-nightly cnr is safe + risky_level = None + cnr_id = json_data.get('id') + skip_post_install = json_data.get('skip_post_install') - install_type = json_data['install_type'] - - print(f"Install custom node '{json_data['title']}'") - - res = False - - if len(json_data['files']) == 0: - return web.Response(status=400) - - if install_type == "unzip": - res = unzip_install(json_data['files']) - - if install_type == "copy": - if 'js_path' in json_data: - if '.' in json_data['js_path'] or ':' in json_data['js_path'] or json_data['js_path'].startswith('/'): - print(f"[ComfyUI Manager] An abnormal JS path has been transmitted. This could be the result of a security attack.\n{json_data['js_path']}") - return web.Response(status=400) - else: - js_path_name = json_data['js_path'] + if json_data['version'] != 'unknown': + selected_version = json_data.get('selected_version', 'latest') + if selected_version != 'nightly': + risky_level = 'low' + node_spec_str = f"{cnr_id}@{selected_version}" else: - js_path_name = '.' - res = copy_install(json_data['files'], js_path_name) + node_spec_str = f"{cnr_id}@nightly" + else: + # unknown + unknown_name = os.path.basename(json_data['files'][0]) + node_spec_str = f"{unknown_name}@unknown" - elif install_type == "git-clone": - res = core.gitclone_install(json_data['files']) + # apply security policy if not cnr node (nightly isn't regarded as cnr node) + if risky_level is None: + risky_level = await get_risky_level(json_data['files'], json_data.get('pip', [])) - if 'pip' in json_data: - for pname in json_data['pip']: - pkg = core.remap_pip_package(pname) - install_cmd = [sys.executable, "-m", "pip", "install", pkg] - core.try_install_script(json_data['files'][0], ".", install_cmd) + if not is_allowed_security_level(risky_level): + logging.error(SECURITY_MESSAGE_GENERAL) + return web.Response(status=404, text="A security error has occurred. Please check the terminal logs") - core.clear_pip_cache() + node_spec = core.unified_manager.resolve_node_spec(node_spec_str) - if res: - print(f"After restarting ComfyUI, please refresh the browser.") - return web.json_response({}, content_type='application/json') + if node_spec is None: + return web.Response(status=400, text=f"Cannot resolve install target: '{node_spec_str}'") - return web.Response(status=400) + node_name, version_spec, is_specified = node_spec + res = await core.unified_manager.install_by_id(node_name, version_spec, json_data['channel'], json_data['mode'], return_postinstall=skip_post_install) + # discard post install if skip_post_install mode + + if res.action not in ['skip', 'enable', 'install-git', 'install-cnr', 'switch-cnr']: + return web.Response(status=400, text=f"Installation failed: {res}") + + return web.Response(status=200, text="Installation success.") -@PromptServer.instance.routes.post("/customnode/fix") +@routes.post("/customnode/fix") async def fix_custom_node(request): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_GENERAL) - return web.Response(status=403) + logging.error(SECURITY_MESSAGE_GENERAL) + return web.Response(status=403, text="A security error has occurred. Please check the terminal logs") json_data = await request.json() - install_type = json_data['install_type'] - - print(f"Install custom node '{json_data['title']}'") - - res = False - - if len(json_data['files']) == 0: - return web.Response(status=400) - - if install_type == "git-clone": - res = core.gitclone_fix(json_data['files']) + node_id = json_data.get('id') + node_ver = json_data['version'] + if node_ver != 'unknown': + node_name = node_id else: - return web.Response(status=400) + # unknown + node_name = os.path.basename(json_data['files'][0]) - if 'pip' in json_data: - if not is_allowed_security_level('high'): - print(SECURITY_MESSAGE_GENERAL) - return web.Response(status=403) + res = core.unified_manager.unified_fix(node_name, node_ver) - for pname in json_data['pip']: - install_cmd = [sys.executable, "-m", "pip", "install", '-U', pname] - core.try_install_script(json_data['files'][0], ".", install_cmd) - - # HOTFIX: force downgrade to numpy<2 - install_cmd = [sys.executable, "-m", "pip", "install", "numpy<2"] - core.try_install_script(json_data['files'][0], ".", install_cmd) - - if res: - print(f"After restarting ComfyUI, please refresh the browser.") + if res.result: + logging.info("After restarting ComfyUI, please refresh the browser.") return web.json_response({}, content_type='application/json') - return web.Response(status=400) + logging.error(f"ERROR: An error occurred while fixing '{node_name}@{node_ver}'.") + return web.Response(status=400, text=f"An error occurred while fixing '{node_name}@{node_ver}'.") -@PromptServer.instance.routes.post("/customnode/install/git_url") +@routes.post("/customnode/install/git_url") async def install_custom_node_git_url(request): if not is_allowed_security_level('high'): - print(SECURITY_MESSAGE_NORMAL_MINUS) + logging.error(SECURITY_MESSAGE_NORMAL_MINUS) return web.Response(status=403) url = await request.text() - res = core.gitclone_install([url]) + res = await core.gitclone_install(url) - if res: - print(f"After restarting ComfyUI, please refresh the browser.") + if res.action == 'skip': + logging.info(f"Already installed: '{res.target}'") + return web.Response(status=200) + elif res.result: + logging.info("After restarting ComfyUI, please refresh the browser.") return web.Response(status=200) + logging.error(res.msg) return web.Response(status=400) -@PromptServer.instance.routes.post("/customnode/install/pip") -async def install_custom_node_git_url(request): +@routes.post("/customnode/install/pip") +async def install_custom_node_pip(request): if not is_allowed_security_level('high'): - print(SECURITY_MESSAGE_NORMAL_MINUS) + logging.error(SECURITY_MESSAGE_NORMAL_MINUS) return web.Response(status=403) packages = await request.text() @@ -947,110 +951,146 @@ async def install_custom_node_git_url(request): return web.Response(status=200) -@PromptServer.instance.routes.post("/customnode/uninstall") +@routes.post("/customnode/uninstall") async def uninstall_custom_node(request): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) - return web.Response(status=403) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + return web.Response(status=403, text="A security error has occurred. Please check the terminal logs") json_data = await request.json() - install_type = json_data['install_type'] + node_id = json_data.get('id') + if json_data['version'] != 'unknown': + is_unknown = False + node_name = node_id + else: + # unknown + is_unknown = True + node_name = os.path.basename(json_data['files'][0]) - print(f"Uninstall custom node '{json_data['title']}'") + res = core.unified_manager.unified_uninstall(node_name, is_unknown) - res = False - - if install_type == "copy": - js_path_name = json_data['js_path'] if 'js_path' in json_data else '.' - res = copy_uninstall(json_data['files'], js_path_name) - - elif install_type == "git-clone": - res = core.gitclone_uninstall(json_data['files']) - - if res: - print(f"After restarting ComfyUI, please refresh the browser.") + if res.result: + logging.info("After restarting ComfyUI, please refresh the browser.") return web.json_response({}, content_type='application/json') - return web.Response(status=400) + logging.error(f"ERROR: An error occurred while uninstalling '{node_name}'.") + return web.Response(status=400, text=f"An error occurred while uninstalling '{node_name}'.") -@PromptServer.instance.routes.post("/customnode/update") +@routes.post("/customnode/update") async def update_custom_node(request): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) - return web.Response(status=403) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + return web.Response(status=403, text="A security error has occurred. Please check the terminal logs") json_data = await request.json() - install_type = json_data['install_type'] + node_id = json_data.get('id') + if json_data['version'] != 'unknown': + node_name = node_id + else: + # unknown + node_name = os.path.basename(json_data['files'][0]) - print(f"Update custom node '{json_data['title']}'") + res = core.unified_manager.unified_update(node_name, json_data['version']) - res = False + manager_util.clear_pip_cache() - if install_type == "git-clone": - res = core.gitclone_update(json_data['files']) - - core.clear_pip_cache() - - if res: - print(f"After restarting ComfyUI, please refresh the browser.") + if res.result: + logging.info("After restarting ComfyUI, please refresh the browser.") return web.json_response({}, content_type='application/json') - return web.Response(status=400) + logging.error(f"ERROR: An error occurred while updating '{node_name}'.") + return web.Response(status=400, text=f"An error occurred while updating '{node_name}'.") -@PromptServer.instance.routes.get("/comfyui_manager/update_comfyui") +@routes.get("/comfyui_manager/update_comfyui") async def update_comfyui(request): - print(f"Update ComfyUI") + logging.info("Update ComfyUI") try: repo_path = os.path.dirname(folder_paths.__file__) res = core.update_path(repo_path) if res == "fail": - print(f"ComfyUI update fail: The installed ComfyUI does not have a Git repository.") + logging.error("ComfyUI update fail: The installed ComfyUI does not have a Git repository.") return web.Response(status=400) elif res == "updated": return web.Response(status=201) else: # skipped return web.Response(status=200) except Exception as e: - print(f"ComfyUI update fail: {e}", file=sys.stderr) + logging.error(f"ComfyUI update fail: {e}", file=sys.stderr) return web.Response(status=400) -@PromptServer.instance.routes.post("/customnode/toggle_active") -async def toggle_active(request): +@routes.get("/comfyui_manager/comfyui_versions") +async def comfyui_versions(request): + try: + res, current = core.get_comfyui_versions() + return web.json_response({'versions': res, 'current': current}, status=200, content_type='application/json') + except Exception as e: + logging.error(f"ComfyUI update fail: {e}", file=sys.stderr) + + return web.Response(status=400) + + +@routes.get("/comfyui_manager/comfyui_switch_version") +async def comfyui_switch_version(request): + try: + if "ver" in request.rel_url.query: + core.switch_comfyui(request.rel_url.query['ver']) + + return web.Response(status=200) + except Exception as e: + logging.error(f"ComfyUI update fail: {e}", file=sys.stderr) + + return web.Response(status=400) + + +@routes.post("/customnode/disable") +async def disable_node(request): json_data = await request.json() - install_type = json_data['install_type'] - is_disabled = json_data['installed'] == "Disabled" + node_id = json_data.get('id') + if json_data['version'] != 'unknown': + is_unknown = False + node_name = node_id + else: + # unknown + is_unknown = True + node_name = os.path.basename(json_data['files'][0]) - print(f"Update custom node '{json_data['title']}'") - - res = False - - if install_type == "git-clone": - res = core.gitclone_set_active(json_data['files'], not is_disabled) - elif install_type == "copy": - res = copy_set_active(json_data['files'], not is_disabled, json_data.get('js_path', None)) + res = core.unified_manager.unified_disable(node_name, is_unknown) if res: return web.json_response({}, content_type='application/json') - return web.Response(status=400) + return web.Response(status=400, text="Failed to disable") -@PromptServer.instance.routes.post("/model/install") +@routes.get("/manager/migrate_unmanaged_nodes") +async def migrate_unmanaged_nodes(request): + logging.info("[ComfyUI-Manager] Migrating unmanaged nodes...") + await core.unified_manager.migrate_unmanaged_nodes() + logging.info("Done.") + return web.Response(status=200) + + +@routes.get("/manager/need_to_migrate") +async def need_to_migrate(request): + return web.Response(text=str(core.need_to_migrate), status=200) + + +@routes.post("/model/install") async def install_model(request): json_data = await request.json() model_path = get_model_path(json_data) if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) return web.Response(status=403) if not json_data['filename'].endswith('.safetensors') and not is_allowed_security_level('high'): @@ -1063,19 +1103,19 @@ async def install_model(request): break if not is_belongs_to_whitelist: - print(SECURITY_MESSAGE_NORMAL_MINUS) + logging.error(SECURITY_MESSAGE_NORMAL_MINUS) return web.Response(status=403) res = False try: if model_path is not None: - print(f"Install model '{json_data['name']}' into '{model_path}'") + logging.info(f"Install model '{json_data['name']}' into '{model_path}'") model_url = json_data['url'] if not core.get_config()['model_download_by_agent'] and ( model_url.startswith('https://github.com') or model_url.startswith('https://huggingface.co') or model_url.startswith('https://heibox.uni-heidelberg.de')): - model_dir = get_model_dir(json_data) + model_dir = get_model_dir(json_data, True) download_url(model_url, model_dir, filename=json_data['filename']) if model_path.endswith('.zip'): res = core.unzip(model_path) @@ -1089,17 +1129,17 @@ async def install_model(request): if res and model_path.endswith('.zip'): res = core.unzip(model_path) else: - print(f"Model installation error: invalid model type - {json_data['type']}") + logging.error(f"Model installation error: invalid model type - {json_data['type']}") if res: return web.json_response({}, content_type='application/json') except Exception as e: - print(f"[ERROR] {e}", file=sys.stderr) + logging.error(f"[ERROR] {e}", file=sys.stderr) return web.Response(status=400) -@PromptServer.instance.routes.get("/manager/preview_method") +@routes.get("/manager/preview_method") async def preview_method(request): if "value" in request.rel_url.query: set_preview_method(request.rel_url.query['value']) @@ -1110,18 +1150,7 @@ async def preview_method(request): return web.Response(status=200) -@PromptServer.instance.routes.get("/manager/badge_mode") -async def badge_mode(request): - if "value" in request.rel_url.query: - set_badge_mode(request.rel_url.query['value']) - core.write_config() - else: - return web.Response(text=core.get_config()['badge_mode'], status=200) - - return web.Response(status=200) - - -@PromptServer.instance.routes.get("/manager/default_ui") +@routes.get("/manager/default_ui") async def default_ui_mode(request): if "value" in request.rel_url.query: set_default_ui_mode(request.rel_url.query['value']) @@ -1132,7 +1161,7 @@ async def default_ui_mode(request): return web.Response(status=200) -@PromptServer.instance.routes.get("/manager/component/policy") +@routes.get("/manager/component/policy") async def component_policy(request): if "value" in request.rel_url.query: set_component_policy(request.rel_url.query['value']) @@ -1143,7 +1172,7 @@ async def component_policy(request): return web.Response(status=200) -@PromptServer.instance.routes.get("/manager/dbl_click/policy") +@routes.get("/manager/dbl_click/policy") async def dbl_click_policy(request): if "value" in request.rel_url.query: set_double_click_policy(request.rel_url.query['value']) @@ -1154,7 +1183,7 @@ async def dbl_click_policy(request): return web.Response(status=200) -@PromptServer.instance.routes.get("/manager/channel_url_list") +@routes.get("/manager/channel_url_list") async def channel_url_list(request): channels = core.get_channel_dict() if "value" in request.rel_url.query: @@ -1191,7 +1220,7 @@ def add_target_blank(html_text): return modified_html -@PromptServer.instance.routes.get("/manager/notice") +@routes.get("/manager/notice") async def get_notice(request): url = "github.com" path = "/ltdrdata/ltdrdata.github.io/wiki/News" @@ -1220,9 +1249,9 @@ async def get_notice(request): try: if core.comfy_ui_commit_datetime == datetime(1900, 1, 1, 0, 0, 0): - markdown_content = f'

Your ComfyUI isn\'t git repo.

' + markdown_content + markdown_content = '

Your ComfyUI isn\'t git repo.

' + markdown_content elif core.comfy_ui_required_commit_datetime.date() > core.comfy_ui_commit_datetime.date(): - markdown_content = f'

Your ComfyUI is too OUTDATED!!!

' + markdown_content + markdown_content = '

Your ComfyUI is too OUTDATED!!!

' + markdown_content except: pass @@ -1233,58 +1262,56 @@ async def get_notice(request): return web.Response(text="Unable to retrieve Notice", status=200) -@PromptServer.instance.routes.get("/manager/reboot") +@routes.get("/manager/reboot") def restart(self): if not is_allowed_security_level('middle'): - print(SECURITY_MESSAGE_MIDDLE_OR_BELOW) + logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW) return web.Response(status=403) try: sys.stdout.close_log() - except Exception as e: + except Exception: pass if '__COMFY_CLI_SESSION__' in os.environ: - with open(os.path.join(os.environ['__COMFY_CLI_SESSION__'] + '.reboot'), 'w') as file: + with open(os.path.join(os.environ['__COMFY_CLI_SESSION__'] + '.reboot'), 'w'): pass - print(f"\nRestarting...\n\n") + print("\nRestarting...\n\n") # This printing should not be logging - that will be ugly exit(0) - print(f"\nRestarting... [Legacy Mode]\n\n") + print("\nRestarting... [Legacy Mode]\n\n") # This printing should not be logging - that will be ugly sys_argv = sys.argv.copy() if '--windows-standalone-build' in sys_argv: sys_argv.remove('--windows-standalone-build') if sys.platform.startswith('win32'): - return os.execv(sys.executable, ['"' + sys.executable + '"', '"' + sys.argv[0] + '"'] + sys.argv[1:]) + cmds = ['"' + sys.executable + '"', '"' + sys_argv[0] + '"'] + sys_argv[1:] else: - return os.execv(sys.executable, [sys.executable] + sys.argv) + cmds = [sys.executable] + sys_argv + + print(f"Command: {cmds}", flush=True) + + return os.execv(sys.executable, cmds) -def sanitize_filename(input_string): - # 알파벳, 숫자, 및 밑줄 이외의 문자를 밑줄로 대체 - result_string = re.sub(r'[^a-zA-Z0-9_]', '_', input_string) - return result_string - - -@PromptServer.instance.routes.post("/manager/component/save") +@routes.post("/manager/component/save") async def save_component(request): try: data = await request.json() name = data['name'] workflow = data['workflow'] - if not os.path.exists(components_path): - os.mkdir(components_path) + if not os.path.exists(core.manager_components_path): + os.mkdir(core.manager_components_path) if 'packname' in workflow and workflow['packname'] != '': - sanitized_name = sanitize_filename(workflow['packname']) + '.pack' + sanitized_name = manager_util.sanitize_filename(workflow['packname']) + '.pack' else: - sanitized_name = sanitize_filename(name) + '.json' + sanitized_name = manager_util.sanitize_filename(name) + '.json' - filepath = os.path.join(components_path, sanitized_name) + filepath = os.path.join(core.manager_components_path, sanitized_name) components = {} if os.path.exists(filepath): with open(filepath) as f: @@ -1299,51 +1326,48 @@ async def save_component(request): return web.Response(status=400) -@PromptServer.instance.routes.post("/manager/component/loads") +@routes.post("/manager/component/loads") async def load_components(request): - try: - json_files = [f for f in os.listdir(components_path) if f.endswith('.json')] - pack_files = [f for f in os.listdir(components_path) if f.endswith('.pack')] + if os.path.exists(core.manager_components_path): + try: + json_files = [f for f in os.listdir(core.manager_components_path) if f.endswith('.json')] + pack_files = [f for f in os.listdir(core.manager_components_path) if f.endswith('.pack')] - components = {} - for json_file in json_files + pack_files: - file_path = os.path.join(components_path, json_file) - with open(file_path, 'r') as file: - try: - # When there is a conflict between the .pack and the .json, the pack takes precedence and overrides. - components.update(json.load(file)) - except json.JSONDecodeError as e: - print(f"[ComfyUI-Manager] Error decoding component file in file {json_file}: {e}") + components = {} + for json_file in json_files + pack_files: + file_path = os.path.join(core.manager_components_path, json_file) + with open(file_path, 'r') as file: + try: + # When there is a conflict between the .pack and the .json, the pack takes precedence and overrides. + components.update(json.load(file)) + except json.JSONDecodeError as e: + logging.error(f"[ComfyUI-Manager] Error decoding component file in file {json_file}: {e}") - return web.json_response(components) - except Exception as e: - print(f"[ComfyUI-Manager] failed to load components\n{e}") - return web.Response(status=400) + return web.json_response(components) + except Exception as e: + logging.error(f"[ComfyUI-Manager] failed to load components\n{e}") + return web.Response(status=400) + else: + return web.json_response({}) -args.enable_cors_header = "*" -if hasattr(PromptServer.instance, "app"): - app = PromptServer.instance.app - cors_middleware = server.create_cors_middleware(args.enable_cors_header) - app.middlewares.append(cors_middleware) - - -def sanitize(data): - return data.replace("<", "<").replace(">", ">") +@routes.get("/manager/version") +async def get_version(request): + return web.Response(text=core.version_str, status=200) async def _confirm_try_install(sender, custom_node_url, msg): json_obj = await core.get_data_by_mode('default', 'custom-node-list.json') - sender = sanitize(sender) - msg = sanitize(msg) + sender = manager_util.sanitize_tag(sender) + msg = manager_util.sanitize_tag(msg) target = core.lookup_customnode_by_url(json_obj, custom_node_url) if target is not None: PromptServer.instance.send_sync("cm-api-try-install-customnode", {"sender": sender, "target": target, "msg": msg}) else: - print(f"[ComfyUI Manager API] Failed to try install - Unknown custom node url '{custom_node_url}'") + logging.error(f"[ComfyUI Manager API] Failed to try install - Unknown custom node url '{custom_node_url}'") def confirm_try_install(sender, custom_node_url, msg): @@ -1357,16 +1381,16 @@ import asyncio async def default_cache_update(): async def get_cache(filename): - uri = 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/' + filename - cache_uri = str(core.simple_hash(uri)) + '_' + filename - cache_uri = os.path.join(core.cache_dir, cache_uri) + uri = f"{core.DEFAULT_CHANNEL}/{filename}" + cache_uri = str(manager_util.simple_hash(uri)) + '_' + filename + cache_uri = os.path.join(manager_util.cache_dir, cache_uri) - json_obj = await core.get_data(uri, True) + json_obj = await manager_util.get_data(uri, True) - with core.cache_lock: + with manager_util.cache_lock: with open(cache_uri, "w", encoding='utf-8') as file: json.dump(json_obj, file, indent=4, sort_keys=True) - print(f"[ComfyUI-Manager] default cache updated: {uri}") + logging.info(f"[ComfyUI-Manager] default cache updated: {uri}") a = get_cache("custom-node-list.json") b = get_cache("extension-node-map.json") @@ -1376,10 +1400,15 @@ async def default_cache_update(): await asyncio.gather(a, b, c, d, e) + # NOTE: hide migration button temporarily. + # if not core.get_config()['skip_migration_check']: + # await core.check_need_to_migrate() + # else: + # logging.info("[ComfyUI-Manager] Migration check is skipped...") threading.Thread(target=lambda: asyncio.run(default_cache_update())).start() -if not os.path.exists(core.config_path): +if not os.path.exists(core.manager_config_path): core.get_config() core.write_config() @@ -1388,5 +1417,5 @@ cm_global.register_extension('ComfyUI-Manager', {'version': core.version, 'name': 'ComfyUI Manager', 'nodes': {}, - 'description': 'It provides the ability to manage custom nodes in ComfyUI.', }) + 'description': 'This extension provides the ability to manage custom nodes in ComfyUI.', }) diff --git a/glob/manager_util.py b/glob/manager_util.py index 7a7312e1..e9369ef5 100644 --- a/glob/manager_util.py +++ b/glob/manager_util.py @@ -1,5 +1,22 @@ +""" +description: + `manager_util` is the lightest module shared across the prestartup_script, main code, and cm-cli of ComfyUI-Manager. +""" + +import aiohttp +import json +import threading +import os +from datetime import datetime import subprocess import sys +import re + +cache_lock = threading.Lock() + +comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) +cache_dir = os.path.join(comfyui_manager_path, '.cache') # This path is also updated together in **manager_core.update_user_directory**. + # DON'T USE StrictVersion - cannot handle pre_release version # try: @@ -66,8 +83,89 @@ class StrictVersion: return not self == other +def simple_hash(input_string): + hash_value = 0 + for char in input_string: + hash_value = (hash_value * 31 + ord(char)) % (2**32) + + return hash_value + + +def is_file_created_within_one_day(file_path): + if not os.path.exists(file_path): + return False + + file_creation_time = os.path.getctime(file_path) + current_time = datetime.now().timestamp() + time_difference = current_time - file_creation_time + + return time_difference <= 86400 + + +async def get_data(uri, silent=False): + if not silent: + print(f"FETCH DATA from: {uri}", end="") + + if uri.startswith("http"): + async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session: + headers = { + 'Cache-Control': 'no-cache', + 'Pragma': 'no-cache', + 'Expires': '0' + } + async with session.get(uri, headers=headers) as resp: + json_text = await resp.text() + else: + with cache_lock: + with open(uri, "r", encoding="utf-8") as f: + json_text = f.read() + + json_obj = json.loads(json_text) + + if not silent: + print(" [DONE]") + + return json_obj + + +async def get_data_with_cache(uri, silent=False, cache_mode=True): + cache_uri = str(simple_hash(uri)) + '_' + os.path.basename(uri).replace('&', "_").replace('?', "_").replace('=', "_") + cache_uri = os.path.join(cache_dir, cache_uri+'.json') + + if cache_mode and is_file_created_within_one_day(cache_uri): + json_obj = await get_data(cache_uri, silent=silent) + else: + json_obj = await get_data(uri, silent=silent) + + with cache_lock: + with open(cache_uri, "w", encoding='utf-8') as file: + json.dump(json_obj, file, indent=4, sort_keys=True) + if not silent: + print(f"[ComfyUI-Manager] default cache updated: {uri}") + + return json_obj + + +def sanitize_tag(x): + return x.replace('<', '<').replace('>', '>') + + +def extract_package_as_zip(file_path, extract_path): + import zipfile + try: + with zipfile.ZipFile(file_path, "r") as zip_ref: + zip_ref.extractall(extract_path) + extracted_files = zip_ref.namelist() + print(f"Extracted zip file to {extract_path}") + return extracted_files + except zipfile.BadZipFile: + print(f"File '{file_path}' is not a zip or is corrupted.") + return None + + pip_map = None + def get_installed_packages(renew=False): global pip_map @@ -84,8 +182,8 @@ def get_installed_packages(renew=False): continue pip_map[y[0]] = y[1] - except subprocess.CalledProcessError as e: - print(f"[ComfyUI-Manager] Failed to retrieve the information of installed pip packages.") + except subprocess.CalledProcessError: + print("[ComfyUI-Manager] Failed to retrieve the information of installed pip packages.") return set() return pip_map @@ -154,9 +252,9 @@ class PIPFixer: cmd = [sys.executable, '-m', 'pip', 'uninstall', 'comfy'] subprocess.check_output(cmd, universal_newlines=True) - print(f"[manager-core] 'comfy' python package is uninstalled.\nWARN: The 'comfy' package is completely unrelated to ComfyUI and should never be installed as it causes conflicts with ComfyUI.") + print("[manager-core] 'comfy' python package is uninstalled.\nWARN: The 'comfy' package is completely unrelated to ComfyUI and should never be installed as it causes conflicts with ComfyUI.") except Exception as e: - print(f"[manager-core] Failed to uninstall `comfy` python package") + print("[manager-core] Failed to uninstall `comfy` python package") print(e) # fix torch - reinstall torch packages if version is changed @@ -166,7 +264,7 @@ class PIPFixer: or self.prev_pip_versions['torchaudio'] != new_pip_versions['torchaudio']: self.torch_rollback() except Exception as e: - print(f"[manager-core] Failed to restore PyTorch") + print("[manager-core] Failed to restore PyTorch") print(e) # fix opencv @@ -200,7 +298,7 @@ class PIPFixer: print(f"[manager-core] 'opencv' dependencies were fixed: {targets}") except Exception as e: - print(f"[manager-core] Failed to restore opencv") + print("[manager-core] Failed to restore opencv") print(e) # fix numpy @@ -208,7 +306,16 @@ class PIPFixer: np = new_pip_versions.get('numpy') if np is not None: if StrictVersion(np) >= StrictVersion('2'): - subprocess.check_output([sys.executable, '-m', 'pip', 'install', f"numpy<2"], universal_newlines=True) + subprocess.check_output([sys.executable, '-m', 'pip', 'install', "numpy<2"], universal_newlines=True) except Exception as e: - print(f"[manager-core] Failed to restore numpy") + print("[manager-core] Failed to restore numpy") print(e) + + +def sanitize(data): + return data.replace("<", "<").replace(">", ">") + + +def sanitize_filename(input_string): + result_string = re.sub(r'[^a-zA-Z0-9_]', '_', input_string) + return result_string diff --git a/glob/node_package.py b/glob/node_package.py new file mode 100644 index 00000000..d199fa30 --- /dev/null +++ b/glob/node_package.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +from dataclasses import dataclass +import os + +from git_utils import get_commit_hash + + +@dataclass +class InstalledNodePackage: + """Information about an installed node package.""" + + id: str + fullpath: str + disabled: bool + version: str + + @property + def is_unknown(self) -> bool: + return self.version == "unknown" + + @property + def is_nightly(self) -> bool: + return self.version == "nightly" + + @property + def is_from_cnr(self) -> bool: + return not self.is_unknown and not self.is_nightly + + @property + def is_enabled(self) -> bool: + return not self.disabled + + @property + def is_disabled(self) -> bool: + return self.disabled + + def get_commit_hash(self) -> str: + return get_commit_hash(self.fullpath) + + def isValid(self) -> bool: + if self.is_from_cnr: + return os.path.exists(os.path.join(self.fullpath, '.tracking')) + + return True + + @staticmethod + def from_fullpath(fullpath: str, resolve_from_path) -> InstalledNodePackage: + parent_folder_name = os.path.basename(os.path.dirname(fullpath)) + module_name = os.path.basename(fullpath) + + if module_name.endswith(".disabled"): + node_id = module_name[:-9] + disabled = True + elif parent_folder_name == ".disabled": + # Nodes under custom_nodes/.disabled/* are disabled + node_id = module_name + disabled = True + else: + node_id = module_name + disabled = False + + info = resolve_from_path(fullpath) + if info is None: + version = 'unknown' + else: + node_id = info['id'] # robust module guessing + version = info['ver'] + + return InstalledNodePackage( + id=node_id, fullpath=fullpath, disabled=disabled, version=version + ) diff --git a/glob/security_check.py b/glob/security_check.py index ac906633..fb0e376f 100644 --- a/glob/security_check.py +++ b/glob/security_check.py @@ -109,7 +109,7 @@ https://blog.comfy.org/comfyui-statement-on-the-ultralytics-crypto-miner-situati for x in detected: print(f"\n======== TARGET: {x} =========") - print(f"\nTODO:") + print("\nTODO:") print(guide.get(x)) exit(-1) diff --git a/glob/share_3rdparty.py b/glob/share_3rdparty.py index fd5fc914..c6cfcb1e 100644 --- a/glob/share_3rdparty.py +++ b/glob/share_3rdparty.py @@ -65,10 +65,10 @@ async def share_option(request): def get_openart_auth(): - if not os.path.exists(os.path.join(core.comfyui_manager_path, ".openart_key")): + if not os.path.exists(os.path.join(core.manager_files_path, ".openart_key")): return None try: - with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "r") as f: + with open(os.path.join(core.manager_files_path, ".openart_key"), "r") as f: openart_key = f.read().strip() return openart_key if openart_key else None except: @@ -76,10 +76,10 @@ def get_openart_auth(): def get_matrix_auth(): - if not os.path.exists(os.path.join(core.comfyui_manager_path, "matrix_auth")): + if not os.path.exists(os.path.join(core.manager_files_path, "matrix_auth")): return None try: - with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "r") as f: + with open(os.path.join(core.manager_files_path, "matrix_auth"), "r") as f: matrix_auth = f.read() homeserver, username, password = matrix_auth.strip().split("\n") if not homeserver or not username or not password: @@ -94,10 +94,10 @@ def get_matrix_auth(): def get_comfyworkflows_auth(): - if not os.path.exists(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey")): + if not os.path.exists(os.path.join(core.manager_files_path, "comfyworkflows_sharekey")): return None try: - with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "r") as f: + with open(os.path.join(core.manager_files_path, "comfyworkflows_sharekey"), "r") as f: share_key = f.read() if not share_key.strip(): return None @@ -107,10 +107,10 @@ def get_comfyworkflows_auth(): def get_youml_settings(): - if not os.path.exists(os.path.join(core.comfyui_manager_path, ".youml")): + if not os.path.exists(os.path.join(core.manager_files_path, ".youml")): return None try: - with open(os.path.join(core.comfyui_manager_path, ".youml"), "r") as f: + with open(os.path.join(core.manager_files_path, ".youml"), "r") as f: youml_settings = f.read().strip() return youml_settings if youml_settings else None except: @@ -118,7 +118,7 @@ def get_youml_settings(): def set_youml_settings(settings): - with open(os.path.join(core.comfyui_manager_path, ".youml"), "w") as f: + with open(os.path.join(core.manager_files_path, ".youml"), "w") as f: f.write(settings) @@ -135,7 +135,7 @@ async def api_get_openart_auth(request): async def api_set_openart_auth(request): json_data = await request.json() openart_key = json_data['openart_key'] - with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "w") as f: + with open(os.path.join(core.manager_files_path, ".openart_key"), "w") as f: f.write(openart_key) return web.Response(status=200) @@ -178,16 +178,14 @@ async def api_get_comfyworkflows_auth(request): @PromptServer.instance.routes.post("/manager/set_esheep_workflow_and_images") async def set_esheep_workflow_and_images(request): json_data = await request.json() - current_workflow = json_data['workflow'] - images = json_data['images'] - with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), "w", encoding='utf-8') as file: + with open(os.path.join(core.manager_files_path, "esheep_share_message.json"), "w", encoding='utf-8') as file: json.dump(json_data, file, indent=4) return web.Response(status=200) @PromptServer.instance.routes.get("/manager/get_esheep_workflow_and_images") async def get_esheep_workflow_and_images(request): - with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), 'r', encoding='utf-8') as file: + with open(os.path.join(core.manager_files_path, "esheep_share_message.json"), 'r', encoding='utf-8') as file: data = json.load(file) return web.Response(status=200, text=json.dumps(data)) @@ -196,12 +194,12 @@ def set_matrix_auth(json_data): homeserver = json_data['homeserver'] username = json_data['username'] password = json_data['password'] - with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "w") as f: + with open(os.path.join(core.manager_files_path, "matrix_auth"), "w") as f: f.write("\n".join([homeserver, username, password])) def set_comfyworkflows_auth(comfyworkflows_sharekey): - with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "w") as f: + with open(os.path.join(core.manager_files_path, "comfyworkflows_sharekey"), "w") as f: f.write(comfyworkflows_sharekey) @@ -319,7 +317,7 @@ async def share_art(request): form.add_field("shareWorkflowTitle", title) form.add_field("shareWorkflowDescription", description) form.add_field("shareWorkflowIsNSFW", str(is_nsfw).lower()) - form.add_field("currentSnapshot", json.dumps(core.get_current_snapshot())) + form.add_field("currentSnapshot", json.dumps(await core.get_current_snapshot())) form.add_field("modelsInfo", json.dumps(models_info)) async with session.post( @@ -368,9 +366,9 @@ async def share_art(request): text_content += f"{description}\n" if credits: text_content += f"\ncredits: {credits}\n" - response = matrix.send_message(comfyui_share_room_id, text_content) - response = matrix.send_content(comfyui_share_room_id, mxc_url, filename, 'm.image') - response = matrix.send_content(comfyui_share_room_id, workflow_json_mxc_url, 'workflow.json', 'm.file') + matrix.send_message(comfyui_share_room_id, text_content) + matrix.send_content(comfyui_share_room_id, mxc_url, filename, 'm.image') + matrix.send_content(comfyui_share_room_id, workflow_json_mxc_url, 'workflow.json', 'm.file') except: import traceback traceback.print_exc() diff --git a/js/cm-api.js b/js/cm-api.js index 95a13cfb..58df1169 100644 --- a/js/cm-api.js +++ b/js/cm-api.js @@ -1,6 +1,6 @@ import { api } from "../../scripts/api.js"; import { app } from "../../scripts/app.js"; -import { sleep } from "./common.js"; +import { sleep, customConfirm, customAlert } from "./common.js"; async function tryInstallCustomNode(event) { let msg = '-= [ComfyUI Manager] extension installation request =-\n\n'; @@ -19,11 +19,10 @@ async function tryInstallCustomNode(event) { msg += `\n\nRequest message:\n${event.detail.msg}`; if(event.detail.target.installed == 'True') { - alert(msg); + customAlert(msg); return; } - - let res = confirm(msg); + const res = await customConfirm(msg); if(res) { if(event.detail.target.installed == 'Disabled') { const response = await api.fetchApi(`/customnode/toggle_active`, { diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index 8d2b12bf..a574a4f1 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -11,7 +11,9 @@ import { showYouMLShareDialog } from "./comfyui-share-common.js"; import { OpenArtShareDialog } from "./comfyui-share-openart.js"; -import { free_models, install_pip, install_via_git_url, manager_instance, rebootAPI, setManagerInstance, show_message } from "./common.js"; +import { + free_models, install_pip, install_via_git_url, manager_instance, + rebootAPI, migrateAPI, setManagerInstance, show_message, customAlert, customPrompt } from "./common.js"; import { ComponentBuilderDialog, getPureName, load_components, set_component_policy } from "./components-manager.js"; import { CustomNodesManager } from "./custom-nodes-manager.js"; import { ModelManager } from "./model-manager.js"; @@ -41,7 +43,7 @@ docStyle.innerHTML = ` width: 1000px; height: 520px; box-sizing: content-box; - z-index: 10000; + z-index: 1000; overflow-y: auto; } @@ -49,7 +51,7 @@ docStyle.innerHTML = ` width: 400px; height: 25px; box-sizing: border-box; - z-index: 10000; + z-index: 1000; margin-top: 10px; margin-bottom: 5px; } @@ -101,24 +103,6 @@ docStyle.innerHTML = ` vertical-align: middle; } -#cm-channel-badge { - color: white; - background-color: #AA0000; - width: 220px; - height: 23px; - font-size: 13px; - border-radius: 5px; - left: 5px; - top: 5px; - align-content: center; - justify-content: center; - text-align: center; - font-weight: bold; - float: left; - vertical-align: middle; - position: relative; -} - #custom-nodes-grid a { color: #5555FF; font-weight: bold; @@ -239,9 +223,9 @@ function is_legacy_front() { document.head.appendChild(docStyle); var update_comfyui_button = null; +var switch_comfyui_button = null; var fetch_updates_button = null; var update_all_button = null; -var badge_mode = "none"; let share_option = 'all'; // copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts @@ -287,6 +271,18 @@ const style = ` color: white !important; } + +.cm-button-orange { + width: 310px; + height: 30px; + position: relative; + overflow: hidden; + font-size: 17px !important; + font-weight: bold; + background-color: orange !important; + color: black !important; +} + .cm-experimental-button { width: 290px; height: 30px; @@ -411,14 +407,6 @@ const style = ` } `; - - -async function init_badge_mode() { - api.fetchApi('/manager/badge_mode') - .then(response => response.text()) - .then(data => { badge_mode = data; }) -} - async function init_share_option() { api.fetchApi('/manager/share_option') .then(response => response.text()) @@ -435,7 +423,6 @@ async function init_notice(notice) { }) } -await init_badge_mode(); await init_share_option(); async function fetchNicknames() { @@ -502,65 +489,6 @@ function getNickname(node, nodename) { } } -function drawBadge(node, orig, restArgs) { - let ctx = restArgs[0]; - const r = orig?.apply?.(node, restArgs); - - if (!node.flags.collapsed && badge_mode != 'none' && node.constructor.title_mode != LiteGraph.NO_TITLE) { - let text = ""; - if (badge_mode.startsWith('id_nick')) - text = `#${node.id} `; - - let nick = node.getNickname(); - if (nick) { - if (nick == 'ComfyUI') { - if(badge_mode.endsWith('hide')) { - nick = ""; - } - else { - nick = "🦊" - } - } - - if (nick.length > 25) { - text += nick.substring(0, 23) + ".."; - } - else { - text += nick; - } - } - - if (text != "") { - let fgColor = "white"; - let bgColor = "#0F1F0F"; - let visible = true; - - ctx.save(); - ctx.font = "12px sans-serif"; - const sz = ctx.measureText(text); - ctx.fillStyle = bgColor; - ctx.beginPath(); - ctx.roundRect(node.size[0] - sz.width - 12, -LiteGraph.NODE_TITLE_HEIGHT - 20, sz.width + 12, 20, 5); - ctx.fill(); - - ctx.fillStyle = fgColor; - ctx.fillText(text, node.size[0] - sz.width - 6, -LiteGraph.NODE_TITLE_HEIGHT - 6); - ctx.restore(); - - if (node.has_errors) { - ctx.save(); - ctx.font = "bold 14px sans-serif"; - const sz2 = ctx.measureText(node.type); - ctx.fillStyle = 'white'; - ctx.fillText(node.type, node.size[0] / 2 - sz2.width / 2, node.size[1] / 2); - ctx.restore(); - } - } - } - return r; -} - - async function updateComfyUI() { let prev_text = update_comfyui_button.innerText; update_comfyui_button.innerText = "Updating ComfyUI..."; @@ -595,6 +523,154 @@ async function updateComfyUI() { } } +function showVersionSelectorDialog(versions, current, onSelect) { + const dialog = new ComfyDialog(); + dialog.element.style.zIndex = 1100; + dialog.element.style.width = "300px"; + dialog.element.style.padding = "0"; + dialog.element.style.backgroundColor = "#2a2a2a"; + dialog.element.style.border = "1px solid #3a3a3a"; + dialog.element.style.borderRadius = "8px"; + dialog.element.style.boxSizing = "border-box"; + dialog.element.style.overflow = "hidden"; + + const contentStyle = { + width: "300px", + display: "flex", + flexDirection: "column", + alignItems: "center", + padding: "20px", + boxSizing: "border-box", + gap: "15px" + }; + + let selectedVersion = versions[0]; + + const versionList = $el("select", { + multiple: true, + size: Math.min(10, versions.length), + style: { + width: "260px", + height: "auto", + backgroundColor: "#383838", + color: "#ffffff", + border: "1px solid #4a4a4a", + borderRadius: "4px", + padding: "5px", + boxSizing: "border-box" + } + }, + versions.map((v, index) => $el("option", { + value: v, + textContent: v, + selected: v === current + })) + ); + + versionList.addEventListener('change', (e) => { + selectedVersion = e.target.value; + Array.from(e.target.options).forEach(opt => { + opt.selected = opt.value === selectedVersion; + }); + }); + + const content = $el("div", { + style: contentStyle + }, [ + $el("h3", { + textContent: "Select Version", + style: { + color: "#ffffff", + backgroundColor: "#1a1a1a", + padding: "10px 15px", + margin: "0 0 10px 0", + width: "260px", + textAlign: "center", + borderRadius: "4px", + boxSizing: "border-box", + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis" + } + }), + versionList, + $el("div", { + style: { + display: "flex", + justifyContent: "space-between", + width: "260px", + gap: "10px" + } + }, [ + $el("button", { + textContent: "Cancel", + onclick: () => dialog.close(), + style: { + flex: "1", + padding: "8px", + backgroundColor: "#4a4a4a", + color: "#ffffff", + border: "none", + borderRadius: "4px", + cursor: "pointer", + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis" + } + }), + $el("button", { + textContent: "Select", + onclick: () => { + if (selectedVersion) { + onSelect(selectedVersion); + dialog.close(); + } else { + customAlert("Please select a version."); + } + }, + style: { + flex: "1", + padding: "8px", + backgroundColor: "#4CAF50", + color: "#ffffff", + border: "none", + borderRadius: "4px", + cursor: "pointer", + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis" + } + }), + ]) + ]); + + dialog.show(content); +} + +async function switchComfyUI() { + let res = await api.fetchApi(`/comfyui_manager/comfyui_versions`, { cache: "no-store" }); + + if(res.status == 200) { + let obj = await res.json(); + + let versions = []; + let default_version; + + for(let v of obj.versions) { + default_version = v; + versions.push(v); + } + + showVersionSelectorDialog(versions, obj.current, (selected_version) => { + api.fetchApi(`/comfyui_manager/comfyui_switch_version?ver=${selected_version}`, { cache: "no-store" }); + }); + } + else { + show_message('Failed to fetch ComfyUI versions.'); + } +} + + async function fetchUpdates(update_check_checkbox) { let prev_text = fetch_updates_button.innerText; fetch_updates_button.innerText = "Fetching updates..."; @@ -745,6 +821,14 @@ class ManagerMenuDialog extends ComfyDialog { () => updateComfyUI() }); + switch_comfyui_button = + $el("button.cm-button", { + type: "button", + textContent: "Switch ComfyUI", + onclick: + () => switchComfyUI() + }); + fetch_updates_button = $el("button.cm-button", { type: "button", @@ -803,8 +887,8 @@ class ManagerMenuDialog extends ComfyDialog { $el("button.cm-button", { type: "button", textContent: "Install via Git URL", - onclick: () => { - var url = prompt("Please enter the URL of the Git repository to install", ""); + onclick: async () => { + var url = await customPrompt("Please enter the URL of the Git repository to install", ""); if (url !== null) { install_via_git_url(url, self); @@ -815,6 +899,7 @@ class ManagerMenuDialog extends ComfyDialog { $el("br", {}, []), update_all_button, update_comfyui_button, + switch_comfyui_button, fetch_updates_button, $el("br", {}, []), @@ -838,6 +923,28 @@ class ManagerMenuDialog extends ComfyDialog { }), ]; + let migration_btn = + $el("button.cm-button-orange", { + type: "button", + textContent: "Migrate to New Node System", + onclick: () => migrateAPI() + }); + + migration_btn.style.display = 'none'; + + res.push(migration_btn); + + api.fetchApi('/manager/need_to_migrate') + .then(response => response.text()) + .then(text => { + if (text === 'True') { + migration_btn.style.display = 'block'; + } + }) + .catch(error => { + console.error('Error checking migration status:', error); + }); + return res; } @@ -856,7 +963,7 @@ class ManagerMenuDialog extends ComfyDialog { this.datasrc_combo.className = "cm-menu-combo"; this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'DB: Channel (1day cache)' }, [])); this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, [])); - this.datasrc_combo.appendChild($el('option', { value: 'url', text: 'DB: Channel (remote)' }, [])); + this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'DB: Channel (remote)' }, [])); // preview method let preview_combo = document.createElement("select"); @@ -875,32 +982,9 @@ class ManagerMenuDialog extends ComfyDialog { api.fetchApi(`/manager/preview_method?value=${event.target.value}`); }); - // nickname - let badge_combo = ""; - if(is_legacy_front()) { - badge_combo = document.createElement("select"); - badge_combo.setAttribute("title", "Configure the content to be displayed on the badge at the top right corner of the node. The ID is the identifier of the node. If 'hide built-in' is selected, both unknown nodes and built-in nodes will be omitted, making them indistinguishable"); - badge_combo.className = "cm-menu-combo"; - badge_combo.appendChild($el('option', { value: 'none', text: 'Badge: None' }, [])); - badge_combo.appendChild($el('option', { value: 'nick', text: 'Badge: Nickname' }, [])); - badge_combo.appendChild($el('option', { value: 'nick_hide', text: 'Badge: Nickname (hide built-in)' }, [])); - badge_combo.appendChild($el('option', { value: 'id_nick', text: 'Badge: #ID Nickname' }, [])); - badge_combo.appendChild($el('option', { value: 'id_nick_hide', text: 'Badge: #ID Nickname (hide built-in)' }, [])); - - api.fetchApi('/manager/badge_mode') - .then(response => response.text()) - .then(data => { badge_combo.value = data; badge_mode = data; }); - - badge_combo.addEventListener('change', function (event) { - api.fetchApi(`/manager/badge_mode?value=${event.target.value}`); - badge_mode = event.target.value; - app.graph.setDirtyCanvas(true); - }); - } - // channel let channel_combo = document.createElement("select"); - channel_combo.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list. Note that the badge utilizes local information."); + channel_combo.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list."); channel_combo.className = "cm-menu-combo"; api.fetchApi('/manager/channel_url_list') .then(response => response.json()) @@ -1024,7 +1108,6 @@ class ManagerMenuDialog extends ComfyDialog { this.datasrc_combo, channel_combo, preview_combo, - badge_combo, default_ui_combo, share_combo, component_policy_combo, @@ -1048,8 +1131,8 @@ class ManagerMenuDialog extends ComfyDialog { type: "button", textContent: "Install PIP packages", onclick: - () => { - var url = prompt("Please enumerate the pip packages to be installed.\n\nExample: insightface opencv-python-headless>=4.1.1\n", ""); + async () => { + var url = await customPrompt("Please enumerate the pip packages to be installed.\n\nExample: insightface opencv-python-headless>=4.1.1\n", ""); if (url !== null) { install_pip(url, self); @@ -1313,9 +1396,23 @@ class ManagerMenuDialog extends ComfyDialog { } } +async function getVersion() { + let version = await api.fetchApi(`/manager/version`); + return await version.text(); +} + app.registerExtension({ name: "Comfy.ManagerMenu", + + aboutPageBadges: [ + { + label: `ComfyUI-Manager ${await getVersion()}`, + url: 'https://github.com/ltdrdata/ComfyUI-Manager', + icon: 'pi pi-th-large' + } + ], + init() { $el("style", { textContent: style, @@ -1340,7 +1437,6 @@ app.registerExtension({ try { // new style Manager buttons - // unload models button into new style Manager button let cmGroup = new (await import("../../scripts/ui/components/buttonGroup.js")).ComfyButtonGroup( new(await import("../../scripts/ui/components/button.js")).ComfyButton({ @@ -1354,6 +1450,19 @@ app.registerExtension({ content: "Manager", classList: "comfyui-button comfyui-menu-mobile-collapse primary" }).element, + new(await import("../../scripts/ui/components/button.js")).ComfyButton({ + icon: "star", + action: () => { + if(!manager_instance) + setManagerInstance(new ManagerMenuDialog()); + + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.FAVORITES); + }, + tooltip: "Show favorite custom node list" + }).element, new(await import("../../scripts/ui/components/button.js")).ComfyButton({ icon: "vacuum-outline", action: () => { @@ -1443,32 +1552,6 @@ app.registerExtension({ this._addExtraNodeContextMenu(nodeType, app); }, - async nodeCreated(node, app) { - if(is_legacy_front()) { - if(!node.badge_enabled) { - node.getNickname = function () { return getNickname(node, node.comfyClass.trim()) }; - let orig = node.onDrawForeground; - if(!orig) - orig = node.__proto__.onDrawForeground; - - node.onDrawForeground = function (ctx) { - drawBadge(node, orig, arguments) - }; - node.badge_enabled = true; - } - } - }, - - async loadedGraphNode(node, app) { - if(is_legacy_front()) { - if(!node.badge_enabled) { - const orig = node.onDrawForeground; - node.getNickname = function () { return getNickname(node, node.type.trim()) }; - node.onDrawForeground = function (ctx) { drawBadge(node, orig, arguments) }; - } - } - }, - _addExtraNodeContextMenu(node, app) { const origGetExtraMenuOptions = node.prototype.getExtraMenuOptions; node.prototype.cm_menu_added = true; diff --git a/js/comfyui-share-common.js b/js/comfyui-share-common.js index d4b2567c..e6f3e103 100644 --- a/js/comfyui-share-common.js +++ b/js/comfyui-share-common.js @@ -4,6 +4,7 @@ import { $el, ComfyDialog } from "../../scripts/ui.js"; import { CopusShareDialog } from "./comfyui-share-copus.js"; import { OpenArtShareDialog } from "./comfyui-share-openart.js"; import { YouMLShareDialog } from "./comfyui-share-youml.js"; +import { customAlert } from "./common.js"; export const SUPPORTED_OUTPUT_NODE_TYPES = [ "PreviewImage", @@ -252,9 +253,9 @@ export const showShareDialog = async (share_option) => { if (potential_output_nodes.length === 0) { // todo: add support for other output node types (animatediff combine, etc.) const supported_nodes_string = SUPPORTED_OUTPUT_NODE_TYPES.join(", "); - alert(`No supported output node found (${supported_nodes_string}). To share this workflow, please add an output node to your graph and re-run your prompt.`); + customAlert(`No supported output node found (${supported_nodes_string}). To share this workflow, please add an output node to your graph and re-run your prompt.`); } else { - alert("To share this, first run a prompt. Once it's done, click 'Share'.\n\nNOTE: Images of the Share target can only be selected in the PreviewImage, SaveImage, and VHS_VideoCombine nodes. In the case of VHS_VideoCombine, only the image/gif and image/webp formats are supported."); + customAlert("To share this, first run a prompt. Once it's done, click 'Share'.\n\nNOTE: Images of the Share target can only be selected in the PreviewImage, SaveImage, and VHS_VideoCombine nodes. In the case of VHS_VideoCombine, only the image/gif and image/webp formats are supported."); } return false; } @@ -336,7 +337,7 @@ export class ShareDialogChooser extends ComfyDialog { key: "Copus", textContent: "Copus", website: "https://www.copus.io", - description: "🔴 Permanently store and secure ownership of your workflow on the open-source platform: Copus.io", + description: "🔴 Earn simple. Get paid from your ComfyUI workflows—no revenue sharing. Ever.", onclick: () => { showCopusShareDialog(); this.close(); @@ -356,7 +357,8 @@ export class ShareDialogChooser extends ComfyDialog { }); buttons.forEach(b => { - const button = $el("button", { + const button = $el("button", + { type: "button", textContent: b.textContent, onclick: b.onclick, @@ -369,8 +371,14 @@ export class ShareDialogChooser extends ComfyDialog { 'padding': '5px 5px', 'margin-bottom': '5px', 'transition': 'background-color 0.3s', + 'position':'relative' } - }); + }, + [ + $el("span", { style: { + } }), + ] + ); button.addEventListener('mouseover', () => { button.style.backgroundColor = '#007BFF'; // Change color on hover }); @@ -388,6 +396,28 @@ export class ShareDialogChooser extends ComfyDialog { }, }); + const copus_ui =$el("div", { style: { + 'position': 'absolute', + 'height': '100%', + 'left': '-25px', + 'top': '-26px', + 'width': '100%', + 'z-index':'-1', + 'background':'url("https://static.copus.io/images/client/202412/test/f28ac6ef8f4c6f3d5d50856a272ed02c.png")', + 'background-repeat': 'no-repeat', + } }); + const copus_ui_bottom =$el("div", { style: { + 'position': 'absolute', + 'height': '100%', + 'left': '25px', + 'bottom': '-26px', + 'width': '100%', + 'transform':'scale(-1, -1)', + 'z-index':'-1', + 'background':'url("https://static.copus.io/images/client/202412/test/f28ac6ef8f4c6f3d5d50856a272ed02c.png")', + 'background-repeat': 'no-repeat', + } }); + const websiteLink = $el("a", { textContent: "🌐 Website", href: b.website, @@ -417,7 +447,6 @@ export class ShareDialogChooser extends ComfyDialog { 'margin-bottom': '10px', } }, [button, websiteLink]); - const column = $el("div", { style: { 'flex-basis': '100%', @@ -426,8 +455,17 @@ export class ShareDialogChooser extends ComfyDialog { 'border': '1px solid #ddd', 'border-radius': '5px', 'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.1)', + 'position':'relative' } - }, [buttonLinkContainer, description]); + }, [buttonLinkContainer, description + , + b.key ==='Copus' ? + copus_ui + :'', + b.key ==='Copus' ? + copus_ui_bottom + :'', + ]); container.appendChild(column); }); @@ -475,7 +513,7 @@ export class ShareDialogChooser extends ComfyDialog { } show() { this.element.style.display = "block"; - this.element.style.zIndex = 10001; + this.element.style.zIndex = 1099; } } export class ShareDialog extends ComfyDialog { @@ -824,7 +862,7 @@ export class ShareDialog extends ComfyDialog { if (destinations.includes("matrix")) { let definedMatrixAuth = !!this.matrix_homeserver_input.value && !!this.matrix_username_input.value && !!this.matrix_password_input.value; if (!definedMatrixAuth) { - alert("Please set your Matrix account details."); + customAlert("Please set your Matrix account details."); return; } } @@ -841,9 +879,9 @@ export class ShareDialog extends ComfyDialog { if (potential_output_nodes.length === 0) { // todo: add support for other output node types (animatediff combine, etc.) const supported_nodes_string = SUPPORTED_OUTPUT_NODE_TYPES.join(", "); - alert(`No supported output node found (${supported_nodes_string}). To share this workflow, please add an output node to your graph and re-run your prompt.`); + customAlert(`No supported output node found (${supported_nodes_string}). To share this workflow, please add an output node to your graph and re-run your prompt.`); } else { - alert("To share this, first run a prompt. Once it's done, click 'Share'.\n\nNOTE: Images of the Share target can only be selected in the PreviewImage, SaveImage, and VHS_VideoCombine nodes. In the case of VHS_VideoCombine, only the image/gif and image/webp formats are supported."); + customAlert("To share this, first run a prompt. Once it's done, click 'Share'.\n\nNOTE: Images of the Share target can only be selected in the PreviewImage, SaveImage, and VHS_VideoCombine nodes. In the case of VHS_VideoCombine, only the image/gif and image/webp formats are supported."); } this.selectedOutputIndex = 0; this.close(); @@ -881,16 +919,16 @@ export class ShareDialog extends ComfyDialog { try { const response_json = await response.json(); if (response_json.error) { - alert(response_json.error); + customAlert(response_json.error); this.close(); return; } else { - alert("Failed to share your art. Please try again."); + customAlert("Failed to share your art. Please try again."); this.close(); return; } } catch (e) { - alert("Failed to share your art. Please try again."); + customAlert("Failed to share your art. Please try again."); this.close(); return; } diff --git a/js/comfyui-share-copus.js b/js/comfyui-share-copus.js index 318b1fe5..ef08c580 100644 --- a/js/comfyui-share-copus.js +++ b/js/comfyui-share-copus.js @@ -1,13 +1,15 @@ import { app } from "../../scripts/app.js"; import { $el, ComfyDialog } from "../../scripts/ui.js"; +import { customAlert } from "./common.js"; + const env = "prod"; let DEFAULT_HOMEPAGE_URL = "https://copus.io"; -let API_ENDPOINT = "https://api.client.prod.copus.io/copus-client"; +let API_ENDPOINT = "https://api.client.prod.copus.io"; if (env !== "prod") { - API_ENDPOINT = "https://api.dev.copus.io/copus-client"; + API_ENDPOINT = "https://api.test.copus.io"; DEFAULT_HOMEPAGE_URL = "https://test.copus.io"; } @@ -61,6 +63,7 @@ export class CopusShareDialog extends ComfyDialog { [$el("div.comfy-modal-content", {}, [...this.createButtons()])] ); this.selectedOutputIndex = 0; + this.selectedOutput_lock = 0; this.selectedNodeId = null; this.uploadedImages = []; this.allFilesImages = []; @@ -190,10 +193,36 @@ export class CopusShareDialog extends ComfyDialog { type: "text", placeholder: "Subtitle (Optional)", style: inputStyle, - maxLength: "70", + maxLength: "350", oninput: () => { const titleNum = this.SubTitleInput.value.length; - subTitleNumDom.textContent = `${titleNum}/70`; + subTitleNumDom.textContent = `${titleNum}/350`; + }, + }); + this.LockInput = $el("input", { + type: "text", + placeholder: "", + style: { + width: "100px", + padding: "7px", + borderRadius: "4px", + border: "1px solid #ddd", + boxSizing: "border-box", + }, + oninput: (event) => { + let input = event.target.value; + // Use a regular expression to match a number with up to two decimal places + const regex = /^\d*\.?\d{0,2}$/; + if (!regex.test(input)) { + // If the input doesn't match, remove the last entered character + event.target.value = input.slice(0, -1); + } + const numericValue = parseFloat(input); + if (numericValue > 9999) { + input = "9999"; + } + // Update the input field with the valid value + event.target.value = input; }, }); this.descriptionInput = $el("textarea", { @@ -297,7 +326,7 @@ export class CopusShareDialog extends ComfyDialog { color: "#999", }, }, - ["0/70"] + ["0/350"] ); const descriptionNumDom = $el( "label", @@ -333,6 +362,59 @@ export class CopusShareDialog extends ComfyDialog { // descriptionNumDom, ]); // switch between outputs section and additional inputs section + this.radioButtons_lock = []; + + this.radioButtonsCheck_lock = $el("input", { + type: "radio", + name: "output_type_lock", + value: "0", + id: "blockchain1_lock", + checked: true, + }); + this.radioButtonsCheckOff_lock = $el("input", { + type: "radio", + name: "output_type_lock", + value: "1", + id: "blockchain_lock", + }); + + const blockChainSection_lock = $el("div", { style: sectionStyle }, [ + $el("label", { style: labelStyle }, ["6️⃣ Pay to download"]), + $el( + "label", + { + style: { + marginTop: "10px", + display: "flex", + alignItems: "center", + cursor: "pointer", + }, + }, + [ + this.radioButtonsCheck_lock, + $el("div", { style: { marginLeft: "5px" ,display:'flex',alignItems:'center'} }, [ + $el("span", { style: { marginLeft: "5px" } }, ["ON"]), + $el("span", { style: { marginLeft: "20px",marginRight:'10px' ,color:'#fff'} }, ["Price US$"]), + this.LockInput + ]), + ] + ), + $el( + "label", + { style: { display: "flex", alignItems: "center", cursor: "pointer" } }, + [ + this.radioButtonsCheckOff_lock, + $el("span", { style: { marginLeft: "5px" } }, ["OFF"]), + ] + ), + + $el( + "p", + { style: { fontSize: "16px", color: "#fff", margin: "10px 0 0 0" } }, + ["Get paid from your workflow. You can change the price and withdraw your earnings on Copus."] + ), + ]); + this.radioButtons = []; this.radioButtonsCheck = $el("input", { @@ -350,7 +432,7 @@ export class CopusShareDialog extends ComfyDialog { }); const blockChainSection = $el("div", { style: sectionStyle }, [ - $el("label", { style: labelStyle }, ["6️⃣ Store on blockchain "]), + $el("label", { style: labelStyle }, ["7️⃣ Store on blockchain "]), $el( "label", { @@ -380,6 +462,8 @@ export class CopusShareDialog extends ComfyDialog { ["Secure ownership with a permanent & decentralized storage"] ), ]); + + // Message Section this.message = $el( "div", @@ -441,6 +525,7 @@ export class CopusShareDialog extends ComfyDialog { SubtitleSection, DescriptionSection, // contestSection, + blockChainSection_lock, blockChainSection, this.message, buttonsSection, @@ -520,7 +605,7 @@ export class CopusShareDialog extends ComfyDialog { this.shareButton.textContent = "Sharing..."; await this.share(); } catch (e) { - alert(e.message); + customAlert(e.message); } this.shareButton.disabled = false; this.shareButton.textContent = "Share"; @@ -543,6 +628,8 @@ export class CopusShareDialog extends ComfyDialog { subTitle: this.SubTitleInput.value, content: this.descriptionInput.value, storeOnChain: this.radioButtonsCheck.checked ? true : false, + lockState:this.radioButtonsCheck_lock.checked ? 2 : 0, + unlockPrice:this.LockInput.value, }; if (!this.keyInput.value) { @@ -557,6 +644,12 @@ export class CopusShareDialog extends ComfyDialog { throw new Error("Title is required"); } + if(this.radioButtonsCheck_lock.checked){ + if (!this.LockInput.value){ + throw new Error("Price is required"); + } + } + if (!this.uploadedImages.length) { if (this.selectedFile) { await this.uploadThumbnail(this.selectedFile); diff --git a/js/comfyui-share-openart.js b/js/comfyui-share-openart.js index 41038600..1c96a8c7 100644 --- a/js/comfyui-share-openart.js +++ b/js/comfyui-share-openart.js @@ -1,6 +1,7 @@ import {app} from "../../scripts/app.js"; import {api} from "../../scripts/api.js"; import {ComfyDialog, $el} from "../../scripts/ui.js"; +import { customAlert } from "./common.js"; const LOCAL_STORAGE_KEY = "openart_comfy_workflow_key"; const DEFAULT_HOMEPAGE_URL = "https://openart.ai/workflows/dev?developer=true"; @@ -431,7 +432,7 @@ export class OpenArtShareDialog extends ComfyDialog { this.shareButton.textContent = "Sharing..."; await this.share(); } catch (e) { - alert(e.message); + customAlert(e.message); } this.shareButton.disabled = false; this.shareButton.textContent = "Share"; diff --git a/js/comfyui-share-youml.js b/js/comfyui-share-youml.js index 80077b25..efd8916f 100644 --- a/js/comfyui-share-youml.js +++ b/js/comfyui-share-youml.js @@ -1,6 +1,7 @@ import {app} from "../../scripts/app.js"; import {api} from "../../scripts/api.js"; import {ComfyDialog, $el} from "../../scripts/ui.js"; +import { customAlert } from "./common.js"; const BASE_URL = "https://youml.com"; //const BASE_URL = "http://localhost:3000"; @@ -347,7 +348,7 @@ export class YouMLShareDialog extends ComfyDialog { this.shareButton.textContent = "Sharing..."; await this.share(); } catch (e) { - alert(e.message); + customAlert(e.message); } finally { this.shareButton.disabled = false; this.shareButton.textContent = "Share"; diff --git a/js/common.js b/js/common.js index 8847606f..51a67e03 100644 --- a/js/common.js +++ b/js/common.js @@ -2,22 +2,176 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js"; import { $el, ComfyDialog } from "../../scripts/ui.js"; + +function internalCustomConfirm(message, confirmMessage, cancelMessage) { + return new Promise((resolve) => { + // transparent bg + const modalOverlay = document.createElement('div'); + modalOverlay.style.position = 'fixed'; + modalOverlay.style.top = 0; + modalOverlay.style.left = 0; + modalOverlay.style.width = '100%'; + modalOverlay.style.height = '100%'; + modalOverlay.style.backgroundColor = 'rgba(0, 0, 0, 0.8)'; + modalOverlay.style.display = 'flex'; + modalOverlay.style.alignItems = 'center'; + modalOverlay.style.justifyContent = 'center'; + modalOverlay.style.zIndex = '1101'; + + // Modal window container (dark bg) + const modalDialog = document.createElement('div'); + modalDialog.style.backgroundColor = '#333'; + modalDialog.style.padding = '20px'; + modalDialog.style.borderRadius = '4px'; + modalDialog.style.maxWidth = '400px'; + modalDialog.style.width = '80%'; + modalDialog.style.boxShadow = '0 2px 8px rgba(0, 0, 0, 0.5)'; + modalDialog.style.color = '#fff'; + + // Display message + const modalMessage = document.createElement('p'); + modalMessage.textContent = message; + modalMessage.style.margin = '0'; + modalMessage.style.padding = '0 0 20px'; + modalMessage.style.wordBreak = 'keep-all'; + + // Button container + const modalButtons = document.createElement('div'); + modalButtons.style.display = 'flex'; + modalButtons.style.justifyContent = 'flex-end'; + + // Confirm button (green) + const confirmButton = document.createElement('button'); + if(confirmMessage) + confirmButton.textContent = confirmMessage; + else + confirmButton.textContent = 'Confirm'; + confirmButton.style.marginLeft = '10px'; + confirmButton.style.backgroundColor = '#28a745'; // green + confirmButton.style.color = '#fff'; + confirmButton.style.border = 'none'; + confirmButton.style.padding = '6px 12px'; + confirmButton.style.borderRadius = '4px'; + confirmButton.style.cursor = 'pointer'; + confirmButton.style.fontWeight = 'bold'; + + // Cancel button (red) + const cancelButton = document.createElement('button'); + if(cancelMessage) + cancelButton.textContent = cancelMessage; + else + cancelButton.textContent = 'Cancel'; + + cancelButton.style.marginLeft = '10px'; + cancelButton.style.backgroundColor = '#dc3545'; // red + cancelButton.style.color = '#fff'; + cancelButton.style.border = 'none'; + cancelButton.style.padding = '6px 12px'; + cancelButton.style.borderRadius = '4px'; + cancelButton.style.cursor = 'pointer'; + cancelButton.style.fontWeight = 'bold'; + + const closeModal = () => { + document.body.removeChild(modalOverlay); + }; + + confirmButton.addEventListener('click', () => { + closeModal(); + resolve(true); + }); + + cancelButton.addEventListener('click', () => { + closeModal(); + resolve(false); + }); + + modalButtons.appendChild(confirmButton); + modalButtons.appendChild(cancelButton); + modalDialog.appendChild(modalMessage); + modalDialog.appendChild(modalButtons); + modalOverlay.appendChild(modalDialog); + document.body.appendChild(modalOverlay); + }); +} + export function show_message(msg) { app.ui.dialog.show(msg); - app.ui.dialog.element.style.zIndex = 10010; + app.ui.dialog.element.style.zIndex = 1099; } export async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } +export async function customConfirm(message) { + try { + let res = await + window['app'].extensionManager.dialog + .confirm({ + title: 'Confirm', + message: message + }); + + return res; + } + catch { + let res = await internalCustomConfirm(message); + return res; + } +} + + +export function customAlert(message) { + try { + window['app'].extensionManager.toast.addAlert(message); + } + catch { + alert(message); + } +} + + +export async function customPrompt(title, message) { + try { + let res = await + window['app'].extensionManager.dialog + .prompt({ + title: title, + message: message + }); + + return res; + } + catch { + return prompt(title, message) + } +} + + export function rebootAPI() { if ('electronAPI' in window) { - window.electronAPI.restartApp(); - return true; - } - if (confirm("Are you sure you'd like to reboot the server?")) { + 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"); + } + catch(exception) {} + } + }); + + return false; +} + + +export async function migrateAPI() { + let confirmed = await customConfirm("When performing a migration, existing installed custom nodes will be renamed and the server will be restarted. Are you sure you want to apply this?\n\n(If you don't perform the migration, ComfyUI-Manager's start-up time will be longer each time due to re-checking during startup.)") + if (confirmed) { try { + await api.fetchApi("/manager/migrate_unmanaged_nodes"); api.fetchApi("/manager/reboot"); } catch(exception) { @@ -29,6 +183,7 @@ export function rebootAPI() { return false; } + export var manager_instance = null; export function setManagerInstance(obj) { diff --git a/js/components-manager.js b/js/components-manager.js index b2ccf43b..e2403d78 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -1,6 +1,6 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js" -import { sleep, show_message } from "./common.js"; +import { sleep, show_message, customConfirm, customAlert } from "./common.js"; import { GroupNodeConfig, GroupNodeHandler } from "../../extensions/core/groupNode.js"; import { ComfyDialog, $el } from "../../scripts/ui.js"; @@ -365,7 +365,7 @@ function checkVersion(name, component) { return msg; } -function handle_import_components(components) { +async function handle_import_components(components) { let msg = 'Components:\n'; let cnt = 0; for(let name in components) { @@ -387,8 +387,9 @@ function handle_import_components(components) { let last_name = null; msg += '\nWill you load components?\n'; - if(confirm(msg)) { - let mode = confirm('\nWill you save components?\n(cancel=load without save)'); + const confirmed = await customConfirm(msg); + if(confirmed) { + const mode = await customConfirm('\nWill you save components?\n(cancel=load without save)'); for(let name in components) { let component = components[name]; @@ -411,7 +412,7 @@ function handle_import_components(components) { } } -function handlePaste(e) { +async function handlePaste(e) { let data = (e.clipboardData || window.clipboardData); const items = data.items; for(const item of items) { @@ -421,7 +422,7 @@ function handlePaste(e) { let json_data = JSON.parse(data); if(json_data.kind == 'ComfyUI Components' && last_paste_timestamp != json_data.timestamp) { last_paste_timestamp = json_data.timestamp; - handle_import_components(json_data.components); + await handle_import_components(json_data.components); // disable paste node localStorage.removeItem("litegrapheditor_clipboard", null); @@ -455,7 +456,7 @@ export class ComponentBuilderDialog extends ComfyDialog { this.invalidateControl(); this.element.style.display = "block"; - this.element.style.zIndex = 10001; + this.element.style.zIndex = 1099; this.element.style.width = "500px"; this.element.style.height = "480px"; } @@ -621,7 +622,7 @@ export class ComponentBuilderDialog extends ComfyDialog { self.version_string.value = self.default_ver; } else { - alert('If you are not the author, it is not recommended to change the version, as it may cause component update issues.'); + customAlert('If you are not the author, it is not recommended to change the version, as it may cause component update issues.'); } }; @@ -677,7 +678,7 @@ export class ComponentBuilderDialog extends ComfyDialog { let orig_handleFile = app.handleFile; -function handleFile(file) { +async function handleFile(file) { if (file.name?.endsWith(".json") || file.name?.endsWith(".pack")) { const reader = new FileReader(); reader.onload = async () => { @@ -690,7 +691,7 @@ function handleFile(file) { } if(is_component) { - handle_import_components(jsonContent); + await handle_import_components(jsonContent); } else { orig_handleFile.call(app, file); diff --git a/js/custom-nodes-manager.js b/js/custom-nodes-manager.js index 7584e606..b4b4352a 100644 --- a/js/custom-nodes-manager.js +++ b/js/custom-nodes-manager.js @@ -1,8 +1,10 @@ import { app } from "../../scripts/app.js"; -import { $el } from "../../scripts/ui.js"; -import { - manager_instance, rebootAPI, install_via_git_url, - fetchData, md5, icons +import { ComfyDialog, $el } from "../../scripts/ui.js"; +import { api } from "../../scripts/api.js"; + +import { + manager_instance, rebootAPI, install_via_git_url, + fetchData, md5, icons, show_message, customConfirm, customAlert, customPrompt } from "./common.js"; // https://cenfun.github.io/turbogrid/api.html @@ -10,8 +12,8 @@ import TG from "./turbogrid.esm.js"; const pageCss = ` .cn-manager { - --grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - z-index: 10001; + --grid-font: -apple-system, BlinkMacSystemFont, "Segue UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + z-index: 1099; width: 80%; height: 80%; display: flex; @@ -28,11 +30,11 @@ const pageCss = ` .cn-manager button { font-size: 16px; color: var(--input-text); - background-color: var(--comfy-input-bg); - border-radius: 8px; - border-color: var(--border-color); - border-style: solid; - margin: 0; + background-color: var(--comfy-input-bg); + border-radius: 8px; + border-color: var(--border-color); + border-style: solid; + margin: 0; padding: 4px 8px; min-width: 100px; } @@ -53,6 +55,18 @@ const pageCss = ` color: white; } +.cn-manager .cn-manager-back { + align-items: center; + justify-content: center; +} + +.arrow-icon { + height: 1em; + width: 1em; + margin-right: 5px; + transform: translateY(2px); +} + .cn-manager-header { display: flex; flex-wrap: wrap; @@ -124,7 +138,7 @@ const pageCss = ` .cn-manager-grid .cn-node-desc a { color: #5555FF; - font-weight: bold; + font-weight: bold; text-decoration: none; } @@ -191,7 +205,7 @@ const pageCss = ` .cn-tag-list > div { background-color: var(--border-color); border-radius: 5px; - padding: 0 5px; + padding: 0 5px; } .cn-install-buttons { @@ -200,8 +214,8 @@ const pageCss = ` gap: 3px; padding: 3px; align-items: center; - justify-content: center; - height: 100%; + justify-content: center; + height: 100%; } .cn-selected-buttons { @@ -212,17 +226,17 @@ const pageCss = ` } .cn-manager .cn-btn-enable { - background-color: blue; + background-color: #333399; color: white; } .cn-manager .cn-btn-disable { - background-color: MediumSlateBlue; + background-color: #442277; color: white; } .cn-manager .cn-btn-update { - background-color: blue; + background-color: #1155AA; color: white; } @@ -247,41 +261,52 @@ const pageCss = ` } .cn-manager .cn-btn-uninstall { - background-color: red; + background-color: #993333; color: white; } +.cn-manager .cn-btn-reinstall { + background-color: #993333; + color: white; +} + +.cn-manager .cn-btn-switch { + background-color: #448833; + color: white; + +} + @keyframes cn-btn-loading-bg { - 0% { - left: 0; - } - 100% { - left: -105px; - } + 0% { + left: 0; + } + 100% { + left: -105px; + } } .cn-manager button.cn-btn-loading { - position: relative; - overflow: hidden; - border-color: rgb(0 119 207 / 80%); + position: relative; + overflow: hidden; + border-color: rgb(0 119 207 / 80%); background-color: var(--comfy-input-bg); } .cn-manager button.cn-btn-loading::after { - position: absolute; - top: 0; - left: 0; - content: ""; - width: 500px; - height: 100%; - background-image: repeating-linear-gradient( - -45deg, - rgb(0 119 207 / 30%), - rgb(0 119 207 / 30%) 10px, - transparent 10px, - transparent 15px - ); - animation: cn-btn-loading-bg 2s linear infinite; + position: absolute; + top: 0; + left: 0; + content: ""; + width: 500px; + height: 100%; + background-image: repeating-linear-gradient( + -45deg, + rgb(0 119 207 / 30%), + rgb(0 119 207 / 30%) 10px, + transparent 10px, + transparent 15px + ); + animation: cn-btn-loading-bg 2s linear infinite; } .cn-manager-light .cn-node-name a { @@ -312,7 +337,12 @@ const pageHtml = `