LTX-2.3 first-last-frame ComfyUI template (video_ltx2_3_flf2v): frame guides at 0 and -1, one distilled 8-step pass with audio, off-rule size and length
The official video_ltx2_3_flf2v template (Comfy-Org/workflow_templates 0cc0fba) wraps one subgraph. Both frames are resized to Width x height (1280x720) and added as LTXVAddGuide keyframes at index 0 and -1, strength 0.7. One SamplerCustomAdvanced pass runs ltx-2.3-22b-distilled-fp8 with 8 manual sigmas at CFG 1, Gemma 3 12B FP4 text encoding and generated audio. The saved 720 height and 5 s x 25 fps + 1 = 126 frames do not meet the card's 32-pixel and 8k+1 rules. Read statically; not executed.
LTX-2.3 first-last-frame (FLF2V) in ComfyUI: the official template
Scope. This guide reads the official video_ltx2_3_flf2v.json in Comfy-Org/workflow_templates at commit 0cc0fba562efe9f68e48050c2b82ed6495050bc2 (SHA256 7218f8f2...062c, 89,975 bytes). The root holds 5 nodes and a single subgraph, "First-Last-Frame to Video (LTX-2.3)" (32 nodes). Every node was traced statically, through the wrapper's promoted widgets, primitives and math nodes. There is no switch, and every node is active. Nothing was run, and no model, image or linked page was downloaded.
1. Prerequisites
- A recent ComfyUI with the core LTX nodes: LTXVAddGuide, LTXVPreprocess, LTXVConditioning, EmptyLTXVLatentVideo, LTXVEmptyLatentAudio, LTXVConcatAVLatent, LTXVSeparateAVLatent, LTXVCropGuides, LTXAVTextEncoderLoader, LTXVAudioVAELoader and LTXVAudioVAEDecode. All nodes except the note are comfy-core, saved between 0.3.56 and 0.18.1, and the wrapper itself at 0.18.1. The Model Links note (node 79) says to update ComfyUI first. Saved versions are not a tested minimum.
- Files, as the note and loader properties declare them:
- models/checkpoints/ltx-2.3-22b-distilled-fp8.safetensors (27.5 GB), from Lightricks/LTX-2.3-fp8. It is loaded three times: CheckpointLoaderSimple 127 (model and VAE), LTXVAudioVAELoader 126 (audio VAE) and LTXAVTextEncoderLoader 103.
- models/text_encoders/gemma_3_12B_it_fp4_mixed.safetensors (8.8 GB), from Comfy-Org/ltx-2, loaded by LTXAVTextEncoderLoader 103 together with the checkpoint.
That is about 36 GB. There is no LoRA, no prompt enhancer and no latent upscaler.
2. The controls you edit
The root has LoadImage 31 "Load First Frame" (example high_view_classic_car.png), LoadImage 39 "Load Last Frame" (example low_view_classic_car.png), the wrapper 129 and SaveVideo 68. The wrapper exposes first_frame and last_frame as inputs, and promotes these controls: the prompt (CLIPTextEncode 128), Width 1280 (PrimitiveInt 113), height 720 (98), Duration 5 (102), Frame Rate 25 (114), noise_seed (RandomNoise 100, saved 315253765879496, randomize), ckpt_name and text_encoder.
3. How the two frames are conditioned
- First frame: link 254 to subgraph input first_frame, then ResizeImageMaskNode 124, set to "scale dimensions" with Width and height (crop center, nearest-exact). Its saved 640x360 is linked over by the primitives. It then goes through LTXVPreprocess 104 (saved value 25) to LTXVAddGuide 115 at frame index 0, strength 0.7.
- Last frame: link 255 to last_frame, then ResizeImageMaskNode 125, then LTXVPreprocess 99, then LTXVAddGuide 111 at frame index -1, strength 0.7.
- Order: LTXVConditioning 109 (positive 128, negative 112, frame_rate 25) feeds guide 115, which feeds guide 111. Guide 111's conditioning goes to CFGGuider 116, and its video latent goes to LTXVConcatAVLatent 119. The video latent size comes from GetImageSize 110 of the resized first frame.
4. Size, length and the LTX-2.3 rules
- EmptyLTXVLatentVideo 108 takes width and height from GetImageSize 110 (1280x720 as saved). It takes length from ComfyMathExpression 130, "a * b + 1" = Duration x Frame Rate + 1 = 5 x 25 + 1 = 126. Its saved 768x512x97 is linked over. LTXVEmptyLatentAudio 101 gets the same 126 frames at frame_rate 25.
- ComfyMathExpression 123 ("a" = 25) passes Frame Rate to LTXVConditioning and to CreateVideo 122, whose saved 24 is linked over. The audio latent takes Frame Rate directly from PrimitiveInt 114.
- The LTX-2.3 card record says width and height must be divisible by 32 and the frame count must be 8k+1 (for example 97 or 121); otherwise pad the input with -1 and crop back. As saved, 1280 meets that, but 720 is not divisible by 32 and 126 is not 8k+1. This file shows no padding or cropping step, and what the nodes do with these values was not checked.
- To stay within the card's rules: use height 704 or 736 (or another multiple of 32), and pick duration and fps so that duration x fps + 1 = 8k+1. For example, 5 s at 24 fps gives 121, as in the LTX-2.5 first-last-frame template. At 25 fps, the duration must be a multiple of 8 s.
5. Sampling: one pass
SamplerCustomAdvanced 120 uses RandomNoise 100, CFGGuider 116 (CFG 1, model from checkpoint 127) and SamplerEulerAncestral 117 (saved 0, 1). It uses ManualSigmas 118 "1., 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0": nine values, so 8 steps. Its latent is LTXVConcatAVLatent 119, the guided video latent plus the empty audio latent. This matches the card's distilled setting of 8 steps at CFG 1. There is no second stage: the card's latent upscalers are not used here.
6. Output
LTXVSeparateAVLatent 121 splits the result. The video latent goes through LTXVCropGuides 106 (with guide 111's conditioning) and VAEDecodeTiled 105 (saved 768, 64, 4096, 64). The audio goes through LTXVAudioVAEDecode 107. CreateVideo 122 joins the images and audio at 25 fps, and SaveVideo 68 writes it (prefix video/ltx2.3_flf2v, format auto, codec auto). If the nodes accept the saved values, expect one video with audio at 1280x720, 126 frames, about 5 s. The output was not produced here.
7. Prompts
The saved positive prompt asks for a camera move from a high position to a low one, with the subject centred, plus synthwave music. It matches the example file names (high view to low view of a classic car); the images were not viewed. Note 79's tips: describe actions as they happen over time, all the visual details, and the sounds or dialogue you need. The saved negative prompt (CLIPTextEncode 112) is a long list that includes items unrelated to this example: a "PNTR" cap, a "JUST DO IT" t-shirt, a microphone, sniff sounds and dialogue. It looks carried over from another template, so rewrite it for your scene.
8. Run it
1) Update ComfyUI and put the two files in the folders above. 2) Open the template and load your first frame in node 31 and your last frame in node 39. 3) On the wrapper, write the prompt with the motion and sound you want, and set Width and height (multiples of 32), Duration and Frame Rate so that duration x fps + 1 = 8k+1. 4) Rewrite the negative prompt inside the subgraph (node 112). 5) Run. Expect one video with audio under video/ltx2.3_flf2v.
9. Failure cases and checks
- Off-rule size or length: see section 4. Adjust the values rather than relying on the saved defaults.
- Different aspect ratios: both frames are scaled to the same Width x height with center crop, so parts of a frame with another aspect ratio can be cut. Use frames that already match the output shape.
- Missing LTX nodes: update ComfyUI (note 79). They are core nodes, not a custom pack.
- Hardware: the file gives no VRAM or timing figures. The two files alone total about 36 GB.
- Changing the seed: RandomNoise 100 randomizes after each run. Set it to fixed to reproduce a result.
- Unrelated negative prompt: see section 7.
10. Compared with the LTX-2.5 first-last-frame template
The lane's audit of the LTX-2.5 first-last-frame record found the same pattern: LTXVAddGuide at 0 and -1 with strength 0.7, resize to 1280x720, and length "a * b + 1". That template uses 24 fps, giving 121 frames, and has a prompt-enhancer switch. LTX-2.3 uses 25 fps, so 126 frames, and has no switch or enhancer. The Wan 2.2 14B first-last-frame template instead uses WanFirstLastFrameToVideo with two image inputs.
Evidence and rights. Evidence status: source_inspected, not_run, unreviewed. This is shared-founder desk curation by the tutorial lane. The workflow repository declares the MIT licence, which covers this analysis of the template. The LTX-2.3 weights are under the LTX-2 Community License according to the card record, not an open-source licence. Gemma, example images and outputs keep their own terms.
Structured fields
{
"citations": [
{
"url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/0cc0fba562efe9f68e48050c2b82ed6495050bc2/templates/video_ltx2_3_flf2v.json",
"note": "Exact pinned template; node, link and subgraph byte ranges and excerpt hashes are in the source pins."
},
{
"url": "https://raw.githubusercontent.com/Comfy-Org/workflow_templates/0cc0fba562efe9f68e48050c2b82ed6495050bc2/LICENSE",
"note": "Repository MIT licence at the same commit (existing native source)."
}
]
}Rights
| component | license | hosting | redistribution | modification | training | Evidence and notes |
|---|---|---|---|---|---|---|
| documentation | unknown | permitted | permitted | permitted | unknown | Original attributed analysis. Repository MIT notice cited; LTX-2.3 weights (LTX-2 Community License per the card record), Gemma, example images and outputs keep separate terms. |