LTX Director (TJ 2.5)
A video timeline editor bolted onto an LTX node, and it mostly works
- 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
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
clipto 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_by32 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.
Inputs (33)
| 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. |
| vaeopt | VAE | Optional. 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_strengthopt | FLOAT | 1.000–5 | Guide strength applied to the character reference images (Ghost Mask / Licon MSR ref options). |
| ref_imagesopt | IMAGE | Ghost 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. | |
| startopt | FLOAT | 0.00 | Automation (connection-only). Start time in SECONDS. Overrides the panel Start when connected. |
| endopt | FLOAT | 0.00 | Automation (connection-only). End time in SECONDS. When connected (and duration is not), the render length is derived from start..end. |
| durationopt | FLOAT | 0.00 | Automation (connection-only). Duration in SECONDS. Overrides the panel Duration and sets the render length when connected. |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | Negative conditioning emitted by the Director (neutral/empty). Wire to LTX Director Guide's 'negative' input. |
| 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. |