ComfyUI Node

Olm Curve Editor

Give your renders a proper grade without leaving ComfyUI

By o-l-l-i·Created about a year ago·Updated about a year ago· 42
Olm Curve Editor
  • image
  • IMAGE
strength1.00
debug_loggingfalse

You know that feeling when a render is almost right - the composition works, the lighting works, but the image is just a touch cold, or the blacks are crushed, or you want the kind of color pass you'd normally open Photoshop for? Olm Curve Editor is for that. It puts a proper Photoshop-style curves tool - R, G, B, and Luma channels, independent curves, drag the points - right inside the node graph, so you can grade the image between the VAE decode and the Save Image node instead of exporting and re-editing. One node, one output wire, zero API calls. It does exactly one job and it does it well.

How it works

The node is two pieces working together. The frontend draws an interactive curve widget on the node - click to add a point, drag to move it, shift-click to remove one (a minimum of two points stays). The backend is where the actual math happens. As you edit, your curves get serialized into a hidden curve_json string that travels with the graph, and on each queue the Python side reads it back.

The backend builds a lookup from your points using linear interpolation (scipy.interpolate), then applies it per channel. The Luma curve is the interesting one: instead of mapping brightness directly, it computes Rec.709 luminance from the RGB channels, maps that through your curve, then scales all three channels by the ratio. That's the trick that keeps hue and saturation roughly intact while you ride brightness - which is why the Luma curve feels like a "real" grade rather than a brightness slider. RGB curves, unsurprisingly, just remap their own channel.

The inputs that matter

Three inputs, and you'll only touch two:

  • image - any IMAGE tensor. Batches work; it processes every frame.
  • strength (float, 0–1, default 1) - blends between the original and the graded result. Your friend when a preset is too much; set 0.5 and you get half the effect.
  • debug_logging (bool, default false) - this is the preset-export tool. Flip it on, run the graph, and the console prints your current curves as JSON that you can save into the curve_presets folder as a new preset.

The output is a single IMAGE, so wire it straight into a Preview or Save Image node, or chain more processing after it.

Installing it

ComfyUI Manager handles this one: search "Olm Curve Editor" and install, or clone it:

cd ComfyUI/custom_nodes
git clone https://github.com/o-l-l-i/ComfyUI-Olm-CurveEditor

Restart ComfyUI. No model downloads, no API keys. The README claims "no extra dependencies," which is mostly true - but the code does import scipy, so if you hit an ImportError after install, pip install scipy fixes it (it's usually already present in ComfyUI's Python env). The pack's requirements.txt lists torch, numpy, and scipy.

Common gotchas

  • The curve you see isn't exactly the curve you get. The frontend renders smooth curves, but the backend linearly interpolates between your control points. For gentle S-curves the difference is invisible; if you're pushing extreme shapes, expect the output to be a bit harder-edged than the preview suggests. The author has flagged this as a known limitation.
  • Changes don't apply until you queue. The curve data is sent when the graph runs, so use ComfyUI's "Run (On Change)"/instant-queue mode if you want near-realtime preview while you drag.
  • No undo/redo. ComfyUI's built-in undo sort of covers it, but there's no node-level undo - another stated limitation.
  • Check your version if you're on a new frontend. A 1.0.1.1 update fixed the node not collapsing properly on ComfyUI frontend 1.24.4 and later.

One honest caveat before you build your whole pipeline on it: this is a personal learning project (the author, Olli Sorjonen, says so himself), and it's not standard open source - the license is "source-available" with redistribution restricted. Fine to use and build on for your own work, but don't vendor it into a distribution without asking.

For a lightweight, no-bloat color grader that lives in the graph, this is the one I'd reach for over a pile of math nodes. It shipped with ~20 presets, so you're not starting from a flat line either.

Categoryimage/color

Inputs (3)

NameTypeDefaultDescription
imageIMAGE
strengthFLOAT1.000–1
debug_loggingBOOLEANfalse

Outputs (1)

NameTypeDescription
IMAGEIMAGE