TV Director π¬
Plan your whole video as shots before a single frame is generated
- images
- audio
- timeline
- total_frames
- summary
The hardest part of a multi-shot AI video isn't the generating. It's keeping the shot list straight - which prompt goes with which reference image, how long each shot runs, what cuts into what. That's the whole job of TV Director π¬, the timeline editor node at the heart of the TensorVizion Director pack. You build your video as a list of shots once, and three different video backends (LTX, Wan, Hunyuan) can all render it.
The idea comes straight from LTX Director, the community timeline node that blew up for Lightricks' LTX models. Its one catch: it's LTX-only. This pack lifts the same drag-and-drop shot editor and makes the timeline itself model-agnostic. The timeline node doesn't know or care which video model you're on - the adapters behind it handle that. If you've hit the "5-second clip" wall and started stitching shots into actual scenes, this is the node that makes the shot list the source of truth instead of a text file you keep beside the workflow.
How it works
Under the hood your timeline is a documented JSON schema (version 1): a global block with fps, width, height, and a list of shots, each with a prompt, negative_prompt, duration_frames, an optional image_ref pointing into your input images, an image_role (first/last/middle/reference), transition_in/transition_out, and a per-shot strength. You don't write that JSON - the node ships a custom JavaScript UI that hides the raw text box and gives you per-shot cards, drag-to-reorder, and a timeline scrubber.
When you run it, the node validates the whole timeline and fails loudly if something's malformed rather than silently feeding garbage downstream. It also attaches whatever you wired into its images and audio inputs to the timeline object, so the adapters can resolve a shot's image_ref index into an actual tensor.
The inputs that matter
- timeline_json - the hidden widget the custom UI edits. You'll never type in it by hand.
- images (optional, IMAGE) - wire a Load Image or multi-image loader here, then reference frames by index from the timeline cards. Shots with no image are plain text-to-video.
- audio (optional, AUDIO) - hook in audio tracks that the schema can reference, if you're planning sound.
The outputs are what you wire into the rest of the pack: timeline (a DIRECTOR_TIMELINE object) feeds any of the three adapters, total_frames is the sum of every shot's duration, and summary is a handy readout like 3 shots, 291 frames (~12.1s @ 24fps).
Install
Install once, use everywhere - this is the only node in the pack you must have:
cd ComfyUI/custom_nodes/
git clone https://github.com/TensorVizion/ComfyUI-Director-Node-Pack tensorvizion-director
Restart ComfyUI. ComfyUI Manager also finds it if you search the pack title. It has no requirements.txt - no Python deps of its own. The heavy lifting (the actual LTX/Wan/Hunyuan node packs) is only needed when you add an adapter, and each adapter tells you exactly what's missing if it isn't installed.
Where people get burned
Two honest caveats, both in the pack's own docs. Transitions are intent only. You can set crossfade, hold, or morph on a shot, but none of the adapters render them - every shot is conditioned independently and concatenated, so a "crossfade" today is really a hard cut. Second, this is a brand-new pack with essentially zero community track record, so expect rough edges. The design is sound and the code is small enough to read; there just isn't a crowd of users yet to have tripped over everything for you.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| timeline_json | STRING | {"schema_version": 1, "global": {"fps": 24, "width": 768, "height": 512, "seed": -1, "global_prompt_prefix": "", "global_negative_prompt": ""}, "audio_tracks": [], "shots": []} | β |
| imagesopt | IMAGE | β | |
| audioopt | AUDIO | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| timeline | DIRECTOR_TIMELINE | β |
| total_frames | INT | β |
| summary | STRING | β |