Dailies: Write take.json
Your MP4 remembers nothing. This node writes the receipt.
- filenames
- video_info
- sidecar_path
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- theVHS_FILENAMESoutput from VideoHelperSuite's Video Combine. This is the easy path; plug it in and the node knows exactly what was just saved. It wins overvideo_pathwhenever 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- thetake_idthis clip is a rerun of, if it is one.hash_models- content-hash the model and LoRA files instead of leavingsha256null. 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 shipsffprobe) or wirevideo_infofrom 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
createdtimestamp. 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.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| filenamesopt | VHS_FILENAMES | — | |
| video_pathopt | STRING | Clip path, absolute or relative to the output folder. Ignored when filenames is connected. | |
| video_infoopt | VHS_VIDEOINFO | — | |
| shotopt | STRING | Shot name, groups takes for ranking. | |
| parentopt | STRING | take_id this is a rerun of. | |
| hash_modelsopt | BOOLEAN | false | Content-hash model and LoRA files. Slow on big weights. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| sidecar_path | STRING | — |