Nodes/ComfyUI Easy Use/EasyControlnetStack
ComfyUI Node Runs on cloud

EasyControlnetStack

Build up to three ControlNets before you apply any of them

By yolain·Created 3 years ago·Updated 8 days ago· 2,633
EasyControlnetStack
  • optional_controlnet_stack
  • image_1
  • image_2
  • image_3
  • controlnet_stack
toggle
mode
num_controlnet1
controlnet_1None
controlnet_1_strength1.00
start_percent_10.000
end_percent_11.000
scale_soft_weight_11.000
controlnet_2None
controlnet_2_strength1.00
start_percent_20.000
end_percent_21.000
scale_soft_weight_21.000
controlnet_3None
controlnet_3_strength1.00
start_percent_30.000
end_percent_31.000
scale_soft_weight_31.000

Multi-ControlNet - canny plus depth for structure, pose plus depth for a posed character in a real environment - is a completely normal, well-supported pattern, and it needs somewhere to configure each unit before applying all of them at once. This node is that somewhere: up to three independent ControlNet units, each with its own image, strength, and timing, packaged into a single stack for easy controlnetStackApply to commit downstream.

Why build the stack separately from applying it

The alternative - chaining separate load-and-apply nodes for each ControlNet - works, but it means every unit's conditioning has to thread through the next one in sequence, and adding or removing a unit means rewiring that chain. Building the whole stack in one node instead means you can toggle individual units on and off, adjust one unit's weight, or add a third condition, all without touching anything downstream - the apply node just reads whatever's currently in the stack.

The inputs that matter

toggle is a master on/off for the whole stack - flip it off to disable every ControlNet in this stack without deleting the node or its settings. mode (simple or advanced) controls how much of each unit's configuration is exposed: simple keeps things minimal, advanced shows the full set of per-unit controls including step-range and soft-weight scaling. num_controlnet (1–3) sets how many units are actually active; the node exposes fields for all three regardless, but only the first num_controlnet of them get used.

Each unit follows the same pattern, numbered 1 through 3: controlnet_N (which checkpoint), controlnet_N_strength, start_percent_N/end_percent_N (the step range this unit applies over), scale_soft_weight_N (the gentler layer-scaled alternative to a flat strength multiplier), and image_N (that unit's own conditioning image - each ControlNet in a stack typically needs a different source image, since canny and depth maps of the same scene look nothing alike). The optional optional_controlnet_stack input lets you chain this stack on top of an existing one built elsewhere, rather than always starting from scratch.

Output is a single controlnet_stack (CONTROL_NET_STACK), which does nothing on its own - it needs easy controlnetStackApply downstream to actually bake it into conditioning.

Installing it

ComfyUI Manager: search ComfyUI Easy Use, install, restart. By hand:

cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Use

Windows: double-click install.bat. Linux/Mac: run pip install -r requirements.txt yourself. Restart ComfyUI. Every ControlNet checkpoint you reference needs to already be in models/controlnet - this node builds a plan, it doesn't download anything.

Where people get stuck

The single most common mistake is forgetting a unit needs toggle on both at the stack level and, if you're using advanced mode, potentially per-unit - a fully configured ControlNet unit that never actually fires because the master toggle is off is a very quiet failure, since nothing errors, the condition just doesn't apply. Second: num_controlnet set lower than the number of units you actually configured silently drops the extras - if you set up all three but num_controlnet is still at 1, only the first one is used. And a genuinely easy trap with multi-ControlNet in general: feeding the same source image into more than one unit's image_N slot when each unit expects a different conditioning type - a depth map plugged into a canny-configured unit produces conditioning that actively fights what you want, not a milder version of it.

CategoryEasyUse/Loaders

Inputs (22)

NameTypeDefaultDescription
toggleBOOLEAN
modeCOMBO2 options: simple, advanced
num_controlnetINT11–3
optional_controlnet_stackoptCONTROL_NET_STACK
controlnet_1optCOMBONone1 options: None
controlnet_1_strengthoptFLOAT1.00-10–10
start_percent_1optFLOAT0.0000–1
end_percent_1optFLOAT1.0000–1
scale_soft_weight_1optFLOAT1.0000–1
image_1optIMAGE
controlnet_2optCOMBONone1 options: None
controlnet_2_strengthoptFLOAT1.00-10–10
start_percent_2optFLOAT0.0000–1
end_percent_2optFLOAT1.0000–1
scale_soft_weight_2optFLOAT1.0000–1
image_2optIMAGE
controlnet_3optCOMBONone1 options: None
controlnet_3_strengthoptFLOAT1.00-10–10
start_percent_3optFLOAT0.0000–1
end_percent_3optFLOAT1.0000–1
scale_soft_weight_3optFLOAT1.0000–1
image_3optIMAGE

Outputs (1)

NameTypeDescription
controlnet_stackCONTROL_NET_STACK