Nodes/ComfyUI-Koolook/LTX Director (Koolook)
ComfyUI Node

LTX Director (Koolook)

Direct your clip instead of prompting it

By malkuthro·Created 11 months ago·Updated a day ago· 8
LTX Director (Koolook)
  • 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
start_second0.00
end_second5.00
duration_seconds5.00
start_frame0
end_frame120
duration_frames120
timeline_data
local_prompts
segment_lengths
epsilon0.0010
guide_strength
global_prompt
use_custom_audiofalse
use_custom_motiontrue
inpaint_audiotrue
frame_rate24
display_modeseconds
custom_width0
custom_height0
resize_methodmaintain aspect ratio
divisible_by32
img_compression18
override_audiofalse
snap_keyframes_to_gridtrue
keyframe_ease0
ease_falloff0.50
reference_strength1.00

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. Lower reference_strength if 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.

CategoryKoolook/PromptRelay

Inputs (32)

NameTypeDefaultDescription
modelMODEL
clipCLIP
start_secondFLOAT0.000–1000Start time in seconds of the timeline generation.
end_secondFLOAT5.000–1000End time in seconds of the timeline generation.
duration_secondsFLOAT5.000.1–1000Total timeline duration in seconds (computed/synced from frames).
start_frameINT00–10000Start frame of the timeline generation.
end_frameINT1201–10000End frame of the timeline generation.
duration_framesINT1201–10000Total timeline length in pixel-space frames. Used by the editor for visual scale only.
timeline_dataSTRINGJSON state of the timeline editor (auto-managed; do not edit by hand).
local_promptsSTRINGAuto-populated from the timeline editor.
segment_lengthsSTRINGAuto-populated from the timeline editor (pixel-space frame counts).
epsilonFLOAT0.00100.0001–0.99Penalty decay parameter. Values below ~0.1 all produce sharp boundaries (paper default 0.001). For softer transitions, try 0.5 or higher.
guide_strengthSTRINGAuto-populated from the timeline editor (comma-separated guide strengths for image segments).
audio_vaeoptVAEOptional. Connect an Audio VAE to generate audio latents.
optional_latentoptLATENTOptional. Connect a latent to override the auto-generated one.
global_promptoptSTRINGConditions the entire video. Anchors persistent characters, objects, and scene context.
use_custom_audiooptBOOLEANfalseToggle between using timeline audio (ON) and generating audio from scratch (OFF).
use_custom_motionoptBOOLEANtrueToggle between using timeline motion guidance (ON) and ignoring motion video segments (OFF).
inpaint_audiooptBOOLEANtrueToggle whether empty gaps in the audio track are inpainted with generated audio.
frame_rateoptFLOAT241–240Frames per second — only affects how time is displayed in the timeline editor when time_units is set to 'seconds'.
display_modeoptCOMBOsecondsDisplay the ruler, segment ranges, length input, and total in frames or seconds. Internal storage is always pixel-space frames.
custom_widthoptINT00–8192Target output width for all image segments. Set to 0 to use the original image width.
custom_heightoptINT00–8192Target output height for all image segments. Set to 0 to use the original image height.
resize_methodoptCOMBOmaintain aspect ratioHow to resize image segments to fit the target dimensions.
divisible_byoptINT321–256Snap the final output image dimensions to be divisible by this number (e.g. 32 for LTX).
img_compressionoptINT180–100H.264 CRF compression to apply to each guide image. 0 = no compression, higher = more artefacts.
override_audiooptBOOLEANfalseUse the audio from the IC-LoRA video instead of using the audio track.
snap_keyframes_to_gridoptBOOLEANtrueKoolook (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_easeoptINT00–4Koolook: 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_falloffoptFLOAT0.500–1Strength multiplier per ease step: neighbor k gets center_strength * falloff**k. Lower = quicker release (less dwell), higher = gentler/longer ease.
reference_imagesoptIMAGEKoolook (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_strengthoptFLOAT1.000–5Guide 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)

NameTypeDescription
modelMODEL
positiveCONDITIONING
video_latentLATENTAuto-generated LTXV empty latent (only populated when no latent is connected).
audio_latentLATENTAuto-generated audio latent (uses custom audio if enabled).
guide_dataGUIDE_DATA
motion_guide_dataMOTION_GUIDE_DATA
frame_rateFLOATThe frame rate used for the timeline.
combined_audioAUDIOCombined timeline audio layout.
clean_latent_framesINTLatent 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_framesINTPixel frame count of the clean video region.