LatentDetailer
Put a photoreal detail pass between the sampler and the VAE
- model
- latent
- positive
- negative
- LATENT
You know the complaint: SDXL output looks clean, smooth, plastic. The classic fixes all cost something - cranking CFG gets you saturation and burn, a full hi-res fix is a second generation, and a generative upscaler like SeedVR2 or SUPIR rewrites your faces along the way. LatentDetailer is the cheap middle option: a detail pass that runs entirely in latent space, right before the VAE decode, at the price of one extra UNet evaluation.
Its workflow position tells you what it does: wire it between your KSampler's LATENT output and the VAE Decode, and it adjusts the latent before it ever becomes pixels. It's a "detailer" in the Impact-Pack sense of the word, but where FaceDetailer detects a region and re-generates it at higher resolution, this one never detects anything and never re-generates.
How it works
The node runs your UNet again on the finished latent - once per entry in sigmas - at a chosen point in the denoise schedule, and computes what the model thinks the clean image would be there. Same denoised-estimate math your sampler uses every step, just a one-off probe instead of a full walk.
sigmas is a comma-delimited string of normalized positions from 0.0 (start of denoising, noisiest) to 1.0 (end, cleanest). Each entry triggers one UNet evaluation and the estimates are averaged, so 0.40 (the default) means one probe, and 0.25,0.55 means two. Then the interesting part: the difference between that clean estimate and your latent is split into low and high frequency, and the high-frequency part is reinjected as detail - scaled by detail_strength, tamed in flat areas by protect_lows, separated by hf_radius.
There's also a CFG-delta branch, a nice piece of reuse: it amplifies den_pos - den_neg, the same signal classifier-free guidance is built on. cfg_hf_boost pushes that high-frequency guidance into the result. The node's own cfg input is just the base for that shaping - set it to match your sampler's CFG. On a distilled model at CFG 1, this branch quietly shuts off, which is expected, not a bug.
On top of that come the finishing touches, all optional: noise_scale/noise_radius for photographic micrograin, bloom_strength/bloom_threshold for halation, color_drift for granular color variation, and chromatic_aberration for lens-like fringing. Defaults are subtle by design - the author aimed at "real photography," not a dramatic filter.
The inputs that matter
You won't set forty knobs on your first run. Start here:
- model, latent, positive, negative - you wire your checkpoint and conditioning in again. It's a MODEL node that runs the UNet, not a free post-filter, so it needs the same ingredients as your KSampler.
- sigmas - leave at
0.40until you understand the effect. - detail_strength - the master detail dial (default 0.65). This is the one you'll actually turn.
- hires_scale / hires_strength - a cheap built-in hi-res trick: if >1, one UNet pass at the upscaled latent, then downsampled and blended back. Not a substitute for a real hi-res fix, but a way to feed the detail pass more resolution.
- noise_scale - micrograin; the author pairs a little bloom with it for convincing rolloff.
The output is a single LATENT, fed straight into your VAE Decode (or another KSampler, if you're feeling ambitious).
Install
ComfyUI Manager, search "LatentDetailer" (it's on the Comfy Registry), or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/SparknightLLC/ComfyUI-SpectralVAEDetailer
Restart ComfyUI. That's it - no requirements.txt, no model downloads, no heavy dependencies; the only cost is what those extra UNet evaluations use.
Gotchas
- Images turn "splotchy"? The author hit this too and shipped a
preset_subtleexample workflow. If the effect is too strong, load that preset instead of fighting the sliders. - Noisy flat backgrounds were the original worst case - that's what the
cfg_radius_adaptivemode (withcfg_radius_flatandcfg_adapt_feather) was built to fix. It uses a cheap detail mask so flat regions get gentler CFG-detail treatment. - It's subtle. You're micro-adjusting a latent, not running a restoration model. Compare side by side or you'll think it did nothing.
- Speed scales with
sigmasandhires_scale- one sigma at 1x is fast, three sigmas at 2x is a second mini-sampler.
It's tuned for SDXL photoreal workflows, though the author says it's model-agnostic - ZIT and friends work, just budget time to re-tune the starting parameters. For killing the AI-look on portraits without a face-rewriting upscale pass, it earns its slot.
The alias, and a name change
If you also see SpectralVAEDetailer in your node menu, that's this same node under its old name - the pack renamed itself from ComfyUI-SpectralVAEDetailer to ComfyUI-LatentDetailer in v0.3.0 and kept the old name registered as an alias. Both map to the same class, same inputs, same output; use either. See the SpectralVAEDetailer page for the full rename story.
Inputs (42)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | -1-1–2147483647 | Random seed for grain/color drift. Use -1 for random each run. |
| sigmas | STRING | 0.40 | Comma-delimited list of normalized sigma positions (0..1). Each entry runs one UNet evaluation and the denoised estimates are averaged. Example: 0.25,0.55. 0=start (noisiest), 1=end (cleanest). |
| model | MODEL | — | |
| latent | LATENT | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| luma_clarity | FLOAT | 0.000–1 | Mid-band local contrast on latent channel 0. 1.0 is intentionally strong. |
| boost_confidence | FLOAT | 0.000–1 | Boosts UNet-proposed micro detail ONLY where it appears confident; suppresses flats and strong edges. |
| bloom_strength | FLOAT | 0.000–1 | Approximate photographic bloom/halation by spreading bright highlights (luma only). Best paired with a little noise_scale (e.g. 0.02–0.08) for a more convincing photographic rolloff. |
| bloom_threshold | FLOAT | 0.650–1 | Only highlights above this luma threshold contribute to bloom. |
| bloom_radius | INT | 80–64 | Blur radius for bloom spread. Larger is softer but slower. |
| color_drift | FLOAT | 0.250–1 | Noise-driven granular color drift (micro color distribution). Higher = stronger. |
| color_drift_radius | INT | 160–64 | Granular drift scale. 1..3 is typical; 16 is very broad/slow drift. |
| cfg | FLOAT | 7.000–10 | Base CFG. This node applies additional HF/LF shaping when cfg > 1. |
| cfg_hf_boost | FLOAT | 5.000–5 | How strongly to inject high-frequency CFG detail (from den_pos - den_neg). |
| cfg_lf_boost | FLOAT | 0.000–2 | How strongly to inject low-frequency CFG contrast (usually keep low). |
| cfg_radius | INT | 50–64 | CFG split radius. In adaptive mode, this is the DETAIL radius. |
| cfg_radius_flat | INT | 00–64 | CFG split radius used in flat/low-detail regions when adaptive mode is ON. |
| cfg_radius_adaptive | BOOLEAN | true | If ON, blends between cfg_radius_flat (flat) and cfg_radius (detail). |
| cfg_adapt_feather | INT | 20–32 | Blur radius applied to the adaptive mask. Higher reduces halos but can soften detail reach. |
| cfg_adapt_gamma | FLOAT | 2.000.5–3 | Mask curve. >1 shrinks 'detailed' regions (less spill/halo). <1 expands them. |
| detail_strength | FLOAT | 0.650–2 | Strength of injected high-frequency detail from denoised estimate. |
| hf_radius | INT | 40–64 | Detail split radius for base projection (larger = coarser separation). |
| mid_strength | FLOAT | 0.050–0.5 | Adds some mid/low component of the base projection (contrast/shape). |
| detail_chroma | FLOAT | 0.100–2 | Scales how much the detail + CFG injections affect chroma latent channels (1..3). This is NOT chromatic aberration (no spatial shift). |
| chromatic_aberration | FLOAT | 0.000–1 | Lens-like chromatic aberration (spatial misregistration) applied to chroma latent channels (1..3) after all other adjustments. Very subtle effects are usually best (0.02–0.10). |
| protect_lows | FLOAT | 0.900–1 | Prevents HF detail from over-applying in low-frequency regions (reduces harshness). |
| soft_clip_detail | BOOLEAN | true | Soft-limits HF detail to reduce halos/zipper edges. |
| soft_clip_detail_k | FLOAT | 2.200.5–8 | Detail soft-clip amount. Higher = weaker limiting. |
| soft_clip_cfg | BOOLEAN | true | Soft-limits HF CFG injection to reduce harsh edges and background speckle. |
| soft_clip_cfg_k | FLOAT | 2.000.5–8 | CFG soft-clip amount. Higher = weaker limiting. |
| noise_scale | FLOAT | 0.100–0.5 | Micrograin intensity in latent space. |
| grain_luma | FLOAT | 0.000–1 | Luma-dependent grain: increases grain in shadows and reduces it in highlights. This primarily modulates the grain injected by noise_scale (and shaped by noise_radius). |
| noise_tail | FLOAT | -1.00-1–1 | Tail-heaviness of the grain noise distribution. 0 = Gaussian. + = heavier tails (more occasional strong specks / grit). - = lighter tails (smoother). RMS-normalized so noise_scale stays comparable. |
| noise_radius | INT | 10–16 | Grain correlation radius. 0=white, 1..3 often looks most photographic. |
| noise_flat_suppress | FLOAT | 1.000–1 | Suppresses grain in flat regions (local smoothstep mode, always-on). |
| hires_scale | FLOAT | 1.01–4 | If >1, runs ONE UNet pass at upscaled latent resolution, then downsamples denoised estimates back to 1x before post-processing. |
| hires_strength | FLOAT | 0.750–1 | How much of the hires-derived correction to apply. 0=off, 1=full. |
| hires_use_importance_mask | BOOLEAN | true | If ON, applies hires correction mostly where small/foreground-ish features are detected (cheap heuristic). |
| hires_mask_strength | FLOAT | 1.000–1 | 0 = uniform hires blend, 1 = fully importance-masked blend. |
| ignore_cond_timestep_range | BOOLEAN | true | If ON, strips timestep limits from conditioning ranges (more consistent behavior). |
| debug | BOOLEAN | false | Prints diagnostics to console. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |