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 17 days ago·Updated about 16 hours ago· 112
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