Smart MiniMax H3 Single-Frame Decoder
The single-frame decoder swap
- vae
- vae
MiniMax H3 is a video model, but you can absolutely use it to make stills - the H3-VAE's latent space does double duty. The catch is that the official decoder is a video decoder: it expects a stack of temporal tokens and tiles its way through them, which is the wrong tool when all you generated was one frame. This node's whole job is to give you the right tool. It takes the official H3 video VAE, keeps its encoder, and swaps in the experimental single-frame decoder from iamkaikai/MiniMax-H3-Single-Frame-VAE-500K - a decoder someone already tuned for ~500K steps specifically to make clean still images out of H3 latents.
The name is doing a lot of honest work, which is refreshing. It doesn't call any API, it needs no key, and it won't pretend to decode video for you. The description says it plainly: "Not for video."
How it works
The node reads the decoder .safetensors and remaps its keys from the Diffusers-style export onto ComfyUI's MiniMaxH3VideoVAE layout - fusing the separate q/k/v attention matrices into one to_qkv, swapping the two halves of the GEGLU feed-forward weight (Diffusers stores [value, gate], ComfyUI reads [gate, value]), and renaming a few projection layers. That's the fiddly part people usually hand-wave; this node just does it.
Then it builds a cloned copy of your VAE so the official one in memory stays untouched and cached, sets tiling = False, and replaces the decode path with one that decodes a single temporal slice: slice the latent, denormalize, run decoder(post_quant_conv(z)), keep the last pixel frame, and apply the ImageNet denormalization. What comes out the other end is a VAE, not an image - same as any other VAE you'd wire into a VAE Decode node.
The inputs that matter
- vae - your official MiniMax H3 video VAE. It has to be the real
MiniMaxH3VideoVAE; feed it anything else and the node refuses with aValueError, not a crash mid-decode. Good behavior. - decoder_name - path under
models/vae/. Defaults tominimax_h3/minimax_h3_single_frame_decoder_500k.safetensors; the node also resolves the basename so a loose file in the VAE folder still works. - latent_index - which temporal slice to decode.
0is the first token (matching the HuggingFace default),-1is the last. For a true still you'll normally just leave it at 0.
Output: one vae, which you feed straight into VAE Decode after the KSampler.
Installation
Install the pack via ComfyUI Manager (search "ComfyUI Smart Helper Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/slvslvslv/ComfyUI-SmartHelperNodes
Restart ComfyUI. There are no Python dependencies - requirements.txt is empty - but two other things have to be true:
- You need a recent ComfyUI build that includes MiniMax H3 support (this node imports
comfy.ldm.minimax.vae), plus the official H3 VAE. - You need to grab the decoder file itself, since it doesn't ship with the pack:
cd ComfyUI/models/vae
mkdir -p minimax_h3
# download minimax_h3_single_frame_decoder_500k.safetensors from
# iamkaikai/MiniMax-H3-Single-Frame-VAE-500K into minimax_h3/
Common issues
- "Expected the iamkaikai MiniMax H3 single-frame decoder export" - the node matched fewer than 400 keys. You pointed it at the wrong file (the official video VAE, say). Grab the right download.
- ValueError on the VAE input - you're not feeding it an actual H3 video VAE, so there's nothing to overlay.
- It's not a video node. If you wire it into a full H3 video decode you'll get one frame's worth of pixels and a headache. Use it for stills, use the stock VAE for clips.
One last thing worth knowing: H3's weights carry a community license that excludes the US, EU, UK and South Korea. That's a legal constraint, not a technical one - if you're in an excluded territory, this node is a solution to a problem you aren't licensed to run at all.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| vae | VAE | — | |
| decoder_name | COMBO | minimax_h3/minimax_h3_single_frame_decoder_500k.safetensors | 1 options: minimax_h3/minimax_h3_single_frame_decoder_500k.safetensors |
| latent_index | INT | 0-1–4096 | Temporal latent slice to decode independently. 0 = first token (HF default). -1 = last token. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| vae | VAE | — |