Nodes/H3 Relay/H3RelayInternalLTXRollingCheckpoint
ComfyUI Node

H3RelayInternalLTXRollingCheckpoint

The node that remembers where the last LTX shot ended

By akatz-ai·Created 28 days ago·Updated 8 days ago· 15
H3RelayInternalLTXRollingCheckpoint
  • latent
  • latent
  • status
run_nameh3_ltx_rolling
shot_index1
context_latent_steps3

LTX enhancement of a multi-shot sequence has a continuity problem that the raw H3 chain doesn't. H3 carries its own sliding history natively, but LTX enhancement is a per-window diffusion pass - to make shot N's finish line up with shot N−1's finish, you need to hand the new pass the exact tail of the previous accepted LTX latent. That's the rolling checkpoint: it persists that tail to disk so the next enhancement job can pick it up.

The node description is admirably short: Persist the accepted LTX latent tail for the next incremental enhancement job. It takes the latent that just came out of the sampler, writes the last context_latent_steps of it to a safetensors checkpoint keyed by run_name and shot_index, and returns the same latent plus a status string.

The inputs

  • latent - the 5D LTX latent (batch, channels, frames, height, width). The node validates that it's 5D and that it's at least as long as the context you want to persist.
  • run_name (default h3_ltx_rolling) - the namespacing for the checkpoint files. The reference workflow uses the movie's run name so multiple projects don't collide.
  • shot_index (default 1) - which shot this checkpoint belongs to. The next shot's inject node reads run_name + shot_index − 1.
  • context_latent_steps (default 3) - how many latent frames to persist. The tooltip explains the math: three LTX latent steps represent 17 pixel frames and are the recommended rolling context.

The outputs are latent (pass-through - the sampler result flows onward to decode) and status.

How it fits the rolling loop

The full loop, which you'll see as the H3RelayInternalLTXRolling* family when H3 Relay · LTX 2× Enhance expands:

  1. RollingInput builds one incremental window: the current delivered H3 segment padded with 17 frames of the previous checkpoint's tail.
  2. VAE-encode, latent-upscale 2x, then RollingInject freezes the previous accepted tail at the head of the current target.
  3. Sampler runs, and RollingCheckpoint writes the tail of this accepted result to disk.
  4. RollingCrop strips the terminal LTX alignment padding after decode.

That order is why the checkpoint node sits between sampling and decoding in the expanded graph - it captures the latent before VAE decode, which is exactly the representation the next shot's injection needs. Skip it and the next enhancement has no idea where the previous shot ended, and you get drift, not a movie.

The honest caveat: this machinery only matters for long, multi-shot LTX finishing where inter-shot consistency is the whole point. For a single-shot enhancement you'll see the node in the graph but its work is trivial. And as with all the internal nodes, leave it wired as built - the run name and shot index have to agree with the inject and input nodes, and mismatched bookkeeping is the kind of thing that breaks caching silently.

Install the pack via ComfyUI Manager (H3 Relay) or git clone https://github.com/akatz-ai/h3-relay.git into custom_nodes. ComfyUI 0.32.0+, FFmpeg, and the LTX 2.5 files from MODELS.md (the rolling checkpoint path uses safetensors, which ComfyUI already ships). LTX's community license applies - free under $10M annual revenue.

Categoryconditioning/minimax/contex_loop/enhance

Inputs (4)

NameTypeDefaultDescription
latentLATENT
run_nameSTRINGh3_ltx_rolling
shot_indexINT11–100000
context_latent_stepsINT31–64

Outputs (2)

NameTypeDescription
latentLATENT
statusSTRING