Image Ledger · Visual Queue
Two dropdowns between you and never rendering a source twice
- image
- mask
- job_ticket
- source_path
- remaining_pending
- completed
- status
Batch I2V has a boring, expensive problem: a folder of source images, each one to be rendered exactly once, and no spreadsheet. Image Ledger · Visual Queue is the pack's low-friction answer - a loader with five widgets, no ledger-name bookkeeping, and a job ticket you hand to a commit node.
What it's for
This is the entry point of the explicit "advanced mode" workflow, and the one to reach for if you don't want the global panel writing into your LoadImage for you. It sits where your LoadImage sat, picks an unprocessed image from a folder, shows you which one, and reserves it so a half-finished render doesn't get counted.
Almost everything that makes it work is hardcoded, which is why it's pleasant: the ledger name is fixed to image-ledger-default, the shuffle seed to 1337, reservations to 1440 minutes. The Tracked Image Loader exposes all of that as widgets; this one says trust the defaults. That's the right call most of the time - the other times you want oldest-first ordering rather than a shuffle, and then you switch nodes.
How it works
Preview first, then queue. That's the whole design. When you hit Queue, the node asks the ledger for a pending source (or re-uses one you already previewed), registers it as running under a token, re-checks the file hasn't changed on disk since it was hashed, then loads it through ComfyUI's own LoadImage machinery - via an input-relative path, so a symlinked or junctioned library under ComfyUI/input still resolves and still serves previews.
From there the ledger does nothing until something commits. Your graph's final video writer hands its filenames to the commit node, the commit node verifies the video exists, and only then does that source leave the pending pool. Interrupt a run and the image isn't lost - the reservation just outlives its lease until Recovery releases it.
The ticket is how the two nodes agree on what's being rendered: a small JSON string carrying a token, the ledger name, and whether continuous queueing is on. It's not meant to be read or edited by hand.
Inputs and outputs
Three widgets you'll actually touch:
- source_subfolder - the library folder under
ComfyUI/input. Defaults to the pack'sLibrary foldersetting (out of the box,AI), and it defaults to scanning subfolders, which is what you want for theAI/portraits/,AI/illustrations/layout. - pick_mode -
Random preview(a stable shuffle, without replacement) orManual selection(a specific path). This is the widget that changes the node's personality. - manual_path - only read in manual mode, input-relative only, e.g.
AI/portraits/1.png. Absolute paths are rejected.
And auto_queue_next - off by default. On, a successful commit queues the next image for you, which is how you leave this running overnight. The author's tooltip is a warning, not a suggestion: "In random mode, queues the next image after a successful commit. Keep this off for manual selection." Confirm your commit actually works before you flip it.
Worth knowing: manual picks are tagged manual_untracked in the ticket, so committing one deliberately does not touch the random queue. That's the right behaviour - a one-off render shouldn't delete two hours of queue state - and it's the safe way to test a workflow end to end.
Seven outputs, in order: image and mask (drop them exactly where your LoadImage output went - the mask is the alpha channel, same as core), job_ticket (to the commit node), source_path (handy for a filename prefix), remaining_pending and completed (ints for a counter or a note node), and status (Pending 42 | Running 1 | Done 310 | Unique 352 | Duplicates 7).
Install
Manager → search Image Ledger → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Rona1do/ComfyUI-Image-Ledger.git
No extra pip packages. Put your sources under ComfyUI/input/AI/<category>/ and, on Windows, you can junction a library from another drive there.
Common issues
It picks the same-looking image again after a rename. Expected without move-on-success: a completed source is recognised by path, so a renamed copy shows up as pending in selection even though the ledger deduplicates it by content hash. Enable Move source in the pack's settings if you want completed files archived into _used/ - test it on a backup library first.
"No pending images remain in this ledger." You finished the folder, or your source_subfolder is scanning a path with nothing in it. The error text includes the ledger's pending/done counts, which usually tells you which.
Empty source folder reads as unexpected images. With an empty source_subfolder you're scanning the whole input root; keep Scan subfolders off in that case, since the input directory is where ComfyUI parks its own scratch folders.
Videos come out but nothing is ever marked done. The commit node needs the exact VHS_FILENAMES pair from VideoHelperSuite with save_output enabled - a VideoCombine writing to temp doesn't count, and neither does a queue with no commit node at all.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| source_subfolder | STRING | AI | Random mode scans this directory. For example, AI means input/AI. External folders can be linked under ComfyUI/input. |
| recursive | BOOLEAN | true | Whether random mode includes nested folders. |
| auto_queue_next | BOOLEAN | false | In random mode, queues the next image after a successful commit. Keep this off for manual selection. |
| pick_mode | COMBO | Random preview | Random preview draws without repetition. Manual selection previews a path relative to input. |
| manual_path | STRING | Used only in manual mode, for example AI/portraits/1.png. Absolute paths are not allowed. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| job_ticket | STRING | — |
| source_path | STRING | — |
| remaining_pending | INT | — |
| completed | INT | — |
| status | STRING | — |