H3 Timeline Analyze (alpha)
Turn two oracles' opinions into a retiming plan the graph obeys
- plan_path
- preview
- graph_path
- report
H3 Timeline Analyze is the front half of the MAINodes timeline surface, and its core idea is the kind of thing that sounds obvious until you see how it changes the workflow: a plan is a document, and a graph is only ever compiled from it. Instead of you hand-tuning a de-rope graph, you feed this node the oracle's read of your clip and it writes a per-clip JSON - a plan document - that says, in dilation ratios over time, how the shot should be retimed. That plan is the source of truth. Everything downstream is derived from it, which is what makes the plan editable, shareable, and priceable.
The inputs that matter
clip_pathandframes- where the source clip lives and its world length (on the 17k+5 grid; wire H3 Video Fit'slength). The clip's file name is what the compiled graph's LoadVideo will use, so this isn't just bookkeeping.jerk_profileand/orindecision_profile- the oracle outputs. Wiring both is the validated combination: the jerk oracle catches fast props, the indecision oracle catches detail the model is still arguing with itself about, they disagree in both directions, and the proposal takes the max of the two rank-normalized profiles. Wire one and you're only seeing half the story.auto(default true) - the zero-click mode: accept the proposal and compile it straight into a minted graph. Set false to stop at the plan for editing.ceiling(default 4) - the lane's top end in generated frames per world frame. The README is explicit: "4x is the measured sweet spot, not a wall." Raise it if you're cool spending the time; the price meter is what makes a high ceiling safe.threshold(default 0.75) - rank-scale saliency below which the clip stays at real time.- The execution knobs -
prompt,width/height,regen_strength(H3's inject, default 0.45),steps,seed,output_prefix,graph_path- get baked into the compiled graph so it can't drift from the plan.
Outputs
plan_path (where the JSON landed), preview (an image of the proposal), graph_path (where the compiled .api.json was minted), and report (the price). With auto on, one queue item gets you a plan and a ready-to-run graph.
Install
Ships with matlowai/ComfyUI-MAINodes:
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
Restart, under latent/minimax/timeline. No extra Python deps; you need MiniMax-H3 weights and ComfyUI's H3 support (check the licence's US/EU/UK/Korea carve-outs).
The honest take: this whole timeline surface is alpha and young - it's the pack's bid to make de-roping a specification rather than a pile of widgets. If you're happy tuning dials, the classic pipeline nodes still work and are regression-tested; Timeline Analyze is for when you want the same decisions made systematically, repeatably, and priced before you commit. Start with auto on and both oracles wired - that's the path the author validated.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_path | STRING | the source clip this plan is about (its file name is what the compiled graph's LoadVideo will use) | |
| frames | INT | 12439–3600 | world length of the clip, on the 17k+5 grid; wire H3 Video Fit's length |
| plan_path | STRING | where to write plan.json; empty = output/timeline/<clip>.plan.json | |
| auto | BOOLEAN | true | True: accept the proposal and compile it immediately (zero click). False: write the plan and stop |
| jerk_profileopt | STRING | H3 Jerk Oracle's profile output | |
| indecision_profileopt | STRING | H3 Indecision Oracle's profile output | |
| ceilingopt | FLOAT | 4.01–16 | the lane's top end in generated frames per world frame; the output is NOT slower or longer, it is generated denser. The price meter is what makes a high ceiling safe |
| thresholdopt | FLOAT | 0.750–0.99 | rank-scale saliency below which the clip stays at real time (the oracle's q, on a scale both signals share) |
| promptopt | STRING | — | |
| widthopt | INT | 115264–4096 | — |
| heightopt | INT | 64064–4096 | — |
| regen_strengthopt | FLOAT | 0.450–1 | how much of the denoise schedule the regeneration gets (H3's inject) |
| stepsopt | INT | 251–100 | — |
| seedopt | INT | 202608170–18446744073709550000 | — |
| output_prefixopt | STRING | video/timeline | — |
| graph_pathopt | STRING | where auto-compile mints the .api.json; empty = workflows/<plan name>.api.json |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| plan_path | STRING | — |
| preview | IMAGE | — |
| graph_path | STRING | — |
| report | STRING | — |