JLC Flux2 ControlNet Orchestrator
Four ControlNets at once, in parallel instead of stacked
- controlnet
- conditioning
- vae
- control_image_1
- control_image_2
- control_image_3
- control_image_4
- conditioning
- vae
- control_image_1
- control_image_2
- control_image_3
- control_image_4
This is the flagship node of the pack, and the one worth the install on its own. Most multi-ControlNet setups chain one Apply after another - A(B(C(x))) - so each branch has to pass through the previous ones and errors compound down the chain. The Orchestrator instead evaluates up to four branches independently and combines their residuals: A(x) + B(x) + C(x). Each branch gets its own control image, strength, and timestep range, and they all share one loaded side model. Flat composition, one ControlNet in memory, no recursion.
Why that design actually matters
Beyond the elegance, flat composition changes what you can tune. Because the branches don't nest, you can push one condition hard and another soft without the interaction effects of a recursive chain - the pose stays rigid while the depth just whispers. The shared side model means four branches don't cost four copies of the ControlNet weights, which on a FLUX.2-dev workload is the difference between fitting and OOMing. The author built this design on his earlier Flux.1 work and carried it straight over; it's the stable, preferred path in this pack, with the single Apply nodes kept for simpler graphs.
Wiring it
Connect the controlnet handle, your conditioning (or text conditioning), the vae, and control_image_1 - slot 1 is required. Set slot_count to how many branches you're actually using (1–4); slots above it are ignored even if stale workflow data is attached, and the node exposes only the sockets you configure. Per-slot, in the strength_1, start_percent_1, end_percent_1 style:
strength- default 0.5 per branch. The union model's overall published range is 0.65–0.80, but per-branch with several conditions you'll usually sit lower.start_percent/end_percent- when that condition is active during denoising. Giving dense controls short windows is the recommended way to keep them from fighting the prompt.
Outputs: conditioning for your guider, a pass-through vae, and control_image_1..4 pass-throughs so you can branch off the same images downstream.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/Damkohler/JLC-Flux2-ControlNet.git
Restart ComfyUI or use Manager ("JLC Flux2 ControlNet"). Requires current ComfyUI with native FLUX.2 support, Python 3.10+, a FLUX.2-dev model + text encoder + VAE, and the Fun ControlNet Union checkpoint in ComfyUI/models/controlnet/. Preprocessors are external.
Where people get burned
The orchestrator wants clean conditioning - place it right after text conditioning or the Reference Image Orchestrator, not after another Apply node, or you'll get a hard error. Two more classics: connecting a None control image (a disabled slot above slot_count reads as None and errors - enable it or disconnect it), and piling on dense conditions like depth + luminance at high strength and wondering why the image fights itself. Start with one branch, get it stable, then add the rest conservatively with short activation ranges. High-res multi-branch runs are also just slow and memory-hungry; that's physics, not a bug.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| controlnet | JLC_FLUX2_CONTROLNET | — | |
| conditioning | CONDITIONING | — | |
| vae | VAE | — | |
| control_image_1 | IMAGE | — | |
| slot_count | INT | 41–4 | Number of exposed and active ControlNet slots. Slots above this count are ignored by the backend even if stale workflow data remains connected. |
| strength_1 | FLOAT | 0.500–2 | — |
| start_percent_1 | FLOAT | 0.0000–1 | — |
| end_percent_1 | FLOAT | 1.0000–1 | — |
| diagnostics | BOOLEAN | true | — |
| control_image_2opt | IMAGE | — | |
| strength_2opt | FLOAT | 0.500–2 | — |
| start_percent_2opt | FLOAT | 0.0000–1 | — |
| end_percent_2opt | FLOAT | 1.0000–1 | — |
| control_image_3opt | IMAGE | — | |
| strength_3opt | FLOAT | 0.500–2 | — |
| start_percent_3opt | FLOAT | 0.0000–1 | — |
| end_percent_3opt | FLOAT | 1.0000–1 | — |
| control_image_4opt | IMAGE | — | |
| strength_4opt | FLOAT | 0.500–2 | — |
| start_percent_4opt | FLOAT | 0.0000–1 | — |
| end_percent_4opt | FLOAT | 1.0000–1 | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |
| vae | VAE | — |
| control_image_1 | IMAGE | — |
| control_image_2 | IMAGE | — |
| control_image_3 | IMAGE | — |
| control_image_4 | IMAGE | — |