Controlnet Stack
Stack Up to Three ControlNets and Hand Them Off in One Bundle
- image_1
- image_2
- image_3
- controlnet_stack
ControlNet is the closest thing Stable Diffusion has to a steering wheel - you condition generation on an edge map, a pose skeleton, a depth render, and the image goes where you point it. The catch is that a serious workflow rarely wants one ControlNet. Controlnet Stack is the pack's answer: a single node that bundles up to three ControlNets - model, strength, and conditioning image for each - into one package that the pack's checkpoint_sampler can apply in a single pass.
How it works
Rather than applying anything itself, this node is a builder. It collects each ControlNet you configure into a small structured list - name, strength, image - and emits it as a controlnet_stack. The pack's checkpoint_sampler (and the dual/triple CLIP variants) accept that bundle on their optional_controlnet_stack input, and the sampler applies each ControlNet in sequence when it encodes your positive conditioning. One node to configure, one input to wire, multiple conditions applied.
The inputs that matter
num_controlnet- 1 to 3, how many slots are active. Set it to 2 and the node shows two full sets of controls instead of three dead ones.controlnet_1/controlnet_2/controlnet_3- the model dropdowns, populated from yourcontrolnetfolder. Each has aNoneoption, so you can leave slots unused.controlnet_1_strength/2/3- per-ControlNet strength from 0 to 1. This is the knob that actually matters in practice. A strength of 1.0 pins the generation to the condition; 0.3–0.7 is loose guidance that keeps the composition without strangling the model. The controlnet literature in this area is consistent: start strong, back off when the model starts fighting you.image_1/image_2/image_3- each slot's conditioning image (an edge map, a pose, a depth render).
Output is a single controlnet_stack bundle. Note the paired nodes: controlnetStack builds and hands off; controlnetStack_2 ("Simple Controlnet Stack") is the version that applies the ControlNets directly to a conditioning and works in a plain graph.
The honest take
ControlNet really is as good as the community says - but three of them chained through a standard graph is a mess of duplicated nodes. This node's whole contribution is tidiness: configure the stack in one place, wire it once. The trade-off is that it only feeds this pack's samplers, so it's a package deal. If you're already in zsq_prompt's world, it's a clean way to do multi-condition work; if you're on a standard graph, the controlnetStack_2 sibling is the one that plays nice.
Installing it
From windfancy/zsq_prompt - ComfyUI Manager, search "zsq_prompt", install, restart; or:
cd ComfyUI/custom_nodes
git clone https://github.com/windfancy/zsq_prompt
then restart. Heavy requirements install alongside but the controlnet path uses ComfyUI's own loader. And Manager's "conflict" flag on zsq_prompt is the generic-class-name issue - ignore unless you're actually running the other pack it names.
Verdict
A genuinely useful organizing node for multi-ControlNet work, as long as you live inside this pack's sampler family. If you use ControlNets at all, you know the strength dial is where the real work happens - this just gives you three of them in a tidy row.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| num_controlnet | INT | 11–3 | — |
| controlnet_1opt | COMBO | 1 options: None | |
| controlnet_1_strengthopt | FLOAT | 1.000–1 | — |
| image_1opt | IMAGE | — | |
| controlnet_2opt | COMBO | 1 options: None | |
| controlnet_2_strengthopt | FLOAT | 1.000–1 | — |
| image_2opt | IMAGE | — | |
| controlnet_3opt | COMBO | 1 options: None | |
| controlnet_3_strengthopt | FLOAT | 1.000–1 | — |
| image_3opt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| controlnet_stack | ZSQ_CONTROL_NET_STACK | — |