EasyControlnetStack
Build up to three ControlNets before you apply any of them
- optional_controlnet_stack
- image_1
- image_2
- image_3
- controlnet_stack
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.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| toggle | BOOLEAN | — | |
| mode | COMBO | 2 options: simple, advanced | |
| num_controlnet | INT | 11–3 | — |
| optional_controlnet_stackopt | CONTROL_NET_STACK | — | |
| controlnet_1opt | COMBO | None | 1 options: None |
| controlnet_1_strengthopt | FLOAT | 1.00-10–10 | — |
| start_percent_1opt | FLOAT | 0.0000–1 | — |
| end_percent_1opt | FLOAT | 1.0000–1 | — |
| scale_soft_weight_1opt | FLOAT | 1.0000–1 | — |
| image_1opt | IMAGE | — | |
| controlnet_2opt | COMBO | None | 1 options: None |
| controlnet_2_strengthopt | FLOAT | 1.00-10–10 | — |
| start_percent_2opt | FLOAT | 0.0000–1 | — |
| end_percent_2opt | FLOAT | 1.0000–1 | — |
| scale_soft_weight_2opt | FLOAT | 1.0000–1 | — |
| image_2opt | IMAGE | — | |
| controlnet_3opt | COMBO | None | 1 options: None |
| controlnet_3_strengthopt | FLOAT | 1.00-10–10 | — |
| start_percent_3opt | FLOAT | 0.0000–1 | — |
| end_percent_3opt | FLOAT | 1.0000–1 | — |
| scale_soft_weight_3opt | FLOAT | 1.0000–1 | — |
| image_3opt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| controlnet_stack | CONTROL_NET_STACK | — |