Nodes/Polyhedron Suite/⬡ Polyhedron Cine Timeline
ComfyUI Node

⬡ Polyhedron Cine Timeline

Cine Timeline Builds the MiniMax H3 Prompt For You

By PolyhedronAI·Created 5 months ago·Updated about 23 hours ago· 6
⬡ Polyhedron Cine Timeline
  • refs
  • image_1
  • image_2
  • image_3
  • image_4
  • image_5
  • image_6
  • image_7
  • image_8
  • image_9
  • prompt
  • first_frame
  • last_frame
  • anchors
  • seconds
  • frames
  • info
  • clip_prefix
  • scene
◄timeline{"v": 1, "seconds": 6.0, "style": "Live-action, cinematic,", "shots": [{"at": 0.0, "cut": "the camera cuts to", "text": ""}], "anchors": [], "soundscape": "", "music": "N/A", "from": "", "render": "whole", "active": 1, "project": "cine", "transitions": [], "carry_mode": "pin", "triggers": "", "target": "fl2va"}►
◄storyboard—►

MiniMax H3 makes 4–15 second clips with their own sound, which is great until you want a film. Then you're the person typing [Shot 2] At 00:02.500, the camera cuts to ... into a text box, hoping you counted frames right, and retyping the block when a cut moves half a second. ⬡ Polyhedron Cine Timeline replaces that text box with a timeline: shots on a time axis, anchor images pinned to frames, and a compiler that emits the official H3 prompt form for you.

It ships in the Polyhedron Suite pack, an ambitious thing for one repo to attempt - media I/O, LoRA management, samplers, upscalers and a whole little NLE in one install. For this node the pitch is honest: H3's prompt format is picky, and Cine Timeline knows it.

What it actually does

The only required input is timeline - a JSON blob whose own tooltip tells you not to touch it, because the editor drawn on the node edits it for you. That editor is the real product: a length, a project name, shots with at times and text, scene flags, H3 transitions on cuts. Then the node compiles it into the shape H3 wants:

integrated_multimodal_description: [Shot 1] Live-action, cinematic, <your text>

[Shot 2] At 00:02.500, the camera cuts to <your text>

overall_soundscape: ...
non_diegetic_music: N/A

Shot 1 starts at zero and carries no time, later shots carry MM:SS.mmm, cuts go forward, and the cut phrase has to be one of the official ones. Get that wrong by hand and H3 quietly ignores you. Anchors get split too: an image on the first or last frame is a keyframe (a real <Picture n> the text encoder sees, plus the alignment line); an anchor in the middle is a guide - passed downstream but never shown to the text encoder, so info says so instead of pretending the prompt can name it.

Length is snapped to H3's 17k+5 frame grid at 24 fps. Ask for 6.0 seconds and you get 158 frames - 6.58 seconds, the same rounding core's Empty Latent does. Not a bug, but it explains why your cuts feel a frame or two off.

The pins you actually wire

prompt is the one that matters, and its intended home is a ⬡ Polyhedron CLIP Text Encode with external_mode = fill {pos_N}: fixed text (triggers, look, light, subject) stays in the encoder's segments, and the timeline carries {pos_1} / {pos_2} and fills them at run time. The "→ CTE" button moves Shot 1's fixed parts into those segments for you.

Then seconds goes into ⬡ Polyhedron Empty Latent's duration_seconds, clip_prefix (optional) into a Save's filename_prefix so each run lands as <day>/PH_<hhmmss>_<project>_whole or _scene_k, and first_frame / last_frame / anchors into the keyframe and guide-style H3 input nodes. frames, scene and info are readouts - info prints a shot-by-shot breakdown to the console, warnings included.

Optional inputs: refs from a Reference Board (anchors can use its images by @tag), up to nine image_1–image_9 (pins appear as you wire them, so an anchor can be a Media Loader output or a frame of an earlier clip), and storyboard from the Cine Storyboard node - a new storyboard replaces the timeline once, your edits after that stick.

Install

Manager first - search "Polyhedron Suite" (package id polyhedron-lora-stack) - or:

cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI

No Python dependencies; the nodes run on what ComfyUI ships. You do want ffmpeg (on the PATH, or the copy imageio-ffmpeg brings) for the film strips, waveforms and export, and clips are read through PyAV, which modern builds already have.

Where people get burned

Two failures are H3 refusing the prompt rather than the node crashing, and both are reported by name: a shot at 0.0 that isn't shot 1 ("cuts go forward"), and a shot starting past the clip's end. Fix the time, not the JSON.

Transitions are the subtle one. An H3 transition wants a formula and two sentences - one closing the shot before, one opening the shot after. The formula alone gives you a hard cut; the author found that by probing. A shot that starts a scene also ignores its transition, because two clips meet there.

The render setting also matters more than it looks: whole timeline, one scene, or one queued run per scene - great for iterating scenes 2–5, confusing if you expected one long film. And on the ref2va target there's no last-frame input, so an anchor on the last frame warns rather than surprises you.

My honest take: for single-shot prompting this is a lot of node for a text field you could type yourself. The moment you have three shots, a carried frame between scenes and a cut to move by 200 ms, it's the only sane way to work. Just budget for the H3 weights - the local release is a big download, and its community licence excludes the US, EU, UK and South Korea.

CategoryPolyhedron/Cine

Inputs (12)

NameTypeDefaultDescription
timelineSTRING{"v": 1, "seconds": 6.0, "style": "Live-action, cinematic,", "shots": [{"at": 0.0, "cut": "the camera cuts to", "text": ""}], "anchors": [], "soundscape": "", "music": "N/A", "from": "", "render": "whole", "active": 1, "project": "cine", "transitions": [], "carry_mode": "pin", "triggers": "", "target": "fl2va"}The timeline's state (JSON), edited by the timeline above -- not by hand.
refsoptPLS_REFSReference Board refs -- anchors can use its images by @tag.
image_1optIMAGEAnchor source 'image_1': an image without a board (a Media Loader, a frame of an earlier clip, any IMAGE). Up to 9 -- the pins grow with what is wired.
image_2optIMAGEAnchor source 'image_2'.
image_3optIMAGEAnchor source 'image_3'.
image_4optIMAGEAnchor source 'image_4'.
image_5optIMAGEAnchor source 'image_5'.
image_6optIMAGEAnchor source 'image_6'.
image_7optIMAGEAnchor source 'image_7'.
image_8optIMAGEAnchor source 'image_8'.
image_9optIMAGEAnchor source 'image_9'.
storyboardoptSTRINGFrom Cine Storyboard, or the answer of any LLM node asked with its `system` + `request`. A NEW storyboard replaces the timeline once; your edits after that stay until the next new one.

Outputs (9)

NameTypeDescription
promptSTRING—
first_frameIMAGE—
last_frameIMAGE—
anchorsPLS_ANCHORS—
secondsFLOAT—
framesINT—
infoSTRING—
clip_prefixSTRING—
sceneINT—