Batch Selector
Pick the keepers before anything downstream runs
- images
- selected_images
You know the workflow: queue up eight generations, stare at them, cancel, delete the bad ones, re-queue the survivors through the upscaler. Batch Selector kills that loop. It sits between your sampler and whatever comes next, pauses the run, shows you the whole batch as a grid drawn right on the canvas, and only lets the images you click continue downstream. It's a human-in-the-loop gate, and for anyone doing upscale-after-select or img2img passes it's the difference between babysitting a queue and getting one clean shot at the right answer.
It's part of the 3R3BOS Pack, a small solo pack. This node is the pack's least glamorous and most practical tool - and the one its author clearly shipped after using it daily.
How it works
When a batch arrives, the backend saves every frame as a PNG in ComfyUI's temp directory and fires a websocket event at the frontend. Then it blocks - the node waits, resending that event every two seconds as a heartbeat, until you make a call. Click images to toggle them, hit CONFIRM, and the chosen indices are posted to the backend, which slices images[selected_indices] and lets only those continue. Everything you didn't pick never touches the upscaler, saver, or any other downstream node. That "zero overhead" claim in the README is real: unselected frames are dropped, not just hidden.
The footer buttons round it out: ALL and NONE to select everything or clear, and CANCEL, which actually interrupts the whole workflow via ComfyUI's interrupt API - for when the batch is a bust and you want the run dead, not partially filtered.
Inputs and outputs
About as simple as a node gets:
- images (IMAGE) - any batch, from a KSampler, a batch of latents decoded, whatever.
- Output: selected_images (IMAGE) - the subset you chose, wired into your upscaler, saver, or next stage.
It's marked as an output node, so it works as the end of a branch if you want - you can just let it display the survivors.
Installing it
It ships in the pack, so installation is the same as the rest of it. No model files, no Python dependencies beyond what ComfyUI already has. Easiest via Manager: search 3R3BOS Pack, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/3R3BOS/ComfyUI-3R3BOS-Pack
then restart ComfyUI.
Where people get burned
The big one is confusion about the blocking. When you queue, the run genuinely pauses at this node waiting for you - that's the design, not a freeze. Give it a click and it moves on. Second: because the selection UI is canvas JavaScript, it's sensitive to the same frontend issues as other canvas-heavy nodes; if the grid never appears, restart ComfyUI or hard-refresh the browser rather than assuming your queue is stuck.
Two behavior notes worth knowing. If you confirm with nothing selected, the node passes the entire original batch through - it treats an empty selection as "keep everything," not "keep nothing," so don't use it as a filter-to-zero. And it always re-runs on every queue (its IS_CHANGED returns NaN), which is correct: you want to be asked every time, not have the node silently replay the last selection. This node is newer and less battle-tested than ecosystem staples like Impact Pack's tooling, so it's fair to test it on a small batch first - but for the pick-the-keepers pattern, it's genuinely the smoothest native-canvas version out there.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| selected_images | IMAGE | — |