2026-06-01 10:37:30 +02:00
2026-06-01 10:37:30 +02:00
2026-06-01 10:37:30 +02:00
2026-06-01 10:37:30 +02:00
2026-06-01 10:37:30 +02:00
2026-03-21 11:16:39 +01:00
2026-03-21 11:16:39 +01:00
2026-06-01 10:37:30 +02:00
2026-06-01 10:37:30 +02:00
2026-06-01 10:37:30 +02:00
2026-06-01 10:37:30 +02:00

ComfyUI Nifty Nodes

A ComfyUI node pack focused on workflow organisation and flexibility. The centrepiece is a Bundle system for passing arbitrary named values through a single wire, alongside smart media loaders with built-in resize, a multi-LoRA loader, a full set of logic and switch nodes, image processing tools, latent utilities, and various quality-of-life helpers.

Installation

Clone the repository into your ComfyUI custom_nodes folder:

cd ComfyUI/custom_nodes
git clone https://github.com/Stibo/comfyui-nifty-nodes

Then restart ComfyUI. Optional dependencies for certain nodes:

pip install kornia        # reinhard_lab_gpu and perceptual_crossfade in Image Color Match
pip install color-matcher # additional color transfer methods in Image Color Match

Features

  • ComfyUI v3 native — built entirely on the comfy_api.latest API with proper define_schema, lazy evaluation, fingerprint_inputs caching and async execution where applicable
  • Bundle system — pass any number of named values through a single BUNDLE wire, with dot-notation support for nested structures
  • Smart media loaders — load images, videos or both with an integrated resize pipeline and optional frame rate control
  • Multi-LoRA loader — manage an entire LoRA stack in one node with per-row enable/disable and strength controls
  • Full logic suite — lazy and eager input switches, output routers, boolean operators, string/number comparisons and more
  • Image Color Match — 10 color transfer methods including GPU-accelerated options, batch multithreading and selective channel transfer
  • Search aliases on every node for fast discovery via the node search

Nodes

Bundle

The Bundle system lets you pack multiple values of any type into a single BUNDLE wire and unpack or access them wherever needed. This keeps graphs clean when many values need to travel together.

Bundle Pack

Packs up to 32 values of any type into a Bundle. An optional incoming Bundle can be merged — new values are added to it or overwrite existing keys.

Inputs
Name Type Required Default Description
bundle BUNDLE No — Existing bundle to merge into. New slot values overwrite keys with the same name.
value1 … value32 ANY No — Values to pack. Controlled by count.
count INT No 1 Number of value slots to show (1–32).
hide_links BOOL No False Hide the connection wires going into this node to reduce visual clutter.
Outputs
Name Type Description
bundle BUNDLE The resulting bundle containing all packed values.

Bundle Unpack

Unpacks a Bundle back into up to 32 individual outputs. Output labels are set by renaming the slots, matching the keys used when packing.

Inputs
Name Type Required Default Description
bundle BUNDLE Yes — The bundle to unpack.
count INT No 1 Number of output slots to show (1–32).
hide_links BOOL No False Hide the connection wires going out of this node to reduce visual clutter.
Outputs
Name Type Description
bundle BUNDLE The original bundle, passed through unchanged.
value1 … value32 ANY Unpacked values. Slots beyond count output None.

Bundle Get

Reads a single value from a Bundle by key.

Inputs
Name Type Required Default Description
bundle BUNDLE Yes — The bundle to read from.
key STRING Yes value1 Key to read. Supports dot notation for nested keys, e.g. settings.width.
Outputs
Name Type Description
value ANY The value at the given key, or None if the key does not exist.

Bundle Set

Writes or overwrites a single key in a Bundle.

Inputs
Name Type Required Default Description
bundle BUNDLE Yes — The bundle to update.
key STRING Yes value1 Key to write. Supports dot notation for nested keys, e.g. settings.width.
value ANY Yes — Value to store at the given key.
Outputs
Name Type Description
bundle BUNDLE Updated bundle. The original is not modified — a new copy is returned.
Slot Labels and Key Names

When you rename a slot in Bundle Pack or Bundle Unpack (double-click the slot label), the new name becomes the key used inside the bundle. The same label must be used on both ends for values to align correctly.

Dot Notation and Nesting

Keys use . as a path separator, allowing you to read and write into nested structures. For example:

Bundle Pack  →  slot label: "camera.fov"   →  value: 90
Bundle Get   →  key: "camera.fov"          →  returns: 90

You can nest arbitrarily deep: "render.output.format", "lora.0.strength", etc. Bundle Get and Bundle Set both support full dot-path access.

Merging Bundles

Bundle Pack accepts an optional incoming Bundle. Any values you pack are merged on top of it — existing keys are overwritten, other keys are preserved. This makes it easy to incrementally build up a shared parameter object across multiple nodes.


Media Loader

Load & Resize Media

The most versatile loader — accepts images and videos in a single node, with a built-in resize pipeline. A is_video boolean output lets you route the result differently depending on what was loaded.

Inputs
Name Type Required Default Description
file COMBO Yes none File to load. Supports image formats (jpg, png, webp, …), animated formats (gif, apng, webp, avif) and video formats (mp4, mkv, webm, …).
force_frame_rate INT No 0 Enforce a specific frame rate. 0 = keep original. Values like 24, 30 or 60 resample the video during loading.
resize DYNAMIC No off Resize mode to apply after loading — see Resize Modes.
Outputs
Name Type Description
IMAGE IMAGE Loaded frames as a batch tensor. None if file is none.
frames INT Total number of frames (1 for still images).
width INT Output width after any resize.
height INT Output height after any resize.
frame_rate INT Frame rate of the source (or the forced rate if set).
audio AUDIO Extracted audio track. Silent if the file has no audio.
is_video BOOL True if the loaded file is a video or animation, False for still images.

Load & Resize Video

Same as Load & Resize Media but restricted to video and animation file types.

Inputs / Outputs

Same as Load & Resize Media, minus the is_video output.

Load & Resize Image

Same as Load & Resize Media but restricted to image and animation file types. No frames, frame_rate or audio outputs.

Outputs
Name Type Description
IMAGE IMAGE Loaded image as a tensor. None if file is none.
width INT Output width after any resize.
height INT Output height after any resize.
Resize Modes

All three loaders share the same resize pipeline, available via the resize dropdown:

Mode Description
off No resize — load at original dimensions.
scale dimensions Scale to exact width × height. Optional center crop to avoid stretching.
scale by multiplier Scale both dimensions by a float multiplier.
scale longer dimension Scale so the longer side equals the given size, preserving aspect ratio.
scale shorter dimension Scale so the shorter side equals the given size, preserving aspect ratio.
scale width Scale to a specific width, preserving aspect ratio.
scale height Scale to a specific height, preserving aspect ratio.
scale total pixels Scale to a target megapixel count.
make divisible by Round dimensions to the nearest multiple (e.g. 16 for WAN).

All modes include a divisible_by option and separate scale method selectors for upscaling and downscaling:

Scale Method Best for
nearest-exact Fastest, pixel art / sharp pixel edges
bilinear / bicubic General purpose
area Downscaling — sharp, minimal aliasing
lanczos Upscaling — smooth, good detail retention
mitchell-netravali Sharp upscaling with minimal ringing
bilinear (antialias) / bicubic (antialias) Smooth downscaling with anti-aliasing
nvidia-rtx-vsr AI upscaling — requires an NVIDIA RTX GPU and the nvidia-vfx package

Lora Loader

Nifty Lora Loader

Applies a full LoRA stack to a model and CLIP in one node. Each row has its own enable toggle and strength slider. Rows with strength 0.0 or disabled are skipped entirely.

Inputs
Name Type Required Default Description
model MODEL Yes — Base model to apply LoRAs to.
clip CLIP Yes — CLIP model to apply LoRAs to.
loras NIFTY_LORA_LOADER Yes — LoRA stack widget. Add rows, pick a LoRA file, set strength and toggle enabled. Strength 1.0 = full effect, 0.5 = half, negative values invert.
Outputs
Name Type Description
MODEL MODEL Model with all enabled LoRAs applied in order.
CLIP CLIP CLIP with all enabled LoRAs applied in order.

Logic

A full set of flow control nodes. Most come in two variants: lazy (only evaluates the branch that will actually be used) and eager (evaluates both branches regardless).

Input Switch

Routes one of two inputs to the output based on a boolean. Lazy — the unused branch is never executed.

Inputs
Name Type Required Default Description
on_true ANY No — Passed through when boolean is True.
on_false ANY No — Passed through when boolean is False.
boolean BOOL Yes — Selector.
Outputs
Name Type Description
output ANY The selected input value.

Input Switch (Eager)

Same as Input Switch but both branches are always evaluated.

None Input Switch

Routes between on_exists and on_none depending on whether value is None. Lazy.

Inputs
Name Type Required Default Description
on_exists ANY No — Passed through when value is not None.
on_none ANY No — Passed through when value is None.
value ANY No — The value to check.
Outputs
Name Type Description
output ANY The selected branch.

None Input Switch (Eager)

Same as None Input Switch but both branches are always evaluated.

Index Input Switch

Routes one of up to 16 inputs to the output by index. Lazy — only the selected input is evaluated.

Inputs
Name Type Required Default Description
index INT Yes 1 Which input to pass through (1–16).
value1 … value16 ANY No — Auto-growing input list.
Outputs
Name Type Description
output ANY The value at the selected index, or None if the slot is not connected.

Index Input Switch (Eager)

Same as Index Input Switch but all inputs are always evaluated.

Output Switch

Routes a single input to either on_true or on_false. The unselected output is blocked (downstream nodes do not execute).

Inputs
Name Type Required Default Description
input ANY Yes — Value to route.
boolean BOOL No True True = route to on_true, False = route to on_false.
Outputs
Name Type Description
on_true ANY Active when boolean is True, blocked otherwise.
on_false ANY Active when boolean is False, blocked otherwise.

None Output Switch

Routes input to either on_exists or on_none depending on whether value is None.

Inputs
Name Type Required Default Description
input ANY No — Value to route.
value ANY No — Value to check for None.
Outputs
Name Type Description
on_exists ANY Active when value is not None.
on_none ANY Active when value is None.

Index Output Switch

Routes a single input to one of up to 16 outputs by index. All other outputs are blocked.

Inputs
Name Type Required Default Description
input ANY No — Value to route.
index INT Yes 1 Which output to route to (1–16).
Outputs
Name Type Description
value1 … value16 ANY Only the output at index is active; all others are blocked.

Signal Switch

Simple on/off gate. When passthrough is False, the output is blocked and all downstream nodes skip execution.

Inputs
Name Type Required Default Description
input ANY Yes — Value to gate.
passthrough BOOL No True True = pass through, False = block.
Outputs
Name Type Description
output ANY The input value, or blocked if passthrough is False.

First Switch

Returns the first non-None value from a list of up to 16 inputs. Lazy — inputs are evaluated one by one until a non-None value is found.

Inputs
Name Type Required Default Description
value1 … value16 ANY No — Auto-growing input list checked in order from top to bottom.
Outputs
Name Type Description
output ANY First non-None value found, or None if all inputs are None.

String Compare

Compares a string against a match value and returns a boolean.

Inputs
Name Type Required Default Description
string STRING Yes — The string to test.
match STRING Yes `` The value to compare against. An empty match always returns False.
comparison DYNAMIC Yes exact exact = full equality · contains = substring · starts with / ends with = prefix/suffix · regex = regular expression
case_sensitive BOOL No False Enable case-sensitive comparison.
negate BOOL No False Invert the result.
Outputs
Name Type Description
BOOL BOOL Result of the comparison.

Number Compare

Compares two numbers and returns a boolean.

Inputs
Name Type Required Default Description
a INT / FLOAT Yes — Left-hand operand.
b INT / FLOAT Yes — Right-hand operand.
comparison DYNAMIC Yes a == b a == b · a != b · a < b · a > b · a <= b · a >= b · a <= b <= c (range check)
negate BOOL No False Invert the result.
Outputs
Name Type Description
BOOL BOOL Result of the comparison.

Is None

Returns True if the input is None (not connected or explicitly None).

Inputs
Name Type Required Default Description
input ANY No — Value to check.
negate BOOL No False Invert — returns False when None, True otherwise.
Outputs
Name Type Description
BOOL BOOL True if input is None, False otherwise (before negation).

Int Switch / Float Switch / String Switch

Each returns one of two primitive values based on a boolean.

Inputs
Name Type Required Default Description
boolean BOOL No True Selector.
on_true INT / FLOAT / STRING No 0 / 0.0 / `` Returned when boolean is True.
on_false INT / FLOAT / STRING No 0 / 0.0 / `` Returned when boolean is False.

Combo Switch

Switches between two combo (dropdown) values based on a boolean. Each side has its own options list, defined as a pipe-separated string (option1|option2|option3). Also outputs the index of the selected value within its option list.

Inputs
Name Type Required Default Description
boolean BOOL No True Selector.
on_true COMBO No — Selected value when True.
true_options STRING No — Available options for on_true, separated by |.
on_false COMBO No — Selected value when False.
false_options STRING No — Available options for on_false, separated by |.
Outputs
Name Type Description
COMBO COMBO Selected combo value.
index INT Index of the selected value within its option list. -1 if not found.

Boolean AND / OR / XOR

Standard two-input boolean gates.

Boolean AND All / OR Any

Multi-input variants using an auto-growing input list (up to 16). AND All returns True only if every connected input is True. OR Any returns True if at least one is True.

Boolean NOT

Inverts a boolean value.

None

Outputs a None value. Useful as an explicit empty input for optional slots.


Image

Image Color Match

Transfers the color distribution of a reference image onto a target image. Supports 10 transfer methods, selective channel transfer, adjustable strength and batch multithreading.

Inputs
Name Type Required Default Description
image_target IMAGE No — Image whose colors will be adjusted.
image_ref IMAGE No — Reference image providing the color distribution.
enabled BOOL No True When disabled, image_target passes through unchanged.
method COMBO No mkl Color transfer algorithm — see Methods below.
transfer_mode COMBO No all all = full color transfer · color = hue/chroma only, keep original luminance · luminance = brightness only, keep original colors
strength FLOAT No 1.0 Blend amount. 1.0 = full match, 0.5 = half-way blend, values above 1.0 exaggerate the effect. Range 0.0–10.0.
multithread BOOL No True Process batch frames in parallel using multiple CPU threads. Recommended for large batches.
Outputs
Name Type Description
IMAGE IMAGE Color-matched image batch. None if either input is not connected.
Color Match Methods
Method Notes
mkl Monge-Kantorovich linear map — accurate and general purpose, recommended default
reinhard_lab Fast statistical match in LAB color space — CPU
reinhard_lab_gpu Same as above but GPU-accelerated — requires kornia
wavelet Structure-preserving, transfers low-frequency color info — good for textures
adain Adaptive instance normalisation — fast, works well for style-like transfers
hm Histogram matching
reinhard Classic Reinhard RGB
mvgd Multivariate Gaussian — requires color-matcher
hm-mvgd-hm Histogram + MVGD combo — requires color-matcher
hm-mkl-hm Histogram + MKL combo — requires color-matcher

Merge Image Batches

Concatenates two image batches with optional blending at the transition. Useful for stitching video segments.

Inputs
Name Type Required Default Description
source_images IMAGE No — First batch.
new_images IMAGE No — Second batch, appended after source.
overlap_mode DYNAMIC No none Transition mode — see below.
Overlap Mode Description
none Simple concatenation, no blending.
cut Remove overlap frames from the selected side before concatenating.
linear_blend Simple linear crossfade over the overlap region.
ease_in_out S-curve (smoothstep) crossfade — more natural motion.
filmic_crossfade Gamma-correct (2.2) crossfade — preserves perceived brightness.
perceptual_crossfade LAB color space crossfade — perceptually even transition. Requires kornia.
Outputs
Name Type Description
images IMAGE Merged batch. None if both inputs are disconnected.

Resize Image

Resizes an image or mask using the full Nifty resize pipeline. Accepts both IMAGE and MASK types.

Inputs
Name Type Required Default Description
input IMAGE / MASK Yes — Image or mask to resize.
resize DYNAMIC Yes — Resize mode — see Resize Modes.
Outputs
Name Type Description
resized IMAGE / MASK Resized output (same type as input).
width INT Output width.
height INT Output height.

Image From Batch

Extracts a slice from an image batch by start index and length.

Inputs
Name Type Required Default Description
image IMAGE Yes — Input batch.
batch_index INT No 0 Start index. Positive = from beginning, negative = from end (-1 = last image). Range −4096–4096.
length INT No 1 Number of images to take. -1 = all from start to end of batch. Range −1–4096.
Outputs
Name Type Description
IMAGE IMAGE Extracted slice.

Last Image From Batch

Shortcut to take the last N images from a batch.

Inputs
Name Type Required Default Description
image IMAGE Yes — Input batch.
length INT No 1 Number of images to take from the end (1–4096).
Outputs
Name Type Description
IMAGE IMAGE Last length images from the batch.

Latent

VAE Encode

Encodes an image batch into latents. Automatically detects the temporal compression factor of the VAE and can optionally encode only a subset of frames specified by a target latent count.

Inputs
Name Type Required Default Description
pixels IMAGE Yes — Image frames to encode.
vae VAE Yes — VAE model to use for encoding.
target_latents INT No 0 0 = encode all frames. Positive = encode only the first N latents' worth of frames. Negative = encode only the last N latents' worth. The temporal factor is detected automatically from the VAE.
Outputs
Name Type Description
LATENT LATENT Encoded latent samples.
IMAGE IMAGE The original pixel frames, passed through unchanged.

Normalize Video Latent Start

Normalises the statistics (mean and standard deviation) of the first few latent frames to match the subsequent frames. Helps reduce flicker or discontinuity at the beginning of a generated video.

Inputs
Name Type Required Default Description
latent LATENT Yes — Video latent to process. Passthrough if the latent has only 1 frame.
enabled BOOL No True When disabled, the latent is passed through unchanged.
start_frame_count INT No 4 Number of latent frames from the start to normalise (1–max).
reference_frame_count INT No 5 Number of frames immediately after the start region to use as the normalisation reference (1–max).
Outputs
Name Type Description
LATENT LATENT Latent with normalised start frames.

Latent From Batch

Extracts a slice from a latent batch by start index and length. Supports both 4D (image) and 5D (video) latents.

Inputs
Name Type Required Default Description
samples LATENT Yes — Input latent batch.
batch_index INT No 0 Start index. Positive = from beginning, negative = from end (-1 = last frame). Range −4096–4096.
length INT No 0 0 = all from start to end. Positive = first N frames. Negative = trim N frames from the opposite end (e.g. -1 = all except the last).
Outputs
Name Type Description
LATENT LATENT Extracted latent slice.

Last Latent From Batch

Shortcut to take the last N latents from a batch.

Inputs
Name Type Required Default Description
samples LATENT Yes — Input latent batch.
length INT No 1 Number of latents to take from the end (1–4096).
Outputs
Name Type Description
LATENT LATENT Last length latents from the batch.

Selectors

Lightweight selector nodes that output a filename or name string. They exist to keep your actual loader nodes clean — connect these to a loader and swap models or settings without touching the loader itself.

Diffusion Model Selector

Selects a diffusion model file from the unet / diffusion_models folder. Supports .safetensors, .gguf, .pt, .pth, .bin.

Outputs
Name Type Description
model ANY Selected model filename string.
is_gguf BOOL True if the selected file has a .gguf extension.

Clip Selector

Selects a CLIP / text encoder model file from the clip / text_encoders folder.

Outputs
Name Type Description
clip ANY Selected model filename string.
is_gguf BOOL True if the selected file has a .gguf extension.

Sampler Selector

Selects a sampler name from the full list of available ComfyUI samplers.

Scheduler Selector

Selects a scheduler name from the full list of available ComfyUI schedulers.


String

Any To String

Converts one or more values of any type to a single string. Booleans become true/false, None becomes "none", everything else uses str().

Inputs
Name Type Required Default Description
value1 … value16 ANY No — Auto-growing list of values to convert. None values are excluded.
mode DYNAMIC No delimiter delimiter = join all values with a separator string · pattern = insert values into a template using $1, $2, … placeholders (e.g. "$1_$2" with hello and world → "hello_world")
Outputs
Name Type Description
string STRING Resulting string.

String Split

Splits a string into a list by a delimiter.

Inputs
Name Type Required Default Description
string STRING Yes — String to split. Must be connected.
delimiter STRING No \n Split character or string. Use \n for newline, \t for tab.
trim BOOL No False Trim leading and trailing whitespace from each part.
Outputs
Name Type Description
list STRING List of string parts.

String Join

Joins a list of strings into a single string.

Inputs
Name Type Required Default Description
list STRING Yes — List to join. Must be connected.
delimiter STRING No \n Separator inserted between each item. Use \n for newline, \t for tab.
Outputs
Name Type Description
string STRING Joined string.

Number

Nifty Math

Evaluates a free-form mathematical expression using up to 16 named inputs (a–p). Unconnected slots default to 0. The result is cast to all three output types simultaneously.

Inputs
Name Type Required Default Description
a … p INT / FLOAT No 0 Auto-growing variable inputs. The first two (a, b) are always visible; additional slots appear as needed up to 16.
expression STRING Yes a + b Expression to evaluate. See supported syntax below.
Outputs
Name Type Description
int INT Result cast to integer (truncated, not rounded).
float FLOAT Result as a float.
boolean BOOL False if result is 0 or 0.0, True otherwise.
Supported Syntax
Category Examples
Arithmetic a + b, a - b, a * b, a / b, a // b, a % b, a ** b
Comparisons a == b, a != b, a < b, a > b, a <= b, a >= b
Boolean logic a and b, a or b, not a
Ternary a if a > 0 else b
Math functions abs, round, min, max, pow, sqrt, floor, ceil, log, log2, log10, exp
Trig sin, cos, tan, asin, acos, atan, atan2, radians, degrees, hypot
Helpers clamp(v, lo, hi), lerp(a, b, t), remap(v, a, b, c, d)
Constants pi, tau, e, inf

Division by zero returns 0. Any other expression error raises a descriptive exception.


Nifty Seed

A seed node with integrated New Seed and Random on Prompt controls. Clicking New Seed immediately randomises the seed. Random on Prompt automatically generates a new random seed every time the queue is triggered.

Inputs
Name Type Required Default Description
seed INT No 0 Seed value (0–1125899906842624).
Outputs
Name Type Description
seed INT The seed value, clamped to the valid range.

Utils

Experimental workflow organisation and debugging nodes.

Passes any value through unchanged while hiding the connection wire on the incoming side. Useful for keeping graphs readable when a connection has to cross a large distance.

Bypass By Title

Bypasses a set of nodes by title when a boolean is True. Node titles are matched case-insensitively and support partial matches.

Inputs
Name Type Required Default Description
bypass BOOL No False When True, the listed nodes are bypassed.
nodes STRING No `` Node titles to bypass, one per line.
search_from_root BOOL No True Search in the root graph even when called from inside a subgraph.
enforce BOOL No True Actively enforce the bypass state so it cannot be overridden.

Bypass Switch By Title

A multi-option version of Bypass By Title. Each option has its own label and list of nodes to bypass. Selecting an option bypasses all nodes in that option's list and activates the others.

Node Chain Extender

Dynamically duplicates a node and chains the copies together, connecting specified slots between adjacent links.

Subgraph Labels

Assigns display labels to up to 10 subgraph ports. Experimental — requires subgraph support in your ComfyUI version.

Simple Title

A display-only node showing a text label in the graph. Useful for annotating sections of a workflow.

Debug Any

Displays any value as a text preview below the node. Primitives are shown as-is; complex types are serialized to JSON.

Preview Any

Displays up to 16 values simultaneously as inline text previews. For image tensors, shows a summary (N images, WxH) rather than rendering the images.

S
Description
No description provided
Readme
223 KiB
Languages
Python 74.2%
JavaScript 25.8%