Checkpoint Status Tagger
Tag checkpoints keep-or-delete without deleting a single file
This is the "what do I keep and what do I nuke" node, and the suite is careful to keep those two things far apart. Checkpoint Status Tagger takes the name of a checkpoint (ckpt_name_str, pulled from the Cycler or List Selector) and stamps it with one of five review statuses: 👑 god!, 💛 favorite, 👍 nice, ✔ keep, and 🗑 delete. It has no outputs - it's a pure output node whose job is updating a status database and reflecting it back into the UI (the node title shows the current status, which is a nice touch).
Statuses are global and stored on disk in data/checkpoint_statuses.json inside the pack folder, so they survive restarts and - because they're files, not browser state - they show up in every tab. Any tab can refresh its Selector list and see the icons. This is the part of the suite that makes the whole "handpicking" loop work: batch-generate with the Cycler, review with ImageDir Preview, then hit a status button as you go.
The statuses and their weird rules
The tiers are self-explanatory - god! is your hall of fame, keep is "works, stays", nice is a maybe. Two behaviors are worth knowing up front because they're deliberate:
- There's no
nonebutton. You clear a status by pressing the active status again, which toggles it off. Slightly surprising the first time, easy once you get it. deletecan only be set fromnone. If a checkpoint is already tagged something else, you can't jump straight to delete - you have to toggle it off first. Annoying? A little. But it's a speed bump on purpose, so you don't trash a checkpoint you'd marked 👑 two minutes ago.
And here's the part that matters: delete never deletes anything. It's a reservation. The suite writes a script instead - delete_reserved_checkpoints.py under ComfyUI/output/CheckpointHandpickerSuite/delete_scripts/ - that asks for confirmation before touching files when you actually run it. So you can spend an afternoon marking a third of your models for deletion, sleep on it, and the only thing that happened is a script appeared. That review-first safety model is the whole design philosophy of the pack.
How it fits a workflow
The straightforward wiring: Cycler's ckpt_name_str → Tagger's ckpt_name_str, so as the Cycler advances, the Tagger follows and you mark while the batch runs. In manual review, the List Selector drives it instead - either through Sync with ImageDir Preview, or through the DirectLink mode (external review on a tablet or shared folder), where the Tagger labels whatever's currently selected in the Selector.
Tags don't only decorate the UI, they feed the Cycler: the Cycler's status filter can restrict rotation to, say, favorites, or exclude everything marked delete. That's the loop coming full circle - you curate, then you generate only from the curated set. There's also a separate CheckpointTagExportImport node (same pack) to back up or migrate tags between machines; the Tagger just owns the statuses.
Install
Standard one-pack install, zero extra dependencies:
cd ComfyUI/custom_nodes
git clone https://github.com/ruminar/ComfyUI-CheckpointHandpickerSuite.git
Restart ComfyUI. No model downloads, no pip step.
Realistic take
The safety rails (confirm-to-delete script, delete-only-from-none) make this the right node for the job if you're drowning in checkpoints and afraid of the trash can. The one thing it's not is a file manager - the actual deletion still happens when you run the script, and image deletion is ImageDir Preview's job. Tagger just keeps score.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| ckpt_name_str | STRING | — | |
| hps_tab_idopt | STRING | — |
Outputs (0)
No outputs