Nodes/koo-nodes-pack/KoO Finisher
ComfyUI Node

KoO Finisher

The Grader That Lives Inside Your Workflow Instead of Photoshop

By kooailab·Created 15 days ago·Updated 4 days ago· 0
KoO Finisher
  • image
  • image
◄finisher_settings►

Most ComfyUI post-processing is a chain of small nodes: brightness here, a LUT loader there, sharpen, save. It works, and every time you want a different look you re-wire the graph. KoO Finisher goes the other way - it's one node with a small editing application bolted to its face. Queue once to cache the image, then grade it in the node's own panel, browse LUTs, and export a PNG/JPG/WEBP straight out.

Whether that's better than the node-chain approach depends entirely on how you work. If you're rendering one hero image and want to push it around by eye, the Finisher is faster than any chain. If you're batching two hundred frames that need identical treatments, an actual node chain plus Save Image is the sane choice - the Finisher's UI is a per-run, per-image thing.

How it works

The backend is deliberately tiny. KoOFinisher takes an IMAGE, caches it against the node's unique ID, and returns it unchanged through the image output. That's it for the graph. Everything else is a small local web app: the frontend talks to /koo/finisher/* routes, that route layer does the actual grading and file writing, and the finished result gets saved wherever you pointed the output folder.

It's an output node (OUTPUT_NODE = True), which matters - ComfyUI will always execute it when you queue, so the cache refresh you trigger is a real run, not a no-op.

There's an IS_CHANGED override worth knowing about: if your saved settings include auto_save, the node returns float("NaN") to force itself dirty every run. That's the standard ComfyUI idiom for "never cache me," and it's how auto-save keeps working. Without auto_save on, it compares the finisher_settings string instead, so editing settings marks it dirty and leaving them alone lets it cache.

The two inputs

  • image (IMAGE, required) - whatever you want to grade. Wire your sampler's VAE Decode output or an upscaler's result in.
  • finisher_settings (STRING, optional) - a JSON blob. You normally never touch this; the panel writes it. It's exposed because it makes settings wireable and because presets need somewhere to live.

One output: image, unchanged. If you want the graded result inside the graph rather than on disk, this node isn't that - it exports files, it doesn't return the graded tensor. Keep a normal Save Image or Preview Image downstream if the graph needs to continue.

Presets, LUTs and the localhost rule

The panel does .cube LUTs, but the README is explicit that no LUT path ships with the pack - you set your own folder. Presets are a separate mechanism: named looks stored as JSON under ComfyUI's user directory at KoO/finisher/presets/, with + New Preset, Save, Save As, Rename, Delete, and - genuinely useful - Export/Import so you can hand a look to someone else as one file. Settings live at KoO/finisher/settings.json, with the old nodes/koo_finisher/config/settings.json kept as a read-only fallback so existing installs don't lose their config.

The gotcha, straight from the docs: the desktop folder picker and direct export require localhost. Open ComfyUI on a remote box through a tunnel or a reverse proxy and the cross-origin write gets rejected, the folder dialog won't appear, and the path-copy button still works but the save doesn't. That's a browser security boundary, not a bug you can configure away. Run it locally, or type the output path manually.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/kevintronchin-blip/koo-nodes-pack

Restart and hard-refresh the browser - this node's whole value is the frontend, and a stale browser cache is the most common reason the panel looks blank. Dependencies are the usual four (torch, numpy, Pillow, aiohttp), all already provided by ComfyUI. No models, no LUTs bundled.

Two structural things. First, this pack's custom canvas interfaces need the Legacy / LiteGraph renderer; under the Nodes 2.0 frontend the node registers but its drawing and mouse hooks don't run, so the panel stays empty. Second, if you have an older standalone Koo Finisher folder installed, disable it - the node ID is shared and duplicates cause the kind of "controls missing" symptom the README's troubleshooting section starts with.

Where it goes wrong

Blank panel after a run. Refresh the browser, check the console, then confirm you actually queued with the node in the active graph. The cache only updates on a run.

Nothing saves on remote. See the localhost rule. This is the single most-reported confusion with this node and it isn't fixable from the node's side.

Looks different from the export. Grading happens on the cached source at whatever resolution it arrived at. If you grade before an upscale and export after, you're looking at two different images.

CategoryKoO/Post Processing

Inputs (2)

NameTypeDefaultDescription
imageIMAGE—
finisher_settingsoptSTRING—

Outputs (1)

NameTypeDescription
imageIMAGE—