Multi-Control Net Param Stack JK๐
Six ControlNets in one stack, each with its own strength and timing
- controlnet_0
- image_0
- controlnet_1
- image_1
- controlnet_2
- image_2
- controlnet_3
- image_3
- controlnet_4
- image_4
- controlnet_5
- image_5
- CONTROLNET_STACK
- ContrlNet_Switch
- ContrlNet0_Switch
- ContrlNet1_Switch
- ContrlNet2_Switch
- ContrlNet3_Switch
- ContrlNet4_Switch
- ContrlNet5_Switch
Most multi-ControlNet workflows are a rat's nest of parallel apply nodes, each with its own strength and start/end percent, all converging on the same conditioning. Multi-ControlNet Param Stack JK๐ exists to collapse that into one tidy node. It gathers up to six ControlNets, each with its own control image, strength, and active window in the denoising schedule, and hands you a single CONTROL_NET_STACK you can feed to the pack's Apply Multi-ControlNet Adv node.
It's the param half of the split Jake made in v1.8.0 when he separated the old monolithic "Multi-ControlNet Stack" into a loader and a param stacker. The workflow story: you load six different ControlNets with the loader, prep each one's hint image, then stack them here and apply in one shot. If you've ever wanted depth + pose + openpose layered with different weights at different points in the sample, this is the node that makes it not-a-headache.
How it works
The node gives you six slots (ControlNet_Unit_0 through _5). Each unit has:
- a
ControlNet_Unit_ion/off toggle, controlnet_strength_i(default 1.0, range โ10 to 10 - negative weights are legal and occasionally useful for suppressing a structure),start_percent_iandend_percent_i(0โ1) controlling when during denoising that unit applies.
Wire a loaded CONTROL_NET and its hint IMAGE into the matching controlnet_i and image_i optional inputs. When the master control_switch is on, any unit that's enabled, has a model, has an image, and is non-empty gets bundled into the stack. Reading the source, each bundled entry is a tuple of (controlnet, image, strength, start_percent, end_percent) - that's exactly what the apply node unpacks.
The stack output wires into CR Apply Multi-ControlNet Adv JK, which takes positive/negative conditioning plus the stack and runs ControlNetApplyAdvanced per unit, in order. The node also re-emits its own switches as ContrlNet_Switch / ContrlNet0_Switchโฆ booleans, which you can use to gate other logic downstream - a nice touch if you're building a switchable workflow and want to know what actually got applied.
Where people get burned
Two recurring mistakes. First: the per-unit on/off toggle is also gated by the master control_switch - if the master is off, nothing stacks, and the node silently returns an empty list. If your apply node does nothing, check the master switch first. Second: start/end percent are the parameters that matter most for structure work - the standing advice in the ControlNet community is to release the condition once composition has formed rather than holding it through the whole sample. For a stack of six, stagger them: pose early (0โ0.5), tile late (0.5โ1.0), and you'll get far less fighting between units.
Install
It ships with the JakeUpgrade pack, so install once via ComfyUI Manager (search ComfyUI-JakeUpgrade) or:
cd ComfyUI/custom_nodes
git clone https://github.com/jakechai/ComfyUI-JakeUpgrade
cd ComfyUI-JakeUpgrade && pip install -r requirements.txt
No extra models or heavy dependencies beyond the pack's standard list (opencv-python, torch, pillow, etc.). The ControlNet models themselves live in models/controlnet as usual. And if Manager grumbles about a conflict with IPAdapter Plus, that's the pack's replacement folder setting off the warning - it's not actually loaded, you can ignore it.
Inputs (37)
| Name | Type | Default | Description |
|---|---|---|---|
| control_switch | BOOLEAN | false | Enable/disable ControlNet stacking |
| ControlNet_Unit_0 | BOOLEAN | false | Enable/disable ControlNet unit 0 |
| controlnet_strength_0 | FLOAT | 1.00-10โ10 | Control strength for unit 0 |
| start_percent_0 | FLOAT | 0.0000โ1 | Start percentage for unit 0 |
| end_percent_0 | FLOAT | 1.0000โ1 | End percentage for unit 0 |
| ControlNet_Unit_1 | BOOLEAN | false | Enable/disable ControlNet unit 1 |
| controlnet_strength_1 | FLOAT | 1.00-10โ10 | Control strength for unit 1 |
| start_percent_1 | FLOAT | 0.0000โ1 | Start percentage for unit 1 |
| end_percent_1 | FLOAT | 1.0000โ1 | End percentage for unit 1 |
| ControlNet_Unit_2 | BOOLEAN | false | Enable/disable ControlNet unit 2 |
| controlnet_strength_2 | FLOAT | 1.00-10โ10 | Control strength for unit 2 |
| start_percent_2 | FLOAT | 0.0000โ1 | Start percentage for unit 2 |
| end_percent_2 | FLOAT | 1.0000โ1 | End percentage for unit 2 |
| ControlNet_Unit_3 | BOOLEAN | false | Enable/disable ControlNet unit 3 |
| controlnet_strength_3 | FLOAT | 1.00-10โ10 | Control strength for unit 3 |
| start_percent_3 | FLOAT | 0.0000โ1 | Start percentage for unit 3 |
| end_percent_3 | FLOAT | 1.0000โ1 | End percentage for unit 3 |
| ControlNet_Unit_4 | BOOLEAN | false | Enable/disable ControlNet unit 4 |
| controlnet_strength_4 | FLOAT | 1.00-10โ10 | Control strength for unit 4 |
| start_percent_4 | FLOAT | 0.0000โ1 | Start percentage for unit 4 |
| end_percent_4 | FLOAT | 1.0000โ1 | End percentage for unit 4 |
| ControlNet_Unit_5 | BOOLEAN | false | Enable/disable ControlNet unit 5 |
| controlnet_strength_5 | FLOAT | 1.00-10โ10 | Control strength for unit 5 |
| start_percent_5 | FLOAT | 0.0000โ1 | Start percentage for unit 5 |
| end_percent_5 | FLOAT | 1.0000โ1 | End percentage for unit 5 |
| controlnet_0opt | CONTROL_NET | First ControlNet input | |
| image_0opt | IMAGE | First control image input | |
| controlnet_1opt | CONTROL_NET | Second ControlNet input | |
| image_1opt | IMAGE | Second control image input | |
| controlnet_2opt | CONTROL_NET | Third ControlNet input | |
| image_2opt | IMAGE | Third control image input | |
| controlnet_3opt | CONTROL_NET | Fourth ControlNet input | |
| image_3opt | IMAGE | Fourth control image input | |
| controlnet_4opt | CONTROL_NET | Fifth ControlNet input | |
| image_4opt | IMAGE | Fifth control image input | |
| controlnet_5opt | CONTROL_NET | Sixth ControlNet input | |
| image_5opt | IMAGE | Sixth control image input |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| CONTROLNET_STACK | CONTROL_NET_STACK | โ |
| ContrlNet_Switch | BOOLEAN | โ |
| ContrlNet0_Switch | BOOLEAN | โ |
| ContrlNet1_Switch | BOOLEAN | โ |
| ContrlNet2_Switch | BOOLEAN | โ |
| ContrlNet3_Switch | BOOLEAN | โ |
| ContrlNet4_Switch | BOOLEAN | โ |
| ContrlNet5_Switch | BOOLEAN | โ |