Color Bias
Steer a generation's palette with hex pickers, no reference image needed
- conditioning
- model
- clip
- vae
- color 1
- color 2
- color 3
- color 4
- color 5
- conditioning
- latent
Pick colors, get a palette, no reference image required
Color Bias (class CLIPColorBiasMixer) is the whole of a small one-trick pack, and the trick is neat: you pick one to five hex colors, and it pushes your generation toward them. No reference image, no IP-Adapter, no praying that your prompt's "muted teal and warm amber" phrasing actually lands. It's the kind of node you reach for when a checkpoint has a stubborn color cast you can't talk it out of, or when you want a deliberate look - synthwave magenta-and-cyan, autumn orange - that prompt wording keeps fumbling.
Models do carry color biases, by the way. The merge-inheritance lore is real: shared ancestry propagates the same VAE requirements and color casts down whole model families. If your SDXL anime fine-tune always drifts slightly green no matter what you type, this is a direct knob for that, not another prompt hack.
The README scopes it honestly: it's aimed at CLIP-era checkpoints - SD1.5, SDXL, and anime variants like Illustrious and noobai, plus Anima - where color words in the conditioning actually bind to the latent space. On newer LLM-encoded models that connection is much weaker, so treat this as an SD/SDXL-era tool.
How it works
The node does two things at once, and the pair is the point:
- The text side. Each hex is converted to a plain-English color description - the node tries
webcolorsfirst for an exact CSS name, and falls back to a hue-based one ("vermilion", "vivid sky blue") if there's no exact match. It builds a prompt like(red color palette:1.2), red tones:1.1, subtle red lighting, red accents, hex color #FF0000, RGB 255 0 0, HSL hue 0 degrees..., CLIP-encodes that, scales it, and appends it to your existing conditioning. Encodes are cached, so repeated runs don't re-tokenize every time. - The latent side. It paints a synthetic palette image - colored noise, or vertical/horizontal color bands - with each color's share weighted by its
strength, VAE-encodes it, then adapts the result to your model's latent format. That last part is genuinely useful: it handles different channel counts (SDXL's 4-channel VAE vs. Flux's 16) and spatial downscale ratios, so you don't get the "flat color or noise" mess you'd normally see wiring a mismatched VAE's latent into the wrong model.
The inputs and outputs that matter
conditioning,model,clip,vae- feed it the same ones your KSampler uses. There's no trick here; it needs all four because it works in both text and latent space.color 1–5/strength 1–5- hex pickers plus a relative weight (0–5).active colors(1–5) says how many of the slots count; only the first N are used.global influence- overall strength of the added color conditioning, default 0.5. Set it to 0 and the conditioning passes through untouched while the node still returns its latent - handy if you only want the color-seeding half.latent- palette layout:noise(default, and the recommended one) or the experimentalvertical/horizontalbands.bypass- skips all color processing, returns your conditioning unchanged plus a neutral gray latent. Great A/B switch to see how much the colors were actually doing.
Outputs: a conditioning (wire into KSampler's positive or negative) and a latent (wire into latent_image).
Installing it
Tiny pack, no models to download, no API keys. ComfyUI Manager → search "Color Bias", or:
cd ComfyUI/custom_nodes
git clone https://github.com/dimmedcrow/ComfyUI-ColorBias
Restart ComfyUI. The only dependency is webcolors, and the code even degrades gracefully without it - the hue-naming fallback kicks in. So installation is about as painless as it gets.
Where people get burned
The big one: the latent only steers the image when KSampler's denoise is below 1.0. At full denoise the sampler re-noises the latent completely and your palette gets washed away - you'd be left with just the CLIP text effect. Feed this into a KSampler at denoise ~0.6–0.85, or use it as a second pass, and the color seed actually shows through. That img2img-style behavior is the whole game here, and the README's "typical workflow" sketch doesn't warn you.
Second: width and height default to 1024×1024, which means a full VAE encode per batch item every run. On a small GPU that's real cost for what's just a color field - drop to 512. batch size multiplies the memory hit, and noise mode is heavier than the banded layouts. And if every strength is 0, it throws an error - there's nothing to condition on.
It's a young pack from a small author (zero community chatter yet), so treat the experimental band modes as exactly that, and keep noise as your daily driver.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | — | |
| bypass | BOOLEAN | false | — |
| active colors | INT | 21–5 | — |
| global influence | FLOAT | 0.500–1 | — |
| batch size | INT | 11–64 | — |
| width | INT | 102464–20000 | — |
| height | INT | 102464–20000 | — |
| latent | COMBO | noise | 3 options: noise, vertical, horizontal |
| color 1 | COLOR | #FF0000 | — |
| strength 1 | FLOAT | 1.000–5 | — |
| color 2 | COLOR | #00FF00 | — |
| strength 2 | FLOAT | 1.000–5 | — |
| color 3opt | COLOR | #0000FF | — |
| strength 3opt | FLOAT | 1.000–5 | — |
| color 4opt | COLOR | #FFFF00 | — |
| strength 4opt | FLOAT | 1.000–5 | — |
| color 5opt | COLOR | #FF00FF | — |
| strength 5opt | FLOAT | 1.000–5 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |
| latent | LATENT | — |