Simple Controlnet Stack
Apply Three ControlNets to Your Conditioning in One Node
- positive
- image_1
- image_2
- image_3
- positive
The "Simple Controlnet Stack" is the applied version of the pack's ControlNet tooling. Where controlnetStack just bundles conditions for the pack's own sampler to consume, this node works in any graph: feed it a positive conditioning and up to three ControlNets, and it hands back the conditioning with all of them baked in. It's the drop-in replacement for the row of ControlNetApply nodes you'd otherwise stack by hand.
How it works
The mechanism is the standard ControlNet application, done in a loop. For each active slot, it loads the chosen ControlNet from your controlnet folder, sets the conditioning image as the control hint with the given strength, and chains each ControlNet onto the previous one's context (set_previous_controlnet), so the conditions compose in order rather than overwriting. The output is a modified positive conditioning - the same shape a normal ControlNetApply produces, just bundled for up to three conditions at once.
The one deliberate difference from the base ComfyUI behavior: this node sets control_apply_to_uncond to false, meaning the ControlNet guides the positive conditioning without dragging the negative pass along with it. That's a defensible choice for most workflows - you usually want the prompt's negative to stay clean - but if you relied on the condition reaching the unconditional pass, this changes behavior subtly.
The inputs that matter
positive- your CLIP-encoded positive conditioning.num_controlnet- 1 to 3 active slots.controlnet_1/2/3- the model dropdowns from yourcontrolnetfolder.controlnet_1_strength/2/3- per-slot strength, 0 to 1. The strength dial is where ControlNet work lives: 1.0 pins hard, 0.3–0.7 leaves room for the model to breathe. Set a slot to 0 and it's skipped entirely.image_1/2/3- each slot's conditioning image: a pose skeleton, an edge map, a depth render.
Output is a single positive conditioning, ready to feed a KSampler or this pack's zsqsampler.
Why this one over the other
The pack ships two ControlNet stack nodes, and the difference is where they do their work. controlnetStack hands a bundle to the pack's checkpoint_sampler; this one applies the ControlNets itself and works with any sampler or graph. If your workflow is built on the standard loader → CLIP encode → sampler chain, this is the one that slots in without restructuring. Pair it with a ControlNet preprocessor output (canny, lineart, depth) and you've got multi-condition control with one extra node.
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. The heavy requirements install alongside but this node runs on ComfyUI's own controlnet stack. And the Manager "conflict" flag on zsq_prompt is the generic-class-name issue - ignore unless you're actually running the other pack.
Verdict
The more useful of the two stack nodes for most people, precisely because it plays nice with ordinary graphs. If you run multi-ControlNet workflows, this collapses a row of nodes into one.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| 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 |
|---|---|---|
| positive | CONDITIONING | — |