H3 Project
Every number the rest of the graph reads, and the ladder it prints
- project
- upscale_megapixels
- report
H3 Project is the boring node you wire first and then forget about. It holds fps, aspect ratio, resolutions, the base seed, the frame ladder and the stale-run timeout, and every other node in the pack reads its numbers from it. Change the ladder here and it changes everywhere at once.
It also has the single most useful output in the pack: a report that prints the entire ladder of lengths H3 will actually accept. Read it once and you'll stop guessing why 15 seconds doesn't work.
The 17-frame ladder, in one paragraph
MiniMax H3 doesn't take an arbitrary length. The reference workflow's expression reduces to length % 17 == 5, minimum 5. At 24fps that's 21 usable rungs, 0.708s apart, topping out at 345 frames = 14.375s. Fifteen seconds is not reachable. 8.000s is one of the few round numbers on the grid.
So the planner keeps two numbers per segment: target_duration (what the cut needs, a free float you plan in) and render_duration (the rung at or above it). Because the snap always rounds up, every clip renders slightly long - and H3 Stitch Timeline trims it back, which is what stops a twelve-segment video drifting 8 seconds against its track. If a different VAE or turbo LoRA changes the rule, frame_modulus, frame_remainder and frame_minimum are widgets. Set modulus to 1 to disable snapping entirely.
The inputs worth knowing
project_name- this is a folder name. State lives inoutput/h3_planner/<project>/, so the same name has to appear in your planning, rendering and stitching workflows or they'll be talking about different projects.fps,aspect_ratio- ten aspects, 9:16 default; H3 is happiest with what the guide specifies.render_pass-draft,finalorone_go. H3 Pass Gate is what reads this, and it decides the claim pass. Inone_gothe draft falls out of the same base sample for free.draft_megapixels/final_megapixels- 0.3 and 1.2 by default, snapped toalign(32) for clean latent upscaling. The base sampler always runs at draft size; a final is the draft latent through the upscaler, not a bigger base render.base_seed- segment seeds are derived from it deterministically and fixed at plan time. That's what makes a promoted segment match the draft you approved.max_segment_seconds- the longest clip your card can render in one go. H3 itself tops out near 15s; drop this to 6 on a smaller card and the planner cuts more, shorter segments instead. This is the VRAM lever that matters, because peak VRAM has to stay flat as the video gets longer.stale_minutes- an unfinished run older than this is reclaimed topending.
Outputs are project, upscale_megapixels (wire it to your latent upscaler so the two agree), and report.
What the report gives you
The project name and folder, the render mode in words, the base resolution every pass samples at, the upscale target and its exact integer scale, the ladder rule, how many rungs there are and how far apart, the longest usable clip inside your segment cap, and a line confirming seeds are derived from your base seed. When something downstream does the wrong thing with a duration, this is where you find out whether the plan was wrong or the render was.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/AIJigyasa/ComfyUI-H3-Planner
Restart, or install MiniMax H3 Planner from ComfyUI Manager. You need ffmpeg on PATH (or pip install imageio-ffmpeg), a ComfyUI with the MiniMax H3 nodes, and - for the language-model nodes only - the sibling ComfyUI-H3-Prompt-Creator pack. H3 Project itself needs none of that.
Where people get burned
Project name mismatch is the most common failure in the pack. Your plan workflow writes output/h3_planner/h3_project/timeline.json; your render workflow with a different project_name sees nothing. The Timeline node now names the projects that do have a timeline when you get this wrong, which saves a miserable manual hunt.
Deleting timeline.json starts over. That's the reset button - and the inverse trick is genuinely useful: delete a clip from vault/ and that segment becomes outstanding again on the next run.
Don't plan on 15 seconds per clip. 14.375s is the ceiling and it's a lot of VRAM; sitting at 5–8s per segment is how you keep peak memory flat across a three-minute video. Also worth knowing if you're in the US, EU, UK or South Korea: H3's community licence excludes those territories for the local weights, which is a licensing question, not a node one - the hosted API is a separate path.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| project_name | STRING | h3_project | — |
| fps | FLOAT | 241–120 | — |
| aspect_ratio | COMBO | 9:16 | 10 options: 9:16, 16:9, 1:1, 4:5, 5:4, 4:3, +4 |
| render_pass | COMBO | draft | draft = base sample only, the upscale branch is skipped. final = base + upscale, for segments you have approved. one_go = both in a single run, storing a draft and a final for every segment. |
| draft_megapixels | FLOAT | 0.300.05–8 | — |
| final_megapixels | FLOAT | 1.200.05–8 | — |
| align | INT | 321–128 | — |
| base_seed | INT | 123450–72057594037927940 | — |
| frame_modulus | INT | 171–256 | H3 needs length %% modulus == remainder |
| frame_remainder | INT | 50–255 | — |
| frame_minimum | INT | 51–4096 | — |
| snap | COMBO | up | up never renders less than planned; the stitcher trims the overshoot |
| max_segment_seconds | FLOAT | 6.01–60 | the longest single clip your GPU can render in one go. H3 itself tops out near 15s; drop this to 6 on a smaller card and the planner cuts more, shorter segments instead. |
| default_duration | FLOAT | 6.00.2–60 | — |
| stale_minutes | INT | 100–1440 | a run left unfinished this long is reclaimed |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| project | H3_PROJECT | — |
| upscale_megapixels | FLOAT | — |
| report | STRING | — |