H3 Contact Sheet Decode
The mandatory other half of the contact sheet
- vae
- samples
- views
- sheet
If you wire up an H3 Contact Sheet and skip this node, you'll get a smeared strip of nonsense and blame the pack. H3 Contact Sheet Decode is the node that makes the five-view trick work - it's the decoder the contact sheet latent requires, not an optional convenience.
Here's the deal. H3 Contact Sheet packs five standalone image latents onto the model's time axis and denoises them together, so the subject stays consistent across views. That's a great trick for consistency, but it means the output latent isn't a video - it's five independent frames riding one tensor. A normal video VAE decode treats them as consecutive video frames and smears them together. The decode node exists precisely to avoid that: it decodes each slot one at a time.
The mechanism, briefly
It pulls each slot out of the packed latent and decodes it alone. There's a subtlety worth knowing: a single latent frame is off the H3 VAE's legal grid (the minimum legal clip is two latent tokens), so a lone frame decodes with heavy artifacts. The node's fix is to duplicate the slot token into a legal two-token clip, decode, and keep pixel frame 0 - measured cleaner than any one-frame path. You don't need to do anything about this; it's the kind of thing you only care about when you're wondering why the node exists at all.
The inputs and outputs
Delightfully boring. Two required inputs: vae (your H3 VAE) and samples (the denoised latent out of your sampler, straight from H3 Contact Sheet). Two outputs:
views- an IMAGE batch of the five independent views. This is the one you'd pass to a save node or ImageBatch for a grid.sheet- the same five views concatenated side by side into one strip image, ready to preview as a single picture.
That's the whole node. No knobs, no presets, no hidden dials.
Wiring order
H3 Contact Sheet → KSampler (28 steps, res_multistep, denoise 1.0, LoRA strength 0.75 is the shipped recipe) → this node → save/preview. If you're working from the drag-in example, it's all pre-wired. The one decision left to you is size on the Contact Sheet node upstream (512/1024/2048); the decode just follows whatever's in the latent.
Installing it
Same story as the rest of the pack - pure Python:
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
Restart, look under latent/minimax. The example graphs want ComfyUI-KJNodes for their attention patches; this node itself uses stock VAE decode. Underneath it all is MiniMax H3, whose community license excludes the US, EU, UK and South Korea - check your region before you build a turnaround pipeline on it.
That's genuinely all there is. It's a thin node, but it's the one that prevents the pack's most embarrassing failure mode, and it's worth knowing why before you hit it blind.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| vae | VAE | — | |
| samples | LATENT | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| views | IMAGE | — |
| sheet | IMAGE | — |