Nodes/zsq_prompt/Simple Controlnet Stack
ComfyUI Node

Simple Controlnet Stack

Apply Three ControlNets to Your Conditioning in One Node

By windfancy·Created 2 years ago·Updated 5 months ago· 2
Simple Controlnet Stack
  • positive
  • image_1
  • image_2
  • image_3
  • positive
num_controlnet1
controlnet_1
controlnet_1_strength1.00
controlnet_2
controlnet_2_strength1.00
controlnet_3
controlnet_3_strength1.00

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 your controlnet folder.
  • 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.

CategoryZSQ/Loaders

Inputs (11)

NameTypeDefaultDescription
positiveCONDITIONING
num_controlnetINT11–3
controlnet_1optCOMBO1 options: None
controlnet_1_strengthoptFLOAT1.000–1
image_1optIMAGE
controlnet_2optCOMBO1 options: None
controlnet_2_strengthoptFLOAT1.000–1
image_2optIMAGE
controlnet_3optCOMBO1 options: None
controlnet_3_strengthoptFLOAT1.000–1
image_3optIMAGE

Outputs (1)

NameTypeDescription
positiveCONDITIONING