Nodes/Prompt Helpers/Concatenate ControlNet
ComfyUI Node

Concatenate ControlNet

Stack two ControlNets without the spaghetti

By Pauan·Created 8 months ago·Updated 5 months ago· 3
Concatenate ControlNet
  • control_nets
  • CONTROL_NET

In stock ComfyUI, running two ControlNets means chaining ControlNetApplyAdvanced nodes - positive out of one into the next, negative likewise, until the wiring diagram looks like a plate of spaghetti. Concatenate ControlNet is Prompt Helpers' answer: it bundles several ControlNet "settings" into one list that EZ Generate can consume directly, so your graph stays flat.

It's part of the pack's pattern of passing structured settings around instead of raw tensors. Each EZ ControlNet node wraps a single ControlNet + reference image + strength + timing into an EZ_CONTROL_NET value. Concatenate ControlNet takes those values and flattens them into one list. When EZ Generate finally runs, it replays each entry through ControlNetApplyAdvanced in order.

Why you'd stack at all

The honest answer: stacking is overhyped for casual work. The community's standing advice is one condition, one shot - if you just need a pose or a canny edge, one ControlNet at sensible strength beats two fighting each other. Where stacking earns its keep is layered composition: canny for structure and depth for spatial layout, or a pose ControlNet that runs early (low end_percent) plus a tile/repair ControlNet that runs late. Each EZ ControlNet in your stack carries its own strength and start/end percent, so you can give each condition its own time window instead of both blasting the whole denoise.

Inputs and outputs

  • control_nets - an autogrow socket, 1 to 20 of them. Each is an EZ_CONTROL_NET, i.e. the output of an EZ ControlNet or Empty ControlNet node.
  • CONTROL_NET (EZ_CONTROL_NET) - the merged list, wired into EZ Generate's control_net input.

The autogrow input is the modern ComfyUI way of saying "this node grows extra sockets as you plug things in" - you'll see a "+" to add more.

Setting it up

EZ ControlNet (canny) ─┐
                        ├─ Concatenate ControlNet ──► EZ Generate
EZ ControlNet (depth) ─┘

Because order is preserved, the list order determines which ControlNet applies first. If your stack produces mush, the usual fix is dialing start_percent/end_percent on the EZ ControlNet nodes - the parameter that matters most for structure-heavy work - rather than turning both strengths up. Releasing a condition once composition has formed is what stops ControlNets from fighting the sampler in the last steps.

Installing it

It's part of the Prompt Helpers pack, so it installs once for the whole family. In ComfyUI Manager search "Prompt Helpers" (Pauan/comfyui-prompt-helpers), install, restart. Or manually:

cd ComfyUI/custom_nodes
git clone https://github.com/Pauan/comfyui-prompt-helpers

Then restart ComfyUI. No models to download - this node carries no model weights, it only rearranges what the EZ ControlNet nodes already loaded. Requires ComfyUI 0.8.0+.

One thing that trips people: the inputs are EZ ControlNet outputs, not raw CONTROL_NET tensors. If you try to plug a ControlNet directly from a loader into Concatenate ControlNet, the sockets won't match. Wrap it in an EZ ControlNet first.

Categoryprompt_helpers/controlnet

Inputs (1)

NameTypeDefaultDescription
control_netsCOMFY_AUTOGROW_V3

Outputs (1)

NameTypeDescription
CONTROL_NETEZ_CONTROL_NET