JLC ControlNet Orchestrator (Advanced)
Multi-ControlNet without the chain
- positive
- negative
- vae
- image_01
- image_02
- image_03
- image_04
- image_05
- image_06
- image_07
- image_08
- CONDITIONING
- CONDITIONING
This is the flagship of JLC's ControlNet family, and it's the node the pack's README points new users to first. JLC ControlNet Orchestrator (Advanced) is a single node that replaces the whole stack - loaders, Apply nodes, and most of the wiring - for running multiple ControlNets at once. Up to eight slots, each with its own model dropdown, hint image, strength, activation window, and weight, all fused into one conditioning stream.
The pitch isn't convenience, though that's real. It's how the fusion happens. Where ComfyUI natively evaluates chained ControlNets recursively - think A(B(C(x))) - the JLC core evaluates each ControlNet independently against the same sampler state and combines the outputs explicitly: roughly A(x) + B(x) + C(x), with weights. Fewer repeated passes, less accumulated memory pressure, and behavior that's actually predictable. On a ControlNet-heavy Flux workflow, that's the difference between a graph you trust and one you babysit.
How it works
Each slot gets prepared as an isolated per-run copy of its base model (set_cond_hint() with your image, strength, and range), and the results are aggregated as Σ W_i·C_i(x). The weight per slot is w_i · alpha^i, where alpha is an order-bias dial:
alpha = 1.0is neutral - slots contribute in proportion to their weight, order-independent.alpha < 1favors earlier slots;alpha > 1favors later ones. Negative alpha flips influence by position.
Model loading is handled internally with a shared cache, so if three slots use the same ControlNet file, it loads once and each slot gets its own conditioned copy. The SHARE_PREVIOUS selector option lets a slot reuse whatever named model was chosen just before it - handy when you want the same ControlNet at different strengths or windows.
There's also a genuinely good safety habit here: strict preflight. The node validates every active slot before it loads any model. A slot with a model selected, meaningful strength, meaningful weight, and a non-empty range, but no connected hint image, raises a clear error up front instead of failing mid-sampling.
Inputs that matter
- positive / negative - your conditioning in and out (two CONDITIONING outputs).
- vae - needed for hint encoding.
- slot_count (1–8, default 3) - how many slots are active. Backend ignores anything above it.
- controlnet_cache_size - the shared cache capacity. Set to 0 to avoid keeping resident cached ControlNets between runs.
- Per slot: control_net_name (DISABLED / SHARE_PREVIOUS / a model), image, strength (0–10), start/end (0–1 activation window), weight (-10 to 10, the fusion weight).
- alpha - the order-bias knob above.
Installing it
Ships in jlc-comfyui-nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/Damkohler/jlc-comfyui-nodes.git
Restart ComfyUI, or install "jlc-comfyui-nodes" from ComfyUI Manager. No Python dependencies. Your ControlNet model files go in the normal models/controlnet folder and show up in the dropdowns. A starter workflow (drag-and-drop PNG) is included in the repo's assets/workflows/ if you want a known-good starting point.
Where people get burned
- "Missing image" errors are the preflight working. Connect the image, set the selector to DISABLED, zero the strength/weight, or empty the activation range. The error is telling you exactly which slot is under-specified.
- SHARE_PREVIOUS needs a prior named model. Slot 1 can't share a selection that was never made - put a named model in an earlier slot first.
- Slow? Check
--lowvram. The author's investigation pinned a multi-hour collapse on forced--lowvram(destructive partial unload/reload cycles), not on the fusion math. Normal VRAM mode with DynamicVRAM is the tested baseline. - One ControlNet at weight 1.0 goes native. A single effective control routes through ComfyUI's own path because it's mathematically equivalent. Not a bug.
Context for the skeptical: this is one developer's project (J. L. Córdova), announced with benchmarks on a 16 GB RTX 4090 laptop, and the speedup claims are his own measurements. The idea - flatten recursive ControlNet chains into independent weighted evaluation - is sound and the implementation is careful and heavily documented. Try it with the included workflow before you rip out your existing setup.
Inputs (54)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| slot_countopt | INT | 31–8 | Number of visible/active internal ControlNet slots. Backend ignores slots above this count. |
| controlnet_cache_sizeopt | INT | 20–10 | Shared JLC ControlNet cache capacity. 0 means evict/prevent resident cached ControlNets. |
| control_net_name_01opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_01opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| 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 | — |
| control_net_name_02opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_02opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| 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 | — |
| control_net_name_03opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_03opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| 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 | — |
| control_net_name_04opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_04opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| 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 | — |
| control_net_name_05opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_05opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| 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 | — |
| control_net_name_06opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_06opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| strength_06opt | FLOAT | 1.000–10 | — |
| start_06opt | FLOAT | 0.0000–1 | — |
| end_06opt | FLOAT | 1.0000–1 | — |
| weight_06opt | FLOAT | 1.00-10–10 | — |
| control_net_name_07opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_07opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| strength_07opt | FLOAT | 1.000–10 | — |
| start_07opt | FLOAT | 0.0000–1 | — |
| end_07opt | FLOAT | 1.0000–1 | — |
| weight_07opt | FLOAT | 1.00-10–10 | — |
| control_net_name_08opt | COMBO | ControlNet model for this slot. SHARE_PREVIOUS reuses the last selected model. | |
| image_08opt | IMAGE | Control image for this slot. A disconnected socket or runtime None (including a DISABLED/hidden aux-wrapper output) disables only this slot. | |
| strength_08opt | FLOAT | 1.000–10 | — |
| start_08opt | FLOAT | 0.0000–1 | — |
| end_08opt | FLOAT | 1.0000–1 | — |
| weight_08opt | 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 | — |