π€ Diffusers Controlnet Unit Stack
Up to three ControlNet conditions, one wire out
- controlnet_unit_1
- controlnet_unit_2
- controlnet_unit_3
- controlnet unit
Multi-ControlNet - canny plus depth, pose plus a lineart pass, whatever combination you need - collapsed into a single node so the Generator only has to take one wire for it.
What it is and how it works
Combining more than one ControlNet condition at once is a completely standard technique: canny plus depth for edges and spatial arrangement together, openpose plus depth for a posed figure that also respects scene layout, lineart plus reference for structure plus style. Each condition keeps its own independent strength and step-range - set on the individual Controlnet Unit nodes before they reach this one - and they blend together during denoising rather than one overriding the other.
This node's job is purely plumbing: it takes up to three already-configured Controlnet Unit nodes and merges them into one object of the same type a single unit would produce. That's the detail that matters - a Stack and a single Unit are interchangeable from the Generator's point of view. Nothing downstream needs to know or care whether it's getting one condition or three.
The inputs and outputs that matter
controlnet_unit_1(required) - aCONTROLNET_UNITfrom a Diffusers Controlnet Unit node. This has to be fully configured already (its own image, scale, start/end) before it gets here.controlnet_unit_2/controlnet_unit_3(both optional, default empty) - add a second and third condition the same way. Leave either empty if you only need two.
Output is a single controlnet unit (CONTROLNET_UNIT) - the same type a lone Controlnet Unit node outputs, which is what makes it a drop-in replacement anywhere a single condition would normally plug in.
Installing it
Part of the ComfyUI-J pack. ComfyUI Manager: search ComfyUI-J, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Jannchie/ComfyUI-J
cd ComfyUI-J
pip install -r requirements.txt
Nothing this node needs on its own - all the model loading happens on the Controlnet Loader nodes feeding into the units you're stacking here.
Where people get burned
The schema caps you at three conditions, and there's no visible way to chain two stacks together to build a fourth - if your workflow genuinely needs more than three ControlNet conditions running simultaneously, this node doesn't offer a documented path there. In practice three is already generous; most real workflows that stack ControlNet at all use two.
The more common mistake is simpler: forgetting to actually configure each unit before it reaches the stack. Because this node just merges whatever comes in, a Controlnet Unit left at its defaults (full strength, active the entire denoising range) will blend in at full force alongside your carefully tuned conditions, and the result reads as "ControlNet is fighting itself" rather than an obvious configuration error. If a multi-condition result looks muddier or more rigid than expected, check every unit feeding the stack individually rather than assuming the stack node itself is misbehaving - it isn't doing any weighting or blending logic of its own beyond combining what you handed it.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| controlnet_unit_1 | CONTROLNET_UNIT | β | |
| controlnet_unit_2opt | CONTROLNET_UNIT | β | |
| controlnet_unit_3opt | CONTROLNET_UNIT | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| controlnet unit | CONTROLNET_UNIT | β |