Auto White Balance
Fix color casts with zero dials to turn
- video
- video
Shoot under tungsten lights with auto white balance and your footage comes back orange. Under fluorescent, it comes back green. Auto White Balance is the one-click fix for both: it looks at the frame, decides the average color isn't really supposed to be there, and pulls it out. And for once, "one-click" isn't marketing - this node has no parameters at all. You wire in a video, you get a corrected video.
ComfyTV is jtydhr88's canvas app (~190 stages, each its own node). GrayWorld sits in the VideoFX suite next to the other color stages, and it's the node you reach for before you start dragging color wheels: it fixes the global cast so your manual grading starts from a neutral frame.
How it works
The name is the mechanism. The gray world assumption says: average out all the colors in a natural scene and you should get gray. If the average isn't gray - if it's orange, say - then the whole frame is shifted, and you can compute how much to shift it back by scaling each channel until the mean lands on neutral. It's a real white-balance technique (camera makers have shipped it for decades), it's deterministic, and it's the fastest possible fix for a cast that's uniform across the frame.
It's also the weakness, and it's worth knowing before you rely on it: gray world fails exactly when the scene is supposed to be one color. A sunset, a shot of a red wall, a forest of green - those scenes have a genuine color bias, and gray world will fight it, desaturating the very thing that makes the shot beautiful. On those, skip this node and grade by hand instead.
The hidden inputs, explained once
The only inputs are the internal ones every ComfyTV stage carries: force_run_token, project_id, and parent_output_id, all marked "Internal" in the schema and populated by the frontend's projectStore for per-node Run. There's also the optional video input (a COMFYTV_VIDEO) and a single video output. That's the whole interface - which is the point.
Installing it
Same pack, same steps:
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
or ComfyUI Manager ("ComfyTV"), full backend restart, then ComfyTV → VideoFX. The one gotcha that bites people: on ComfyUI Desktop, macOS, or multiple installs, clone into the running instance by absolute path and confirm custom_nodes/ComfyTV/__init__.py exists (not nested), then fully restart. The pack declares no pip deps, but video stages lazily import PyAV - pip install av if a video node errors.
Common issues
- Sunset footage looks washed out - working as designed. Gray world is neutralizing a scene that's supposed to be orange. Don't fight it; use a manual color stage.
- The fix looks green or magenta now - a global average can overcorrect when one big colored object dominates the frame (a red car filling half the shot). Crop the dominant object out or grade manually.
- No visible change - your footage was already neutral, or the cast is localized to part of the frame rather than global. Gray world can only fix what's true of the whole frame.
Inputs (4)
| 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. |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | COMFYTV_VIDEO | — |