LTX Keyframe Soften Schedule (Koolook)
Make LTX Director keyframes glide between poses instead of snapping
- model
- sigmas
- model
- info
Pin keyframes hard in LTX Director from step zero and you get exactly what you'd expect: the model must hit each exact pose immediately, so a transition between two poses comes out as a cut - that robotic stop-and-dissolve that ruins an otherwise good music video. LTXKeyframeSoftenSchedule is Koolook's fix. It eases the keyframe pins during the high-sigma part of denoise, where coarse motion forms, so the model glides between poses, then restores them so the poses sharpen by the end. No new frames, no re-noise, and it's lipsync-safe.
How it works
The Director pins each keyframe through the latent's denoise mask. This node is a model patcher that hooks the sampler's per-step denoise_mask_function and loosens those pins by a gain that's biggest at the start of denoise and smoothsteps down to zero within the top slice of the sigma range you choose. Because LTX 2.3's audio-video mask is a NestedTensor((video, audio)), only the video pins get softened - the audio mask passes through untouched, so lip-sync is unaffected. That "no extra frames" bit matters: unlike adding easing keyframes, this costs you nothing in generation time, just a touch of effective pin strength early on.
The inputs
max_soften- ease strength: how much the pins unpin at the peak. 0 = off, ~0.1 = gentle, 1 = max. Start at 0.1 and only climb if motion is still snapping.soften_range- ease the top % of the sigma range where motion forms; 0.03 means the top 3%. This is a level on the noise curve, not a step count - how many actual steps it spans depends on your scheduler.
That distinction trips people up, which is why there's an optional sigmas input and an info STRING output: wire your sampler's SIGMAS in and the node reports exactly which steps get eased in the run. The wired sigmas also serve as the runtime fallback anchor when a run doesn't supply usable sigmas.
The model output goes into your sampler; info is just for reading.
Where people get burned
Mostly two ways. First, treating soften_range as a step count - set it too high and you're softening pins well into refinement, and your "sharp" poses come out mushy. Second, expecting it to fix pin placement. It doesn't; it only smooths the motion between pins. If your transition itself is bad, look at Koolook's Director-side keyframe_ease control (strength-ramped neighbor pins) instead. And if you're doing two-stage work, remember the softened pass is stage 1 - stage 2 refinement is where you want the pins back at full strength.
Installing it
Part of the ComfyUI-Koolook pack. ComfyUI Manager → Install Custom Nodes → "ComfyUI-Koolook", restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/malkuthro/ComfyUI-Koolook.git
Restart ComfyUI. No extra Python dependencies for this node - it's a patcher on the LTX 2.3 model, so you need an LTX 2.3 model and the Director workflow around it. Stick to one install method: the README warns that a Manager install (which lands in custom_nodes/koolook/) plus a manual clone loads two copies that both register the same nodes, and the workflow store can corrupt on restart. Pick one, remove the other.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | LTX 2.3 model. | |
| max_soften | FLOAT | 0.100–1 | Ease strength — how much to unpin the keyframes. 0 = off, ~0.1 = gentle, 1 = max. |
| soften_range | FLOAT | 0.030–1 | Ease the TOP % of the sigma range (where motion forms). 0.03 = top 3%. It's a level, not a step count — wire SIGMAS to see which steps that is. |
| sigmasopt | SIGMAS | Optional — connect your sampler's SIGMAS to show the exact steps on the 'info' output; also used as the fallback schedule when the run doesn't supply sigmas. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| info | STRING | — |