Nodes/ꘇ Genereti/ꘇ top.level
ComfyUI Node

ꘇ top.level

Eight knobs, one correct order, and why gamma isn't brightness

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ top.level
  • image
  • image
◄black0.00►
◄white1.00►
◄brightness1.00►
◄contrast1.00►
◄saturation1.00►
◄gamma1.00►
◄output_black0.00►
◄output_white1.00►

top.level is the grading node: black/white input levels, brightness, contrast, saturation, gamma, output levels. Eight floats in a fixed order, alpha preserved. It's the node you want when a render comes out flat, lifted, or too hot, and when you'd rather fix it deterministically than re-roll the seed.

The KB has the one distinction that makes this node legible: brightness and gamma are not the same operation. In most node packs "brightness" is an additive offset - it lifts everything and clips highlights fast. Gamma is a power curve, so it moves shadows without moving white. This node gives you both, and knowing which to reach for is most of the skill.

How it works

The chain runs in a specific order, and the order is the design:

  1. Input levels - black/white normalise the input range, remapping black→0 and white→1. This is your "crush a washed-out frame back into range" step.
  2. brightness - a multiplicative gain (1 is neutral), not an additive offset. It scales the whole signal.
  3. contrast - expands around 0.5, so midtones stay put and the ends move apart.
  4. saturation - blends toward luminance; 0 is greyscale, 1 is untouched, above 1 oversaturates.
  5. gamma - the power curve, applied as an inverse power so larger values lift the shadows. This is the one that makes a flat image look properly re-exposed.
  6. output_black/output_white - remap the result into a new range, which is how you lift blacks to a filmic grey or squeeze a picture into a narrower band for a background.

One guardrail: white must exceed black, and the node raises an error if it doesn't. Silent division by a negative range is exactly the kind of thing you don't want in a graph.

The inputs that matter

You'll live on gamma and output_black/output_white. A frame that looks "AI-flat" usually wants gamma around 1.15–1.4, not brightness. A composite that looks pasted-on usually wants its blacks lifted a touch via output_black so it sits in the same air as its background. black/white are for rescuing a clipped or hazy source, and contrast/saturation are broad strokes - easy to overshoot, easy to walk back.

Output is a single image. Chain it before top.composite to grade a plate, or after everything to do a final look pass.

Install

ComfyUI Manager → search ꘇ Genereti → install, or:

git clone https://github.com/languel/genereti.git custom_nodes/genereti
./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt

Restart and refresh the page. One frontend dependency pin; no model files, no services. It's ꘇ top.level in Genereti / TOP - the leading mark is a glyph and sorts to the bottom, so search genereti.

Traps

Brightness clips, gamma doesn't. The first thing beginners do with a dark image is crank brightness, watch the highlights flatten into white, and conclude the preview is broken. Use gamma.

Order is not negotiable. Input normalisation happens before the gains, so a black/white pair you set for a different source will move everything downstream. Re-check levels when you swap the input.

Everyone else's Level node is different. Photoshop-style levels are per-channel and have a midpoint; this one is a fixed all-channel chain. Don't map the numbers one-to-one in your head.

Live vs Queue. Live chains stay on the browser GPU (WebGPU required); Queue runs the PyTorch implementation. Live intermediates are 8-bit and Queue keeps float, which means a very aggressive grade can band slightly differently between the two.

Pack status: super-alpha, early classroom testing - back up workflows before updating.

CategoryGenereti / TOP

Inputs (9)

NameTypeDefaultDescription
imageIMAGE—
blackFLOAT0.000–1—
whiteFLOAT1.000–1—
brightnessFLOAT1.000–4—
contrastFLOAT1.000–4—
saturationFLOAT1.000–4—
gammaFLOAT1.000.01–4—
output_blackFLOAT0.000–1—
output_whiteFLOAT1.000–1—

Outputs (1)

NameTypeDescription
imageIMAGE—