ComfyUI Node

CN Step Control

Step-range control with a fade

By creativeself-kim·Created 10 months ago·Updated 6 months ago· 1
CN Step Control
  • model
  • model
strength_start1.00
strength_end0.00
start_at0.00
end_at1.00

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.

CategoryIXIWORKS/ControlNet

Inputs (5)

NameTypeDefaultDescription
modelMODEL
strength_startFLOAT1.000–2
strength_endFLOAT0.000–2
start_atFLOAT0.000–1
end_atFLOAT1.000–1

Outputs (1)

NameTypeDescription
modelMODEL