ποΈ Multi-Controlnet
Three ControlNets in one node, and the switch to turn each off
- multicontrolnet_stack
- image_1
- image_2
- image_3
- multicontrolnet_stack
Multi-ControlNet is one of those ideas that sounds like a power-user gimmick until you need it. Canny alone gets you edges but not depth; depth alone gives you layout but no contours. Stacking them gets you both - pose plus scene, edges plus arrangement - and each condition keeps its own strength and its own start/end window. This node is the stack builder: it takes up to three ControlNet units and packs them into a single MULTICONTROLNET_STACK that a second node actually applies.
Here's the mental model for the pack's ControlNet menu. There are three pieces that work as a set:
- MultiControlnet - builds the stack from up to three regular per-condition ControlNet files (this node).
- MultiControlnetUnion - the same builder, but for union checkpoints that carry many conditions in one file.
- MultiControlnetApply - the sink that takes the stack and bakes it into your base conditioning.
This node is the middle of that chain's first half: build, then apply.
How it works
Each of the three slots is a self-contained unit with a switch_1 toggle, a controlnet_1 file picker (it lists the .safetensors files in models/controlnet), a controlnet_strength_1, start_percent_1 / end_percent_1, and an image_1. You fill in what you need and leave the rest. The output multicontrolnet_stack carries all the enabled units downstream.
Two details are worth flagging. First, switch_N is a plain boolean - flip a unit off to disable it without deleting the wiring, which is the whole point when you're A/B testing whether depth is helping or just muddying. Second, controlnet_strength can go negative (the range runs from -10 to 10). Negative strength is an edge case you'll almost never want, but it's there - it inverts the condition's push, which is occasionally useful for fighting a condition rather than following it.
There's also a multicontrolnet_stack input on the node itself. That lets you daisy-chain - feed one stack into the next node's stack input and build a bigger stack than three units. Handy if the pack's slot count is the only thing holding your workflow back.
The inputs a beginner actually sets
- controlnet_N - pick the file from the dropdown.
- image_N - the preprocessed condition for that unit (canny map, depth map, pose skeleton).
- controlnet_strength_N - start at 1.0 for separate per-condition files; if it fights the base model, drop it to 0.7.
- start/end percent_N - per-unit control window. Classic combo: pose at full range, depth only in the first half so the model can add detail later.
Install
ComfyUI Manager β search ComfyUI-NeuralMedia, or:
cd ComfyUI/custom_nodes
git clone https://github.com/YarvixPA/ComfyUI-NeuralMedia
cd ComfyUI-NeuralMedia
pip install -r requirements.txt
Restart ComfyUI. Same pack install as the rest of the ControlNets menu - YarvixPA's grab-bag pack, which also comes with the author's reputation for shipping GGUF Flux models. If the clone 404s (the repo's moved around), install via Manager.
When to reach for this vs. a union
If you're on a modern base, check whether you have a union ControlNet before reaching for this node. Union models (xinsir's SDXL union, the Fun unions for Flux 2 / Z-Image) learn how to blend conditions during training, so stacking needs no per-condition tuning - and for those, MultiControlnetUnion is the better fit. This node is for the classic separate-file workflow: canny + depth, openpose + depth, tile + canny on an SD 1.5 or SDXL setup. Both roads end at MultiControlnetApply, so the two stack builders swap freely.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| multicontrolnet_stackopt | MULTICONTROLNET_STACK | β | |
| switch_1opt | BOOLEAN | false | β |
| controlnet_1opt | COMBO | 1 options: None | |
| controlnet_strength_1opt | FLOAT | 1.00-10β10 | β |
| start_percent_1opt | FLOAT | 0.0000β1 | β |
| end_percent_1opt | FLOAT | 1.0000β1 | β |
| image_1opt | IMAGE | β | |
| switch_2opt | BOOLEAN | false | β |
| controlnet_2opt | COMBO | 1 options: None | |
| controlnet_strength_2opt | FLOAT | 1.00-10β10 | β |
| start_percent_2opt | FLOAT | 0.0000β1 | β |
| end_percent_2opt | FLOAT | 1.0000β1 | β |
| image_2opt | IMAGE | β | |
| switch_3opt | BOOLEAN | false | β |
| controlnet_3opt | COMBO | 1 options: None | |
| controlnet_strength_3opt | FLOAT | 1.00-10β10 | β |
| start_percent_3opt | FLOAT | 0.0000β1 | β |
| end_percent_3opt | FLOAT | 1.0000β1 | β |
| image_3opt | IMAGE | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| multicontrolnet_stack | MULTICONTROLNET_STACK | β |