ComfyUI Node

Keeper

A Preview Image that saves only the frames you actually like

By omervanerΒ·Created 3 months agoΒ·Updated 16 days agoΒ· 3
Keeper
  • images
  • images
β—„filename_prefixComfyUIβ–Ί
β—„keep_allfalseβ–Ί

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.

CategoryPromptDeck

Inputs (3)

NameTypeDefaultDescription
imagesIMAGEThe images to preview.
filename_prefixSTRINGComfyUIUsed when you click πŸ’Ύ. Same formatting as Save Image, e.g. MyModel/%date:yyyy-MM-dd%/%date:hhmmss%
keep_alloptBOOLEANfalseβ€”

Outputs (1)

NameTypeDescription
imagesIMAGEβ€”