FmlfLtx23
The first-frame model, actually used
- video_vae
- audio_vae
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- latent
- video_latent
- audio_latent
- segment_lengths
LTX 2.3 is a first-frame/last-frame model at heart: it genuinely shines when you give it images to anchor on, not just a paragraph of text. FmlfLtx23 ("FMLF" = First Middle Last Frame) is the node that turns that into a usable workflow. You feed it up to six guide images and it encodes them into video and audio latents, automatically spacing them across your clip's timeline. Combined with its sibling SamplerLTXV_2.3, this is the I2V/FFLF pipeline that the community converged on for 2.3 - the pack's own README credits WhatDreamsCost and princepainter's workflows as the inspiration, and it shows in the design.
The positioning is important. LTX-2.3's I2V is dramatically better than 2.x's frozen, zoom-in-a-box output - that was the headline fix of the release. If you want a character or scene to stay consistent across a longer clip, guide images beat prompt text every time. This node is how you give the model that structure.
How it works
The placement logic is dead simple and worth internalizing:
image_1goes to frame 0 (the first frame anchor).- The last connected image goes to the final frame (the last frame anchor - a hard anchor the sampler re-embeds in its Pass 2).
- Everything in between gets spread evenly: with 3 images that's 0%, 33%, 66%; with 6 images, 0%, 17%, 33%, 50%, 67%, 83%.
Each image has a matching strength_1…strength_6 slider (0–1). At 1.0 the frame is fully conditioned; drop it to soften the anchor. The README's rule of thumb: aim for roughly one image per 8 seconds of video, so 2 images for a 10–15s clip, 4 for 30–35s, and all 6 for anything past 50 seconds.
There's also img_compression, a JPEG pre-compression value that mimics LTXVPreprocess - running the guide image through a JPEG roundtrip before encoding. It sounds backwards, but matching the compression the model saw in training genuinely helps the latent land where you expect. 18 is the default; 0 disables it.
The node needs video_vae to encode the images and audio_vae to stamp out an empty audio latent, plus width, height, length, and fps - which is exactly what LTX Resolution Selector outputs, so connect them straight across.
Outputs
Four pins: latent (a combined video+audio NestedTensor for direct sampler input - legacy, you can ignore it), video_latent and audio_latent (feed these into SamplerLTXV_2.3's matching pins), and segment_lengths, a string of per-segment pixel-space frame counts that connects to a PromptRelayEncode node if you're doing time-windowed conditioning. Most people never touch segment_lengths, but it's there when the clip needs to know "this part is 40 frames, that part is 30."
Installing it
Part of ComfyUI-rogala:
cd ComfyUI/custom_nodes
git clone https://github.com/rogala/ComfyUI-rogala
Restart, look under rogala → Video → FMLFLTX_2.3. ComfyUI Manager works too - search "rogala". No model downloads from this node; the LTX-2.3 checkpoint, VAE, and text encoder are the same ones the rest of your LTX setup already needs.
Where people get burned
The last connected image becomes the last-frame anchor. If you leave image_6 connected but only half the image slots filled, the anchor follows whatever is actually plugged in - so it's on you to keep the connections ordered. Also: strength at 0.0 means ignored, not "weak," so if an image isn't influencing anything, check that its strength isn't zero. And keep the frame count on the model's grid - feed it values from the LTX Resolution Selector, not round numbers you made up, because 2.3 refuses to round for you.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| video_vae | VAE | — | |
| audio_vae | VAE | — | |
| img_compression | INT | 180–100 | JPEG pre-compression strength (0 = disabled). Matches LTXVPreprocess. |
| widthopt | INT | 76864–4096 | Latent width — connect from LTX Resolution Selector. |
| heightopt | INT | 51264–4096 | Latent height — connect from LTX Resolution Selector. |
| lengthopt | INT | 979–1024 | Frame count — connect from LTX Resolution Selector. |
| fpsopt | FLOAT | 25.001–120 | Frames per second — connect from LTX Resolution Selector. |
| batch_sizeopt | INT | 11–16 | — |
| image_1opt | IMAGE | — | |
| strength_1opt | FLOAT | 1.000–1 | Conditioning strength: First frame (FF) — automatically placed at frame 0. |
| image_2opt | IMAGE | — | |
| strength_2opt | FLOAT | 1.000–1 | Conditioning strength: Middle frame 1 — evenly spaced between FF and LF. |
| image_3opt | IMAGE | — | |
| strength_3opt | FLOAT | 1.000–1 | Conditioning strength: Middle frame 2 — evenly spaced between FF and LF. |
| image_4opt | IMAGE | — | |
| strength_4opt | FLOAT | 1.000–1 | Conditioning strength: Middle frame 3 — evenly spaced between FF and LF. |
| image_5opt | IMAGE | — | |
| strength_5opt | FLOAT | 1.000–1 | Conditioning strength: Middle frame 4 — evenly spaced between FF and LF. |
| image_6opt | IMAGE | — | |
| strength_6opt | FLOAT | 1.000–1 | Conditioning strength: Last connected image becomes the Last Frame (LF) — hard anchor for sampler Pass 2. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| video_latent | LATENT | — |
| audio_latent | LATENT | — |
| segment_lengths | STRING | — |