FLSampler (BSS)
Detail where the image is actually changing, mid-denoise
- model
- positive
- negative
- latent_image
- latent
- fovea_mask
FLSampler (BSS) is a drop-in KSampler replacement that doesn't just denoise - it watches its own denoising and pumps detail into the parts of the latent that are actively changing. The "foveated vision" framing is marketing; the mechanism underneath is selective unsharp masking plus a small noise injection, applied mid-run instead of as a post-process filter. That's a genuinely useful trick, and the node is a fine way to play with it. Just don't expect it to replace a proper hires fix, and know you're the early adopter: this pack has almost no community footprint (you won't find it on Reddit), a one-person author, and an explicit "experimental release" stamp. Read the code before you run it, like you should with any custom node.
Where you'd reach for it: your model's output looks waxy or plastic - skin reads as rubber, fabric as flat color - and you want micro-texture without a second upscale pass. Or you want one sampler that bundles detail control and cuts the post-processing stack. It works on any architecture the standard sampler stack supports - SDXL, Flux, even Anima DiT, which the README pitches as FLSampler's partner model - because it sits on top of comfy.sample.sample rather than caring about the checkpoint.
How the "fovea" actually works
The node runs the normal sampling loop but hands ComfyUI a callback that fires every step. The first 10% of steps are left untouched so gross structure forms. After that, each step:
- Computes the absolute difference between the current predicted clean image (
x0) and the previous step's, averaged over channels and smoothed with a 5×5 average pool. Big changes = geometry and boundaries forming. - Thresholds that map with
mean + 0.5·std, pushes it through a sigmoid for a soft mask, and zeroes anything under 0.2. That's your focus map. - Blends it with the mask from previous steps via
mask_inertia, so focus doesn't hop around erratically. - Applies the effects inside the mask only: unsharp masking on
x0(original minus a 3×3 blur, scaled bysharpness) and arandnnoise perturbation scaled byfovea_strength(clamped to ±0.15 so it can't nuke the image). Both are multiplied by adecayterm fading toward the final steps, so the noise resolves into texture instead of ending up as static.
Inpainting works: the node reads and passes through the latent's noise_mask, so masked regions behave like they do with a normal KSampler.
The inputs that matter
The right half is a standard sampler: model, positive, negative, latent_image, seed, steps, cfg, sampler_name, scheduler, denoise. Same as KSampler, same defaults roughly. The three you're actually here for:
- fovea_strength (0–10, default 3) - the texture/noise injection. This is the "pores and fabric grain" dial. The README suggests 3–8; set 0 to disable noise entirely. It decays across steps automatically, so high values are less scary than they sound.
- sharpness (0–3, default 0.5) - local contrast/edge definition inside focus zones. 0.3–1.0 is the sane band. This is the one that "fries" the image if you go ham - the noise has a clamp, sharpness doesn't.
- mask_inertia (0–0.99, default 0.85) - how smoothly the focus moves between steps. Higher = stable detail zones, lower = the mask reacts instantly. Leave it alone until the other two are dialed.
Change one knob at a time. Defaults are honestly decent starting points.
Outputs: the debug gift
Two outputs. latent wires straight into VAE Decode like any sampler. The second, fovea_mask, is the accumulated focus map upscaled to image resolution - plug it into a Preview or Save Image node and you see exactly where the sampler concentrated its work. That's a genuinely nice debugging tool, and most detail-boost nodes don't give you anything like it.
Installing it
No dependencies beyond what ComfyUI already bundles - the repo has no requirements.txt, no model downloads, and the node is pure PyTorch + the standard comfy.* modules. The README only documents the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/BlackSnowSkill/ComfyUI-BSS_FLSampler.git
Restart ComfyUI and hard-refresh your browser (Ctrl+F5) - that last bit matters because the pack ships a custom web UI (a "BSS Premium" gold-on-dark theme that also suppresses hover tooltips while dragging). You can also try ComfyUI Manager's search for "FLSampler" or "ComfyUI-BSS_FLSampler".
Real talk: gotchas
- The README says "without adding any overhead to generation times." That's optimistic. There's a per-step callback doing pool ops, a blur, and mask accumulation. It's cheap relative to the model forward pass - you won't see it in wall-clock - but it's not literally zero.
- Your saved workflows lie about this node. To keep CivitAI metadata parsers happy, the node rewrites its own entry to
class_type: KSamplerbefore the workflow is saved. Re-import a shared image and you'll see a plain KSampler where FLSampler used to be - deliberate, but confusing the first time you hit it. - If the node doesn't appear in your node list, ComfyUI didn't crash - the pack's
__init__.pycatches import errors and logs them underBSS_FLSAMPLER. Check the console; that's where the real error is. Missing node after a fresh install usually just means the browser cache again. - It's one solo dev's experimental project with a fiercely worded copyright header and a Russian README (the author's home base is Boosty). Treat version numbers ("V4" in a 1.3.0 pack) as branding, and don't build a production pipeline on it without reading
nodes/node_fls.py- it's 300 lines and actually well-commented.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.00–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| denoise | FLOAT | 1.000–1 | — |
| fovea_strength | FLOAT | 3.00–10 | — |
| sharpness | FLOAT | 0.500–3 | — |
| mask_inertia | FLOAT | 0.850–0.99 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| fovea_mask | IMAGE | — |