LTX-2.3 Reference Conditioning ⚡
Keep one face through an LTX-2.3 clip — without training a LoRA
- model
- vae
- image
- target_latent
- model
The cheapest way to get a character to stay the same person across an LTX-2.3 clip is not a LoRA - it's this node. You hand it a reference image, it encodes that image through the LTX video VAE and splices the resulting latent into the model's attention stream as a token prefix, and the model spends the whole clip cross-attending to it. Same subject in frame one through frame 121, no training run, no adapter download, no new weights at all.
Character consistency is the running joke of open video models: each generation samples fresh, and "same seed" does not mean "same face." The 2026 answer is to stop re-rolling and hand the model something to look at. LTX-2.3 is good enough at prompt adherence that a reference carried in-context actually lands, and this node is the whole reference mechanism in one socket - the old standalone "enable" node got folded in, so there's nothing else to wire up.
How it works
The mechanism is token-prefix injection, and it's different from the i2v first-frame hold. The reference latent is patchified and concatenated in front of the video token sequence inside the model's forward, at frame-0 RoPE coordinates with the adaLN modulation rows extended to match. The prefix is stripped in unpatchify, so the sampler never sees a shape change - no crop node exists, and none is needed. The patch is per-instance: it installs itself on the model object this node returns, which is why the README's rule is the important one - always take MODEL from this node's output. And because it intervenes at a different point than i2v conditioning, you can run both at once without them fighting.
The inputs that matter
Required: model, vae (the video VAE), and image. Then the ones you'll actually set:
target_latent- wire the same LATENT that goes into your sampler. The image is resized in pixel space to match that latent's spatial dimensions before encoding, so reference and target land on matching patches-per-frame. Skip it and a size mismatch is a hard tensor error.strength- 1.0 is native VAE output. 0.0 is a clean bypass that also clears any prior reference state, which makes it a great A/B switch.position_mode-reference(default) overlaps the target's first frame for uniform influence across the clip;prefix_continuousis the standard i2v prior-context layout.start_frame/num_frames- batch a video in and you get a multi-frame reference window, useful for motion or temporal-style context.num_frames9 (1 + the 8× temporal compression) is roughly two latent frames; 17/25 add more context at higher cost.
zero_ref_timesteps stays off - empirically, most 2.3 checkpoints produce better output when the reference shares the target's noise sigma.
The single output is model. Chain: Models Loader → this node → LTX-2.3 Img/Audio to Video → KSampler (distilled).
Installing it
This is one node inside the ComfyUI-GGUF-Loader pack - ChrisColeTech's fork of city96's ComfyUI-GGUF with a pile of extra pipelines bolted on (the LTX-2.3/2.5 A/V families among them). ComfyUI Manager: search "ComfyUI-GGUF-Loader" and install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
then pip install --upgrade gguf, and restart. No extra weights for this node - it rides on the LTX-2.3 kit you're already loading.
Common issues
The two classics: taking MODEL from the loader instead of this node's output (the patch lives on this instance), and leaving target_latent disconnected so the shapes mismatch. Both error loudly rather than failing softly, which is a blessing. This is literally the same implementation as the LTX-2.5 version - if you've seen one category listing, the other behaves identically.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| image | IMAGE | Reference image. A multi-frame batch (video frames) is windowed via start_frame/num_frames below. | |
| target_latentopt | LATENT | Optional. Wire the same LATENT that goes into your sampler. The image will be resized in pixel space to match this latent's spatial dimensions before VAE encoding, guaranteeing memory and target have matching patches-per-frame. Without this, you'll get a tensor mismatch error if your image and target latent don't match exactly. | |
| strengthopt | FLOAT | 1.000–2 | Scales the reference latent magnitude. 1.0 = native VAE output. <1.0 reduces influence; >1.0 boosts (may distort). Set to 0.0 to bypass completely and clear any prior reference state. |
| position_modeopt | COMBO | reference | How reference tokens are positioned in the attention sequence. 'reference' (default): tokens overlap target's first frame temporally - uniform identity influence across all generated frames. 'prefix_continuous': tokens placed before target temporally - equivalent to standard i2v prior-context conditioning. |
| start_frameopt | INT | 00–240 | For a batched IMAGE input: which frame to start the reference window at. Frames before this are discarded. |
| num_framesopt | INT | 11–25 | How many frames from start_frame to use as reference. 1 (default) = single-image reference. 9 (1 + 8k matches LTX temporal compression) gives ~2 latent frames; 17, 25 add temporal context at higher cost. |
| zero_ref_timestepsopt | BOOLEAN | false | Mark reference tokens as sigma=0 (clean reference). Default OFF based on empirical testing - most LTX2.3 checkpoints produce better output when reference tokens share target's noise sigma. Enable only if a checkpoint was trained for clean-reference memory. |
| verboseopt | BOOLEAN | false | Print detailed per-call info to the console. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |