LTXV Multi Concat (N Frames)
Put N keyframes inside an LTX latent without the attention tax
- positive
- negative
- vae
- latent
- images
- positive
- negative
- latent
LTX Video has supported keyframe conditioning since 0.9.5, and the community has been stretching it ever since - storyboard-style videos where you pin several images as "this frame must look like this" and let the model animate between them. The stock way to do that, LTXVAddGuide, works by adding your images to the attention context as guide tokens. It works, but every token costs speed and memory, and LTX's whole selling point is speed. LTXV Multi Concat (N Frames) from the AnotherUtils pack takes the other route: it injects your reference images directly into the latent itself, inpainting-style, with a noise mask telling the model "this frame is fixed, don't touch it."
No attention tokens involved. The model sees your keyframes through the latent channels and the noise mask, the same mechanism inpainting uses - which is why the pack calls it faster than guiding. If you've been fighting the guide-token route for multi-keyframe LTX, this is the alternative worth trying.
How it works
You hand it your LTX conditioning, the VAE, an empty (or seeded) LTX latent, and a batch of images. For each image it encodes it to a single-frame latent at video resolution, finds the right latent index for your target frame, and writes the frame into the latent. It then sets the noise mask at those positions to 1.0 - strength - where strength = 1 means fully fixed (mask 0.0, model leaves it alone) and lower strengths let the model re-render those frames. The code reuses ComfyUI's own LTXVAddGuide.encode and get_latent_index helpers, so it's on solid native ground rather than reinventing LTX internals.
Keyframe positions come from three places. The indices input (an INT list - the same ImageListSampler output that IndicesListTo50 exists to unpack) takes priority. Failing that, positions is a comma-separated string interpreted by mode: frames (raw frame numbers, -1 = last frame), seconds (multiplied by fps), or percentage (of the total length). strengths optionally overrides per-image strengths, comma-separated, falling back to the global strength when empty. If nothing's connected, images distribute evenly across the video.
The inputs that matter
images(IMAGE) - your keyframes, in order.latent- the LTX video latent; pair withEmptyLTXVLatentVideo.mode+fps- howpositionsis interpreted;fpsdefaults to 24.strength(0–1, default 1) - how fixed each keyframe is.indices/positions/strengths- the optional keyframe placement controls above.
Outputs are passthrough positive and negative conditioning plus the modified latent - wire the latent into your sampler with denoise < 1 and let it animate the gaps.
Install
Manager → search AnotherUtils, or:
cd ComfyUI/custom_nodes
git clone https://github.com/marcoc2/ComfyUI-AnotherUtils.git
Restart. Two requirements, both hidden: it only loads on ComfyUI builds with the new video API (comfy_api.latest), and it needs native LTXV (comfy_extras.nodes_lt). If the node isn't in your menu, update ComfyUI. No weights to download.
Common issues
Positional bugs are the usual pain - indices are 0-based frame numbers and it's easy to be off by one, or to reference a frame past the end (it clamps, so watch for keyframes landing in the wrong spot). Mixed units are another: if indices is connected, positions is ignored entirely, so don't fight both at once. And strength semantics trip people up - it's inverted from what you might expect, in that 1.0 means fully fixed. Start with strength 1.0 and lower it only if keyframes look pasted-on rather than integrated.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| latent | LATENT | — | |
| images | IMAGE | — | |
| mode | COMBO | 3 options: frames, seconds, percentage | |
| fps | FLOAT | 24.01–120 | Video FPS. Used to convert seconds/percentage to frame indices. |
| strength | FLOAT | 1.000–1 | Inpaint strength (conceptually). Fixed areas will have noise_mask=0.0. |
| indicesopt | INT | Frame indices from ImageListSampler or similar. Overrides positions string. | |
| positionsopt | STRING | Comma-separated positions for each image. Only used if indices is not connected. Use -1 for last frame (frames mode only). | |
| strengthsopt | STRING | Optional comma-separated per-image strengths (0.0-1.0). If empty, uses the default strength for all. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |