JLC Flux2 ControlNet Apply
The boring, correct way to apply one ControlNet in FLUX.2
- controlnet
- conditioning
- vae
- control_image
- conditioning
Ignore the class name - the node you see in the menu is JLC Flux2 ControlNet Apply, and "Diagnostic" is just the internal class it ships under. It's the plain single-branch apply node of this pack: one ControlNet, one control image, one conditioning stream, out the other side. If you only ever need one condition on a FLUX.2 generation, this is the node you'll reach for every single time.
Why it exists
For FLUX.2-dev, the Alibaba PAI Fun ControlNet Union is the standard side model, and ComfyUI core has no native node for it - third-party support is how everyone runs it. This pack's whole design bet is "extend FLUX.2 without replacing it": instead of swapping in a modified transformer or sampler, the Apply node attaches the ControlNet as conditioning metadata and the side branch gets injected through ComfyUI's native hooks. Your FLUX.2 guider, sampler, model loading, and offloading all stay stock. That's a real difference from packs that fork the model.
How it works
Wire in the controlnet handle from the JLC Loader, a conditioning stream (positive or negative, whichever you're conditioning), the vae, and a control_image. The image gets reordered into the BCHW hint format and attached to your conditioning with a strength and a timestep-percent range. Downstream, the side model's residuals are added into the base model at the FLUX.2 double-block seam - same mechanism the pack's Orchestrator uses, just without the multi-branch wrapper.
The knobs that matter:
strength(default 0.75) - how hard the condition pushes. The Alibaba card recommends 0.65–0.80 for this union, so the default is on target; cranking toward 1.0+ over-conditions and starts to fight the prompt.start_percent/end_percent- when during denoising the condition applies. Letting it run 0.0→1.0 is fine for a first pass; for structure-heavy work, releasing the condition after composition forms is the classic move.
The output is a single conditioning socket that feeds your FLUX.2 guider. There's also a diagnostics toggle for verbose logging when something's misbehaving.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/Damkohler/JLC-Flux2-ControlNet.git
Restart ComfyUI or install "JLC Flux2 ControlNet" from Manager. Requirements: a 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 not included - the depth/pose/canny map is your job upstream.
Common issues
strength = 0 is a runtime bypass, but you still need a real control image - passing None raises a hard error, which is by design. start_percent above end_percent also errors cleanly. And the most common "it did nothing" report: the union model at the old SD-era default strength of 1.0, which overcooks modern FLUX.2 conditioning. Start at the 0.75 default, tune from there. If you need positive and negative both conditioned with the same branch, that's the Apply Advanced variant; if you need two to four branches at once, that's the Orchestrator.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| controlnet | JLC_FLUX2_CONTROLNET | — | |
| conditioning | CONDITIONING | — | |
| vae | VAE | — | |
| control_image | IMAGE | — | |
| strength | FLOAT | 0.750–2 | — |
| start_percent | FLOAT | 0.0000–1 | — |
| end_percent | FLOAT | 1.0000–1 | — |
| diagnostics | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |