MURemoveControlNet
Rip the ControlNet out of conditioning that already has one
- conds
- CONDITIONING
Here's a ComfyUI fact that surprises people: ControlNet guidance doesn't live in the sampler, and it doesn't live in a separate wire - it's packed inside the CONDITIONING. When you apply a ControlNet, the node stuffs a control key (and a control_apply_to_uncond flag) into the conditioning dict, and the sampler reads it back out during denoising. That's exactly why MURemoveControlNet works: it's dict surgery. Feed it a CONDITIONING, and it walks each entry, clones it, and deletes those two keys. What comes out is the same prompt conditioning with the control signal surgically removed.
So when would you want that? You've built a workflow where a ControlNet is applied early - maybe it feeds the positive and negative conditioning, or it sits before a branch. Now you want a variant pass that ignores the structure entirely: same prompt, same seed, no pose. Instead of re-encoding the prompt without the ControlNet node (or building a whole parallel prompt path), you just strip the control key off the conditioning you already have. It's a compare-with/without control in about ten seconds of wiring.
It also composes with its sibling in the same pack, MUConditioningCutoff - one manipulates the schedule of the conditioning, this one removes the control payload entirely. Same author, same family of "reach inside the dict and fix it" tools.
The interface is comically small: one required input, conds (CONDITIONING), one output, CONDITIONING. No sliders, no toggles, nothing to configure. If the conditioning you feed it has no control attached, it's a harmless pass-through - it just clones and returns. The key implementation detail to trust: it clones both the tensor and the dict before deleting, so the original conditioning upstream isn't mutated. Whatever the ControlNet apply node did still exists upstream; you're just making a copy that doesn't carry the control.
The main thing to know for real use is where to put it. It removes control from the conditioning you hand it, so drop it on the branch you want clean - between the ControlNet apply and the sampler, on the specific positive or negative input you're trying to un-constrain. And if you're stripping control on the understanding that it'll also drop the control_apply_to_uncond behavior, that's exactly what the node does: both keys go.
It lives in asagi4's comfyui-utility-nodes pack, a six-node collection with nothing heavy behind it (just lark and jinja2). Install through ComfyUI Manager by searching "comfyui-utility-nodes", or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/asagi4/comfyui-utility-nodes
cd comfyui-utility-nodes
pip install -r requirements.txt
Restart, and it's under "misc-utils". It's a niche, single-purpose node - but the day you catch yourself rebuilding a prompt branch just to drop a ControlNet, you'll see why it's worth keeping around.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| conds | CONDITIONING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |