Difforum · LTX Guides
Your drawn camera, inside an LTX-2 latent
- positive
- negative
- vae
- latent
- keyframes
- direction
- positive
- negative
- latent
- info
LTX-2 and 2.3 are genuinely good at following a prompt and mostly good at moving - the 2.3 release is the one that fixed the frozen image-to-video problem everyone complained about through the 2.x era. What they still don't do is take orders about where the camera goes. You can hint. You can't draw a dolly-in over four seconds with a crane at the end.
LTX Guides is the bridge that closes that gap. You draw the move in Difforum's timeline, it hands you keyframe pictures at exact frame numbers, and this node puts those pictures into the LTX latent as guides so the model has to hit them on the way through.
How it works
It's a thin wrapper, and that's a feature. The node calls ComfyUI's core LTXVAddGuide once per keyframe, feeding the result of each call into the next, so the guides stack up inside a single latent. The pack deliberately routes through ComfyUI's own node registry rather than importing another pack's internals, which means it inherits whatever core does and breaks loudly rather than subtly when core changes.
That matters for two practical reasons. First: if your ComfyUI is older than LTXVAddGuide, this node raises a plain "update ComfyUI" error instead of a stack trace about a missing module. Second: LTX-2.3 rebuilt the VAE and the latent space, and the TinyVAE preview trick stopped working because it was built for the old latent space - so if you're on 2.3, expect preview behaviour to differ from LTX-2 workflows you copied. The guides themselves are the same idea across 2 and 2.5; verify against your version when something looks off.
Inputs and outputs you'll actually touch
positive, negative, vae and latent come from your LTX graph - the latent must be the empty LTX latent whose length matches what the Keyframes node produced, which is where Setup's target = LTX-2 / 2.5 earns its keep (8k+1 frames, 32-pixel multiples). keyframes is the IMAGE batch and indices the frame number of each one, comma separated, e.g. 0,48,96,123. It's an input, not a widget - wire it from the Keyframes node so the two stay in sync.
Then three strengths, and this is the only part with a real learning curve:
strength(0.7) applies to the keyframes in between. 0.6-0.8 is the band where LTX follows your path but still invents its own in-betweens; 1.0 locks the frame.first_strength(1.0) is frame 0. Keep it high - frame 0 sets the look the whole shot inherits.last_strength(0.7) is the final keyframe. Push it up when the shot must end on your picture; drop it when you want a soft landing.
Outputs are positive, negative and latent to wire into your sampler, plus info - a text report listing every guide with its frame and strength. Read it. It's the fastest way to catch an index you mis-typed.
Install
ComfyUI Manager → search Difforum, or:
cd ComfyUI/custom_nodes
git clone https://github.com/chillithebillis/Difforum.git difforum
Restart and you'll find it under Difforum/5 · Video model bridges. numpy is the only requirement the pack declares, and this node doesn't need OpenCV at all. Start from Templates → Difforum → ltx_guides (template 07) rather than wiring LTX from memory; the pack's README says plainly that its templates have a block layout, and the LTX one expects your own LTX graph to be plugged in where it says so.
Where people get burned
The error message to know is N keyframes but M indices. The node counts guides and indices and refuses to guess, which is correct but arrives as a hard failure in the middle of a queue. If your count is off, you usually added a key on the Keys track without adding the matching picture to the batch.
The subtler one is length. Guides are frame indices into this latent, so a keyframe placed at frame 96 of a 120-frame timeline goes into a latent that only encodes 97 frames - and that mismatch shows up as a guided frame that does nothing, not as an error. Set duration in Setup first, then place keys. Also worth knowing: strength 0 on any keyframe is skipped silently, which is a handy way to disable a guide without deleting it, and a confusing way to find out your list was wrong. The authoritative node reference is docs/NODES.md in the repo; it's generated from the code, so it doesn't drift the way the README can.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | LTX positive conditioning. | |
| negative | CONDITIONING | LTX negative conditioning. | |
| vae | VAE | LTX video VAE. | |
| latent | LATENT | Empty LTX latent (length and size from Keyframes / Setup). | |
| strength | FLOAT | 0.700–1 | Guide strength of the keyframes in between. 0.6-0.8 = follows the path, 1 = locked. |
| first_strength | FLOAT | 1.000–1 | Frame 0 usually locks the look: keep it high. |
| last_strength | FLOAT | 0.700–1 | Strength of the last keyframe. High = the shot must end on it. |
| keyframesopt | IMAGE | Keyframe pictures (from Keyframes or Keyframe Images). | |
| indicesopt | STRING | 0 | Frame number of each keyframe, comma separated, e.g. 0,48,96,123. |
| directionopt | DIFFORUM_DIRECTION | The Director's wire: camera, energy curve, scene prompts, keys and look in one cable. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| info | STRING | — |