ComfyUI Node

Olm LUT

Give your renders a real film LUT without installing a 40-node mega pack

By o-l-l-i·Created about a year ago·Updated about a year ago· 23
Olm LUT
  • image
  • IMAGE
lut_file
strength1.00
gamma_correctionfalse
debug_loggingfalse
operation_mode

Color grading is the step most ComfyUI workflows skip. You decode the VAE, stare at the result, and either accept the flat colors or wrestle with a chain of image filter nodes that were never built for this. Olm LUT is the fix: a single focused node that applies industry-standard .cube LUT files - the same look-up tables DaVinci Resolve, Premiere, and every colorist on earth use - right in your graph. Wire it between your VAE Decode and Save Image, pick a LUT, and you get film emulation or a stylized grade without touching a single KSampler.

Its pitch is basically a counterpoint to ComfyUI's dependency hell. The ecosystem essay's most common complaint is that you install forty nodes to use one. Olm LUT is the opposite: one file, one class, no bloat. It ships with thirteen example LUTs (names like life_is_a_lemon, bubblegum_dream, toxic_sludge), so it works out of the box the second you restart ComfyUI - no model downloads, no API keys, nothing.

How it works

The node reads the .cube file, parses the LUT_3D_SIZE header, and loads the color grid into a 3D lookup table. Then it maps every pixel through a per-channel trilinear interpolation (via scipy.interpolate.RegularGridInterpolator) and blends the result with your original image by strength. It's straightforward math, chunked in batches of 10k pixels so it doesn't eat all your RAM. Under the hood it's numpy/scipy on CPU - perfectly fine for a still, a touch slow if you're feeding it a long image sequence.

The inputs that matter

  • image - any 3-channel RGB tensor. Straight from VAE Decode or Load Image works.
  • lut_file - a dropdown populated automatically from the pack's luts/ folder. Drop any .cube file in there and refresh.
  • strength - 0.0 to 1.0 blend between original and graded image. Default 1.0 is full LUT; I usually park it around 0.6–0.8 for film looks.
  • gamma_correction - flips the image into sRGB around the LUT lookup and back. Most .cube LUTs are authored in sRGB, so leave this off for images straight from the VAE and try it on if your grade looks crushed or washed out.
  • operation_mode - the hidden gem. Besides normal and passthrough, it generates test patterns (RGB swatches, b/w gradient, HSV sweep, mid-gray box) so you can verify exactly what a LUT does to known colors without a reference image.

The single output is an IMAGE, which feeds straight into Preview Image or Save Image.

Installing it

ComfyUI Manager may or may not have it indexed - the author confirmed it wasn't there at launch - so the reliable route is a clone:

cd ComfyUI/custom_nodes
git clone https://github.com/o-l-l-i/ComfyUI-OlmLUT
# restart ComfyUI

Dependencies are torch, numpy, and scipy. You already have the first two; scipy is the only one a barebones install might be missing, and pip install -r requirements.txt in your venv handles it. Zero model downloads.

Gotchas

Where people get burned: your LUTs must live inside the pack's own luts/ folder - there's no external directory setting (a reviewer on the r/comfyui release thread asked for exactly that), so a git pull update can clobber your custom files. Back them up before updating. Second, the .cube parser is strict: it wants a valid LUT_3D_SIZE and exactly size³ data rows, or it throws a ValueError - some cheap free LUTs are sloppy and won't load. Third, it's RGB-only; a 4-channel RGBA input errors out.

One more thing worth knowing: the README and the code disagree about which way the gamma toggle points. Trust the node's own debug log (flip debug_logging on) over the README. It's a first release, so expect rough edges - but for dropping a real grade onto a render, it's the one tool you'll actually reach for.

CategoryLUT

Inputs (6)

NameTypeDefaultDescription
imageIMAGE
lut_fileCOMBO13 options: dynamic_saturated.cube, vibrant_candy.cube, curve_bump.cube, life_is_a_lemon.cube, high_contrast.cube, only_blue.cube, +7
strengthFLOAT1.000–1
gamma_correctionBOOLEANfalse
debug_loggingBOOLEANfalse
operation_modeCOMBO7 options: normal, passthrough, test_colors_horizontal, test_colors_vertical, test_gradient, test_hsv, +1

Outputs (1)

NameTypeDescription
IMAGEIMAGE