Image Save - Bling Edition
The save node that finally cleans up your output folder
- images
- masks
You know the ritual. You queue ten seeds, stare at the Preview node, and when one lands you swap in a Save Image and hope the filename prefix tells you which run it was. Then an hour later you're dragging PNGs back into ComfyUI one at a time, hunting for the settings behind "the good one." Image Save - Bling Edition collapses that whole loop into one node: a session gallery that lives on the node, hold-for-review triage that keeps junk out of your output folder, and one-click workflow recovery on every image it's ever saved.
It's the work of Peter Neill (shootthesound), and it's genuinely small-time - when this shipped on r/StableDiffusion it got a modest handful of upvotes and exactly the right kind of comment: someone fed up with output-folder clutter calling it super useful. The name is silly; the thing is not.
Why you'd reach for it
The stock flow is PreviewImage to look, SaveImage to keep, and a growing output/ folder of everything you ever queued - good, bad, and duplicate. The core nodes give you a binary choice: preview writes to scratch (temp/), save writes forever. Bling Edition adds the missing third option: hold for review. Images park in temp storage instead of your output folder. You batch-generate, flip through fullscreen, tap S to star the keepers, then hit one button - "Keep starred held images" - and only those get written through your naming/format/metadata rules. Everything else is discarded. Your output folder ends up containing only images you chose, which turns out to be worth the install by itself.
How it works
Under the hood it's a classic output node wrapped in a DOM widget (it uses addDOMWidget, so it needs a reasonably modern ComfyUI). The widget is the whole UI - tabs for Output, Naming, Meta, Mask, W-mark, and Presets - and it serializes its state into that config string you see on the node, which is sent along as a JSON blob on every save. All the decision logic lives at save time, not generation time: change the naming pattern or flip on a watermark after generating, and it applies to every held image you commit from that point on.
Mechanically it leans on the same conventions as core ComfyUI. PNGs get the workflow and prompt as text chunks - the "image is the project file" property the KB's image-io doc describes at length. JPEG and WebP use the same EXIF Make/Model convention core ComfyUI's saver uses, so drag-to-restore works even outside PNG. The masks input writes a mask sidecar; if you'd rather not pipe one in, the Mask tab can auto-generate a person mask with mediapipe - face, hair, body, clothes, background - with no GPU needed, since it's all CPU-side.
The inputs you actually touch
- images (required) - the IMAGE you're saving. That's the one you care about.
- config (required) - a JSON string. Don't hand-edit this; the tabs in the widget write it for you.
- masks (optional) - a MASK to save beside each image, if you turn on the Mask tab with source "from input."
It has no outputs - it's an output node. Wire it at the end and it runs last, and the gallery is the preview, so don't double up a Preview node ahead of it.
Install
ComfyUI Manager: search "ComfyUI-ImageSaveBlingEdition". Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/shootthesound/ComfyUI-ImageSaveBlingEdition
pip install -r ComfyUI-ImageSaveBlingEdition/requirements.txt
The one real dependency is mediapipe>=0.10 (the auto person mask). If it's missing, everything except the auto mask still works - the Mask tab will tell you. Mask models auto-download to models/mediapipe/ on first use.
Where people get burned
A few limits are worth knowing before they bite. Held images live in ComfyUI's temp/ directory: they survive a page reload but not a ComfyUI restart - unsaved holds are gone. The gallery caps at the last 500 entries per node. And the ⟲ wf restore button needs a recoverable workflow: no embedded workflow and no sidecar .json means no restore, and the Meta tab warns you when you're in that state. Two subtler ones: a custom save root is served by the node itself, so those files won't show in ComfyUI's own output browser; and history manifests/templates/presets live under the default ComfyUI user, so multi-user servers share them. None of it is fatal - it's the honest part of an honest README. Worth every one of the ten minutes it takes to install.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Images to save. | |
| config | STRING | {} | — |
| masksopt | MASK | Optional masks saved beside each image (enable the Mask tab, source: from input). |
Outputs (0)
No outputs