CB Set Group Mute/Bypass State ⚡️
Switch off a whole region by typing part of its name
- signal
- signal
What it's for
Groups are how you keep a 100-node workflow readable - a labelled box over the TTS section, another over the upscaler, another over the video branch. CB Set Group Mute/Bypass State turns those labels into switches you can throw from inside the graph: give it part of a group's title, pick Mute, Bypass or Active, and every node in every matching group changes state.
The difference between this and rgthree's Fast Groups Muter is who does the switching. rgthree gives you a dashboard - a panel you tick by hand before queuing. This one is triggered by a wire, which means the workflow can switch its own regions between runs. On a big workflow that's the difference between "load all four models at once and pray for VRAM" and "run stage one, mute it, run stage two", the pattern people land on when a graph refuses to fit.
How it works
The backend sends the search string and mode to the frontend, and a JS extension walks app.graph._groups. Matching is a case-insensitive substring test on the group title - so TTS hits TTS, TTS Clone and pre-TTS cleanup alike. Empty or whitespace-only input is refused outright, which is a deliberate guard: with substring matching, an empty string would mute the entire workflow.
Node selection inside a matching group is geometric, and the code says where it came from: it's adapted from rgthree's group muters, and the check is whether the node's centre point falls inside the group's bounding box. Not "was this node assigned to this group" - a position test. Mode mapping is the usual LiteGraph enum: Mute 2, Bypass 4, Active 0.
And like its node-level sibling, this changes your canvas, not the run in flight. The prompt was already sent. You see the effect on the next queue, and if you want it to stick you save the workflow.
Inputs and outputs
| | |
|---|---|
| signal (*, required) | any connection; arriving is the trigger, and it passes through |
| group_name_contains (STRING, default Group) | case-insensitive substring matched against group titles |
| mode (enum: Mute, Bypass, Active) | what every node in matching groups is set to |
| signal (output, *) | the same signal, for chaining several state-changers |
Installing it
Manager → Custom Nodes Manager → search ComfyUI CoolB Nodes → Install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/CoolBreeze164/ComfyUI-CoolB-Nodes
Then hard-refresh the browser tab. The node does its work through a JavaScript file the pack serves, and a cached bundle is the number one reason it looks dead after install.
Common issues
The default Group matches nearly everything. Every default-named group in ComfyUI is literally Group, Group 2, Group 3. Leave the field alone and the first time this fires, your whole canvas changes state. Rename your groups to something meaningful - stage1_load, stage2_video - before you wire this up. That's not the node being sloppy; it's substring matching doing exactly what it says.
A node in the group didn't switch. Move it and watch: membership is decided by the node's centre. A node dragged half outside its group, or one placed near the edge in a way that puts its centre out, isn't in the group as far as this node is concerned. Overlapping groups are the mirror case - a node whose centre sits inside two matching groups gets set twice, which is harmless, but a node inside a non-matching overlapping group gets caught anyway if the other group matches.
Nothing happened at all. Check the title you searched for actually exists (a typo is a silent no-op, not an error), confirm the JS loaded, and remember it applies to the next run. Also be aware this is the same frontend-hook architecture rgthree's group muters use, and that family is what ComfyUI's Nodes 2.0 rewrite broke - if group switching stops responding, check whether Nodes 2.0 is enabled, since the legacy canvas remains the workaround.
It fired when you didn't want it to. It's an output node, so ComfyUI always runs it. Keep the trigger path outside the regions you're switching, or you'll switch off the branch that was supposed to switch the next thing on - and the workflow parks in whatever state it reached.
Pairs well with: the node-level version for one-off pins (that one node in the middle of a group, or something outside any group), and a text-file save/load pair if you need values to survive between those chained runs. Values don't travel across queues by themselves - someone has to write them down.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| signal | * | — | |
| group_name_contains | STRING | Group | — |
| mode | COMBO | Mute | 3 options: Mute, Bypass, Active |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| signal | * | — |