Stitch Clips (FXI)
Join your chained clips without the one-frame hitch
- chain
- images_1
- images_2
- images_3
- images_4
- images
- frame_count
Every frame-chaining tutorial skips the part where the result looks broken. When clip 2 is generated from clip 1's last frame, that frame exists twice: once at the end of clip 1 and again as clip 2's first frame. Concatenate them naively and you get a one-frame hitch at every single seam - the exact stutter you went through all this trouble to avoid.
Stitch Clips (FXI) is the node that joins the chain and deletes those duplicates. Core ComfyUI can concatenate image batches (Image Batch, or a Video Combine node), but nothing drops the seam frame, so this is the piece that makes a chain actually watchable.
How it works
Feed it the chain from your last Frame Chain Step, optionally plus up to four loose clips, and it does this in order:
- Collects the chain first, then
images_1throughimages_4in input order (unconnected slots are skipped). - Checks sizes. Every clip has to match. The default is to stop with an error that names the offending clip and both resolutions - see the widget below.
- Drops the seam. With
drop_seam_frameson, frame 0 of every clip after the first is removed. That's the duplicated frame. A one-frame clip is left alone rather than emptied. - Applies the ramp, if you set one, to each clip individually.
- Concatenates everything into one
[frames, H, W, C]image batch you can hand to Create Video or Save Animated WEBP.
The retiming in step 4 is frame picking, not interpolation: a speed of 2 keeps every other frame, 0.5 repeats frames. So it's lossless and instant, but slow motion done this way looks steppy - put a real frame-interpolation pass after it if smoothness matters.
The widgets a beginner actually sets
Four are required and only the first two matter at the start:
drop_seam_frames(BOOLEAN, default on) - keep it on for a genuine frame chain. Turn it off if you're usingimages_1–images_4to butt unrelated clips together, because otherwise you're chopping a perfectly good first frame off each one for no reason.resize(default error) - what to do when clips come in at different sizes.resize to first clipscales everything to clip 1's dimensions (bilinear). The default erroring out is a feature: it tells you which clip is the odd size instead of quietly softening your whole output.ramp_fast,ramp_hold,ramp_split- the optional two-speed move.ramp_splitis the fraction of each clip played atramp_fast, the rest atramp_hold;0.5 / 2.0 / 1.0is the classic "2x on the camera travel, normal speed on the hold." Leave them at1 / 1 / 0.5and timing is untouched.
Outputs are images (the joined batch) and frame_count (total frames out). Yes, there's an fps knob waiting for you downstream - Create Video takes it, and 16fps is the usual for Wan-family output.
Install
Manager → Custom Nodes Manager → search FXI Frame Chain. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/fueledximagination/comfyui-fxi-frame-chain.git
# restart ComfyUI
No pip install step; the pack depends only on torch. All three nodes land under FXI/frame chain. If you want to test Stitch Clips on its own before wiring a real chain, examples/frame-chain-smoke-test.api.json in the repo fakes two clips from ComfyUI's bundled example.png and spits out a 15-frame animated WEBP - no models required.
Where people get burned
Mismatched clip sizes. This is the first-run failure: you upscale clip 2, or generate it at a different aspect, and Stitch stops on you. Either resize to first clip, or keep every generation at one resolution for the whole chain.
The ramp eats frames and nobody warns you. An 81-frame clip with ramp_fast 2.0 / ramp_hold 1.0 / ramp_split 0.5 comes out around 61 frames, because the first half is resampled down to every other frame. Shortening is intended; just don't be surprised when your 5-second clip becomes 3.8 seconds. Check frame_count and do the arithmetic per clip.
Mixing sources errors out on channels. Clips with a different channel count (RGBA batches next to plain RGB) raise rather than blend. Rare, but it happens if you're stitching in something from a matting or compositing branch.
Expecting stitching to fix continuity. Dropping the seam frame removes the stutter; it doesn't stop the brightness drift or the identity drift that accumulates across generations. The clip boundary is still the weak point of any long chain - the frame count going in is honest about that.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| drop_seam_frames | BOOLEAN | true | Drop the first frame of every clip after the first. In a frame chain it repeats the previous clip's last frame and causes a stutter. |
| ramp_fast | FLOAT | 1.000.25–8 | Speed of the first part of each clip (the camera travel). 1 = normal, 2 = twice as fast. |
| ramp_hold | FLOAT | 1.000.25–8 | Speed of the rest of each clip (the hold). 1 = normal speed. |
| ramp_split | FLOAT | 0.500–1 | Fraction of each clip played at ramp_fast before switching to ramp_hold. |
| resize | COMBO | What to do when clips have different sizes. | |
| chainopt | FXI_FRAME_CHAIN | Clips collected by Frame Chain Step. Stitched first, in order. | |
| images_1opt | IMAGE | Extra clip, appended after the chain in input order. | |
| images_2opt | IMAGE | Extra clip, appended after the chain in input order. | |
| images_3opt | IMAGE | Extra clip, appended after the chain in input order. | |
| images_4opt | IMAGE | Extra clip, appended after the chain in input order. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| frame_count | INT | — |