Nodes/ComfyUI-Majoor-ImageOps/〽️ Image Ops Append
ComfyUI Node

〽️ Image Ops Append

Glue video clips into one timeline without leaving ComfyUI

By MajoorWaldi·Created 8 months ago·Updated 8 days ago· 11
〽️ Image Ops Append
  • image_1
  • image_2
  • image
  • frame_count
  • width
  • height
bypassfalse
fit_modestrict
trims_json{"version":1,"clips":[]}

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.

Categoryimage/imageops

Inputs (5)

NameTypeDefaultDescription
bypassBOOLEANfalse
fit_modeCOMBOstrictHow to align two clips before concatenating their frame batches.
trims_jsonSTRING{"version":1,"clips":[]}Managed by the Append preview controls.
image_1optIMAGE,VIDEO
image_2optIMAGE,VIDEO

Outputs (4)

NameTypeDescription
imageIMAGE
frame_countINT
widthINT
heightINT