ComfyUI Node

Image Picker

Pick the keepers out of your batch without rewiring the graph

By marklieberman·Created about a year ago·Updated 5 months ago· 11
Image Picker
  • images
  • IMAGES
  • IMAGES
selectednone

You generated a batch of eight images, three of them are keepers, and now you have a choice: rerun the whole prompt until the good ones come back (they won't), or hand-pick indexes into a node you've already forgotten how to configure. LiebsPicker exists for that second path, except it makes it pleasant. You drop it in the middle of your workflow, it pauses execution, pops up a modal with every image laid out in a grid, and whatever you click through is what the rest of the graph sees.

Think of it as a manual filter node in the image_filter category. Images go in, a filtered batch comes out. It's the natural companion to batch upscaling or a second img2img pass where you don't want to burn VRAM refining images you'd throw away anyway - the exact "select which images are worth upscaling" job people reach for cg-image-filter for, which this pack is directly descended from (the README credits chrisgoringe's cg-image-filter). The author built it while learning Python and posted it to r/comfyui, where it picked up a healthy score and "works like a charm" reviews. Small pack, one trick, done well.

How it actually works

The mechanism is a little clever and worth knowing because it explains two behaviors that'll otherwise confuse you. First, the node saves your incoming images to ComfyUI's temp output and sends their URLs to the browser over a websocket message. Then it blocks in a polling loop, waiting for a response from the frontend. That's the pause. When you click through the modal, your selection gets POSTed back, the loop exits, and only the selected tensors flow onward.

Two consequences fall out of this. Because the node's IS_CHANGED returns NaN, ComfyUI treats it as changed every single run - the picker will never be cached away and skipped, which is exactly what you want from a node whose whole job is "ask the human." And because it blocks inside the execution, hitting Escape doesn't just close the modal; it raises an interrupt that cancels the entire run. The modal also only ever appears in the browser tab that started the workflow, so don't go alt-tabbing to a different tab and wonder where your picker went.

The inputs and outputs that matter

There are only two inputs, and you'll set exactly one of them:

  • images (required) - the batch you're triaging.
  • selected (optional, default none) - comma-separated image indexes to pre-select before the modal opens, or all / none. Handy for the "reselect the same ones I keep picking" workflow.

The node returns two IMAGES outputs that look identical but aren't. The first is a single stacked batch; the second is a list of one-image tensors. Here's the gotcha: if your images are different sizes, torch.stack fails and the node best-effort returns just the first image on the stacked output. Wire the list output into your downstream nodes when you feed it mixed-size batches - it's the reliable one.

In the modal itself, the keyboard is your friend once there are more than a handful of images. WASD or arrow keys navigate, E selects, X flags unwanted, Enter proceeds and Esc cancels. There's also a filter mode (a negative selection - flag the bad ones, pass the rest) that you toggle in the modal settings, which shines when you're discarding two out of sixty.

Installing it

Standard custom-node story, no surprises:

cd ComfyUI/custom_nodes
git clone https://github.com/marklieberman/ComfyUI-Liebs-Picker
# restart ComfyUI

Or, easier: ComfyUI Manager → Install Custom Nodes → search "Liebs-Picker". There are no dependencies - no pip requirements, no model downloads, no subpack. The whole thing is one Python file plus some frontend JS. The author also maintains ComfyUI-Liebs-Toast, which sends a toast notification when the picker is waiting for you - nice-to-have if you tend to kick off a run and wander off.

Where people get burned

  • The modal "doesn't show." It only renders in the browser tab that ran the workflow, so check you're on the right tab. This is the same pain point that dogged its ancestor cg-image-filter, where the popup also failed when ComfyUI wasn't the focused window.
  • Mixed-size images. Use the list output, not the stacked one, or you'll get one image back and a shrug.
  • It never "caches." That's by design (NaN IS_CHANGED). If you're wondering why the node re-executes every run, that's the feature.
Categoryimage_filter

Inputs (2)

NameTypeDefaultDescription
imagesIMAGE
selectedoptSTRINGnoneComma-separated list of image indexes to select, 'all', or 'none'

Outputs (2)

NameTypeDescription
IMAGESIMAGE
IMAGESIMAGE