Jurdns Iterative Noise KSampler
This KSampler Adds Noise While It Samples — Scrape Out Detail, or Just Add Grain
- model
- positive
- negative
- latent_image
- LATENT
Jurdns Iterative Noise KSampler is a drop-in KSampler replacement that quietly re-injects fresh, seeded noise into your latent partway through sampling. The pitch: most samplers smear detail as they converge, and a little controlled noise mid-run can shake texture back out of the latent. It's a real technique - it's the whole idea behind the well-known Detail Daemon node - but this is the blunt-instrument version of it. A couple of the defaults are aggressive, so it pays to understand the three knobs before you hit Queue.
What it actually does
Wire it in exactly where you'd put a KSampler: model, positive, negative, latent_image, seed, steps, cfg, sampler_name, scheduler, denoise - same inputs, same LATENT output, so it's a one-for-one swap in any existing graph. All the standard samplers and schedulers pass straight through, and it works with SD 1.5, SDXL, and flow-matching models alike because it sits on top of ComfyUI's own sampling pipeline.
The mechanism (from the source, not just the README): after each denoise step, a callback nudges the latent with randn * current_sigma * strength. That "current sigma" bit is the important part - the kick is scaled to how much noise the trajectory has left at that moment, so a shove early in the run is big and a shove near the end is tiny. The strength itself isn't constant: it linearly ramps from start_noise_strength to end_noise_strength across the run. Defaults are 0.1 → 0.0, meaning the early steps get a 10%-of-sigma kick and the final step gets nothing, so the image still converges.
Effectively, it turns any sampler into a mild ancestral one: same "add noise each step" trick that makes Euler A and DPM++ SDE produce their extra texture, but deterministic. The per-step perturbation uses a generator seeded from seed + step + 1, so the same seed, steps, and sampler reproduce exactly.
The three knobs that matter
add_noise_every_n_steps- how often the kick lands. Default1is every step, which is a lot.2–5spreads it out and reads much more like "detail," less like "I dropped sand on the render."start_noise_strength- how hard the early (high-sigma) kicks hit. This is the one that decides grain vs. texture. 0.03–0.05 is a safer starting point than the shipped 0.1.end_noise_strength- where the ramp ends. Keep it near 0 so the last steps clean up. Ramp it up and you're deliberately leaving the output noisy, which is... a choice.
Everything else you already know from KSampler: CFG, steps, sampler/scheduler picks. Output is one LATENT - don't forget the VAE Decode, or you'll stare at an empty preview and blame the wrong node.
Install
No models, no dependencies, no GPU-crushing extras - it's a single Python file using only ComfyUI core. ComfyUI Manager: search "Jurdns Iterative Noise KSampler" and install. Or by hand:
cd /path/to/ComfyUI/custom_nodes/
git clone https://github.com/jurdnf/ComfyUI-JurdnsIterativeNoiseKSampler.git
Restart ComfyUI, and it shows up under sampling/custom.
Where people get burned
Two traps, both from the defaults. First, running it out of the box adds noise every single step at 10% of sigma - on anything with clean gradients you get grain, not detail. Drop add_noise_every_n_steps to 3 and start_noise_strength to 0.04, and the character flips. Second, it's dumb about placement: the noise lands on the whole latent every eligible step, with no region masking and a strictly linear strength curve. Detail Daemon gives you blend amounts and a proper noise schedule for that reason; this node is the cheap seat at the same concert. If you're already on an ancestral sampler, stacking this on top is noise on noise - start from a converging sampler like Euler or DPM++ 2M.
One more honest caveat: the sigma scaling assumes a full-steps run. Dial denoise below 1 and the injected noise gets scaled against the full trajectory's sigmas rather than your truncated one, so the effect skews stronger than the slider suggests. Treat this as a full-denoise tool and it behaves; push it into img2img and be ready to compensate.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| 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 | |
| add_noise_every_n_steps | INT | 11–100 | — |
| start_noise_strength | FLOAT | 0.100–2 | — |
| end_noise_strength | FLOAT | 0.000–2 | — |
| denoise | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |