CN Step Control
Step-range control with a fade
- model
- model
The single most repeated piece of ControlNet advice in the community is also the easiest to forget: the condition should shape the composition early and then back off, or it will fight the model's own detail work in the late steps. CNStepControl is that advice as a node. It takes an already-patched MODEL and gates the ControlNet's effect to a step range, with a linear strength fade - exactly the "release the condition once composition has formed" pattern the KB's ControlNet essay treats as the parameter that matters most.
How it works
This is a wrapper around an existing ControlNet patch, not a ControlNet loader. You feed it a MODEL that already has a ControlNet applied - the README says it's designed for Flux and Z-Image style architectures where the patch lands in the model's double_block layers. Internally it converts your percent-based start_at/end_at range into sigma values using the model's sampling object, then wraps each existing double-block patch. Inside the range, the patch's effect is scaled from strength_start down (or up) to strength_end; outside the range, the patch is skipped entirely.
That phrasing matters: with the defaults - strength_start=1, strength_end=0 - the ControlNet runs at full weight during the composition phase and linearly fades to nothing by the end. Set strength_start=strength_end and you get constant strength inside the window instead of a fade.
The inputs
- model (MODEL) - your already-ControlNet-patched model.
- strength_start (FLOAT, default 1) / strength_end (FLOAT, default 0) - the fade endpoints, 0–2.
- start_at (FLOAT, default 0) / end_at (FLOAT, default 1) - the step window as a 0–1 percentage of the sampling range.
Output is model, the same model with the gated, faded patches - wire it into your sampler as you normally would.
The gotchas
The big one: this only works on models whose ControlNet is applied through double_block patches - which is true of the DiT-era architectures (Flux, Qwen-Image, Z-Image) and their DiffSynth-style controlnet outputs, not classic SD/SDXL UNet controlnets. Feed it an SDXL patched model and the wrap will find no double-block patches to gate, so it does nothing. It also validates that start_at <= end_at and raises rather than silently doing something weird.
A practical tip from how the math works: because the fade is linear in sigma, not in step number, the curve you feel on fast samplers is slightly compressed toward one end. For a "grip it early, release it by 60%" feel, set end_at around 0.6 rather than 1.0 - that's the pattern the ControlNet literature keeps landing on.
Install
Part of the IXIWORKS pack - ComfyUI Manager → search ComfyUI-VideoDescription, restart, or clone the repo into custom_nodes/. No extra dependencies beyond what ComfyUI provides. It's a specialist node - you'll only reach for it on the new architectures - but on those, it's the clean way to do what most people hack together with scheduling hacks or manual strength envelopes.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| strength_start | FLOAT | 1.000–2 | — |
| strength_end | FLOAT | 0.000–2 | — |
| start_at | FLOAT | 0.000–1 | — |
| end_at | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |