H3 Timeline Render (alpha)
Compile a plan into a legal graph, and price it before you queue
- graph_path
- launch_command
- report
H3 Timeline Render is phase 2 of the MAINodes timeline surface: it takes a plan document and turns it into a legal, runnable H3 graph - then, pointedly, it refuses to run it for you. The design choice is worth understanding before you use it, because it's the part that surprises people. The node emits the minted graph's path and the exact launch command rather than executing in place. Launching belongs to your own queue script (queue_scene.py, in the pack's ecosystem), which guards output-prefix collisions and refuses partial graphs. Compile here, launch there.
How it works
The only required input is plan_path - a plan.json, whether it's yours, the oracle's via H3 Timeline Analyze, or one somebody posted. If the plan was edited since it was last compiled, the node recompiles: the compiled graph is a cache keyed to the plan's revision, never a second source of truth. That's the invariant that keeps the "source of truth" promise honest - you can't have a stale graph silently diverging from a newer plan.
The optional inputs are where the pricing lives:
graph_path- where the minted .api.json lands (empty =workflows/<plan name>.api.json).port(default 8189) - the ComfyUI instance the launch line targets, and whose/system_statsthe VRAM-fit line reads.recorder_path- the flight-recorder jsonl (default/root/.cache/mainodes/flight_recorder.jsonl). This is the interesting one: layer (b) of the price meter calibrates from your own runs only, so the longer you use it, the more honest the estimate gets.
Outputs: graph_path, launch_command (the exact line to run), and report (the price - what the compiled graph costs before you spend a single step).
Where it fits
Pair it with H3 Timeline Analyze, which writes the plan (and can auto-compile); Render exists for the cases where you want to see and edit the plan first, or where the plan came from outside the analyze node entirely. The separation is deliberate: Analyze proposes, Render compiles, your queue script executes. It makes the pipeline auditable - the plan is human-readable JSON, the graph is deterministic output, and the price is computed before anyone spends GPU time.
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 thing to internalize: "compiles but doesn't run" isn't a missing feature, it's the contract. If you're used to nodes that execute everything, the first time Render hands you a command line instead of a render it feels broken. It's not - wire launch_command into your queue script (or run it yourself) and the graph will do exactly what the plan said, which is the entire point of the document-driven design.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| plan_path | STRING | — | |
| graph_pathopt | STRING | empty = workflows/<plan name>.api.json | |
| portopt | INT | 81898188–8199 | instance the launch line targets, and whose /system_stats the VRAM fit line reads |
| recorder_pathopt | STRING | /root/.cache/mainodes/flight_recorder.jsonl | flight-recorder jsonl; layer (b) of the price meter calibrates from YOUR runs only |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| graph_path | STRING | — |
| launch_command | STRING | — |
| report | STRING | — |