Nodes/ComfyUI-MAINodes/MAI Video Out (file + sidecars + draft preview)
ComfyUI Node

MAI Video Out (file + sidecars + draft preview)

Save a render with its provenance sitting right beside it

By matlowai·Created 2 months ago·Updated 14 days ago· 213
MAI Video Out (file + sidecars + draft preview)
  • images
  • audio
  • latent
  • path
  • meta_json
◄fps24.000►
◄filename_prefixvideo/mai►
◄codech264►
◄crf18►
◄hold_map►
◄notes►
◄write_metatrue►
◄draft_previewfalse►
◄draft_vae_nametaeh3►

"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's hold_map_used and 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.json with seeds, models, LoRAs, steps and the encode time, read out of the graph that actually ran, plus anything you typed into notes. 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 wire latent) and the node decodes the latent through the tiny VAE in models/vae_approx - taeh3 for 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.

Categoryimage/minimax/video

Inputs (12)

NameTypeDefaultDescription
imagesIMAGE—
fpsFLOAT24.0001–120—
filename_prefixSTRINGvideo/mai—
codecCOMBOh2642 options: h264, av1
crfINT180–51constant quality; lower is better and bigger (18 is near-lossless for review)
audiooptAUDIO—
hold_mapoptSTRINGthe clock that produced these frames (H3 Time Smear hold_map_used), saved beside the file
notesoptSTRINGfree text into the meta sidecar (what this arm is)
write_metaoptBOOLEANtrue—
draft_previewoptBOOLEANfalsealso decode `latent` through the tiny VAE into <prefix>_draft.mp4
latentoptLATENTthe sampled latent, for the draft preview only
draft_vae_nameoptSTRINGtaeh3file stem under models/vae_approx used for the draft

Outputs (2)

NameTypeDescription
pathSTRING—
meta_jsonSTRING—