H3 Window Plan (split the pass into N windows) [alpha]
Cut a de-rope pass into N affordable windows
- images
- images
- hold_map
- splice_map
- first_frame
- last_frame
- window_count
- dilated_frames
- report
The de-rope pipeline regenerates a slowed-down copy of a MiniMax-H3 clip so fast motion stops smearing. That regenerated copy is the expensive part, and on a card that can't hold the whole dilated pass at once, you need to cut it into chunks. H3 Segment Crop cuts one window around the held span. H3 Window Plan splits that span into as many windows as your budget requires, and hands you window k - one per queue item.
Think of it as the front half of a two-node requeue pair. The flow is deliberately one-click: queue once, read the plan report to learn the window count, set the queue batch count to that number, and queue once more. The window widget increments itself per batch item, seed-widget style, so a batch of N renders all N windows from a single press. Each recovered window feeds H3 Window Collect, which banks everything to disk and splices the full set back together once the last one lands. Every window is an independent queue item, which has a nice property: an OOM on window 3 costs you window 3, not windows 1 and 2.
The budget is dilated frames, not world frames
max_dilated_frames (default 209, which is 17×12+5, i.e. 62 latent tokens) is the per-window budget in smeared frames - the number that sets both the bill and the VRAM peak. The way to set it: read your single-window number off H3 Segment Crop's report and go below whatever your card survived.
The other setting worth understanding is coverage:
- full clip (default) tiles windows over every frame, so calm spans get repainted too. They're cheap - 1 dilated frame per frame - and they cut cold by construction.
- held span regenerates only where the hold map fires and splices into the baseline everywhere else. Cheaper, but there's a trap on the upscale recipes: passed-through frames keep baseline resolution, so the clip visibly goes soft the moment motion calms down. Pick it only when the baseline wire is already at pass-2 resolution.
Cold and hot seams, in one paragraph
The plan snaps every cut to a cold boundary first, then to token starts, then to hold plateaus - a cut never lands inside a ramp shoulder if anything else is available. Cold cuts (hold 1 on both sides) crossfade like the single-window path. Hot cuts, forced inside a burst, turn the crossfade off and become a hard cut at a pinned frame: the overlap is generated as context, then overwritten by the next window. Two independent samples of the same frames cross-faded is a dissolve, not a cut, and on audio it doubles a percussive hit.
Outputs and the report
It emits images, the window's hold_map, a splice_map, first_frame/last_frame (pin the seam poses on FL2VA checkpoints), plus window_count and dilated_frames. The report is the price tag: every window's world span, its dilated frame count, and whether each cut came out cold or hot. If a cut is hot, the node's own advice is the right move - raise the budget or lower d_max on the oracle. De-roping a burst at 2x with no seam at all usually beats a visible join in the middle of the action.
Alpha, new 2026-08-12, and part of the pack's deliberate side-by-side of three window implementations - expect interfaces to keep moving. Install is the standard clone:
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
Restart, and note that H3's own open weights are licence-geofenced out of the US, EU, UK and Korea - the pack runs only where you can legitimately hold the model.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | baseline frames, world clock | |
| hold_map | STRING | from the oracle, H3 Manual Hold Map, or H3 Motion Editor | |
| max_dilated_frames | INT | 20939–3600 | budget per window in SMEARED frames (17k+5). 209 = 17x12+5, 62 tokens |
| window | INT | 00–64 | which window to emit this queue item; clamped to the plan. Leave the control on 'increment', set the queue batch count to the report's window count, and queue ONCE: each batch item renders the next window |
| handle_frames | INT | 122–48 | context frames kept each side, same meaning as H3 Segment Crop |
| coverageopt | COMBO | full clip | 'full clip' tiles windows over EVERY frame, so calm spans also get the pass-2 repaint (cheap: they cost 1 dilated frame each and cut cold). 'held span' regenerates only where the hold map fires; frames outside it pass through as baseline. On an upscale recipe passed-through frames keep BASELINE resolution, which reads as the clip going soft the moment motion calms down |
| snap_searchopt | INT | 240–96 | how far back from the largest feasible cut to look for a cold one / a token start. 0 = always cut at the budget limit |
| grid_alignopt | BOOLEAN | true | grow a hold-1 handle so sum(holds) lands on the 17k+5 grid exactly, instead of letting H3 Time Smear freeze the window's last frame. Interior seams multiply that freeze by N-1, so it is on by default here |
| fpsopt | INT | 241–120 | only used to phrase the report in seconds |
| s_per_stepopt | FLOAT | 0.000–120 | seconds per step from a baseline render of this clip; 0 skips the minutes estimate |
| est_stepsopt | INT | 181–100 | steps the regen pass will actually run (total_steps x inject) |
| overhead_sopt | FLOAT | 6.70–600 | fixed non-sampling seconds per render (setup, VAE encode/decode). 40 measured at 1.5 MP on a warm instance; take it from the gap between your own 1-step and 2-step wall times |
| edge_protectopt | INT | 00–48 | (alpha) frames held at 1 on EACH side of every hot cut, re-planning until every cut reads cold. A burst that ends at a window edge has no 'after' to slow into and comes back fast after recovery (measured 2026-08-23 on a chained segment: 1.55x -> 1.06x with one token group protected). 0 = off, the shipped hot-cut behaviour |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| hold_map | STRING | — |
| splice_map | STRING | — |
| first_frame | IMAGE | — |
| last_frame | IMAGE | — |
| window_count | INT | — |
| dilated_frames | INT | — |
| report | STRING | — |