Nodes/ComfyUI CherryPicker/πŸ’ Cherry Picker (Save Image)
ComfyUI Node

πŸ’ Cherry Picker (Save Image)

Save the one you like without rerunning the graph

By malfyzΒ·Created 7 months agoΒ·Updated 7 months agoΒ· 0
πŸ’ Cherry Picker (Save Image)
  • images
    β—„filename_prefix%date:MM-dd-yy%/ZImageβ–Ί
    β—„autosavefalseβ–Ί

    Standard ComfyUI only writes a file when you hit Queue. That's a real problem once your workflow has more than one sampler - say a base pass feeding a detailer - and you've left their seeds on Randomize. The moment you re-queue just to save the frame you're staring at, the seeds roll and you get a different image. πŸ’ Cherry Picker (Save Image) exists to break that loop: it puts a physical "Save Image Now" button on the node, so the image on screen is committed to disk instantly, no re-sampling required.

    It's from malfyz's ComfyUI-CherryPicker pack, and it's built for the "golden shot" workflow. Generate, skim the previews, and when one lands, click the button. Keep your samplers on randomize the whole time - you only ever save the winners. That's the whole pitch, and for a "studio" workflow where you're farming hundreds of candidates for a handful of keepers, it saves a lot of pointless re-queues.

    How it works

    Nothing clever on the surface, but the mechanism is worth understanding because it explains every gotcha below. Every time the node executes, it stashes the incoming images plus the workflow's prompt/pnginfo in an in-memory server-side cache (keyed by a hash of the workflow plus the node id, so different graphs don't cross-talk), and renders a temp preview for the UI. The button is added by the pack's JS: clicking it POSTs to /cherrypicker/save, the server pulls the last cached frame, and writes it to ComfyUI's output directory with the full metadata chunks - prompt and workflow both - exactly like a stock SaveImage would. So a CherryPicker save is a real save: drag the PNG back onto the canvas later and the graph comes back with it.

    The inputs that matter

    There are only three, and two of them are obvious:

    • images - any IMAGE output. Base sampler, detailer pass, final composite, whatever you want to be able to save.
    • filename_prefix - default %date:MM-dd-yy%/ZImage. Same template language as SaveImage: %date:...% and the shorthand tokens (%year%, %month%, %day%, %hour%, %minute%, %second%) resolve to the current time, and a slash creates a subfolder. So the default writes output/08-28-26/ZImage_00001_.png.
    • autosave - a boolean, default off. Off is the whole point: nothing hits disk until you click. Flip it on and the node just behaves like a normal Save Image, writing on every queue.

    It's an output node, so there are no outputs - nothing wires out of it.

    One trap the README sets you up for: it talks about a save_path input pointing at your "Keepers" folder. The shipped version doesn't have one. It writes into ComfyUI's output/, and you organize "shoots" with subfolders in filename_prefix. If you followed the README and went hunting for a save_path widget that doesn't exist, now you know why.

    Installing it

    Via ComfyUI-Manager, search for Cherry Picker and hit install. Or manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/malfyz/ComfyUI-CherryPicker.git
    

    Restart ComfyUI after either route. That's the whole install: the pack's declared dependency list is empty - no models, no torch extras, just the node and one JS file for the button. MIT licensed.

    Common issues

    • "Save failed: No cached images found" - the cache is in-memory and keyed per workflow + node. You have to have run the workflow once (with the node in it) since the last server restart, so a frame actually exists to cache. Restarting ComfyUI wipes it.
    • It saves the last frame the node saw. Edit an upstream input after a run without re-queuing, and the button commits the stale cached frame, not whatever you're picturing. Run first, then save.
    • Where did my file go? output/, or the subfolder in your prefix. Not a custom keepers path - see the save_path trap above.
    • Because the cache key includes a hash of the workflow, the node deliberately isolates runs: another workflow with the same node id won't save into yours. That's a feature, and also why a workflow that hasn't run since restart returns the "no cached images" error.

    It pairs neatly with the seed trap everyone hits eventually - control_after_generate: randomize overwrites the seed after each run, so by the time you spot a good one the seed is already gone. CherryPicker is the alternative answer: leave everything randomizing and commit only the winners. The seed rides along in the PNG metadata, so if you ever want to reproduce a keeper exactly, it's in the file.

    Categoryimage

    Inputs (3)

    NameTypeDefaultDescription
    imagesIMAGEβ€”
    filename_prefixSTRING%date:MM-dd-yy%/ZImageβ€”
    autosaveBOOLEANfalseβ€”

    Outputs (0)

    No outputs