Nodes/comfyui-obvpm/Mute (obvpm)
ComfyUI Node

Mute (obvpm)

Kill everything downstream from one connectable boolean

By chanon·Created about a month ago·Updated a day ago· 42
Mute (obvpm)
  • input
  • value
mutefalse

ComfyUI's own mute is a right-click on a node, which is a lovely UI affordance and a terrible programming primitive. You can't build a workflow that mutes itself when a condition is met - muting is something you do with the mouse, before you hit queue.

Mute (obvpm) makes it a value. The node has a mute boolean, and when it's true, every node downstream of the output is silently skipped. Any input type, pass-through when it's false. If you've wanted a branch that switches itself off - because a mask is empty, because the audio track is missing, because the user unticked a box in your UI - this is the piece that turns that condition into a dead path.

Inputs and output

  • mute - required BOOLEAN, default false. When true, every downstream node is skipped. It's a normal widget, so you can right-click → Convert widget to input and drive it from anything that outputs a boolean.
  • input - optional, wildcard type (*). Any value to pass through.
  • value - the input, blocked while mute is true.

Under the hood it's the engine's own mechanism: a true mute returns an ExecutionBlocker, and ComfyUI prunes everything downstream. There's no partial block, no error raised, no handler - downstream nodes simply don't appear in that run. That's the intended semantics and it's also why this class of node is easy to misuse: silence looks a lot like success.

The upstream half - read this before you trust it

The author's own note on the tooltip is the important one: the nodes upstream of input still run even when muted. By the time a value reaches this gate and can be objected to, it's already been computed. Mute everything downstream of a ninety-second sampler and you've still paid the ninety seconds.

If saving that upstream work is the actual goal, the pack's Lazy Switch is the right tool - the unselected branch isn't executed at all, because the engine is told which inputs it needs before it runs anything. The mental model:

  • Mute cuts the path after a point.
  • Lazy cuts the work before it.

You need both to switch a branch off completely, and it's genuinely easy to misdiagnose which one you're missing.

Driving the boolean

The obvious pairing is a gate's present output into mute, through a boolean invert: "no reference image connected → mute the reference branch". And unlike a hand-placed mute, this survives a saved workflow, a queue on the server, and an API call. Because mute is a connectable input rather than canvas state, the same workflow can behave differently on two machines with no editing - which is exactly what you want in a template you hand to someone else.

The input socket is wildcard, so it doesn't matter what's flowing through: an image, a latent, a model, a bundle. It's a bead on the wire. Remember that an unconnected input means the gate has nothing to pass along, so if you want a pure kill switch, put it on a wire that exists.

And the output-node exception

Mute cannot stop a save or preview node that sits on the muted path - every OUTPUT_NODE is an execution root, and nothing reaches it through a wire, so there's nothing for the pruning to remove. If your "muted" branch still writes files, that's why. Wrap the Save node's own inputs in the gate instead, or delete the branch from the queue by switching the whole thing with a Lazy Switch.

Install

ComfyUI Manager → search comfyui-obvpm (the pack title), or:

cd ComfyUI/custom_nodes
git clone https://github.com/chanon/comfyui-obvpm

Restart ComfyUI. Node id is Mute (obvpm), category obvpm/gates; a node-menu search for obvpm lists everything in the pack. No Python dependencies and no downloads - the pack's pyproject.toml deliberately declares none, since its imports already come with ComfyUI. Every class id gained the (obvpm) suffix in 0.2.0 to end a collision with another pack's Bundle node, and pre-0.2.0 workflows migrate when opened.

Categoryobvpm/gates

Inputs (2)

NameTypeDefaultDescription
muteBOOLEANfalseWhen true, every node downstream of this gate is skipped. Connectable, so it can be driven by logic.
inputopt*Any value to pass through. Its upstream nodes still run even when muted.

Outputs (1)

NameTypeDescription
value*The input passed through. Blocked while mute is true.