Flux Detail Guidance (FDG)
Flux looks like plastic? This node hands you a real detail dial
- model
- model
Flux.1 has a well-known tell: that smooth, "beauty filter" skin that reads as plastic at full resolution. The usual fixes are blunt instruments - raise the denoise and risk your composition drifting, or run a full upscaler that happily rewrites faces. Flux Detail Guidance (FDG) is neither. It's a per-forward-pass model patch that pulls more micro-detail out of the same model, at the same denoise, without moving a pixel of composition or text.
The catch: it's experimental, it's Flux-only, and it costs you about 2x model evaluations during the steps it's active. If that sounds like a fair trade for skipping the plastic look, read on.
What it actually does
FDG is a port of the "token detail guidance" self-guidance idea, and the mechanism is neat. During a window of the denoise schedule, every step runs the model twice:
eps_full = model(x) # normal pass
eps_weak = model(x) with high-frequency detail
attenuated in selected Flux blocks # "starved" pass
delta = eps_full - eps_weak # the detail the model was adding
eps = eps_full + guidance_scale * shaped(delta)
That shaped() is doing real work: it splits the delta into mid/high frequency bands, weights high frequencies more in late steps, gates the hardest edges so you don't get outline halos, and std-limits the result so you get texture back without color drift. An output_rescale stabilizer pulls the output back toward the normal pass's statistics. The weak pass isn't a broken model - it's a detail-starved version of the same model, so the difference between the two is literally "the detail Flux wanted to add."
Crucially, because it's a model patch rather than image inversion, it runs inside tiled samplers like Ultimate SD Upscale. That's where the 3K-4K textures come from. It also refuses to patch anything that isn't Flux - it checks for double_blocks / single_blocks on the diffusion model and errors out on SD/SDXL/Z-Image.
The inputs that matter
It takes a MODEL and outputs a patched MODEL - wire it between your ModelSamplingFlux and your sampler. Of the dozen-odd settings, a beginner actually sets three:
guidance_scale(default 0.35) - the main dial. Start 0.3-0.6 and raise until it looks crunchy, then back off a hair.single_start/single_end(default 15/38) - the single-block band where most of Flux's detail lives. Flux-dev has 38; setend <= startto disable a band entirely.step_start/step_end(0.0/1.0) - the active window as a fraction of executed steps. At low denoise the executed steps are already the tail of the schedule, so keepstep_startnear 0.
weaken_strength (how hard the weak pass suppresses detail), blur_passes (1 = finest detail scale), output_rescale (lower = rawer detail), and adaptive_gate (keep it on - it only weakens where there's already detail energy, so flat areas stay clean) are the fine-tuning layer. The README's wiring is UNETLoader → LoRAs → ModelSamplingFlux → FDG → UltimateSDUpscaleCustomSample, ideally with a clean solver like seeds_3 at eta=0 and the ays scheduler - remember, Flux wants Euler-style schedulers, not Karras.
Install
No model downloads, no heavy deps - the source ships pure Python on ComfyUI's public model-patcher API. Grab it via ComfyUI Manager (search "ComfyUI-FluxDetailGuidance") or:
cd ComfyUI/custom_nodes
git clone https://github.com/lookuters22/ComfyUI-FluxDetailGuidance
Restart ComfyUI and it appears under Flux/experimental.
Where people get burned
- Not enough detail: raise
guidance_scale, widen the single-block band, or loweroutput_rescale. - Halos, crunch, or the flat contrasty "default Flux" look: lower
guidance_scale, narrow the band, and keep the bands in the back half of each stack. Weaken the early blocks and the weak pass stops being "detail-starved" and becomes "broken." - Errors: both bands empty, or
step_start > step_end, and it refuses to run - the messages are explicit. - Silently inactive: if a step can't get
sample_sigmasit logs a warning and passes through. Non-grid image tokens (Kontext, reference latents) make the attenuation safely no-op, which is a graceful failure, not a crash.
Honest framing: this is a 60-impression niche pack with barely any community chatter, so you're on your own a little - but the tooltips are unusually good and the defaults are sensible. If Flux's plastic skin is your pet peeve and you already tile-upscale, this is worth an afternoon.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| enabled | BOOLEAN | true | — |
| double_start | INT | 100–60 | First double-block (inclusive) to weaken. Flux-dev has 19 double-blocks. |
| double_end | INT | 190–60 | Last double-block (exclusive). Set <= start to disable double-block patching. |
| single_start | INT | 150–60 | First single-block (inclusive) to weaken. Flux-dev has 38 single-blocks (most of the detail). |
| single_end | INT | 380–60 | Last single-block (exclusive). Set <= start to disable single-block patching. |
| step_start | FLOAT | 0.000–1 | Start of active window as a fraction of EXECUTED steps. At low denoise keep this near 0. |
| step_end | FLOAT | 1.000–1 | End of active window (fraction of executed steps). |
| guidance_scale | FLOAT | 0.350–3 | Detail strength. Main dial. Start 0.3-0.6 and increase until it looks crunchy. |
| weaken_strength | FLOAT | 0.500–1 | How hard the weak pass suppresses local image-token detail per block. |
| blur_passes | INT | 11–4 | Defines 'detail' scale (high-frequency residual). 1 = finest. |
| output_rescale | FLOAT | 0.300–1 | Stabilizer toward normal-pass statistics. Lower = more raw detail. |
| adaptive_gate | BOOLEAN | true | Only weaken where local detail energy is high; keeps flat regions clean. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |