BMAB Flux ControlNet
Wiring structural control into BMAB's own pipeline
- bind
- control_net
- image_in
- BMAB bind
BMAB is a big, opinionated post-processing pack, and it doesn't just tolerate the rest of your ComfyUI graph - it wants to own the pipeline. This node is how you get a ControlNet condition into that pipeline when you're on Flux: instead of the usual ControlNetApplyAdvanced wired straight into your sampler, you attach the ControlNet to BMAB's own bind object, which then carries the condition into whatever BMAB node samples downstream (Resize By Ratio, Resize By Person, and friends). If you've used the other bind-based BMAB nodes, this is the same pattern: build up settings on the bind, then let a later node actually run the sampler.
How it works
Functionally it's the same math as any ControlNet apply node - strength scaling the condition, start/end percent windowing which portion of the denoise steps it's active for - just repackaged to travel through BMAB's BMAB bind type instead of ComfyUI's native conditioning wires. On Flux specifically, the ControlNet ecosystem moved fast once it moved at all: SDXL waited about a year for a real union checkpoint, but Flux got community ControlNets within a month and BFL's own official Depth and Canny models a few months after that. Shakker Labs' Flux Union Pro 2.0 is the one most people load into the control_net input here, and its own recommended strengths are lower than the old SD-era default of 1.0 across the board - canny and soft edge around 0.7, depth 0.8, pose 0.9. Start high on strength only if the published number for your specific ControlNet type says to.
The inputs and outputs that matter
bind(required) - the BMAB pipeline object coming from upstream (typically BMAB Import Integrator). This node reads it, attaches the ControlNet, and passes it on.control_net(required,CONTROL_NET) - load this with your usual ControlNet loader first; it's not fetched by this node.strength(default 1, 0–10) - how hard the condition pushes. Flux unions generally want less than the old SD default of 1.0; check what your specific checkpoint recommends before cranking this.start_percent/end_percent(0–1) - the classic windowing trick: ending control around the halfway point of denoising frees the later steps to let the model finish the fine detail on its own, which is the standard move for structure-only guidance.imageand optionalimage_in- the node has its own built-in image picker (image, a dropdown), which is handy for quick tests, but for a real workflow wire your source image into the optionalimage_insocket instead so it's coming from the rest of your graph rather than a manually uploaded file.- Output:
BMAB bind- feed this into the next BMAB node in your chain.
How to install it
ComfyUI Manager: search comfyui_bmab and install. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/portu-sim/comfyui_bmab.git
cd comfyui_bmab
pip install -r requirements.txt
(Windows portable: use python_embeded\python.exe -m pip install -r requirements.txt.) The README also asks for two more packs alongside it - Fannovel16/comfyui_controlnet_aux and cubiq/ComfyUI_IPAdapter_plus - installed the same way. comfy.icu's shared image already ships both in the ~100-pack baseline, so if you're running on ComfyICU you likely don't need to chase those down yourself; if you're self-hosting, grab them or BMAB's other nodes will complain about missing types on load.
Common issues & troubleshooting
Nothing changes when you crank strength. Double-check the ControlNet you loaded actually supports the condition type you're preprocessing for - a canny-trained union checkpoint given a depth map won't do much no matter how hard you push it.
The result looks over-baked or plastic. You're probably running start_percent/end_percent across the whole denoise at a strength meant for the old SD 1.0 default. Pull strength down toward the Flux union's published number and consider ending control around 50% of steps instead of 100%.
The built-in image dropdown shows "None." That widget only lists files you've manually placed or uploaded through it - it isn't populated from your graph. If you want to drive the control image from an upstream node, use image_in, not image.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| bind | BMAB bind | — | |
| control_net | CONTROL_NET | — | |
| strength | FLOAT | 1.000–10 | — |
| start_percent | FLOAT | 0.0000–1 | — |
| end_percent | FLOAT | 1.0000–1 | — |
| image | COMBO | 2 options: None, example.png | |
| image_inopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BMAB bind | BMAB bind | — |