LTX Director (Koolook)
Direct your clip instead of prompting it
- model
- clip
- audio_vae
- optional_latent
- reference_images
- model
- positive
- video_latent
- audio_latent
- guide_data
- motion_guide_data
- frame_rate
- combined_audio
- clean_latent_frames
- clean_pixel_frames
LTX 2.3 is a first-frame/last-frame model with time-windowed conditioning, and stock ComfyUI has no good way to say "this, then that, at this exact moment." That's the hole LTX Director fills: a timeline editor where you drag image, text, and audio segments around a canvas instead of fighting a single global prompt. LTXDirector__koolook is Koolook's namespaced fork of the WhatDreamsCost original, currently pinned to upstream v2.0.2, plus a few Koolook extras like ghost-reference images and keyframe easing. Same node you've seen praised on r/comfyui - just with a __koolook suffix so it doesn't collide with the upstream ID.
What it does
You get a visual timeline. Local prompts and segment lengths are edited as draggable blocks; the node translates that timeline into Prompt Relay conditioning, guide data, and latents that downstream LTX nodes understand. It's "Same as Prompt Relay Encode, but you point at blocks instead of typing arrays." One detail to internalize early: duration_frames only sets the timeline's pixel-space scale. The actual frame count still comes from the latent path - the tooltip is blunt about it.
How it works
A web extension renders the timeline editor and writes its state back into timeline_data, local_prompts, segment_lengths, and guide_strength - all auto-managed fields you should treat as generated, not hand-edited (except for debugging/recovery). The node then emits a Prompt Relay conditioning, an auto-generated LTXV empty latent (only when you don't connect your own optional_latent), an audio latent, and guide_data for the downstream LTXDirectorGuide. Because the brief only reaches the model via Director → guide_data → DirectorGuide, both stages of a two-stage pipeline usually consume the same Director output.
Inputs that matter
global_prompt- conditions the whole video. This anchors persistent characters, objects, scene context. It's your insurance against identity drift.epsilon- Prompt Relay's penalty decay; the paper default is 0.001 and it gives sharp segment boundaries. Values below ~0.1 all look sharp; go 0.5+ for softer transitions.keyframe_ease/ease_falloff- Koolook additions that ease in and out of each hard keyframe with strength-ramped neighbor pins, killing the robotic stop/dissolve. 0 = off, 1–2 adds the eased neighbors. Costs extra guide frames, so it's real compute.reference_images/reference_strength- the Ghost Mask character-sheet reference: appended as guide frames just past the clean timeline so the model attends to identity but the ref never shows in the output. Lowerreference_strengthif the reference bleeds pose or lighting.snap_keyframes_to_grid- on by default; snaps each image keyframe to the center of its LTX latent-time bucket so hard pins land on one latent frame.
Worth mentioning: use_custom_audio, use_custom_motion, and inpaint_audio toggle whether the timeline's own audio/motion segments are used and whether empty audio gaps get inpainted. Outputs are the useful spread - model, positive (conditioning), video_latent, audio_latent, guide_data, motion_guide_data, frame_rate, combined_audio, plus clean_latent_frames/clean_pixel_frames so you can slice off any appended reference frames.
Installing it
It's in ComfyUI-Koolook. ComfyUI Manager → Install Custom Nodes → "ComfyUI-Koolook", restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/malkuthro/ComfyUI-Koolook.git
Restart after. Two things to know before you hit Run. First, this fork provides the Director, not its ecosystem - LTXDirectorGuide, LTXDirectorCropGuides, and the LTX/Prompt Relay nodes come from the WhatDreamsCost or Lightricks packs, and the workflow won't complete without them. Second, the one-install rule: Manager puts Koolook in custom_nodes/koolook/, so don't also clone it - two parallel copies load, both register the same nodes, and the workflow store can silently corrupt on restart.
A word of caution
Director-class nodes are exactly what a well-known r/comfyui thread called "convenience & overhaul nodes": they hide the parameters you need when output goes wrong, and some purists argue they sidestep the official Multimodal Guider nodes that improve prompt adherence for lipsync and motion. None of that means skip it - it means when a render goes sideways, unwrap the timeline and look at the fields before you blame the seed.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| start_second | FLOAT | 0.000–1000 | Start time in seconds of the timeline generation. |
| end_second | FLOAT | 5.000–1000 | End time in seconds of the timeline generation. |
| duration_seconds | FLOAT | 5.000.1–1000 | Total timeline duration in seconds (computed/synced from frames). |
| start_frame | INT | 00–10000 | Start frame of the timeline generation. |
| end_frame | INT | 1201–10000 | End frame of the timeline generation. |
| duration_frames | INT | 1201–10000 | Total timeline length in pixel-space frames. Used by the editor for visual scale only. |
| timeline_data | STRING | JSON state of the timeline editor (auto-managed; do not edit by hand). | |
| local_prompts | STRING | Auto-populated from the timeline editor. | |
| segment_lengths | STRING | Auto-populated from the timeline editor (pixel-space frame counts). | |
| epsilon | FLOAT | 0.00100.0001–0.99 | Penalty decay parameter. Values below ~0.1 all produce sharp boundaries (paper default 0.001). For softer transitions, try 0.5 or higher. |
| guide_strength | STRING | Auto-populated from the timeline editor (comma-separated guide strengths for image segments). | |
| audio_vaeopt | VAE | Optional. Connect an Audio VAE to generate audio latents. | |
| optional_latentopt | LATENT | Optional. Connect a latent to override the auto-generated one. | |
| global_promptopt | STRING | Conditions the entire video. Anchors persistent characters, objects, and scene context. | |
| use_custom_audioopt | BOOLEAN | false | Toggle between using timeline audio (ON) and generating audio from scratch (OFF). |
| use_custom_motionopt | BOOLEAN | true | Toggle between using timeline motion guidance (ON) and ignoring motion video segments (OFF). |
| inpaint_audioopt | BOOLEAN | true | Toggle whether empty gaps in the audio track are inpainted with generated audio. |
| frame_rateopt | FLOAT | 241–240 | Frames per second — only affects how time is displayed in the timeline editor when time_units is set to 'seconds'. |
| display_modeopt | COMBO | seconds | Display the ruler, segment ranges, length input, and total in frames or seconds. Internal storage is always pixel-space frames. |
| custom_widthopt | INT | 00–8192 | Target output width for all image segments. Set to 0 to use the original image width. |
| custom_heightopt | INT | 00–8192 | Target output height for all image segments. Set to 0 to use the original image height. |
| resize_methodopt | COMBO | maintain aspect ratio | How to resize image segments to fit the target dimensions. |
| divisible_byopt | INT | 321–256 | Snap the final output image dimensions to be divisible by this number (e.g. 32 for LTX). |
| img_compressionopt | INT | 180–100 | H.264 CRF compression to apply to each guide image. 0 = no compression, higher = more artefacts. |
| override_audioopt | BOOLEAN | false | Use the audio from the IC-LoRA video instead of using the audio track. |
| snap_keyframes_to_gridopt | BOOLEAN | true | Koolook (issue #258): snap each image keyframe to the center of its LTX latent-time bucket so hard pins land cleanly on one latent frame, and bump pins that collide in the same bucket. Off = use raw timeline positions. |
| keyframe_easeopt | INT | 00–4 | Koolook: ease in/out of each hard pin. 0 = off (single frozen frame -> the robotic stop/dissolve). 1-2 adds strength-ramped neighbor pins of the SAME pose one latent bucket apart, so the model glides into and out of the locked pose instead of snapping. Center pose stays exact; costs extra guide frames (more compute). |
| ease_falloffopt | FLOAT | 0.500–1 | Strength multiplier per ease step: neighbor k gets center_strength * falloff**k. Lower = quicker release (less dwell), higher = gentler/longer ease. |
| reference_imagesopt | IMAGE | Koolook (Ghost Mask): optional reference image(s) / character sheet to anchor identity (face, mouth shape) the way a WAN VACE reference does. Each image is added as a guide frame just past the clean timeline, so the model attends to it for identity but it never appears in the output. It rides the SAME guide path as your keyframes — LTXDirectorGuide appends it and LTXDirectorCropGuides removes it, so no extra wiring and the audio stays in sync. No LoRA required. Lower reference_strength if the reference suppresses motion. | |
| reference_strengthopt | FLOAT | 1.000–5 | Guide strength for the reference image(s). 1.0 = full identity pull; lower it if the references bleed pose or lighting into the video. |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| video_latent | LATENT | Auto-generated LTXV empty latent (only populated when no latent is connected). |
| audio_latent | LATENT | Auto-generated audio latent (uses custom audio if enabled). |
| guide_data | GUIDE_DATA | — |
| motion_guide_data | MOTION_GUIDE_DATA | — |
| frame_rate | FLOAT | The frame rate used for the timeline. |
| combined_audio | AUDIO | Combined timeline audio layout. |
| clean_latent_frames | INT | Latent frame count of the clean video region (excludes any appended reference frames). Wire to 'Clean Latent Slice (Koolook)' length with start=0 to drop the refs. |
| clean_pixel_frames | INT | Pixel frame count of the clean video region. |