A collection of ComfyUI utility custom nodes. These provide functionality not offered in the core app or other custom nodes. Several nodes enhance existing ideas with improved UX and quality-of-life features.
- YFG Comical ComfyUI Custom Nodes
- Nodes
- Image Histograms Generator
- Image Histograms Generator (compact)
- Image Halftone Generator
- Image Side by Side
- Image to imgBB
- Smart Checkpoint Loader
- Mono Clip
- VAE Decode with Preview
- Image to Contrast Mask
- PixelArt
- Text Mask Overlay
- Image Switchers
- Random.org True Random Number
- Random.org True Random Number (V2)
- Random Image From Directory
- Examples
- All nodes as of 06-13-2024
- Acknowledgements
- Nodes
Table of contents generated with markdown-toc
Calculate image histograms for RGB channels and L (luminance); displays a graphical representation.
Reduces outputs to just two: Original and Histogram. Can self-preview (original or histogram) and forward the selected histogram downstream.
Based on original code by Phil Gyford and ComfyUI node by aimingfail.
Generates halftone from an input image; can self-display or send output to other nodes.
Creates a side-by-side or split image from two inputs. Optional self-preview, headers (font/size/color), and label toggles.
Example (side-by-side instead of split):
Upload and download images to/from imgBB. Includes nodes for downloading images and a URL “storage” node that keeps the original link alongside the workflow.
Create imgbb_api_key.json
under ./loaders/
:
{
"api_key": "YOUR_API_KEY_HERE"
}
Obtain a key at https://api.imgbb.com/.
Drop-in replacement for the core “Load Checkpoint,” but flattens complex directory trees so checkpoints appear as if in a single folder — ideal for sharing workflows.
Produces B/W or grayscale clipped images with three modes (each reversible). Useful for masks and stylization.
Based on original code by XSS.
VAE decode with inline preview and QoL options.
Based on original code by XSS.
Creates a grayscale contrast mask. Select low/high thresholds (1–255), optional blur.
Based on original code by XSS.
Generates pixel-art style images. Choose interpolation and pixel size.
Based on original Mosaic code by XSS.
Enhances the idea by Yuigahama Yui:
- Choose fonts from System, User, or local
./fonts/
directory. - Built-in Mask-to-Image conversion (no extra converter needed).
Example
![]() |
![]() |
---|---|
Original | Output |
Example workflow JSON (also embedded in the image below):
Based on the ComfyUI-Text node by Yuigahama Yui.
Multi-input image switchers (3, 5, 10, 15, 20 inputs). Provide a routing matrix, inline preview, and graceful handling of missing inputs (with user warnings). Designed to avoid “ganged” switcher confusion in complex workflows.
Modified version of the WAS node (original wasn’t functioning). Requires a Random.org account and API key.
Based on original code by WASasquatch.
Integrates with the random.org JSON-RPC API to generate true random numbers from atmospheric noise.
-
Secure API key handling
Key is not exposed in UI, workflow JSON, or image metadata. Loaded at runtime from:- Environment variable
RANDOM_ORG_API_KEY
, or - Local JSON file
random_org_api_key.json
next toRandomOrgV2.py
.
- Environment variable
-
Flexible outputs
Emits three types for broad node compatibility:NUMBER
FLOAT
INT
-
Optional uniqueness filtering (in-memory)
Avoid repeats within a Python session:ensure_unique
— toggle de-duplicationunique_scope
—"range"
(per[min, max]
) or"global"
(across all ranges)history_size
— how many values to remembertime_window_sec
— ignore duplicates older than this windowretry_limit
— extra draws to try before giving up
-
Backwards compatible
Old node remains available asRandomOrgTrueRandomNumber_node
.
New node isRandomOrgV2TrueRandomNumber_node
.
-
Create
random_org_api_key.json
next toRandomOrgV2.py
:{ "api_key": "YOUR_API_KEY_HERE" }
-
Or set an environment variable before launching ComfyUI:
export RANDOM_ORG_API_KEY=YOUR_API_KEY_HERE
On Windows (PowerShell):
setx RANDOM_ORG_API_KEY "YOUR_API_KEY_HERE"
-
Generate a random integer between 1 and 100
minimum = 1
maximum = 100
mode = random
-
Ensure no repeats in the current range
- Enable
ensure_unique
- Set
unique_scope = range
- Adjust
history_size
andtime_window_sec
- Enable
- Session-lifetime uniqueness resets when Python restarts.
- Persistence (disk-based history) may be added in a future version.
- API limits: Random.org quotas apply — check your dashboard.
This node selects a single image from a given directory (with optional recursion into subdirectories).
It supports true randomness (via Random.org integration if configured) or deterministic selection by index/filename.
It also tracks previously selected images so you can compare “current” vs “previous” outputs.
- Directory traversal
- Select only from the top folder, or include all subdirectories.
- Multiple selection modes
random
: choose a random image (true random if Random.org is enabled, otherwise local PRNG).by_index
: pick image by numeric index (safe wraparound).by_filename
: select a file by exact name or substring.by_query
: glob-style matching (*.png
,cat*
, etc.), random among matches.
- Uniqueness filtering
- Avoids repeating the same file within the same session.
- Scope can be per-directory or global.
- Adjustable
history_size
andtime_window_sec
for fine control.
- Metadata outputs
- Current/previous file info, image size, and SHA256 hash of the file.
- Also reports
total_count
= number of eligible images found.
image_directory
(string) – Path to the folder containing images.include_subdirs
(bool, default: True) – Whether to scan subdirectories.selection_mode
(choice, default: random) – Image selection method.index
(int) – Used whenselection_mode=by_index
.filename_query
(string) – Used whenselection_mode=by_filename
orby_query
.random_source
(choice, default: auto) –auto
: use Random.org if API key is configured, else local PRNG.local
: always use local PRNG.random_org
: force Random.org usage (requires API key).
ensure_unique
(bool) – Prevent repeats during a session.unique_scope
(choice) –"directory"
or"global"
.history_size
(int, default: 512) – Max remembered items.time_window_sec
(int, default: 0) – Forget items older than this many seconds.retry_limit
(int, default: 16) – Max retries when avoiding duplicates.
image
– The loaded image tensor.path_current
– Full path of the selected image (current).index_current
– Index of the selected image (current).filename_current
– Filename of the selected image.width
– Width of the image in pixels.height
– Height of the image in pixels.sha256
– SHA256 checksum of the file (useful for deduplication).total_count
– Total number of eligible images discovered in the directory (after filters).path_previous
– Full path of the image from the previous run.index_previous
– Index of the image from the previous run.
- To enable true randomness, place your API key in
random_org_api_key.json
next to the node:
-
Create
random_org_api_key.json
next toRandomOrgV2.py
:{ "api_key": "YOUR_API_KEY_HERE" }
-
Or set an environment variable before launching ComfyUI:
export RANDOM_ORG_API_KEY=YOUR_API_KEY_HERE
On Windows (PowerShell):
setx RANDOM_ORG_API_KEY "YOUR_API_KEY_HERE"
- Current vs previous outputs make it easy to compare selections.
- Session-lifetime uniqueness resets when Python restarts.
- Persistence future versions may add file-based persistence.
- API limits: Random.org quotas apply — check your dashboard.
If the embedded workflow doesn't load, use the JSON:
workflows/ComfyUI_YFG_Comical-Example-Workflow.json
Huge thanks to creators whose work inspires or integrates with these nodes:
…and many others. Thank you for your talent and generosity.