Blend Joiner
BlendJoiner crossfades, wipes, and glitches between two clips
- clip_a
- clip_b
- frames_out
- clip_b_passthrough
- transition_mask
- blend_info
- frame_rate
ComfyUI is great at making video and genuinely bad at cutting it together. There's no built-in transition node - you generate clip A, generate clip B, and the seam between them becomes somebody else's problem (usually ffmpeg's, or a whole separate editor's). BlendJoiner is the node that closes that gap: it takes two clips, runs one of 100+ shader-based transitions between them, and hands you a finished frame sequence you can encode and post.
It ships in ComfyUI_BlendPack from SKBv0 (the author posts on Reddit as skbphy), which landed in r/comfyui in January 2026 and drew the comment that sums the whole idea up: "We're finally embracing our video editor's side of the pipeline." That's exactly what this is.
How it works
The clever part is where the rendering happens. The node's custom UI runs a WebGL preview in your browser, so you pick an engine (Dissolve, Wipe, Zoom, Light, Glitch, Morph, and more) and a variant, then scrub the timeline live to see the transition before you commit. When you hit run, it serializes your choices into a JSON _settings string and either sends pre-rendered frames up from the browser or lets the backend render with ModernGL. If neither is available, it falls back to a CPU crossfade - meaning your fancy glitch silently degrades to a plain dissolve unless you watch the blend_info output. The blend progression is a cubic bezier curve, which is why the easing eases instead of just sliding linearly.
No model files, no weights, nothing to download. This is all shaders and linear algebra, which is also why it's fast: it's a post-processing node, not a generation node.
Inputs and outputs
The two inputs that matter are clip_a and clip_b, and they're forgiving - each accepts an IMAGE tensor or a VIDEO, and the code even digs a file path out of common video-loader objects (VHS-style nodes with a path accessor). You'll also want resolution_mode: auto matches clip A's size, max uses the larger of the two, and custom lets you set custom_width/custom_height (64–4096, stepped by 8) when the clips don't match up.
This is a regular node, not an output node, so wire its sockets somewhere:
frames_out(IMAGE) - the blended transition frames. Feed this to BlendVideoCombine (the pack's sibling export node) or any video saver.transition_mask(MASK) - a per-frame grayscale blend progression, handy if you want to composite or key something off the transition.frame_rate(FLOAT) - the fps the blend used. Wire it to your encoder so output speed matches.blend_info(STRING) - JSON debug: which backend rendered, which shader ran, target resolution, frame count.clip_b_passthrough(IMAGE) - clip B as the node saw it, for downstream use.
The one input you should not hand-edit is _settings. It's the JSON bucket the UI fills with engine, variant, duration, intensity, and easing - type in there and you'll break the pretty frontend.
Install
Same story as every custom node. Via ComfyUI Manager, search "ComfyUI BlendPack"; or:
cd ComfyUI/custom_nodes/
git clone https://github.com/SKBv0/ComfyUI_BlendPack.git
cd ComfyUI_BlendPack
pip install -r requirements.txt
Then restart ComfyUI. The requirements are moderngl, opencv-python, numpy, torch, and Pillow - all things you almost certainly already have.
Gotchas
- If ModernGL fails to load, every engine becomes the CPU crossfade. Check
blend_info- it tells you which backend actually rendered, so you're not shipping a "glitch" that's secretly a dissolve. - The
use_source_fpsoption only works when the input carries fps metadata. A plain IMAGE tensor has none, so it falls back to 30 fps. - Video inputs are capped at the first 1000 frames when decoded. Fine for clips; a surprise if you feed it a full movie.
- The WebGL UI is exactly the kind of frontend-dependent code that ComfyUI's Nodes 2.0 rendering rewrite tends to break. If the preview panel misbehaves after an update, fall back to the legacy canvas.
If you're stitching Wan or LTX clips into one continuous video, this is the node that does the stitching inside ComfyUI instead of in an external editor.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_a | IMAGE,VIDEO | — | |
| clip_b | IMAGE,VIDEO | — | |
| _settingsopt | STRING | {} | — |
| resolution_modeopt | COMBO | auto | 3 options: auto, max, custom |
| custom_widthopt | INT | 51264–4096 | — |
| custom_heightopt | INT | 51264–4096 | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| frames_out | IMAGE | — |
| clip_b_passthrough | IMAGE | — |
| transition_mask | MASK | — |
| blend_info | STRING | — |
| frame_rate | FLOAT | — |