Nodes/ComfyUI-TJ_NODE_STUDIO_ONE/LTX Director (TJ 2.5)
ComfyUI Node

LTX Director (TJ 2.5)

A video timeline editor bolted onto an LTX node, and it mostly works

By designloves2·Created 4 months ago·Updated about 14 hours ago· 35
LTX Director (TJ 2.5)
  • model
  • clip
  • audio_vae
  • optional_latent
  • vae
  • ref_images
  • model
  • positive
  • negative
  • video_latent
  • audio_latent
  • guide_data
  • motion_guide_data
  • frame_rate
  • combined_audio
◄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►
◄reference_strength1.00►
◄start0.00►
◄end0.00►
◄duration0.00►

LTX Director (TJ 2.5) puts a scrubbable timeline inside a ComfyUI node: blocks you drag to set what happens when, each with its own prompt, or an image, or a video for motion guidance. It's the community's answer to a real hole. LTX has been capable of time-windowed conditioning for a while, but stock ComfyUI had no sane way to say "this, then that, at this second", so people built wrappers around the feature instead. WhatDreamsCost's LTX Director became the well-known one - Director 2.0 pulled a few hundred upvotes and added IC-LoRA, retake mode and audio inpainting. This node is that lineage, copied rather than depended on: the pack vendors CGlide's LTX-2.5-Director fork and renames its keys *TJ25. It's why the whole package went GPL-3.0.

How the prompt relay works

The interesting part isn't the editor, it's what the editor feeds. Each prompt segment gets a token range from the global prompt, and the node builds a temporal penalty matrix over cross-attention so a segment's tokens only attend near the frames they belong to - sigma per segment is 1/ln(1/epsilon), so epsilon is the only knob that shapes how hard the boundary is. Below about 0.1 everything is effectively sharp, which is why the default 0.001 behaves like a hard wall; 0.5 and up softens the transitions between segments.

That mask gets applied through a patched clone of your model (the node returns that clone), so the sampler has to run on this node's model output, not the loader's. Wire the loader straight to your KSampler and the relay is a no-op - the timeline will look like it's doing nothing, because it is.

Image segments go a different route: they become guide_data - a list of images, insert frames, and strengths - which the LTX Director Guide node later splices into the latent with the VAE. So the pair is Director for the plan, Guide for the pixels.

The fields worth your attention

  • model / clip - the LTX model and text encoder; the node tokenises through clip to map your prompt text onto frames.
  • global_prompt - conditions the whole video and anchors characters and scene context. This exists so your segment prompts don't have to repeat the character description on every line.
  • epsilon - boundary sharpness, as above.
  • start_second / end_second / duration_seconds / start_frame / end_frame - the render window, kept in sync.
  • duration_frames - the author is explicit that this sets the timeline's visual scale only; the actual frame count is read from the latent. Setting it to 240 doesn't get you 240 frames.
  • timeline_data / local_prompts / segment_lengths / guide_strength - auto-populated by the editor. Don't hand-edit the JSON.
  • custom_width / custom_height / resize_method / divisible_by - image segments get resized to the target; divisible_by 32 is the LTX-friendly default.
  • audio_vae / use_custom_audio / inpaint_audio / override_audio - the audio side, for timelines with an audio track or gaps worth filling.
  • start / end / duration - connection-only automation sockets that override the panel when wired. Nice for batch renders, invisible otherwise.

Outputs: model, positive, negative, video_latent (an empty latent, only when you don't feed optional_latent), audio_latent, guide_data, motion_guide_data, frame_rate, combined_audio. The usual chain is model and the conditioning into the Guide node, guide_data and motion_guide_data into it too, then the Guide's outputs into the sampler.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/designloves2/ComfyUI-TJ_NODE_STUDIO_ONE.git

Restart, then run bash install_requirements.sh (install_requirements.bat on Windows) once and restart again - the pack's other custom-node packs don't install through Manager. The Director side leans on core ComfyUI's LTXV nodes, on ComfyUI-LTXVideo for the IC-LoRA motion path, and imports PyAV at load time.

Where it goes wrong

The one I'd bet on: your segment_lengths count not matching your local prompt count. That raises outright - "Number of segment_lengths must match number of local prompts" - so if a render dies on validation, count your segments. And because duration_frames is cosmetic, a timeline that looks ten seconds long can render five: the latent wins, every time.

The honest caveat about nodes like this comes from the other side of the community: convenience wrappers hide the parameters you need when output goes sideways. This one hides a lot. When something is off, drop to a plain graph for one comparison render before you start guessing at epsilon.

CategoryWhatDreamsCost CS 2.5

Inputs (33)

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.
vaeoptVAEOptional. Connect the LTX Autoencoder/VAE here to natively encode the MSR visual reference slideshow into the latent prefix. Required for the 'Licon MSR' ref option.
reference_strengthoptFLOAT1.000–5Guide strength applied to the character reference images (Ghost Mask / Licon MSR ref options).
ref_imagesoptIMAGEGhost Mask only. Extra reference image(s) (e.g. an object) — a single image or a batch. Appended as their own block of hidden reference frames AFTER the @ref references, for any number of reference slots loaded (0-3). Ignored in MSR / OFF modes.
startoptFLOAT0.00Automation (connection-only). Start time in SECONDS. Overrides the panel Start when connected.
endoptFLOAT0.00Automation (connection-only). End time in SECONDS. When connected (and duration is not), the render length is derived from start..end.
durationoptFLOAT0.00Automation (connection-only). Duration in SECONDS. Overrides the panel Duration and sets the render length when connected.

Outputs (9)

NameTypeDescription
modelMODEL—
positiveCONDITIONING—
negativeCONDITIONINGNegative conditioning emitted by the Director (neutral/empty). Wire to LTX Director Guide's 'negative' input.
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.