Forward Diffusion (Add Scheduled Noise)
Add the exact right amount of noise, sampler-style
- model
- latent
- mask
- LATENT
Adding noise to a latent sounds trivial - just add random numbers, right? But the amount of noise matters enormously, and it has to be the amount your model's sampler expects at a given step. Forward Diffusion (Add Scheduled Noise) is the node that gets this right: instead of a blind strength slider, it reads the actual sigma schedule from your model and noises the latent to the exact point a KSampler would start from. It's "add noise" with the sampler's blessing.
That makes it the tool for the trickier half of img2img-style pipelines: you don't want to just smear the input latent and hope, you want to push it along the model's own forward-diffusion path so the denoiser recognizes it as a valid starting point. It also composes naturally with inpainting - noise a masked region to a specific schedule point while leaving the rest clean, then let the sampler reconstruct only that area.
How it works
The node builds a KSampler(model, steps=steps) and reads its sigmas - the same schedule your sampler will later denoise through. It maps noise_strength to a start step with start_step = steps - int(steps * noise_strength), grabs the sigma at that point, and computes:
noised = latent + gaussian_noise(seed) * sigma
That single multiply by the schedule's sigma is the whole difference between "correctly pre-noised" and "randomly noisy." If the ComfyUI sampler module isn't available, it falls back to a linear sigma ramp linspace(1, 0, steps), so it never hard-crashes - it just gets less precise.
The inputs that matter:
- model - the diffusion model whose schedule you're borrowing. This is what makes the noise "scheduled."
- latent - the clean latent to push forward.
- seed - fixes the noise.
- steps - must match the KSampler you'll run afterward (the tooltip is explicit:
noise_strengthmust match the KSampler's effective start step). - noise_strength - how far along the schedule to go. 0 is a no-op; 0.8 means "noise to 80% through the schedule."
The optional mask limits the noising to masked areas - the classic inpaint setup.
Installing it
Part of the Skoogeer-Noise pack. ComfyUI Manager: search "Skoogeer-Noise", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
# restart ComfyUI
Standard deps, no model downloads.
Gotchas
- Match
stepsandnoise_strengthto your KSampler. If your sampler runs 30 steps at denoise 0.6, feed this node 30 steps and 0.6. Mismatches mean the noise lands at a different schedule point than the sampler expects, and you get a subtly off result that's hard to diagnose. - Noise adds, it doesn't blend. This node replaces the "clean" latent with a noised version. If you wanted to merge two latents with different noise levels, that's a different operation - this one is strictly forward diffusion.
- The linear fallback is a hint something's off. If you see noise that doesn't match the sampler's curve, check that the ComfyUI sampler module is importable in your install (it should be in a standard install).
- There's a
mask- use it. Localized noising is the difference between "edit one region" and "re-roll the whole image."
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Diffusion model that defines the forward noise schedule. | |
| latent | LATENT | Clean latent to push forward along the schedule. | |
| seed | INT | 00–18446744073709550000 | Seed for the forward diffusion noise. |
| steps | INT | 201–10000 | Number of steps in the sampler's schedule. |
| noise_strength | FLOAT | 0.800–1 | The point in the schedule to noise to. Must match the KSampler's effective start step. |
| maskopt | MASK | Optional mask (often image-sized) to limit the noising to masked areas. The mask is resized to latent resolution (bicubic when downscaling). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |