Prompt Relay Encode (Timeline)
Drag your scene changes instead of typing frame numbers
- model
- clip
- latent
- relay_options
- model
- positive
This is the same node as Prompt Relay Encode, just with a visual editor bolted on instead of you hand-typing |-separated segments and counting frames. It's kijai's own answer to a problem the wider LTX community has clearly been chewing on too - the KB's own read on LTX 2.3 is that it's "a first-frame/last-frame model with time-windowed conditioning, and stock ComfyUI has no good way to express 'this, then that, at this moment.'" That gap is real enough that at least one separate community project, LTX Director, built its own timeline node specifically because it talks to Prompt Relay. This node skips the middleman and gives you that timeline directly inside the pack.
How it works
Functionally it's identical to plain Prompt Relay Encode underneath: a global_prompt anchors the whole clip, and local segments each get their own slice of the timeline with the same epsilon-controlled boundary sharpness. What's different is how you author the segments - instead of writing local_prompts and segment_lengths by hand, you drag blocks around on a visual timeline widget, and the node writes local_prompts, segment_lengths, and timeline_data for you behind the scenes.
The one thing that trips people up is max_frames. It's tempting to read that as "how long is my video," but the tooltip is explicit: it only sets the timeline's visual scale in the editor, pixel-space, so the ruler and your dragged blocks look proportionate. The actual frame count your video ends up with is still read straight from the latent input's shape, same as the plain Encode node. Set max_frames wrong and your timeline editor will just look stretched or squished - it won't change your output length.
Inputs and outputs that matter
model,clip,latent- same as Encode.latentneeds to be an empty latent video; its shape is where the real frame count comes from.global_prompt- the persistent anchor, same role as in plain Encode.max_frames(default 129) - timeline display scale only, not your actual output length.timeline_data- auto-managed JSON state of what you dragged in the editor. The tooltip says it plainly: don't hand-edit this.local_promptsandsegment_lengths- auto-populated from the timeline editor; you generally don't touch these directly either.epsilon- boundary sharpness, identical role to the plain Encode node (paper default 0.001 for sharp cuts, higher for soft blends).fpsandtime_units(optional) - purely cosmetic for the editor. Switchtime_unitsto "seconds" and the ruler, segment ranges, and totals display in seconds using yourfpsvalue; storage is always pixel-space frames underneath, so this changes nothing about the actual encode.relay_options(optional) - same Advanced Options hookup as the plain node.
Outputs are the same pair: patched model and positive conditioning, wired the same way into your sampler.
Installing it
Same pack, same install: search "ComfyUI-PromptRelay" in ComfyUI Manager, or git clone https://github.com/kijai/ComfyUI-PromptRelay into custom_nodes and restart. Nothing extra for the timeline UI specifically - it's part of the same node file, no separate JS package to fetch.
Common issues
Confusing max_frames for your actual video length. Covered above, but it's worth repeating because it's the single most likely "why doesn't this match" question you'll have. Fix your video length in the empty-latent node, not here.
Editing timeline_data by hand. It's raw JSON state and it's marked auto-managed for a reason - hand-editing it risks getting it out of sync with local_prompts/segment_lengths, which the node also writes from the same editor.
Still work-in-progress software. Same caveat as the rest of the pack - the README flags it up front. If the timeline widget behaves oddly after a ComfyUI or pack update, that's more likely early-days rough edges than something you did wrong.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| latent | LATENT | Empty latent video — dimensions are read from its shape. | |
| global_prompt | STRING | Conditions the entire video. Anchors persistent characters, objects, and scene context. | |
| max_frames | INT | 1291–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.000001–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. |
| fpsopt | FLOAT | 24.00.1–240 | Frames per second — only affects how time is displayed in the timeline editor when time_units is set to 'seconds'. |
| time_unitsopt | COMBO | frames | Display the ruler, segment ranges, length input, and total in frames or seconds. Internal storage is always pixel-space frames. |
| relay_optionsopt | RELAY_OPTIONS | Optional advanced per-stream tuning. Connect a Prompt Relay Advanced Options node. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |