ComfyUI Node

FmlfLtx23

The first-frame model, actually used

By Rogala·Created 6 months ago·Updated 4 months ago· 19
FmlfLtx23
  • video_vae
  • audio_vae
  • image_1
  • image_2
  • image_3
  • image_4
  • image_5
  • image_6
  • latent
  • video_latent
  • audio_latent
  • segment_lengths
img_compression18
width768
height512
length97
fps25.00
batch_size1
strength_11.00
strength_21.00
strength_31.00
strength_41.00
strength_51.00
strength_61.00

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_1 goes 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_1strength_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.

Categoryrogala/Video

Inputs (20)

NameTypeDefaultDescription
video_vaeVAE
audio_vaeVAE
img_compressionINT180–100JPEG pre-compression strength (0 = disabled). Matches LTXVPreprocess.
widthoptINT76864–4096Latent width — connect from LTX Resolution Selector.
heightoptINT51264–4096Latent height — connect from LTX Resolution Selector.
lengthoptINT979–1024Frame count — connect from LTX Resolution Selector.
fpsoptFLOAT25.001–120Frames per second — connect from LTX Resolution Selector.
batch_sizeoptINT11–16
image_1optIMAGE
strength_1optFLOAT1.000–1Conditioning strength: First frame (FF) — automatically placed at frame 0.
image_2optIMAGE
strength_2optFLOAT1.000–1Conditioning strength: Middle frame 1 — evenly spaced between FF and LF.
image_3optIMAGE
strength_3optFLOAT1.000–1Conditioning strength: Middle frame 2 — evenly spaced between FF and LF.
image_4optIMAGE
strength_4optFLOAT1.000–1Conditioning strength: Middle frame 3 — evenly spaced between FF and LF.
image_5optIMAGE
strength_5optFLOAT1.000–1Conditioning strength: Middle frame 4 — evenly spaced between FF and LF.
image_6optIMAGE
strength_6optFLOAT1.000–1Conditioning strength: Last connected image becomes the Last Frame (LF) — hard anchor for sampler Pass 2.

Outputs (4)

NameTypeDescription
latentLATENT
video_latentLATENT
audio_latentLATENT
segment_lengthsSTRING