〽️ Image Ops Append
Glue video clips into one timeline without leaving ComfyUI
- image_1
- image_2
- image
- frame_count
- width
- height
ImageOps Append is the node that takes several image or video batches and concatenates them into one frame sequence - think "join clips on a timeline," not "blend two pictures on top of each other." The latter is ImageOps Merge or ImageOps Comp. This one is about time: clip A plays, then clip B, then clip C, out pops a single batch that your video encoder or preview node treats as one clip. It's a small thing until you need it, and then it's the exact thing you need.
How it works
You get dynamic image_1, image_2, … slots - the preview UI adds more as you plug things in. Each clip is a batch of frames [B, H, W, C], which is how ComfyUI represents both still-image batches and decoded video frames. Append stacks them along the batch axis in order.
The interesting part is trims_json, a UI-managed JSON blob that stores per-clip trim data. Instead of importing each clip at full length, you trim it right on the node's preview before it gets appended - so you can cut the dead head off clip B without adding a separate trim node per input. Nice touch for video work.
fit_mode decides how to reconcile clips that don't share a resolution:
strict- every clip must match the first's dimensions, or it errors. Predictable, but rigid.resize_to_first- later clips get resized to the first clip's size. What it says on the tin.pad_to_max- clips are centered on a black canvas sized to the largest connected clip, so nothing gets squeezed. Best when you're mixing aspect ratios.
bypass returns just the first trimmed clip - handy for checking a single segment.
What comes out
The outputs are image (the concatenated batch), plus frame_count, width, and height as plain INTs. That frame count is the bit people overlook: feed it into anything that wants to know how long the sequence is (a loop count, a scheduler, a prompt schedule) and you never have to count frames by hand.
Where it fits
The batch-first design of this whole pack means Append shines in animation and video pipelines. A typical chain: several generated clips → Append → ImageOps FrameRange (to trim or loop the join) → an animated WebP/GIF preview or a video writer. It also makes batch-to-video prompts a lot more pleasant - generate shot-by-shot, then append instead of re-running the whole graph.
Install and gotchas
From ComfyUI Manager, search "ComfyUI-Majoor-ImageOps", or:
cd ComfyUI/custom_nodes
git clone https://github.com/MajoorWaldi/ComfyUI-Majoor-ImageOps
Restart and hard-refresh (Ctrl+F5 / Cmd+Shift+R). No models to download, no heavy dependencies - this pack is plain Python + torch.
The failure mode to expect is resolution mismatch: plug a 512×512 clip into a 1024×1024 sequence under strict and you'll get a dimension error. That's not a bug - switch to pad_to_max or resize_to_first. Also worth knowing: trims_json is managed by the preview UI, so if you hand-edit a saved workflow's JSON and get a blank clip, it's usually a malformed trim - reset it in the node's UI rather than fighting the text.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| bypass | BOOLEAN | false | — |
| fit_mode | COMBO | strict | How to align two clips before concatenating their frame batches. |
| trims_json | STRING | {"version":1,"clips":[]} | Managed by the Append preview controls. |
| image_1opt | IMAGE,VIDEO | — | |
| image_2opt | IMAGE,VIDEO | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| frame_count | INT | — |
| width | INT | — |
| height | INT | — |