MiniMax H3 Latent Upscale
Make MiniMax H3 video bigger without touching a pixel
- samples
- LATENT
If you've spent any time with MiniMax H3 you know its problem: the model generates straight onto a fixed canvas, and there is no "make it bigger" button. You get one resolution and you're stuck with it - unless you do what still-image people have done for years and run a two-pass hi-res fix. This node is the geometry half of that trick.
MiniMax H3 Latent Upscale (from rockerBOO's h3-latent-upscaler pack) takes your denoised video latent from a first sampling pass and spatially upscales it. Then you run a second, low-denoise sampling pass on the bigger latent to firm the detail back up. Same logic as the img2img second pass you'd do on a 512x512 SD image, just done in video-latent space so every frame agrees with its neighbors. It doesn't invent detail on its own - that's what the second pass is for. Think of it as "more pixels," and the resample as "more detail."
How it works
The important context: an H3 latent isn't a plain tensor. ComfyUI carries H3's video and audio together as one AV latent (a NestedTensor), and you split it apart with the stock LTXVSeparateAVLatent node before upscaling. You feed the video half into this node; audio doesn't get upscaled at all - H3's audio latent has its own shape and should pass through untouched.
Mechanically the node is simple: it interpolates the latent's H and W by scale_by with ComfyUI's standard common_upscale, then snaps the result up to a multiple of 2. That snap isn't cosmetic. H3's DiT patchifies with patch size (1, 2, 2) and its conditioning path doesn't pad, so an odd latent dimension crashes the model. The node also upscales the noise_mask along with the samples if one is attached, so masks keep lining up in the second pass.
The inputs that matter
Only two, really:
scale_by- how much bigger (default1.5, range0.01–8). 1.5–2x is the sane band for a second pass; past ~2x the upscaled latent gets soft and the resample has to do increasingly heroic work to add detail back, for more VRAM and time.upscale_method-bilinear(the default),nearest-exact,area,bicubic, orbislerp. Bilinear is a fine starting point.areaaverages so it's the smoothest;nearest-exactstays crunchy and is mostly for masks.
samples is the video latent straight out of LTXVSeparateAVLatent. The single LATENT output feeds the video branch's noise node (MiniMaxH3AddNoise) ahead of the second SamplerCustomAdvanced pass, then you rejoin it with the audio half via LTXVConcatAVLatent.
Installing it
Grab it through ComfyUI Manager (search h3-latent-upscaler), or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/rockerBOO/h3-latent-upscaler
Then restart ComfyUI. There's no pip step - the pack declares zero runtime dependencies and is pure torch over ComfyUI core calls, so install is just "put it in the folder and reload." What you do need is a current ComfyUI: the nodes use the comfy_api.latest extension API and import comfy.ldm.minimax, both of which only exist in builds with day-zero H3 support (weights landed in ComfyUI in early August 2026). If the nodes don't appear after a fresh install, update ComfyUI before blaming the pack. The repo ships two ready-made example workflows in example_workflows/ (ref2va and image-to-video) with the whole two-pass graph already wired - much easier to copy from than to rebuild.
Where people get burned
The most common mistake is upscaling the video and forgetting the conditioning. If your pass 1 used reference images or keyframes (ref2va / image2video), those are carried as visual latents inside the CONDITIONING, sized for the old canvas. Upscale the video and leave them alone and your references sit at the wrong scale for the grown frame. The pack's companion node, MiniMaxH3ConditioningUpscale, fixes exactly that - use it with the same scale_by and upscale_method you set here.
Also: don't feed this node the joined AV latent. It expects the separated video tensor - upscaling audio by the same factor would scramble it and can trip the shape checks downstream. Split first, upscale, concat later. And keep expectations in check: you're interpolating a latent, not calling an image upscaler, so the pass-1 output will look softer than the final video until the resample pass runs.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| samples | LATENT | — | |
| scale_by | FLOAT | 1.500.01–8 | — |
| upscale_method | COMBO | bilinear | 5 options: nearest-exact, bilinear, area, bicubic, bislerp |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |