LTX 2.3 Image Guides (All-in-One)
The all-in-one node
- positive
- negative
- vae
- latent
- start_images
- positive
- negative
- latent
LTX 2.3 is a first-frame/last-frame model: you feed it stills, it animates between them, and where you drop those stills decides what the video looks like. Doing that with stock ComfyUI means threading images through native LTXVAddGuide nodes and wiring the conditioning yourself, and if you've ever tried it, you know the graph gets ugly fast. LTX 2.3 Image Guides (All-in-One) from the comfui-helto-ltx pack collapses the whole thing into one node with a visual editor on it. Pick images, set a frame or a time for each, and it hands you guided conditioning plus a latent ready for the sampler.
How it actually works
The pack doesn't reimplement LTX guide logic - it rides ComfyUI's native path from comfy_extras.nodes_lt. When you run the node it does roughly this:
- loads your guide images from disk, resizes them to the target
width/height(contain, pad, stretch, or crop), and optionally runs them through native LTXV image compression (img_compression, default 35 - the same default ComfyUI's LTXV preprocess node uses); - VAE-encodes them and appends them to the latent tensor as native LTXV guides, updating the positive and negative conditioning with the usual
keyframe_idxs,guide_attention_entries, andnoise_maskmetadata; - if there's no
latentconnected, it creates an empty one for you.
Because guide frames are appended to the latent tensor rather than written into the video, you still need a native LTXVCropGuides node after sampling to strip them back out before decode. Forget that and you'll wonder where your extra frames came from.
The inputs that matter
positive and negative are your conditioning from a CLIP encode - the node augments them with the guide metadata and passes them through. vae is the LTX video VAE. The three you'll actually touch:
num_frames(default 97) - the video length in pixel frames. This is LTX, so it must be8*n + 1(97, 105, 113…). Feed it a bad number and the node errors loudly instead of silently making fewer frames.timing_mode-frame(default) orseconds. In seconds mode, a guide's position is multiplied byfpsto find its frame.global_strength- a master multiplier on every guide's strength. Turn it down if the video is glued to your stills and never moves, which is the classic over-conditioning failure.
A couple of genuinely useful options hide further down. lock_start_frames and lock_end_frame write the first/final frame into the latent instead of appending them as references - stronger initialization, but a VAE-level lock rather than a pixel-perfect copy, so it can distort the ending. If your last frames look weird, disable lock_end_frame and use a normal -1 guide instead. half_size_first_pass halves the internally-created latent for 2x upscale workflows, and only applies when no latent is connected - a connected latent always wins. The optional start_images takes an IMAGE batch (video frames, say) and applies it as a multi-frame guide at frame 0.
Outputs and wiring
Three outputs: positive, negative, and latent. Feed positive/negative into the guider's positive/negative, and latent into the sampler's latent_image, then sample through the normal LTXV path and crop the guides after.
Install
It ships in the comfui-helto-ltx pack, which needs a ComfyUI with native LTXV support (any recent build) and nothing else - no extra Python dependencies, no PyTorch reinstalls. Via ComfyUI Manager, search "comfui-helto-ltx". Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/helto4real/comfui-helto-ltx.git
Restart ComfyUI. You still need the LTX 2.3 checkpoint (dev or distilled; the 22B model really wants quantized weights plus 64GB system RAM on consumer cards). Guide images live in ComfyUI's input folder by default, and the node's UI can manage its own configured folders - workflows store folder aliases and filenames, not absolute paths, so you can move machines without breaking the graph.
Common gotchas
- Wrong frame count out. Check
num_framesis8*n + 1, and if you connected alatent, that latent's shape - not the widget - decides the length. - Extra frames in the output. You skipped
LTXVCropGuidesafter sampling. Add it. - An image at
-1doesn't land on the final frame. Make surenum_framesmatches the active latent; negative positions count back from the end. - Over-stiff video. Lower
global_strengthbefore you start deleting guides.
For a two-stage low-res/high-res workflow this all-in-one is the wrong tool - that's what the Manager + Apply pair is for. But for a single pass, it's the fastest way to go from "here are my reference stills" to "guided latent."
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | Positive conditioning to augment with native LTXV guide metadata. | |
| negative | CONDITIONING | Negative conditioning to augment with matching native LTXV guide metadata. | |
| vae | VAE | LTXV VAE used to encode selected guide images and optional start image sequences. | |
| width | INT | 76864–16384 | Target output size for this stage. With half_size_first_pass enabled and no latent connected, the internal latent uses half this value. |
| height | INT | 51264–16384 | Target output size for this stage. With half_size_first_pass enabled and no latent connected, the internal latent uses half this value. |
| half_size_first_pass | BOOLEAN | false | For 2x LTX upscale workflows: when no latent is connected, create and guide a half-size first-pass latent. Width/height should be the final target size. |
| fps | FLOAT | 24.001–240 | Frames per second used when timing_mode is seconds. |
| num_frames | INT | 971–16384 | Pixel frame count used for timing, negative frame positions, and internally-created empty latents. Native LTXV lengths must be 8*n + 1, for example 97, 105, 113. |
| timing_mode | COMBO | frame | Interpret manual guide positions as frame indexes or seconds. |
| resize_mode | COMBO | contain | How guide images are resized before VAE encoding. contain/pad preserves aspect ratio with padding. |
| duplicate_policy | COMBO | error | How to handle manual guide images that resolve to the same frame. |
| pad_color | STRING | 0,0,0 | RGB padding color for contain/pad resize mode. Accepts r,g,b or #rrggbb. |
| img_compression | INT | 350–100 | Native LTXV image compression applied before guide encoding. Set 0 to disable. |
| global_strength | FLOAT | 1.000–1 | Multiplier applied to every manual guide strength and start sequence strength. |
| lock_start_frames | BOOLEAN | false | When enabled, frame 0 guides and start_images are written into the beginning video latent instead of only appended as guide references. VAE-level lock, not pixel-perfect copy. |
| lock_end_frame | BOOLEAN | false | When enabled, a manual guide resolving to the final frame is written into the final video latent instead of only appended as a guide reference. VAE-level lock, not pixel-perfect copy. |
| start_images_strength | FLOAT | 0.850–1 | Strength for the optional start image sequence before global_strength is applied. |
| guides_json | STRING | {"version":1,"guides":[]} | Hidden serialized guide data used by the custom UI and saved in workflows. |
| latentopt | LATENT | Optional existing video latent. When connected, its shape is used and half_size_first_pass does not resize it. | |
| start_imagesopt | IMAGE | Optional IMAGE batch from a video source. Applied as a native multi-frame guide starting at frame 0. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |