LTX-2 Joint Refresh Latent
Refresh identity mid-clip without re-generating the whole segment
- start_images
- refresh_image
- vae
- latent
- latent
- report
Long LTX-2 generations drift. The face changes by the end of a clip, the character forgets what they look like, and by the time you've chained a few segments the "same person" claim is doing a lot of heavy lifting. The IAMCCS answer to that is the refresh/continuity family of nodes, and this one is the workhorse: it takes a fresh reference image of your subject and re-injects it into the latent you're about to sample, at the tail end where the extension will actually continue.
The name is the mechanism. "Joint" because it does two things at once - it re-conditions the tail of the existing latent with your start frames, and it re-encodes a source refresh image near that same spot, both in one call. You get a latent that still holds the previous generation's motion but re-anchored to the current reference, instead of a blank slate that ignores everything before it.
How it works
Three modes on the mode enum:
tail_then_source_refresh(default) - inject start frames into the tail attail_strength, then inject the refresh image just after the protected overlap region atsource_refresh_strength.tail_only- just the tail injection.source_refresh_after_tail- just the source refresh.
Both injections go through VAE encode, then get spliced into the latent with a noise_mask that controls how hard they're locked: mask value = 1.0 - strength, so a tail_strength of 0.9 means the injected tail is mostly held and barely denoised. overlap_frames (default 9) is how many frames of the tail you protect - it converts to latent frames using the VAE's temporal downscale factor (8 for LTX-2), so pixel-frame numbers stay natural to think in.
tail_preprocess (default on) runs the tail frames through a light re-encode pass at tail_preprocess_crf (default 28) before injection - a small quality/consistency trade-off that keeps the tail from fighting the reference.
Inputs and outputs
start_images- the conditioning frames for the tail (typically from the ExtensionModule).refresh_image- your fresh reference of the subject.vae- needed to encode both.latent- the latent being refreshed.- Then
mode,overlap_frames,tail_strength,source_refresh_strength,tail_preprocess,tail_preprocess_crf.
Outputs: latent (refreshed, ready for the sampler) and a report STRING that narrates each injection stage.
Install
ComfyUI Manager → "IAMCCS", or:
cd ComfyUI/custom_nodes
git clone https://github.com/IAMCCS/IAMCCS-nodes.git
Restart. This one needs the LTX-2 model files (and realistically ComfyUI-LTXVideo for the sampler that runs after it), but adds no dependencies of its own.
Gotchas
The dial to respect is source_refresh_strength - default 0.25 is deliberately gentle. Crank it toward 1 and you'll fix the identity drift but start freezing the motion around the refresh point, which is the static-frame disease LTX users already hate. If your start frames live on disk instead of as an IMAGE input, grab the _Disk sibling of this node, which reads start_dir instead. And when the refresh still doesn't hold, it's usually the downstream sampler ignoring the noise_mask, not this node failing - check that your sampler is actually respecting the conditioning.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| start_images | IMAGE | — | |
| refresh_image | IMAGE | — | |
| vae | VAE | — | |
| latent | LATENT | — | |
| mode | COMBO | tail_then_source_refresh | 3 options: tail_then_source_refresh, tail_only, source_refresh_after_tail |
| overlap_frames | INT | 91–512 | — |
| tail_strength | FLOAT | 0.900–1 | — |
| source_refresh_strength | FLOAT | 0.250–1 | — |
| tail_preprocess | BOOLEAN | true | — |
| tail_preprocess_crf | INT | 280–100 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| report | STRING | — |