ComfyUI Node

FLSampler (BSS)

Detail where the image is actually changing, mid-denoise

By BlackSnowSkill·Created 3 months ago·Updated 3 months ago· 92
FLSampler (BSS)
  • model
  • positive
  • negative
  • latent_image
  • latent
  • fovea_mask
seed0
steps20
cfg8.0
sampler_name
scheduler
denoise1.00
fovea_strength3.0
sharpness0.50
mask_inertia0.85

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:

  1. 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.
  2. 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.
  3. Blends it with the mask from previous steps via mask_inertia, so focus doesn't hop around erratically.
  4. Applies the effects inside the mask only: unsharp masking on x0 (original minus a 3×3 blur, scaled by sharpness) and a randn noise perturbation scaled by fovea_strength (clamped to ±0.15 so it can't nuke the image). Both are multiplied by a decay term 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: KSampler before 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__.py catches import errors and logs them under BSS_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.
CategoryBSS/FLSampler

Inputs (13)

NameTypeDefaultDescription
modelMODEL
seedINT00–18446744073709550000
stepsINT201–10000
cfgFLOAT8.00–100
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
positiveCONDITIONING
negativeCONDITIONING
latent_imageLATENT
denoiseFLOAT1.000–1
fovea_strengthFLOAT3.00–10
sharpnessFLOAT0.500–3
mask_inertiaFLOAT0.850–0.99

Outputs (2)

NameTypeDescription
latentLATENT
fovea_maskIMAGE