๐๏ธ Multi-Controlnet Apply
The glue that turns a ControlNet stack into real conditioning
- base_positive
- base_negative
- multicontrolnet_stack
- base_positive
- base_negative
- show_help
Every ControlNet workflow in this pack ends here. MultiControlnet and MultiControlnetUnion build a stack, but a stack is inert until something applies it - and this node is that something. It takes your base positive and negative conditioning from the text encoder, layers the stack's ControlNet units onto them, and hands the result back out the other side. Think of it as the pack's answer to core ComfyUI's ControlNetApplyAdvanced, except it's fed by a whole stack instead of a single controlnet.
How it works
You wire in:
- base_positive / base_negative - the CONDITIONING from your text encoder (e.g. an SDXL Text Encoder, or the pack's own SDXL Text Encoder Simple).
- multicontrolnet_stack - the
MULTICONTROLNET_STACKproduced byMultiControlnetorMultiControlnetUnion. - switch - a boolean bypass for the whole stack. Flip it off and the node just passes your base conditioning straight through, ControlNets ignored.
And you get back base_positive and base_negative - the same two conditioning types, now carrying every enabled unit's guidance. Those go into the sampler (KSampler/KSampler Advanced), replacing the originals.
The mechanism is sequential: each unit in the stack applies its own strength and its own start/end window to the conditioning. That's why the stack carries per-unit parameters rather than the apply node - the apply node just replays them in order. The third output, show_help, is a text/string output the author built in as a helper; you can wire it to a display node to see the stack's contents, or just ignore it.
Why it exists
The point of the split - build a stack here, apply it there - is that you can build the stack once and reuse it. The stack is data, so you can feed the same stack to this node in a second branch, or swap stacks in without rewiring the sampler. It also keeps the graph tidy: one apply node, one wire into the sampler, instead of a string of ControlNetApply nodes in series. For a multi-condition workflow that's a real readability win, and ComfyUI graphs are hard enough to read as it is.
The trap
The outputs replace your base conditioning. Don't also run the original base_positive into the sampler on a parallel wire - you'd be sampling with the un-conditioned copy, and the ControlNets would seem to do nothing. Follow the outputs from this node all the way to the sampler, and nothing else.
Install
Same pack, same story as the other ControlNets menu nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/YarvixPA/ComfyUI-NeuralMedia
cd ComfyUI-NeuralMedia
pip install -r requirements.txt
Or ComfyUI Manager โ search ComfyUI-NeuralMedia, then restart ComfyUI. It's YarvixPA's personal pack (same author as the FLUX.1-Fill-dev-GGUF models), and if a manual clone hits a 404 because the repo's been shuffled around, Manager's registry copy is the reliable route.
When it's overkill
Honest take: if you're stacking one condition on a single workflow, you don't need this machinery - core ComfyUI's ControlNetApplyAdvanced does the same job with less plumbing. This node earns its place when you're building repeatable multi-ControlNet pipelines, or when the pack's builder nodes (and their per-unit switches) are how you want to A/B conditions without rewiring. That's a niche, but it's a good one.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| base_positive | CONDITIONING | โ | |
| base_negative | CONDITIONING | โ | |
| switch | BOOLEAN | false | โ |
| multicontrolnet_stack | MULTICONTROLNET_STACK | โ |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| base_positive | CONDITIONING | โ |
| base_negative | CONDITIONING | โ |
| show_help | STRING | โ |