Neo Image Chooser 👁️
The pause button for 'pick the good frame' workflows
- images
- IMAGE
You've queued a batch, the sampler spits out eight variations, and now you want to eyeball them before committing pixels to an expensive upscale or a save. NeoChooser is that decision point made physical: it halts the whole pipeline mid-run, shows every frame in a neon-styled preview right on the node, and refuses to continue until you click the ones you want and hit CONTINUE. None worth keeping? SKIP the batch. Regret everything? CANCEL kills the queue. It's the same human-in-the-loop idea as the classic Image Chooser nodes, but with a much prettier frontend and a notification sound so you're not hypnotizing the monitor.
How it works
The server side is honest and simple. The node takes your IMAGE tensor, dumps each frame to ComfyUI's temp folder as a PNG, and pushes a neo_chooser_show event to the browser with the preview URLs. Then it parks in a tight loop - sleeping 50ms at a time and checking on every tick whether the frontend has answered, while also calling ComfyUI's interrupt check so a CANCEL actually propagates. All the real work happens in the browser: a custom canvas widget draws the thumbnails, toggles your selection on click (a single image auto-selects itself), and POSTs your choice back to the /neo_chooser/reply route. The workflow only moves again once that reply lands.
That also means the entire queue freezes while the node waits. That's the point - and it's the thing that'll bite you if you ever queue jobs from an API client with no browser open (more below).
One gotcha to know before you rely on this: the server ignores which frames you selected. Looking at the source, process() always returns the full images tensor it was handed, unchanged. Your clicks drive the CONTINUE (n) counter and, on cancel, the interrupt - but the output is not filtered down to your picks. So think of it as a pause-and-confirm gate, not a picker that narrows the batch. If you genuinely need only the chosen frames downstream, you'll have to handle the selection yourself (save the batch, note your index, crop later) - don't build a workflow that expects a subset to come out the other side.
Inputs and outputs
Only one input matters: images (IMAGE), wired straight from VAE Decode or your sampler's IMAGE output. One output, IMAGE, goes into Save Image or whatever comes next. Nothing else lives in the schema - no mode dropdowns, no hidden toggles. The extras are clickable controls drawn on the node face itself: the ◀ ▶ arrows cycle the ten bundled notification sounds, the bars set volume, and SHOW PREVIEW collapses the node into a thin panel when you want it out of the way. After you make a choice, the buttons swap for a RUN GENERATION button, so you can kick off the next pass without leaving the node.
Installing it
Via ComfyUI Manager: search "NeoChooser" (or use Install via Git URL). The README gives the URL as 13february/ComfyUI-NeoChooser, but that's stale - the actual repo is 13february/NeoChooser. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/13february/NeoChooser
Restart ComfyUI and you'll find it under NeoNodes → NeoChooser. Dependencies are nearly nothing - just numpy and Pillow, which any ComfyUI install already has. No models, no downloads, no API key. Want your own chime? Drop MP3s into custom_nodes/NeoChooser/web/sounds/ and refresh the page - they show up in the track list automatically.
Common issues
- It hangs forever if no browser is watching. The node blocks the server thread waiting for the frontend's reply. If you queue from the API or a headless/remote setup, that reply never comes and the workflow deadlocks. Keep a browser tab on the graph open.
- No pause screen appeared? The preview might be switched off (SHOW PREVIEW unchecked) or the browser cached a stale extension - refresh hard.
- Silent chime? Volume bars at zero, the track set to "# No Sound", or the browser's autoplay policy swallowed the
play()call (the code quietly ignores that failure). - Output is the whole batch, not your picks. By design. See above.
- The node draws its entire UI on the canvas, which is exactly the kind of thing ComfyUI's Nodes 2.0 frontend rewrite has a habit of breaking. If it renders as a blank box after an update, flip Nodes 2.0 off (it's opt-in) and reload.
Worth adding: this pack also ships NeoTimer, and NeoChooser auto-pauses that timer while it waits on you - a nice touch if you like seeing your queue's wall-clock time at a glance.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |