Nodes/ComfyUI-RefCap/H3 RefCap Capture
ComfyUI Node

H3 RefCap Capture

Five photos in, one file the model can't tell from the originals

By AEmotionStudio·Created about 15 hours ago·Updated about 15 hours ago· 1
H3 RefCap Capture
  • conditioning
  • image_1
  • image_2
  • image_3
  • image_4
  • image_5
  • image_6
  • image_7
  • image_8
  • image_9
  • STRING
◄namecharacter►
◄description►
◄store_rowsfalse►
◄compacttrue►

What it's for

MiniMax H3 is the one open-weight video model that takes reference photos and clones the person in them. The native way to do that is MiniMax H3 Reference to Video: wire your photos into it, wire the same photos into nothing else, and hope you remember which file was the smiling three-quarter shot six weeks later. Every workflow starts with a Load Image pile and ends with you re-picking photos because you renamed a folder.

H3 RefCap Capture collapses that into one file. You feed it the reference node's conditioning once, it writes ComfyUI/models/refcaps/<name>.safetensors, and from then on a string in a dropdown stands in for the whole photo set. The pack author's framing is the clearest way to hold it in your head: a RefCap is not a LoRA and nothing is trained. It's a recording of the exact inputs H3's own reference path produced, replayed unchanged later. The name is a deliberate contrast with "RefMod", which compresses and curves references; a RefCap just photographs them.

How it actually works

A reference photo reaches H3's DiT through two channels at once, and the capture node stores both.

The Qwen3-VL-32B text encoder builds a presentation - <Picture 1>: [vision block] <Picture 2>: [vision block] … <your prompt> - and its output rows (5120 wide) become the conditioning, with minimax_token_tags marking vision rows 0 and text rows 1. Separately, each resized photo is VAE-encoded into minimax_refs as an image block, which every one of the model's 50 DiT blocks attends to on every sampling step.

RefCap Capture reads the conditioning the reference node already made, pulls those two channels out, and adds the pixels the encoder actually saw. That last part is the fiddly bit and the reason replay can be exact: the stored photos aren't your originals, they're the resized version the text encoder was looking at, so replay can rebuild identical rows instead of guessing at a resize.

At capture time it hard-refuses a few things, and each refusal is a real mistake you can make. The conditioning must end in a vision token, which is its way of saying encode with an empty prompt on the reference node - if you left your prompt in there, the capture is rejected. References must be images only; clips and audio aren't capturable at this stage.

The inputs that matter

  • conditioning - the output of MiniMax H3 Reference to Video, empty prompt, image references only. This is non-negotiable.
  • name - the file stem. Keep it to letters, digits, _, . and -; anything else (a space, a slash, a bang) throws rather than silently writing somewhere odd.
  • image_1 … image_9 - optional but strongly recommended: the same photos, in the same order as the reference node. Skip them and you get a file with no pixels, which only H3 RefCap Apply (cached) can use. Connect a different number than the reference node holds and it tells you so.
  • store_rows - off by default, and it should stay off unless you specifically want Apply (cached). Rows are only read by that node; Replay rebuilds them. On a five-photo capture, rows were 101 MB of a 163 MB file.
  • compact - on by default. Stores each source photo as a PNG and redoes the resize at replay, bit-identically. A 1024 px photo costs about 0.7 MB instead of 12 MB, which is the difference between a 6.5 MB RefCap and a 162 MB one.

There's one output, a STRING summary: photo count, how many were stored as PNG, whether rows were kept, reference tokens, file size. It's an output node, so the text shows on the node after you queue - read it, it's how you find out a capture went sideways.

Install

ComfyUI Manager, search ComfyUI-RefCap, install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/AEmotionStudio/ComfyUI-RefCap.git

There's no requirements.txt in the repo and no pip step - it needs nothing beyond ComfyUI and the MiniMax H3 models themselves (the int8 ref2va DiT, the Qwen3-VL text encoder, the video and audio VAEs, and the 4-step Lightning LoRA if you're using it), all from Comfy-Org/MiniMax-H3. The ready-made H3 RefCap 1 - Capture template ships with the pack, which is the fastest way to see the wiring.

One thing worth saying out loud because it isn't in the node: H3's weights carry a licence that excludes the US, EU, UK and South Korea from its "Applicable Territory". That's a model constraint, not this pack's, but it applies the moment you render with a RefCap.

Where it goes wrong

The two failure messages you'll actually meet are "encode the references with an empty prompt" (clear the prompt on the reference node before it reaches Capture) and "N images connected for M references" (your photo order or count diverged between the two nodes - wire the same batch to both, in the same order, or none at all).

And if the RefCap never appears in the refcap dropdown of the replay nodes: it's reading ComfyUI/models/refcaps/, and the list is cached. Refresh the browser. From there, H3 RefCap Replay is the node you'll live in, and H3 RefCap Build View Set is what you reach for when one subject needs twenty-four angles instead of five photos.

Categoryadvanced/refcap

Inputs (14)

NameTypeDefaultDescription
conditioningCONDITIONINGMiniMaxH3ReferenceToVideo output, encoded with an empty prompt and image references only
nameSTRINGcharacter—
descriptionoptSTRING—
image_1optIMAGEthe images connected to the reference node, in the same order. Stores the pixels its text encoder saw, for H3 RefCap Replay
image_2optIMAGE—
image_3optIMAGE—
image_4optIMAGE—
image_5optIMAGE—
image_6optIMAGE—
image_7optIMAGE—
image_8optIMAGE—
image_9optIMAGE—
store_rowsoptBOOLEANfalsekeep the encoder's rows for H3 RefCap Apply (cached). Replay rebuilds them from the pixels, so a Replay-only RefCap doesn't need them: they are about 20 MB per 1,000 rows
compactoptBOOLEANtruestore each source image as a PNG and redo the resize at replay (bit-identical, ~17x smaller) instead of keeping the resized floats

Outputs (1)

NameTypeDescription
STRINGSTRING—