ComfyUI Extension: πΈ YFG Comical Nodes
Run ComfyUI workflows without the setup
No installs, no CUDA version roulette, no GPU sitting idle on your bill. Bring a workflow and run it in the browser.
Utility custom nodes for special effects, image manipulation and quality of life tools.
Looking for a different extension?
Custom Nodes (24)
- π― YFG 10 Image Switcher
- π― YFG 15 Image Switcher
- π― YFG 20 Image Switcher
- π― YFG Image To Contrast Mask
- π― YFG Image to imgBB
- π― YFG 3 Image Switcher
- π― YFG 5 Image Switcher
- π― YFG Image Halftone Generator
- π― YFG Histograms Generator
- π― YFG Histograms Generator (compact)
- π― YFG Image Side by Side
- π― YFG imgBB to Image
- π― YFG Monochrome Image Clip
- π― YFG PixelArt
- π― YFG Random Image From Directory
- π― YFG Random.org True Random Number
- π― YFG Random.org True Random Number (V2)
- π― YFG Smart Checkpoint Loader
- π― YFG Store URL
- π― YFG Text Mask Overlay
- π― YFG VAE Decode with Preview
- π― YFG CivitAI MetaSave
- π― YFG Display Value
- π― YFG Random Prompt From File
README
YFG Comical ComfyUI Custom Nodes
</div>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
- Random Prompt From File
- Display Value
- CivitAI MetaSave
- Live Preview Panel
- Power Lora Loader Extras
- Examples
- All nodes as of 06-13-2024
- Acknowledgements
- Nodes
<small><i><a href="http://ecotrust-canada.github.io/markdown-toc/">Table of contents generated with markdown-toc</a></i></small>
Nodes
Image Histograms Generator

Calculate image histograms for RGB channels and L (luminance); displays a graphical representation.
Image Histograms Generator (compact)

Reduces outputs to just two: Original and Histogram. Can self-preview (original or histogram) and forward the selected histogram downstream.
Image Halftone Generator

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.
Image Side by Side

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):

Image to imgBB

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.
Setup
Create imgbb_api_key.json under ./loaders/:
{
"api_key": "YOUR_API_KEY_HERE"
}
Obtain a key at https://api.imgbb.com/.
Smart Checkpoint Loader

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.
Mono Clip

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 Preview

VAE decode with inline preview and QoL options.
Based on original code by XSS.
Image to Contrast Mask

Creates a grayscale contrast mask. Select low/high thresholds (1β255), optional blur.
Based on original code by XSS.
PixelArt
![]()
Generates pixel-art style images. Choose interpolation and pixel size.
Based on original Mosaic code by XSS.
Text Mask Overlay

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
| <a href="img/textMaskOverlay01original.png"><img src="img/textMaskOverlay01original.png" alt="Text Mask Overlay Example" width="400"/></a> | <a href="img/textMaskOverlay01.png"><img src="img/textMaskOverlay01.png" alt="Text Mask Overlay Example" width="400"/></a> | | :-: | :-: | | Original | Output |
Example workflow JSON (also embedded in the image below):
Based on the ComfyUI-Text node by Yuigahama Yui.
Image Switchers

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.

Random.org True Random Number

Modified version of the WAS node (original wasn't functioning). Requires a Random.org account and API key.
Based on original code by WASasquatch.
Random.org True Random Number (V2)

Integrates with the random.org JSON-RPC API to generate true random numbers from atmospheric noise.
β¨ Features
-
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.jsonnext toRandomOrgV2.py.
- Environment variable
-
Flexible outputs
Emits three types for broad node compatibility:NUMBERFLOATINT
-
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.
π API Key Setup
-
Create
random_org_api_key.jsonnext toRandomOrgV2.py:{ "api_key": "YOUR_API_KEY_HERE" } -
Or set an environment variable before launching ComfyUI:
export RANDOM_ORG_API_KEY=YOUR_API_KEY_HEREOn Windows (PowerShell):
setx RANDOM_ORG_API_KEY "YOUR_API_KEY_HERE"
βοΈ Example Usage
-
Generate a random integer between 1 and 100
minimum = 1maximum = 100mode = random
-
Ensure no repeats in the current range
- Enable
ensure_unique - Set
unique_scope = range - Adjust
history_sizeandtime_window_sec
- Enable
π Notes
- 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.
Random Image From Directory

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.
β¨ Features
- Built-in directory browser
- π Browse for Directory button opens a navigable server-side folder picker β no need to type paths manually.
- π Recent Directories button shows an MRU list of previously used directories for quick re-selection.
- Used directories are saved automatically to
yfg_dir_history.jsonon each run.
- Inline output value display
- Key output values (
index_current,width,height,total_count,index_previous) are shown directly on the output slots after each run β no external display nodes needed. 
- Key output values (
- 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 (clamped to valid range β no wrap-around).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_sizeandtime_window_secfor 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.
π§ Input Parameters
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_filenameorby_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.show_preview(bool, default: False) β Show a preview thumbnail on the node after each run.retry_limit(int, default: 16) β Max retries when avoiding duplicates.
π₯οΈ Outputs
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.
π Random.org Setup (optional)
- To enable true randomness, place your API key in
random_org_api_key.jsonnext to the node:
-
Create
random_org_api_key.jsonnext toRandomOrgV2.py:{ "api_key": "YOUR_API_KEY_HERE" } -
Or set an environment variable before launching ComfyUI:
export RANDOM_ORG_API_KEY=YOUR_API_KEY_HEREOn Windows (PowerShell):
setx RANDOM_ORG_API_KEY "YOUR_API_KEY_HERE"
π Notes
- Current vs previous outputs make it easy to compare selections.
- Session-lifetime uniqueness resets when Python restarts.
- Directory history is persisted to
yfg_dir_history.jsonand survives restarts (max 50 entries). - API limits: Random.org quotas apply β check your dashboard.
Random Prompt From File

Selects a single prompt entry from a .txt prompt file using true random.org numbers (or local PRNG). Outputs positive, negative, and name text directly β no additional nodes or wiring required.
β¨ Features
- Built-in file browser
- π Browse for File button opens a navigable server-side file picker showing directories and
.txtfiles, with a live prompt count badge per file. - π Recent Files button shows an MRU list of previously used files for quick re-selection.
- Used files are saved automatically to
yfg_file_history.jsonon each run.
- π Browse for File button opens a navigable server-side file picker showing directories and
- Auto range population
range_startandrange_endfill automatically (0 and totalβ1) whenever a file is selected β no manual entry needed.
- Last-N toggle
last_n_onlyrestricts the random pool to the last N entries in the file β ideal when new prompts are appended to the bottom and you want to pick only from the newest additions.
- Inline output value display
index_current,index_previous, andtotal_countare shown directly on the output slots after each run.
- INDEX auto-sync
- The INDEX widget updates automatically after every run so switching to
by_indexmode requires no manual typing.
- The INDEX widget updates automatically after every run so switching to
- True random.org integration
- Uses the same Random.org API key as the Random Number nodes β no separate setup needed.
- Uniqueness filtering
- Avoids repeating prompts within a session with configurable history size and time window.
- Shuffle bag
- Cycles through all prompts in the pool before repeating, then reshuffles β guarantees uniform coverage.
π Prompt File Format
positive: your positive prompt here
negative: ugly, deformed, watermark
----
positive: second prompt
negative:
name: Optional Label
----
- Entries separated by any number of hyphens (
-,--,----) on their own line negative:content may be emptyname:is optional β defaults to the filename stem- Leading/trailing separator lines are silently ignored
- UTF-8 encoding required
π§ Input Parameters
prompt_file(string) β Path to the.txtprompt file. Use π Browse or π Recent buttons.selection_mode(choice, default: random) βrandompicks fromrange_start..range_end;by_indexuses the INDEX widget directly.index(int) β Used whenselection_mode=by_index. Auto-syncs after every run.range_start(int, default: 0) β First prompt index in the random pool. Auto-fills to 0 when a file is selected.range_end(int, default: 0) β Last prompt index in the random pool. Auto-fills to totalβ1 when a file is selected. 0 = last prompt.last_n_only(bool, default: False) β When ON, restricts the pool to the last N entries only.last_n_count(int, default: 100) β How many entries from the end to include whenlast_n_onlyis ON.random_source(choice, default: auto) βauto,local, orrandom_org.ensure_unique(bool, default: True) β Avoid repeating prompts within a session.history_size(int, default: 100) β How many recent indices to track for uniqueness.time_window_sec(int, default: 0) β Forget entries older than this many seconds.retry_limit(int, default: 20) β Max attempts before falling back to last candidate.use_shuffle_bag(bool, default: True) β Cycle through all prompts before repeating, then reshuffle.
π₯οΈ Outputs
positiveβ Positive prompt text.negativeβ Negative prompt text (empty string if not specified in file).nameβ Prompt name from thename:field, or filename stem if omitted.index_currentβ 0-based index of the selected prompt. Auto-syncs to INDEX widget.index_previousβ Index of the prompt selected in the previous run this session.total_countβ Total number of valid prompts found in the file.
π Random.org Setup (optional)
Uses the same random_org_api_key.json file as the Random Number nodes β see Random.org True Random Number (V2) for setup instructions.
π Notes
- Session-lifetime uniqueness resets when Python restarts.
- File history is persisted to
yfg_file_history.jsonand survives restarts (max 20 entries). - File cache β parsed prompt files are cached in memory keyed by modification time. Re-parsing only occurs when the file changes on disk β zero overhead on repeat runs.
- API limits: Random.org quotas apply β check your dashboard.
Display Value

A minimal utility node that displays any value β INT, FLOAT, or STRING β inline in both the node body and the title bar. Designed to replace large display nodes (like ShowText or Display Int) wherever a compact read-only indicator is all that's needed.
β¨ Features
- Title bar display β value shown as
value | labelso it's always visible even when the node is collapsed to its smallest size. - In-body display β green value rendered in the node body when expanded, no extra height added.
- Rename to label β double-click the node title in ComfyUI to set a custom label (e.g.
Index,Width,Seed). The value is appended automatically after each run. - Any type β accepts
INT,FLOAT, orSTRINGon the single input slot via wildcard. - Persistent β last value is saved into the workflow JSON and pre-filled on reload.
π§ Inputs
value(any) β The value to display.
π Notes
- No outputs β this is a pure display/monitoring node.
- The node title format is
value | label. Rename the node to change the label; the value portion updates automatically on each run.
CivitAI MetaSave

Saves images with full A1111-compatible metadata embedded so that CivitAI automatically recognizes and displays generation info β model, LoRA weights, embeddings, sampler settings, seed, and prompts β exactly as it does for Automatic1111 outputs.
A single node replaces the two-node workflow required by other metadata extensions. Four optional custom key/value extra-metadata pairs are built directly into the node β no helper nodes required.
Compatible with classic SD (KSampler, KSamplerAdvanced), Flux, SD3, Ideogram, SamplerCustomAdvanced, LoRA, and upscale workflows.
β¨ Features
- CivitAI auto-recognition β embeds the
parameterstext chunk that CivitAI parses for resources, prompts, and settings, identical to A1111 output. - Multi-format output β PNG, JPEG, or WebP, each with an optional sidecar workflow JSON.
- EXIF embedding β JPEG and WebP outputs also receive EXIF UserComment metadata so CivitAI can read them regardless of format.
- Model & resource hashing β SHA-256 hashes (first 10 hex chars) for checkpoint, VAE, LoRA, and embedding files are computed and cached on disk to avoid redundant re-hashing.
- LoRA detection β finds LoRA weights from both LoraLoader nodes and inline
<lora:name:weight>syntax in the prompt text. - Filename tokens β supports
%date:yyyy-MM-dd%,%seed%,%model%,%pprompt:32%,%nprompt:32%,%width%,%height%in the filename prefix. - Subdirectory support β optional sub-folder creation inside the output directory, also supporting date tokens.
- Metadata scope control β choose what gets embedded: full, default, parameters only, workflow only, or none.
- Four inline extra metadata slots β attach custom key/value pairs (e.g. workflow name, prompt index, project tag) without any additional nodes.
π§ Input Parameters
images(IMAGE) β Images to save.filename_prefix(string, default:ComfyUI) β Output filename prefix. Supports tokens:%date:yyyy-MM-dd%,%seed%,%model%,%pprompt:32%,%nprompt:32%,%width%,%height%.subdirectory_name(string) β Optional sub-folder inside the output directory. Supports%date%tokens. Leave blank to use the default output folder.output_format(choice, default:png_with_json) β Image format. The*_with_jsonvariants also write a sidecar.jsonworkflow file.png/png_with_jsonjpg/jpg_with_jsonwebp/webp_with_json
quality(choice, default:max) β Output quality level. Ignored for PNG.maxβ 100 (lossless WebP)highβ 80mediumβ 60lowβ 30
metadata_scope(choice, default:full) β Controls what metadata is embedded.fullβ A1111 parameters string + full ComfyUI workflow JSONdefaultβ same as the built-in SaveImage nodeparameters_onlyβ A1111-style parameters string onlyworkflow_onlyβ ComfyUI workflow JSON onlynoneβ no metadata
include_batch_num(bool, default:false) β Append a 5-digit batch index to the filename when saving multiple images.prefer_nearest(bool, default:true) β When multiple upstream nodes provide the same field, prefer the one closest (fewest graph hops) to this node.extra_key1/extra_value1(string, optional) β Custom metadata key/value pair 1.extra_key2/extra_value2(string, optional) β Custom metadata key/value pair 2.extra_key3/extra_value3(string, optional) β Custom metadata key/value pair 3.extra_key4/extra_value4(string, optional) β Custom metadata key/value pair 4.
π Notes
piexifmust be installed (pip install piexif). It is listed as a dependency inpyproject.tomland should install automatically via ComfyUI Manager.- Hash cache is stored in
civitai_metasave/.cache/model_hash_cache.json. Hashes are computed once per file and reused on subsequent runs β no performance penalty after the first generation. - Steps are required for full metadata. If no Steps value is found upstream, the parameters string is skipped and a warning is printed to the console. This is a CivitAI requirement, not a bug.
- Workflow attribution β derived from comfyui_image_metadata_extension by edelvarden which itself was a fork of ComfyUI-SaveImageWithMetaData. Maintained and extended independently as part of YFG Comical.
Live Preview Panel

A floating, draggable live preview window that mirrors the KSampler preview so you can watch generation progress from anywhere in your workflow β no more panning back and forth to the sampler node to check on a render or catch a bad generation early.
This is a pure frontend extension β it has no node, no inputs, and no outputs. It simply appears as a floating panel over the canvas, similar to ComfyUI's built-in minimap. Under the hood it listens to the same websocket events (progress and b_preview) that drive the KSampler's own inline preview, so it adds zero backend overhead.
β¨ Features
- Live preview image β updates in real time as the sampler works, exactly like the in-node preview.
- Progress bar & step counter β shows
step N / M (%)for the currently executing node. - Executing node indicator β displays the title and ID of whichever node is currently running (e.g.
βΆ KSampler (#53)). - π Cancel button β interrupts the current generation from anywhere, without touching the sampler node.
- Drag & resize β move it by the header, resize from the bottom-right grip. Position and size are remembered between sessions.
- Collapse & hide β
βcollapses to just the title bar;βhides the panel (it reappears automatically on the next run). - Keyboard toggle β
Alt+Shift+Lshows/hides the panel at any time. - Settings switch β a master on/off toggle in ComfyUI Settings (search for "YFG"): π― Enable Live Preview panel. When off, the panel never appears, even during generations.
π Notes
- Previews require ComfyUI's preview generation to be enabled (the default). If you launch ComfyUI with
--preview-method none, the panel will still show progress and the executing node, but no image. - The panel auto-appears whenever a generation starts (unless disabled in Settings). If you close it with
β, it comes back on the next run β or pressAlt+Shift+Lto bring it back immediately. - The hotkey deliberately avoids
Alt+Shift+P, which is reserved by Microsoft Edge for tab grouping.
Power Lora Loader Extras
(companion enhancement, no new node)

A pure frontend enhancement for rgthree's Power Lora Loader (rgthree) node β adds sort, bulk strength control, randomization, and drag-and-drop reordering directly to its own right-click menu. No new node type, nothing to wire up: just right-click any Power Lora Loader on your canvas.
β¨ Features
- π― YFG: Sort Loras β reorder the lora list by Name (A-Z/Z-A), Strength (High-Low/Low-High), or Enabled First.
- π― YFG: Nudge All Strengths β bump every lora's strength up or down in sync (
+0.05/-0.05/+0.10/-0.10), or reset all back to1.0in one click. - π― YFG: Randomize
- Randomize Strengthsβ¦ β prompts for a
min,maxrange and assigns each lora a random strength within it. - Randomize On/Off (by % chance)β¦ β prompts for a percent chance (0β100), rolled independently for each lora. This is a per-lora coin-flip, not a target count β e.g. asking for
20%on a list of 30 loras means each one has a 1-in-5 chance of landing on, so the total enabled will vary run to run (often somewhere around 6, but not always). - Enable Exactly N Lorasβ¦ β prompts for a whole number and turns on exactly that many, chosen at random, with the rest off. Use this instead of the percent option if you want a specific count every time.
- π Auto-Randomize Each Queue Run β toggle to re-roll strengths/on-off automatically before each individual run in a queued batch. (Experimental β not yet confirmed reliable on all ComfyUI frontend versions.)
- Randomize Strengthsβ¦ β prompts for a
- π― YFG: Get Trigger Words β pulls trigger/trained words for the selected loras straight from rgthree's own cached CivitAI info (the same data behind its "Show Info" dialog) and shows them in a copyable dialog.
- Enabled Loras Only / All Loras β choose the scope before fetching.
- Handles both short curated CivitAI word lists and raw tag-frequency data (the kind extracted directly from a lora's training captions), deduplicating across all selected loras into one combined list.
- No extra backend needed β this calls rgthree's own already-running
/rgthree/api/loras/infoendpoint directly, so it works out of the box wherever rgthree-comfy is installed. - Loras with no cached CivitAI info (never run through "Show Info," or genuinely untagged) are listed separately at the end so you know what's missing rather than being silently skipped.
- π― YFG: Reorder Panel (drag & drop) β opens a floating panel listing all loras; drag rows into the order you want and click "Apply & Close."
Reorder panel:

π Notes
- All changes (order, strengths, on/off state) are saved directly in the Power Lora Loader's own widget values β the workflow JSON remains 100% standard rgthree-comfy format, so files stay fully portable to installs that don't have this extension.
- Requirement: rgthree-comfy must be installed. This ships as part of
ComfyUI_YFG_Comicaland loads automatically β no extra install step. - Get Trigger Words only returns data rgthree already has cached for a lora. If a lora has never had its info fetched (via rgthree's own "Show Info" on that row, or a CivitAI match), it'll show up in the "no trigger words found" list rather than triggering a fresh lookup.
- Right-click directly on a lora row to get rgthree's own built-in menu (Show Info / Toggle / Move Up-Down / Remove) β the π― additions live on the node's general right-click menu instead, so both work side by side.
Examples
Sample Workflow

If the embedded workflow doesn't load, use the JSON:
workflows/ComfyUI_YFG_Comical-Example-Workflow.json
All nodes as of 06-13-2024

Acknowledgements
Huge thanks to creators whose work inspires or integrates with these nodes:
β¦and many others. Thank you for your talent and generosity.
Run ComfyUI workflows without the setup
No installs, no CUDA version roulette, no GPU sitting idle on your bill. Bring a workflow and run it in the browser.
