XB-BOX - ๐ซ ็ฆ็จ่็น
Mute, bypass and restore specific nodes without hunting for them
What it actually is
XB_DisableNodes is a patch panel for individual nodes. Right-click it, pick the nodes you want to control, and the node becomes a named switch list - each row mutes, bypasses, or restores its target. No wires, no binding, no port used up.
This is the tool for a workflow with three checkpoint loaders, two upscale passes and a FaceDetailer chain you want to keep but skip. Those things aren't neatly boxed into groups; they're scattered, and the boxes they are in contain six other nodes you'd rather keep running. Group muting can't express that. Per-node can.
It's a port of rgthree's Fast Muter, credited as much in the module docstring. Our ecosystem notes call this legibility tooling rather than capability: the point is a graph too large to read staying one you can still work in. The README frames the pack's XB_ReferenceAny as "Fast Muter + Any Switch fused"; this is the un-fused half.
Display name is XB-BOX - ๐ซ ็ฆ็จ่็น, rendered as XB-BOX - ๐ซ Disable Nodes on an English install.
How it works
Python does nothing here. No inputs, no outputs, and a noop function returning {}, so the node never enters the execution queue.
The front end walks the root canvas and nested subgraphs, tracking each target by subgraph path plus node id, renders a DOM widget with one switch row per target, and on click writes LiteGraph's own mode value onto it - 0 normal, 2 mute, 4 bypass. Same field as Ctrl+M and Ctrl+B, same field every other extension reads, so it saves with the workflow and the panel's timer keeps the strip in sync when you toggle by hand.
A row shows โ when only part of its target set is off, and its tooltip carries the node count and subgraph name. Your selection persists as node properties - id, title, subgraph path per entry.
The inputs and outputs that matter
There are none, which is the selling point. Everything happens in the right-click menu - and be warned, the menu labels are hardcoded Chinese even in the English UI (only the display name and description come from the locale files). What you're looking at:
โ๏ธ ้ๆฉ่็นโฆ- the picker. Searchable, checkboxes, nodes filed under their group's heading, subgraphs labelled, drag handles to reorder rows.๐ ๅค้๏ผๅฏๅ จๅ ณ / ๅ จๅผversus๐ ๅ้๏ผๆฐธ่ฟไฟๆไธไธชๅผๅฏ- the second gives you radio-button rows: turning one on turns the others off.โ ็ฆ็จๆนๅผ๏ผ้้ณ (mute)/โ ็ฆ็จๆนๅผ๏ผ็ป่ฟ (bypass)- what "off" means, globally for this node.โ ๅ จ้จๅฏ็จ,โ ๅ จ้จ็ฆ็จ,โ ๅ จ้จๅ่ฝฌ,๐ ๅทๆฐๅ่กจ,๐ ๆธ ็ฉบ้ๆฉ.
Want a whole group at once? Type the group's name into the picker's search - it matches group headings - then hit ๅ
จ้ (select all), which applies to the filtered rows, then ็กฎๅฎ.
Install
ComfyUI Manager โ search XB_ToolBox โ install โ restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/wjluoxiao/XB_ToolBox.git
Restart the backend rather than only reloading the page - the panel registers as a frontend extension when the server starts - then hard-refresh with Ctrl+F5.
That repo's requirements.txt reads like a small ML stack. You don't need it for this node; it serves the audio, CosyVoice, local-LLM and dashboard groups. Installing it into a working ComfyUI environment is how you end up with a broken torch.
Where people get burned
Bypass only passes through when the types line up. A bypassed LoRA loader hands the model through; a bypassed KSampler hands the latent through. That's the good case and why bypass is usually the right "off". A node whose output type matches none of its inputs passes nothing, and downstream fails on queue with a missing required input - so if a row only breaks the run, switch that node's disable mode to mute and see whether the error changes shape.
Rows can go stale. Targets match by node id first, then by title when a subgraph was repacked and ids changed. Two nodes sharing a title make that fallback a coin flip, so give anything you plan to switch a distinct title. Delete a target and its row vanishes after two consecutive refresh failures, following a three-second grace period so an undo doesn't wipe your list.
Keep the controller out of its own blast radius. The picker already excludes the pack's own switch nodes so you can't build a loop that mutes its controller; extend the courtesy to yourself: don't point a row at something the graph needs alive.
Beyond the node: XB_ToolBox is a single-author project (wjluoxiao) with Chinese-first docs and almost no English discussion. Not a knock - the code is legible and actively committing - but the shipped source beats any write-up. The mechanism above came from reading js/xb_fast_toggle.js.
Inputs (0)
No inputs
Outputs (0)
No outputs