JLC ControlNet Orchestrator
Every ControlNet in one node, no Apply-chain spaghetti
- positive
- negative
- vae
- image_01
- control_net_01
- image_02
- control_net_02
- image_03
- control_net_03
- image_04
- control_net_04
- image_05
- control_net_05
- CONDITIONING
- CONDITIONING
Most multi-ControlNet graphs in ComfyUI end up as a daisy chain: Apply node, then another Apply node hanging off the conditioning, then a third, and by the time you're at four ControlNets the wires are a mess and every change means re-wiring half the chain. JLC ControlNet Orchestrator collapses all of that into a single node with up to eight self-contained slots, each carrying its own image, ControlNet, strength, and activation range.
It's part of Damkohler's jlc-comfyui-nodes pack, whose whole shtick is "non-recursive ControlNet composition" - flattening the recursive chains that native Apply-style nodes build, so the execution cost scales roughly linearly with the number of ControlNets rather than compounding. The Orchestrator is the pack's external-input interface: where the fancier JLC ControlNet Orchestrator (Advanced) loads and caches base ControlNet models internally, this one accepts ControlNet objects from whatever loader you already use - standard, third-party, nonstandard-location loaders all work.
How it works
Each of the eight slots is prepared independently against the same sampler state: your hint image gets fed to the ControlNet via a per-run copy, and the outputs are combined through explicit weighted addition (Σ W_i · C_i(x)), exactly like the rest of the JLC composition family. No child calls another recursively.
A couple of slot behaviors are worth knowing because they're opinionated:
- An empty
control_net_XXslot silently reuses the previous active ControlNet. Handy for testing one model across several images, and a foot-gun if you expected a blank slot to mean "off." - A slot is skipped entirely if the image isn't connected, the slot is disabled, strength or weight is 0, or the start/end range is empty. No error - it just doesn't run.
The inputs that matter
Required: positive, negative conditioning, and a vae (needed to prepare the control hints). Then per slot, the ones you'll actually touch:
image_XX- the ControlNet hint (canny edges, depth, pose, whatever your preprocessor produced).control_net_XX- the ControlNet object itself.strength_XX- how hard the condition bites, 0–10, default 1.start_XX/end_XX- when during denoising the condition applies. This is the underrated pair: letting a condition drop out after composition forms (start 0, end ~0.6) is the community's standing trick for structure without over-constraining detail.weight_XX- the fusion weight, can go negative.
Then alpha - order bias, and uniquely among the JLC nodes it goes negative down to -2, which inverts influence per position. Leave it at 1.0 until you have a reason.
Outputs are two CONDITIONING (positive/negative) - into your KSampler.
Installing it
ComfyUI Manager → search jlc-comfyui-nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Damkohler/jlc-comfyui-nodes.git
Restart, and the node shows up under conditioning/controlnet. No extra models or Python deps for this one.
Where people get burned
Because skipped slots are silent, the classic debugging moment is "I set a ControlNet and nothing changed." Check the slot's enabled toggle, the image connection, and that strength isn't 0 - all three are legitimate reasons the slot just doesn't run.
And the pack-level warning applies here too: if a multi-ControlNet Flux run is pathologically slow, look at your ComfyUI launch flags first. Forced --lowvram caused severe regressions in the author's tested workflows; normal VRAM mode with DynamicVRAM is the recommended baseline.
Inputs (40)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| slot_count | INT | 11–5 | Number of ControlNet slots shown in the node. |
| image_01opt | IMAGE | Control image for this slot. Slot is skipped if this is not connected. | |
| control_net_01opt | CONTROL_NET | ControlNet for this slot. Empty slots reuse the previous active ControlNet where possible. | |
| enabled_01opt | BOOLEAN | true | — |
| strength_01opt | FLOAT | 1.000–10 | — |
| start_01opt | FLOAT | 0.0000–1 | — |
| end_01opt | FLOAT | 1.0000–1 | — |
| weight_01opt | FLOAT | 1.00-10–10 | — |
| image_02opt | IMAGE | Control image for this slot. Slot is skipped if this is not connected. | |
| control_net_02opt | CONTROL_NET | ControlNet for this slot. Empty slots reuse the previous active ControlNet where possible. | |
| enabled_02opt | BOOLEAN | true | — |
| strength_02opt | FLOAT | 1.000–10 | — |
| start_02opt | FLOAT | 0.0000–1 | — |
| end_02opt | FLOAT | 1.0000–1 | — |
| weight_02opt | FLOAT | 1.00-10–10 | — |
| image_03opt | IMAGE | Control image for this slot. Slot is skipped if this is not connected. | |
| control_net_03opt | CONTROL_NET | ControlNet for this slot. Empty slots reuse the previous active ControlNet where possible. | |
| enabled_03opt | BOOLEAN | true | — |
| strength_03opt | FLOAT | 1.000–10 | — |
| start_03opt | FLOAT | 0.0000–1 | — |
| end_03opt | FLOAT | 1.0000–1 | — |
| weight_03opt | FLOAT | 1.00-10–10 | — |
| image_04opt | IMAGE | Control image for this slot. Slot is skipped if this is not connected. | |
| control_net_04opt | CONTROL_NET | ControlNet for this slot. Empty slots reuse the previous active ControlNet where possible. | |
| enabled_04opt | BOOLEAN | true | — |
| strength_04opt | FLOAT | 1.000–10 | — |
| start_04opt | FLOAT | 0.0000–1 | — |
| end_04opt | FLOAT | 1.0000–1 | — |
| weight_04opt | FLOAT | 1.00-10–10 | — |
| image_05opt | IMAGE | Control image for this slot. Slot is skipped if this is not connected. | |
| control_net_05opt | CONTROL_NET | ControlNet for this slot. Empty slots reuse the previous active ControlNet where possible. | |
| enabled_05opt | BOOLEAN | true | — |
| strength_05opt | FLOAT | 1.000–10 | — |
| start_05opt | FLOAT | 0.0000–1 | — |
| end_05opt | FLOAT | 1.0000–1 | — |
| weight_05opt | FLOAT | 1.00-10–10 | — |
| alphaopt | FLOAT | 1.00-2–2 | Order bias. 1.0 = neutral. <1 favors earlier slots. >1 favors later slots. Negative values invert influence. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |
| CONDITIONING | CONDITIONING | — |