Mute Bypass by ID — Single
Mute or bypass anything in your graph by ID
You've got a 40-node workflow and the ControlNet is buried four screens over - you just want to see what the image looks like without it. Dragging over to right-click it every run is exactly the chore that makes big graphs unmanageable. RemoteControl - "Mute Bypass by ID - Single" - is a tiny control node that sits wherever you like and flips one other node between running, muted, and bypassed. That's the entire job, and it does it well.
The whole pitch is in the pack name: pixelpainter's mute-bypass by node ID. You don't rewire anything, you don't group anything. You tell this node which other node to act on, and it reaches across the graph and sets that node's state. It's the answer to the r/comfyui classic "can I bypass a section by a button press?" - only instead of muting a whole group, it targets one node by ID, even inside a subgraph.
The rest of this pack exists because that one-node idea is so useful - but the Single is where you start, because it's the one you'll reach for when a single optional stage (a ControlNet, an IP-Adapter, an upscaler pass) needs an on/off switch.
How it actually works
Here's the part that trips people up if they come in expecting a normal node: the Python class does literally nothing. Its do_nothing returns an empty tuple. Every bit of the magic is in the frontend JavaScript. The extension replaces the plain target_node string field with a searchable picker - you click it and get a list of every node in your graph, searchable by ID or name, with the path shown as something like [209:25:103] > [subgraph:subgraph:node target]. That path is the clue to how it stays reliable: newer versions resolve targets by subgraph ID + node ID together, which fixes ComfyUI's habit of handing out duplicate IDs to nodes in different subgraphs.
Then, on every frame, the JS resolves your picker to a real node and sets its mode - the same mode 0 / 2 / 4 states you get from right-clicking a node and choosing Mute or Bypass. It's not an API call and it's not swapping anything - just pressing the button you'd press, from somewhere else.
The inputs that matter
Only three, and you'll set two of them:
target_node- the picker. This is the node you want to control.node_status- the actual on/off switch. Default is on, meaning the target runs normally. Flip it off and the target gets muted or bypassed.mode_select- decides what "off" means: mute or bypass.
Mute vs bypass is the one concept worth internalizing, because they feel the same until the graph breaks. Mute skips the node entirely - it produces no output, and anything downstream that needs that output fails. Bypass also skips the node, but passes the upstream data straight through, so the rest of the graph keeps running. For testing "what if I drop this stage?" bypass is almost always the safer default - which is why it's the default here.
There are no outputs. None. This node is a control surface, not part of the data flow, so don't go looking for a wire to attach it to. That's also why it's safe to drop a dozen of them into one workflow.
Installing it
It's a plain custom node with zero dependencies - no models, no pip packages, no torch tricks. Via ComfyUI Manager, search for "mute-bypass by node ID", or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/pixelpainter/comfyui-mute-bypass-by-ID
Then restart ComfyUI. Because the whole thing runs in the frontend JS, a restart isn't a formality here - the picker UI won't exist until the web extension loads.
Gotchas
- If you search by ID and two nodes come back with the same number, check the path and pick the one inside the subgraph you meant. Duplicate IDs across subgraphs are a real ComfyUI thing; this pack handles them correctly on recent versions, but only if you grab the right entry.
- If a target stops responding, make sure you're on a version from the V2.0.0 update or later - that's the changelog line where subgraph targeting got fixed.
- No outputs means no outputs - if you wired this expecting data, that's your bug, not the pack's.
It's a tiny tool, but for anyone who lives in big workflows, it's the kind of tiny tool that quietly removes a whole class of annoyances.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| mode_select | BOOLEAN | false | — |
| node_status | BOOLEAN | true | — |
| target_node | STRING | — | |
| target_node_2 | STRING | — | |
| target_node_3 | STRING | — | |
| target_node_4 | STRING | — | |
| target_node_5 | STRING | — | |
| target_node_6 | STRING | — | |
| target_node_7 | STRING | — | |
| target_node_8 | STRING | — | |
| target_node_9 | STRING | — | |
| target_node_10 | STRING | — | |
| target_node_11 | STRING | — | |
| target_node_12 | STRING | — | |
| target_node_13 | STRING | — | |
| target_node_14 | STRING | — | |
| target_node_15 | STRING | — | |
| target_node_16 | STRING | — | |
| target_node_17 | STRING | — | |
| target_node_18 | STRING | — | |
| target_node_19 | STRING | — | |
| target_node_20 | STRING | — |
Outputs (0)
No outputs