Nodes/jlc-comfyui-nodes/ JLC ControlNet Orchestrator
ComfyUI Node

 JLC ControlNet Orchestrator

Every ControlNet in one node, no Apply-chain spaghetti

By Damkohler·Created 6 months ago·Updated 2 days ago· 24
 JLC ControlNet Orchestrator
  • 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
slot_count1
enabled_01true
strength_011.00
start_010.000
end_011.000
weight_011.00
enabled_02true
strength_021.00
start_020.000
end_021.000
weight_021.00
enabled_03true
strength_031.00
start_030.000
end_031.000
weight_031.00
enabled_04true
strength_041.00
start_040.000
end_041.000
weight_041.00
enabled_05true
strength_051.00
start_050.000
end_051.000
weight_051.00
alpha1.00

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_XX slot 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.

Categoryconditioning/controlnet

Inputs (40)

NameTypeDefaultDescription
positiveCONDITIONING
negativeCONDITIONING
vaeVAE
slot_countINT11–5Number of ControlNet slots shown in the node.
image_01optIMAGEControl image for this slot. Slot is skipped if this is not connected.
control_net_01optCONTROL_NETControlNet for this slot. Empty slots reuse the previous active ControlNet where possible.
enabled_01optBOOLEANtrue
strength_01optFLOAT1.000–10
start_01optFLOAT0.0000–1
end_01optFLOAT1.0000–1
weight_01optFLOAT1.00-10–10
image_02optIMAGEControl image for this slot. Slot is skipped if this is not connected.
control_net_02optCONTROL_NETControlNet for this slot. Empty slots reuse the previous active ControlNet where possible.
enabled_02optBOOLEANtrue
strength_02optFLOAT1.000–10
start_02optFLOAT0.0000–1
end_02optFLOAT1.0000–1
weight_02optFLOAT1.00-10–10
image_03optIMAGEControl image for this slot. Slot is skipped if this is not connected.
control_net_03optCONTROL_NETControlNet for this slot. Empty slots reuse the previous active ControlNet where possible.
enabled_03optBOOLEANtrue
strength_03optFLOAT1.000–10
start_03optFLOAT0.0000–1
end_03optFLOAT1.0000–1
weight_03optFLOAT1.00-10–10
image_04optIMAGEControl image for this slot. Slot is skipped if this is not connected.
control_net_04optCONTROL_NETControlNet for this slot. Empty slots reuse the previous active ControlNet where possible.
enabled_04optBOOLEANtrue
strength_04optFLOAT1.000–10
start_04optFLOAT0.0000–1
end_04optFLOAT1.0000–1
weight_04optFLOAT1.00-10–10
image_05optIMAGEControl image for this slot. Slot is skipped if this is not connected.
control_net_05optCONTROL_NETControlNet for this slot. Empty slots reuse the previous active ControlNet where possible.
enabled_05optBOOLEANtrue
strength_05optFLOAT1.000–10
start_05optFLOAT0.0000–1
end_05optFLOAT1.0000–1
weight_05optFLOAT1.00-10–10
alphaoptFLOAT1.00-2–2Order bias. 1.0 = neutral. <1 favors earlier slots. >1 favors later slots. Negative values invert influence.

Outputs (2)

NameTypeDescription
CONDITIONINGCONDITIONING
CONDITIONINGCONDITIONING