Home

Awesome

<h1 align="center"> rgthree-comfy <br> <sub><sup><i>Making ComfyUI more comfortable!</i></sup></sub> <br> </h1> <p align="center"> <a href="#️-the-nodes">The Nodes</a> &nbsp; | &nbsp; <a href="#-improvements--features">Improvements & Features</a> &nbsp; | &nbsp; <a href="#-link-fixer">Link Fixer</a> </p> <hr>

A collection of nodes and improvements created while messing around with ComfyUI. I made them for myself to make my workflow cleaner, easier, and faster. You're welcome to try them out. But remember, I made them for my own use cases :)

Context Node

Get Started

Install

  1. Install the great ComfyUi.
  2. Clone this repo into custom_modules:
    cd ComfyUI/custom_nodes
    git clone https://github.com/rgthree/rgthree-comfy.git
    
  3. Start up ComfyUI.

Settings

You can configure certain aspect of rgthree-comfy. For instance, perhaps a future ComfyUI change breaks rgthree-comfy, or you already have another extension that does something similar and you want to turn it off for rgthree-comfy.

You can get to rgthree-settings by right-clicking on the empty part of the graph, and selecting rgthree-comfy > Settings (rgthree-comfy) or by clicking the rgthree-comfy settings in the ComfyUI settings dialog.

(Note, settings are stored in an rgthree_config.json in the rgthree-comfy directory. There are other advanced settings that can only be configured there; You can copy default settings from rgthree_config.json.default before rgthree_config.json before modifying).

<br>

✴️ The Nodes

Note, you can right-click on a bunch of the rgthree-comfy nodes and select 🛟 Node Help menu item for in-app help when available.

Seed

An intuitive seed control node for ComfyUI that works very much like Automatic1111's seed control.

<details> <summary>ℹ️ <i>See More Information</i></summary>

Router Node

</details>

Reroute

Keep your workflow neat with this much improved Reroute node with, like, actual rerouting with multiple directions and sizes.

<details> <summary>ℹ️ <i>More Information</i></summary>

Router Node

</details>

Bookmark (🔖)

Place the bookmark node anywhere on screen to quickly navigate to that with a shortcut key.

<details> <summary>ℹ️ <i>See More Information</i></summary> </details>

Context / Context Big

Pass along in general flow properties, and merge in new data. Similar to some other node suites "pipes" but easier merging, is more easily interoperable with standard nodes by both combining and exploding all in a single node.

<details> <summary>ℹ️ <i>More Information</i></summary>

Context Node

</details>

Image Comparer

The Image Comparer node compares two images on top of each other.

<details> <summary>ℹ️ <i>More Information</i></summary>

Image Inset Crop

The node that lets you crop an input image by either pixel value, or percentage value.

Display Any

Displays most any piece of text data from the backend after execution.

Power Lora Loader

A super-simply Lora Loader node that can load multiple Loras at once, and quick toggle each, all in an ultra-condensed node.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Lora Loader Stack

Deprecated. Used the Power Lora Loader instead.

A simplified Lora Loader stack. Much like other suites, but more interoperable with standard inputs/outputs.

Power Prompt

Power up your prompt and get drop downs for adding your embeddings, loras, and even have saved prompt snippets.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Power Prompt - Simple

Same as Power Prompt above, but without LORA support; made for a slightly cleaner negative prompt (since negative prompts do not support loras).

SDXL Power Prompt - Positive

The SDXL sibling to the Power Prompt above. It contains the text_g and text_l as separate text inputs, as well a couple more input slots necessary to ensure proper clipe encoding. Combine with

SDXL Power Prompt - Simple

Like the non-SDXL Power Prompt - Simple node, this one is essentially the same as the SDXL Power Prompt but without lora support for either non-lora positive prompts or SDXL negative prompts (since negative prompts do not support loras).

SDXL Config

Just some configuration fields for SDXL prompting. Honestly, could be used for non SDXL too.

Context Switch / Context Switch Big

A powerful node to branch your workflow. Works by choosing the first Context input that is not null/empty.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Any Switch

A powerful node to similar to the Context Switch above, that chooses the first input that is not null/empty.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Fast Groups Muter

The Fast Groups Muter is an input-less node that automatically collects all groups in your current workflow and allows you to quickly mute and unmute all nodes within the group.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Fast Groups Bypasser

Same as Fast Groups Muter above, but sets the connected nodes to "Bypass" instead of "Mute"

Fast Muter

A powerful 'control panel' node to quickly toggle connected nodes allowing them to quickly be muted or enabled

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Fast Bypasser

Same as Fast Muter but sets the connected nodes to "Bypass"

Fast Actions Button

Oh boy, this node allows you to semi-automate connected nodes and/or ConfyUI.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Node Collector

Used to cleanup noodles, this will accept any number of input nodes and passes it along to another node.

⚠️ Currently, this should really only be connected to Fast Muter, Fast Bypasser, or Mute / Bypass Relay.

Mute / Bypass Repeater

A powerful node that will dispatch its Mute/Bypass/Active mode to all connected input nodes or, if in a group w/o any connected inputs, will dispatch its Mute/Bypass/Active mode to all nodes in that group.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Mute / Bypass Relay

An advanced node that, when working with a Mute / Bypass Repeater, will relay its input nodes' modes (Mute, Bypass, or Active) to a connected repeater (which would then repeat that mode change to all of its inputs).

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Random Unmuter

An advanced node used to unmute one of its inputs randomly when the graph is queued (and, immediately mute it back).

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Label

A purely visual node, this allows you to add a floating label to your workflow.

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Advanced Techniques

First, a word on muting

A lot of the power of these nodes comes from Muting. Muting is the basis of correctly implementing multiple paths for a workflow utlizing the Context Switch node.

While other extensions may provide switches, they often get it wrong causing your workflow to do more work than is needed. While other switches may have a selector to choose which input to pass along, they don't stop the execution of the other inputs, which will result in wasted work. Instead, Context Switch works by choosing the first non-empty context to pass along and correctly Muting is one way to make a previous node empty, and causes no extra work to be done when set up correctly.

To understand muting, is to understand the graph flow

Muting, and therefore using Switches, can often confuse people at first because it feels like muting a node, or using a switch, should be able to stop or direct the forward flow of the graph. However, this is not the case and, in fact, the graph actually starts working backwards.

If you have a workflow that has a path like ... > Context > KSampler > VAE Decode > Save Image it may initially feel like you should be able to mute that first Context node and the graph would stop there when moving forward and skip the rest of that workflow.

But you'll quickly find that will cause an error, becase the graph doesn't actually move forward. When a workflow is processed, it first moves backwards starting at each "Output Node" (Preview Image, Save Image, even "Display String" etc.) and then walking backwards to all possible paths to get there.

So, with that ... > Context > KSampler > VAE Decode > Save Image example from above, we actually want to mute the Save Image node to stop this path. Once we do, since the output node is gone, none of these nodes will be run.

Let's take a look at an example.

A powerful combination: Using Context, Context Switch, & Fast Muter

Context Node

  1. Using the Context Switch (aqua colored in screenshot) feed context inputs in order of preference. In the workflow above, the Upscale Out context is first so, if that one is enabled, it will be chosen for the output. If not, the second input slot which comes from the context rerouted from above (before the Upscaler booth) will be chosen.

    • Notice the Upscale Preview is after the Upscale Out context node, using the image from it instead of the image from the upscale VAE Decoder. This is on purpose so, when we disable the Upscale Out context, none of the Upscaler nodes will run, saving precious GPU cycles. If we had the preview hooked up directly to the VAE Decoder the upscaler would always run to generate the preview, even if we had the Upscale Out context node disabled.
  2. We can now disable the Upscale Out context node by muting it. Highlighting it and pressing ctrl + m will work. By doing so, it's output will be None, and it will not pass anthing onto the further nodes. In the diagram you can see the Upscale Preview is red, but that's OK; there are no actual errors to stop execution.

  3. Now, let's hook it up to the Fast Muter node. The Fast Muter node works as dashboard by adding quick toggles for any connected node (ignoring reroutes). In the diagram, we have both the Upscaler Out context node, and the Save File context node hooked up. So, we can quickly enable and disable those.

    • The workflow seen here would be a common one where we can generate a handful of base previews cheaply with a random seed, and then choose one to upscale and save to disk.
  4. Lastly, and optionally, you can see the Node Collector. Use it to clean up noodles if you want and connect it to the muter. You can connect anything to it, but doing so may break your workflow's execution.

<br>

⚡ Improvements & Features

rgthree-comfy adds several improvements, features, and optimizations to ComfyUI that are not directly tied to nodes.

Progress Bar

A minimal progress bar that run alongs the top of the app window that shows the queue size, the current progress of the a prompt execution (within the same window), and the progress of multi-step nodes as well.

<i>You can remove/enable from rgthree-comfy settings, as well as configure the height/size.</i>

ComfyUI Recursive Optimization

🎉 The newest version of ComfyUI no longer suffers from poor execution recursion! This feature has been removed from rgthree-comfy.

"Queue Selected Output Nodes" in right-click menu

Sometimes you want to just queue one or two paths to specific output node(s) without executing the entire workflow. Well, now you can do just that by right-clicking on an output node and selecting Queue Selected Output Nodes (rgthree).

<details> <summary>ℹ️ <i>More Information</i></summary> </details>

Auto-Nest Subdirectories in long Combos

(Off by default while experimenting, turn on in rgthree-comfy settings).

Automatically detect top-level subdirectories in long combo lists (like, Load Checkpoint) and break out into sub directories.

Quick Mute/Bypass Toggles in Group Headers

(Off by default while experimenting, turn on in rgthree-comfy settings).

Adds a mute and/or bypass toggle icons in the top-right of Group Headers for one-click toggling of groups you may be currently looking at.

Import Individual Node Widgets (Drag & Drop)

(Off by default while experimenting, turn on in rgthree-comfy settings).

Allows dragging and dropping an image/JSON workflow from a previous generation and overriding the same node's widgets (that match with the same id & type). This is useful if you have several generations using the same general workflow and would like to import just some data, like a previous generation's seed, or prompt, etc.

"Copy Image" in right-click menu

Right clicking on a node that has an image should have a context-menu item of "Copy Image" will allow you to copy the image right to your clipboard

<i>🎓 I believe this has graduated, with ComfyUI recently adding this setting too. You won't get two menu items; my code checks that there isn't already a "Copy Image" item there before adding it.</i>

Other/Smaller Fixes

<br>

📄 Link Fixer

If your workflows sometimes have missing connections, or even errors on load, start up ComfyUI and go to http://127.0.0.1:8188/rgthree/link_fixer which will allow you to drop in an image or workflow json file and check for and fix any bad links.

You can also enable a link fixer check in the rgthree-comfy settings to give you an alert if you load a workflow with bad linking data to start.