Color Grade
Six instant color tools that never touch the queue
- image
- image
Most "color grade" nodes in ComfyUI route pixels through a model or at least a queue. Color Grade does neither. It's a set of six real-time GLSL color tools running entirely in your browser - pick an effect, move sliders or curves, and the preview updates instantly. No ▶ Run, no ComfyUI queue, no diffusion models. It's the fastest way in the pack to fix a flat generation, match a product's color temperature, or put a unified "film look" across shots before anything heavier happens.
That "instant" framing is the whole point, and it lines up with what the KB says about this layer: almost none of post-processing is AI, and the right instinct is to reach for the deterministic, free, millisecond operation instead of burning a diffusion pass on work a curve does perfectly. This node is that instinct made into a node.
How it works
The Python side is a formality - the stage stores its state in a single hidden grade_state input (JSON of the selected effect plus slider values, driven by the Vue panel) and passes the image through. The real work is a WebGL fragment shader: the pack's docs describe useGLSLRenderer loading the selected .frag shader and rendering in your browser's GPU. Because the result is a COMFYTV_IMAGE snapshot, downstream generative stages still need their own ▶ Run to pick up the graded image - the docs are explicit that after grading you re-run the next stage.
The six effects
- Brightness / Contrast - overall exposure.
- Color Adjustment - temp, tint, vibrance, saturation: white balance.
- Color Balance - per-channel shadow/mid/highlight with a preserve-luminosity option: split toning.
- Hue / Saturation - selective HSL with a master-or-per-color mode, plus colorize.
- Curves - master / R / G / B curve editing.
- Levels - Photoshop-style in/out black/white and gamma, per channel.
Input is image (COMFYTV_IMAGE), output is image (COMFYTV_IMAGE). One effect per node - stack nodes or chain them if you need more.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
Restart the ComfyUI backend (a real restart, not a tab refresh); nodes appear under the ComfyTV category. ComfyUI Manager finds the pack by searching "ComfyTV". The README's two recurring gotchas: on Desktop/macOS/multi-install setups the relative cd can clone into the wrong instance - read the startup log for the base path it loaded and clone into that absolute path, quoted - and the first level of custom_nodes/ComfyTV/ must contain __init__.py, not a nested ComfyTV/ComfyTV/ folder. No Python dependencies to install; the GLSL runs in your browser.
Troubleshooting and tips
- Curves not editing? Make sure you've selected the Curves effect, then click on the curve to add points - the pack's FAQ is specific about this being the usual stumble.
- Upscale still looks ungraded? It's reading the last snapshot. Re-run the Upscale (or any downstream generative stage) after you grade.
- This isn't Relight. Color Grade is traditional, instant grading; Relight is AI relighting with a Run and a workflow. If you want the lighting itself changed, that's the other node.
- One effect per node. For a temp+curves look, chain two Color Grade nodes rather than hunting for a combined mode.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| grade_state | STRING | JSON of the selected effect + slider values. Hidden — driven by the Vue panel. | |
| imageopt | COMFYTV_IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | COMFYTV_IMAGE | — |