MAI Video Out (file + sidecars + draft preview)
Save a render with its provenance sitting right beside it
- images
- audio
- latent
- path
- meta_json
"Save Video with the record beside it." That's the entire pitch, and it's a better pitch than it sounds. MAI Video Out encodes your frames (plus optional audio) with ComfyUI's own encoder - same path as Create Video + Save Video - and then does the thing stock save nodes don't: it writes the metadata that makes a render worth keeping, as sidecar files right next to the clip.
Because two weeks from now, looking at a folder of video_00001_.mp4, you will not remember which seed, which model, or which LoRA made that take. This node remembers for you.
The extras, each off unless wired or toggled
hold_map- wire H3 Time Smear'shold_map_usedand the clock that produced these frames is written to<prefix>.holdmap.json, which H3 Load Hold Map can read back. Your recovery metadata survives the save.write_meta(on by default) - writes<prefix>.meta.jsonwith seeds, models, LoRAs, steps and the encode time, read out of the graph that actually ran, plus anything you typed intonotes. That's the self-documenting graph; your prompt and workflow JSON ride along too.draft_preview- the one genuinely clever extra. Toggle it on (and wirelatent) and the node decodes the latent through the tiny VAE inmodels/vae_approx-taeh3for H3 - into<prefix>_draft.mp4. A draft preview instead of a full VAE decode. The tiny VAE is loaded for this call only and released after, so with the toggle off nothing is loaded. Measured at 8-42 ms per latent frame by canvas, which is the difference between a quick look and waiting for the real decode.
The inputs that matter
images, fps (24), filename_prefix (default video/mai), codec (h264 or av1), and crf - constant quality, where 18 is near-lossless for review and lower is bigger. audio is optional; if your render has foley, wire it or ship silent. Outputs are path (where it landed) and meta_json (the sidecar contents, as a string you can wire into a preview to eyeball before it's written). It's an output node, so it shows in the UI.
When you'd bother
If you're on the plain ComfyUI save path and happy, you don't need this. But the moment you're comparing candidates, hunting seeds, or de-roping windows, the sidecars earn their keep fast: holdmap.json keeps your de-rope reproducible, meta.json makes a seed hunt auditable, and the draft preview means you can check a latent without paying for a decode. Alpha-wise it's younger than the settled Motion Lab nodes but this one is straightforward plumbing - encode, write files, release.
Ships in ComfyUI-MAINodes (matlowai, GPL-3.0, no Python deps):
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
Restart, look under image/minimax/video, and keep in mind the pack targets H3 - whose weights are licence-restricted in the US, EU, UK and Korea. Renders of a model you can't legally run are sidecars you don't want.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| fps | FLOAT | 24.0001–120 | — |
| filename_prefix | STRING | video/mai | — |
| codec | COMBO | h264 | 2 options: h264, av1 |
| crf | INT | 180–51 | constant quality; lower is better and bigger (18 is near-lossless for review) |
| audioopt | AUDIO | — | |
| hold_mapopt | STRING | the clock that produced these frames (H3 Time Smear hold_map_used), saved beside the file | |
| notesopt | STRING | free text into the meta sidecar (what this arm is) | |
| write_metaopt | BOOLEAN | true | — |
| draft_previewopt | BOOLEAN | false | also decode `latent` through the tiny VAE into <prefix>_draft.mp4 |
| latentopt | LATENT | the sampled latent, for the draft preview only | |
| draft_vae_nameopt | STRING | taeh3 | file stem under models/vae_approx used for the draft |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| path | STRING | — |
| meta_json | STRING | — |