Nodes/IAMCCS-nodes/LTX-2 Joint Refresh Latent
ComfyUI Node

LTX-2 Joint Refresh Latent

Refresh identity mid-clip without re-generating the whole segment

By IAMCCS·Created 11 months ago·Updated 8 days ago· 113
LTX-2 Joint Refresh Latent
  • start_images
  • refresh_image
  • vae
  • latent
  • latent
  • report
modetail_then_source_refresh
overlap_frames9
tail_strength0.90
source_refresh_strength0.25
tail_preprocesstrue
tail_preprocess_crf28

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 at tail_strength, then inject the refresh image just after the protected overlap region at source_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.

CategoryIAMCCS/LTX-2

Inputs (10)

NameTypeDefaultDescription
start_imagesIMAGE
refresh_imageIMAGE
vaeVAE
latentLATENT
modeCOMBOtail_then_source_refresh3 options: tail_then_source_refresh, tail_only, source_refresh_after_tail
overlap_framesINT91–512
tail_strengthFLOAT0.900–1
source_refresh_strengthFLOAT0.250–1
tail_preprocessBOOLEANtrue
tail_preprocess_crfINT280–100

Outputs (2)

NameTypeDescription
latentLATENT
reportSTRING