CustomScheduler
When you want to dictate the denoising, not pick a preset
- SIGMAS
Every scheduler in ComfyUI is just a factory that spits out a list of sigma values - how much noise gets removed at each step. The stock ones (Normal, Karras, sgm_uniform) compute that list for you. CustomScheduler is the rare node that lets you skip the factory and type the numbers yourself. No model to load, no magic, no dependencies: you write a sigma schedule by hand, it hands you the SIGMAS, and you're done. It's the lowest-tech scheduler node on the shelf, and that's exactly its appeal.
Why would you ever want that? Because sometimes the schedule you need doesn't exist in a dropdown. Papers like Align Your Steps (AYS) publish exact sigma values for their optimized step counts, and people have been hand-coding those into workflows for years. Or you're copying a shared workflow that arrived with a weird sigma list, or you want to pour more denoising effort into the early steps than any preset gives your SD 1.5/SDXL checkpoint. That last one is the honest home turf: this is a DDPM-style-model tool. On flow-matching models (Flux, Z-Image), the KB's samplers essay is blunt that aggressively reshaped sigma curves mostly break things, and the knob that actually pays there is the timestep shift - not manual sigma sculpting.
How it works
The mechanism is embarrassingly simple, and the source confirms it. You set steps (an INT, 1 to 25, default 4) and a bunch of sigma_0 through sigma_25 floats. The node grabs steps + 1 of them - sigma_0 through sigma_steps - packs them into a torch tensor, and returns it as the SIGMAS output.
That +1 is the bit to internalize. A full-denoise sigma schedule for N steps has N+1 entries, because each entry marks a point on the trajectory and you need one more point than jumps. The last entry should be 0 for a full denoise - the README says this outright, and it's the single most important sentence on the page. Leave the last sigma above zero and you're doing a partial denoise, same as img2img at less than 1.0.
The SIGMAS output plugs into the sigmas input of KSampler (Advanced), or into SamplerCustom / SamplerCustomAdvanced in a full custom-sampling chain. In practice it replaces the BasicScheduler node in that group - BasicScheduler picks a stock schedule, CustomScheduler is where you stop picking and start typing.
The inputs that matter
Honestly, there's only steps and the sigma fields, and the only rules are yours:
- steps - how many denoising steps. Each step consumes one gap between consecutive sigmas.
- sigma_0 .. sigma_steps - the schedule itself, as floats between 0 and 100. The defaults (4.12, 1.62, 0.7, 0.04, then zeros) demo a 4-step run.
Two things the node will not do for you: it won't keep your values descending (set sigma_1 above sigma_0 and you're adding noise mid-run), and it won't fill in values you leave at zero. Bump steps to 8 and the widgets for sigma_4+ appear showing 0 - so you get four steps of real denoising and four that do nothing. Fill every sigma you plan to use.
One quirk from the code: the node's JavaScript hides the sigma widgets you aren't using (that hide/show trick is borrowed from tinyterraNodes, per the README). It only works if the node is still named exactly CustomScheduler - rename it and the widgets stop collapsing. Cosmetic, but it'll puzzle you.
Installing it
No model files, no pip deps - the pack is pure node code plus torch, which ComfyUI already ships. Install it like any custom node:
- ComfyUI Manager: search "CustomScheduler" and hit Install, or
cd ComfyUI/custom_nodes && git clone https://github.com/BlakeOne/ComfyUI-CustomScheduler
Then restart ComfyUI. It'll appear under Add Node → sampling → custom_sampling → schedulers. That's the whole install story; there is no requirements.txt to babysit.
Where people get burned
The pitfalls are all numerical, not mechanical. The last sigma must be zero for a full denoise. Values must descend, because nothing enforces it. And the defaults only fill four steps - set steps above 4 and every extra sigma silently defaults to 0, so your "12-step" render is really a 4-step render with dead air. Export the SIGMAS with a debug node and read the list if you're unsure; zeros in the middle mean wasted steps. And if typing twenty-five numbers sounds miserable, the same author's SchedulerMixer builds custom schedules as a weighted average of the built-in ones - often the saner option when you want a shape, not exact figures.
Inputs (27)
| Name | Type | Default | Description |
|---|---|---|---|
| steps | INT | 41–25 | — |
| sigma_0opt | FLOAT | 4.120–100 | — |
| sigma_1opt | FLOAT | 1.620–100 | — |
| sigma_2opt | FLOAT | 0.700–100 | — |
| sigma_3opt | FLOAT | 0.040–100 | — |
| sigma_4opt | FLOAT | 0.000–100 | — |
| sigma_5opt | FLOAT | 0.000–100 | — |
| sigma_6opt | FLOAT | 0.000–100 | — |
| sigma_7opt | FLOAT | 0.000–100 | — |
| sigma_8opt | FLOAT | 0.000–100 | — |
| sigma_9opt | FLOAT | 0.000–100 | — |
| sigma_10opt | FLOAT | 0.000–100 | — |
| sigma_11opt | FLOAT | 0.000–100 | — |
| sigma_12opt | FLOAT | 0.000–100 | — |
| sigma_13opt | FLOAT | 0.000–100 | — |
| sigma_14opt | FLOAT | 0.000–100 | — |
| sigma_15opt | FLOAT | 0.000–100 | — |
| sigma_16opt | FLOAT | 0.000–100 | — |
| sigma_17opt | FLOAT | 0.000–100 | — |
| sigma_18opt | FLOAT | 0.000–100 | — |
| sigma_19opt | FLOAT | 0.000–100 | — |
| sigma_20opt | FLOAT | 0.000–100 | — |
| sigma_21opt | FLOAT | 0.000–100 | — |
| sigma_22opt | FLOAT | 0.000–100 | — |
| sigma_23opt | FLOAT | 0.000–100 | — |
| sigma_24opt | FLOAT | 0.000–100 | — |
| sigma_25opt | FLOAT | 0.000–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SIGMAS | SIGMAS | — |