Keeper
A Preview Image that saves only the frames you actually like
- images
- images
What this actually is
ComfyUI gives you two bad options for output. Save Image writes everything to output/, so a hundred-seed sweep leaves you a hundred PNGs you have to sort through in File Explorer. Preview Image writes to temp/, which is throwaway scratch - right-click β save each keeper by hand, and anything still in there when you close ComfyUI is gone.
Keeper splits the difference: it previews like Preview Image, remembers the last ten, and puts a small πΎ button under the picture. Click it and that file is copied into your real output folder - Save Image filename formatting, workflow metadata still inside. Everything else expires in temp, which is the point.
It lives in omervaner/ComfyUI-PromptDeck, the pack best known for its prompt-file feeder. Keeper is the other half of that loop: grind through a thousand caption lines without archiving every result.
How it works
Mechanically it's an output node that writes every image in the batch to ComfyUI/temp/ as keeper_<random>_00001_.png, with fast compress_level=1 encoding - same as core Preview Image, and the same prompt/workflow PNG text chunks. Those temp files are what you're looking at.
The frontend keeps the last 10 in a per-node history (β 3/10 βΆ, or β/β keys while the node is selected), and a new run jumps to the first image of the new batch so βΆ walks forward through it. Clicking πΎ doesn't re-render anything: it POSTs the temp filename to a route the pack registers (/promptdeck/keeper/save), and the server copies the file into output/ with its metadata intact. That's why the saved PNG drags back into ComfyUI as a loadable workflow, like any Save Image output.
Because the copy goes through folder_paths.get_save_image_path(), you get the same path and naming Save Image would have produced for that prefix: auto-incrementing counter, _00001_ style, subfolders from slashes. No re-encoding, no second generation, no dialogs.
The two inputs, and the one output
images - the IMAGE you want to watch. Wire it from your VAE Decode, or straight off a batch.
filename_prefix - string, default ComfyUI. This only matters when you click πΎ, and it supports Save Image's templating, e.g. MyModel/%date:yyyy-MM-dd%/%date:hhmmss%. Dates resolve at queue time, so the name reflects when the image was generated, not when you clicked. %batch_num% is filled by the node itself. Slashes make subfolders.
Output is images - an IMAGE passthrough of what you fed in, so Keeper can sit mid-chain (preview here, then keep going to an upscaler) instead of being a dead end.
Save asβ¦ is the escape hatch: it prompts for a name pre-filled with the auto one, accepts slashes for subfolders, refuses to overwrite (appends _2, _3β¦), and rejects names that try to climb out of the output folder. It still works on an image you already πΎ'd, since plain πΎ is one-shot per image - no double-saving by twitchy clicking.
Install
No dependencies: Python stdlib plus one frontend JS file ComfyUI serves via WEB_DIRECTORY. The pack's pyproject.toml declares an empty dependencies array and there's no requirements.txt to fail on.
cd ComfyUI/custom_nodes
git clone https://github.com/omervaner/ComfyUI-PromptDeck
Restart ComfyUI fully - the server process, not a browser refresh. Then right-click the canvas β Add Node β PromptDeck β Keeper. Or find it in ComfyUI Manager by searching the pack title (ComfyUI-PromptDeck). Updating is git pull in that folder plus another restart.
Where people get burned
Temp is temp. Unsaved previews disappear when ComfyUI restarts - they were never anywhere but the scratch folder. Click πΎ after the temp sweep and the node says preview is gone (temp cleared?), with nothing to recover: that image only ever existed on screen.
History is per page session, not per install. The ten-image ring lives in the browser tab. Refresh and the bar resets to 0/0; the files you saved are fine, the browsable history is not.
Nothing saves unattended - the honest tradeoff of the whole design. An overnight batch through Keeper writes zero permanent files, so if you queue-and-leave, keep a Save Image in there too. Keeper is a manual gate, and that's the feature.
Run with --disable-metadata and your saved PNGs lose the workflow. The toggle applies at preview time, so the temp file never had the chunks to copy. Saving works; dragging the result back into ComfyUI won't rebuild anything.
If the viewer looks wrong or the buttons don't respond, that's the custom-canvas layer. Keeper draws its viewer and button bar itself on the LiteGraph canvas - precisely the layer ComfyUI's Nodes 2.0 frontend rewrite replaced, and the one that broke plenty of third-party node UIs. If you're opted into Nodes 2.0, switch back to the legacy canvas and retry. Then check the browser console: a JS error means the node frontend didn't load, and a hard reload after restarting the server is the usual fix.
Filename is cosmetic; the reproducibility lives in the PNG chunk, which Keeper copies along with the pixels.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The images to preview. | |
| filename_prefix | STRING | ComfyUI | Used when you click πΎ. Same formatting as Save Image, e.g. MyModel/%date:yyyy-MM-dd%/%date:hhmmss% |
| keep_allopt | BOOLEAN | false | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | β |