Image Ledger · Commit Finished Video
The node that decides a render actually counts
- filenames
- filenames
- status
If you're grinding a thousand stills through Wan or LTX and you only want each source image rendered once, the whole plan lives or dies on one question: when is an image "finished"? Not queued. Not sampled. Actually finished, with a video sitting on disk. Image Ledger · Commit Finished Video is the node that answers it, and it's the smallest piece of bookkeeping in the pack that you cannot skip in advanced mode.
What it's for
Image Ledger treats loading a source as "in progress" and only marks it complete after a real, non-empty output video exists. Split across two nodes, that's a reservation (the loader) and a commit (this one). It exists because the naive version of batch I2V is a shell loop that re-renders the same portrait three times because you renamed something, killed a run halfway, or forgot which folder you'd already done.
The node's own description is the entire spec: marks the source complete only after the final video exists and is non-empty.
How it works
The mechanism is deliberately boring, which is the point. Feed it VideoHelperSuite's VHS_FILENAMES and the job_ticket string from your loader, and it:
- Unpacks the VHS filenames pair. If VideoCombine is set to save into temp rather than output, it refuses - a preview render is not a finished video.
- Checks the last output file has a video extension (
.mp4,.webm,.mkv,.mov,.avi,.m4v). - Confirms that file is inside ComfyUI's output directory and is bigger than zero bytes.
- Only then flips the ledger job from
runningtodoneand writes the output path against the image's SHA-256 hash - inside a SQLite transaction, so a crash mid-commit can't leave half a record.
Two behaviours worth knowing before you rely on it. It is idempotent: re-queue the same graph after the job already committed and it returns committed: false, idempotent: true instead of double-counting. And it fails loudly but kindly: if the video is missing or empty it marks the job failed and releases the reservation, so that source goes back to pending rather than vanishing into limbo.
Inputs and outputs
Two inputs, both required:
- filenames - paste
VHS_VideoCombine.Filenamesin here. Nothing commits without it. - job_ticket - the
job_ticketstring output of the loader. The author's tooltip reads: "Connect job_ticket from the Tracked Image Loader." It's a small JSON blob carrying the token, the ledger name, and whether you had continuous queueing on.
Two outputs:
- filenames - a pass-through of the VHS pair, so you can still hang another node off this branch.
- status - a human string, e.g.
Committed video: 001_00001.mp4; Pending 42 | Running 0 | Done 310 | Unique 352 | Duplicates 7. Wire it to a text display node if you want the count on screen.
Placement matters more than the wiring: directly after the final video writer, before any cleanup or delete node. If something ahead of it removes the file, the node correctly concludes nothing was produced.
Install
ComfyUI Manager → Custom Nodes Manager → search Image Ledger → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Rona1do/ComfyUI-Image-Ledger.git
# restart ComfyUI; no pip install needed (Pillow/SQLite/aiohttp come from ComfyUI)
Because this node's input type is VHS_FILENAMES, VideoHelperSuite has to be installed too - that's the pack that defines the type, and it's the standard video writer for I2V work anyway. Ledger state lives in ComfyUI/user/default/image_ledger/, out of the repo.
Common issues
"Node types were not found: VHS_VideoCombine" when the graph loads. That's VideoHelperSuite missing or its Python env half-broken, not a Ledger problem - VHS_FILENAMES is a type VHS defines, so both the writer and this node go red without it. Install or repair VHS and restart.
"VHS VideoCombine is configured to save into temp, not output." VideoCombine has a save_output toggle. On temp, files land in ComfyUI/temp and get cleaned up; the commit node won't count them. Turn it on.
Nothing ever commits and the image stays reserved. You skipped the job_ticket wire. An uncommitted reservation stays running until its lease expires (default 24h) - the Recovery node exists to release it early.
"Final output is outside the ComfyUI output folder." You pointed VideoCombine at an absolute path outside output/. Keep writes inside the output root and archive afterwards.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| filenames | VHS_FILENAMES | — | |
| job_ticket | STRING | Connect job_ticket from the Tracked Image Loader. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| filenames | VHS_FILENAMES | — |
| status | STRING | — |