FLUX.2 Klein Reference Appearance Balancer
Klein keeps the structure but washes out the colors? This is your fix.
- conditioning
- CONDITIONING
Every Klein editor hits this eventually. The model preserves the layout of your source image beautifully - same composition, same structure - but the color and illumination feel drained, like the image was ironed. People reach for text contrast, or crank the whole reference latent up, and both are the wrong tool. The FLUX.2 Klein Reference Appearance Balancer is the targeted fix.
Here's the insight that makes it work: a raw reference latent isn't doing one job. It's carrying two things at once - coarse appearance (big color fields, lighting, illumination) and local structural lock (edges, fine detail). When you only have a whole-latent knob, loosening the edit path throws both away together, which is why your edit can stay structurally obedient while the chroma washes out. This node separates the two and lets you scale them independently.
How it works
The node splits the reference latent into a low-frequency part and a high-frequency residual using a gaussian blur:
- blur the latent → that's the appearance (coarse color/light) signal
- subtract the blur from the original → that's the detail (structural lock) signal
Then it applies appearance_scale to the blurred part and detail_scale to the residual, and recombines. blur_radius (1–32, default 2) controls how aggressively the latent is split - a bigger radius means "appearance" absorbs more.
So the fix for washed-out edit colors is exactly what you'd expect: keep more of the low-frequency appearance signal, loosen the detail lock.
The README's practical starting point:
appearance_scale = 1.15 to 1.35detail_scale = 0.85 to 1.00blur_radius = 2 to 4
Crank appearance, ease off detail, and the source's broad color comes back while Klein stops fighting you on texture. That's a far more surgical move than globally scaling the reference or pushing text contrast until things go mushy.
Inputs that matter
appearance_scale/detail_scale- the two dials; both 0–3, both default 1 (which makes the node a no-op).blur_radius- the split point.channel_mask_start/channel_mask_end- restrict the rebalancing to a slice of latent channels, if you only want to touch specific ones.target_reference_index--1for all references, or a specific one. Multi-reference edits get this for free, same as the Mixer.
Output is a CONDITIONING with the modified reference latents, wired back into the sampler path.
Where it sits in a workflow
Like the other reference nodes in this pack, it has to come after whatever node injects the reference latents into your conditioning, and before the sampler. It's a natural pairing with the Reference Latent Mixer: use the mixer's lowpass_reference mode when you want to relax the detail lock without necessarily boosting appearance, and use this balancer when you want to actively restore the washed-out color. Both read and write the same reference_latents metadata, so you can chain them.
Install
Same pack, same drill. ComfyUI Manager search "Flux2Klein", or:
cd ComfyUI/custom_nodes
git clone https://github.com/xmarre/ComfyUI-Flux2Klein-Conditioning-Toolkit
Restart. No model downloads, no dependencies beyond torch - this is pure tensor math on small latents.
Two honest caveats. First, like the Mixer, it only does anything if your conditioning actually carries reference_latents metadata - no reference path, no effect. Second, this is a content knob on the reference stream, not a color-grading tool: it restores what the source latent already contained, so it can't invent chroma that was never there. For gross color drift on a specific edit, pairing this with a histogram-match pass in the prompt ("keep the color tone and lighting of the original") is what the community lands on. This node is the part that actually has a slider.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | — | |
| appearance_scale | FLOAT | 1.000–3 | — |
| detail_scale | FLOAT | 1.000–3 | — |
| blur_radiusopt | INT | 21–32 | — |
| channel_mask_startopt | INT | 00–4096 | — |
| channel_mask_endopt | INT | 1280–4096 | — |
| target_reference_indexopt | INT | -1-1–64 | — |
| debugopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |