Control Net Stacker
Control Net Stacker
- control_net
- image
- cnet_stack
- CNET_STACK
Running more than one ControlNet - say pose plus depth - normally means an Apply ControlNet node for each, chained one after another, with conditioning threaded through the whole line. Control Net Stacker collapses that into a tidy list you build up node by node. Each instance adds one ControlNet to a CONTROL_NET_STACK, and you chain them to describe as many as you want. It's the "describe the stack" half of the pack's stacker pattern; something else applies it.
How it works
Each Control Net Stacker holds a single ControlNet: which model, which reference image, and its strength and active window. It has an optional cnet_stack input, and that's the whole trick - feed the output of one stacker into the next stacker's cnet_stack input and you've appended to the list. Three ControlNets is three stackers in a row. The final stack then goes to a node that consumes it: the pack's Efficient Loader has a cnet_stack input, the standalone Apply ControlNet Stack node takes one, and so does XY Input: Control Net for plotting.
The mental model, straight from the KB: prompt decides what, ControlNet decides where. A stack just lets several "where" signals cooperate.
The inputs and outputs
control_netandimage(required) - the model and the preprocessed map it reads (depth, canny, pose, etc.).strength(0–10, default 1) - how hard this net pushes. Note the range goes to 10, but you're almost always living between 0.4 and 1.2; cranking it high tends to fry the image.start_percent/end_percent(0–1) - the slice of denoising this net is active for. Dropping a net out early (lower end_percent) gives the model room to improvise detail; holding it longer locks structure.cnet_stack(optional) - the incoming stack to append to. Leave it empty for the first net in the chain.
The single output is CNET_STACK (CONTROL_NET_STACK), which flows to the next stacker or to whatever applies it.
Installing it
ComfyUI Manager → search Efficiency Nodes for ComfyUI, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/jags111/efficiency-nodes-comfyui
Restart ComfyUI. You'll need real ControlNet models in models/controlnet, and if you're generating the control maps inside Comfy rather than importing them, a preprocessor pack like comfyui_controlnet_aux.
Common issues
The stacker only describes ControlNets - it doesn't apply them. If nothing changes in your output, check that the CNET_STACK actually reaches a consumer (an Efficient Loader's cnet_stack, Apply ControlNet Stack, or an XY plot). A stack that's built but never applied fails silently.
Feed it a valid model and image, too. An empty or mismatched entry passes through without erroring, so a typo'd image connection just means that net quietly does nothing.
Bigger picture, and not a node bug: the set of ControlNets you can stack has narrowed on newer base models. Canny, depth, pose and an edge model get rebuilt for each new base; the SD-era exotics only ever existed on SD 1.5 and SDXL. So what you can meaningfully stack depends on your model.
Pack-wide: an IMPORT FAILED at startup (often a pip freeze non-zero exit) takes the whole pack down at once. Update ComfyUI, update the node to the latest commit, and check your Python environment.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| control_net | CONTROL_NET | — | |
| image | IMAGE | — | |
| strength | FLOAT | 1.000–10 | — |
| start_percent | FLOAT | 0.0000–1 | — |
| end_percent | FLOAT | 1.0000–1 | — |
| cnet_stackopt | CONTROL_NET_STACK | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CNET_STACK | CONTROL_NET_STACK | — |