Nodes/Dailies Take Recorder/Dailies: Write take.json
ComfyUI Node

Dailies: Write take.json

Your MP4 remembers nothing. This node writes the receipt.

By zhang-liz·Created 18 days ago·Updated 18 days ago· 0
Dailies: Write take.json
  • filenames
  • video_info
  • sidecar_path
video_path
shot
parent
hash_modelsfalse

Every PNG that leaves ComfyUI carries its entire recipe inside itself - drag it back onto the canvas and the whole workflow rebuilds. Your MP4 does none of that. A video is just pixels, and the seed, model, LoRA strengths, and prompt edits that made it died at save time. So you queue forty takes overnight, wake up to one that's perfect, and have no idea what produced it. Dailies: Write take.json is the fix: one node that drops a <clip>.take.json sidecar beside every video it renders, so a night of takes can be found, reproduced, and ranked without reopening ComfyUI.

Video generation is a numbers game - the Wan 2.x era normalized 20–50 takes per usable shot, and the workflow that mattered is the one that ran that take, not the one you've edited five times since. This node snapshots it.

How it works

The node reads the hidden PROMPT input ComfyUI passes to every execution - the fully resolved graph of what actually ran - and walks it without caring about node names. Models are found by file extension, seeds by input name (seed/noise_seed), LoRAs carry their strength, and the prompt comes from following positive links. New loaders and samplers work with zero code changes. That resolved graph gets stored verbatim in the JSON, so you could replay a take by loading it back into ComfyUI.

A few mechanical details worth knowing. The take_id is a SHA-256 hash of the clip file itself - rerun the same file and you get the same id, which is how parent lineage works. Video stats (fps, frames, width, height) come from the connected video_info if you wire it, otherwise from ffprobe on your PATH. And because it's an output node with IS_CHANGED returning NaN, it fires on every queue even when nothing upstream changed - the classic always-rerun trick, and exactly what you want for a per-render receipt.

The inputs that matter

There are only a handful, and you'll touch even fewer:

  • filenames - the VHS_FILENAMES output from VideoHelperSuite's Video Combine. This is the easy path; plug it in and the node knows exactly what was just saved. It wins over video_path whenever it's connected.
  • video_path - a plain string, absolute or relative to the output folder. Use this with the core Save Video node. Leave both empty and the node errors with "connect VHS filenames or give a video_path".
  • shot - a name that groups takes for ranking (shot-07, say).
  • parent - the take_id this clip is a rerun of, if it is one.
  • hash_models - content-hash the model and LoRA files instead of leaving sha256 null. Real caveat: hashing multi-GB weights is slow, so it's off by default.

The single output, sidecar_path, is the JSON path - useful if you want to wire it somewhere downstream. The node also preserves any review block already in the file, which matters because the companion dailies CLI writes ranking verdicts into the same JSON. That's the loop: render all night, then dailies review ComfyUI/output/ --shot shot-07 from a terminal and let it rank the folder, mark the dead takes, and record reasons.

Installing it

ComfyUI Manager: search dailies, install, restart. Or manually:

cd ComfyUI/custom_nodes
git clone https://github.com/zhang-liz/comfyui-dailies
pip install -r comfyui-dailies/requirements.txt

Then restart ComfyUI. One dependency to know about: requirements.txt pulls the video-dailies package from the author's zhang-liz/dailies repo, which is what provides the dailies CLI - so the terminal-side triage comes along for the ride. The full JSON format lives in that repo's SPEC.md.

Where people get tripped up

  • No ffprobe - your video stats come back null, but the file still writes. Install ffmpeg (which ships ffprobe) or wire video_info from a VHS loader.
  • Expecting a fresh take per render - it's a receipt, not a database. If you rerun the identical pipeline, you get the same take_id and a new created timestamp. That's correct behavior.
  • It's genuinely new. This is a 0.1.x alpha from a solo author (Liz Zhang, who documents the surrounding workflow on The Multimodal Society blog), with essentially zero community footprint yet. If it breaks, there's no Stack Overflow thread - file an issue on the repo.

Honestly, if you're an image person, you don't need this; the PNG already has your recipe. If you're rendering video takes overnight, it's the difference between "which seed made the good one?" and just knowing.

Categorydailies

Inputs (6)

NameTypeDefaultDescription
filenamesoptVHS_FILENAMES
video_pathoptSTRINGClip path, absolute or relative to the output folder. Ignored when filenames is connected.
video_infooptVHS_VIDEOINFO
shotoptSTRINGShot name, groups takes for ranking.
parentoptSTRINGtake_id this is a rerun of.
hash_modelsoptBOOLEANfalseContent-hash model and LoRA files. Slow on big weights.

Outputs (1)

NameTypeDescription
sidecar_pathSTRING