Nodes/DemonAlone-JS_Addon-ComfyUI/Node Controller [BETA]
ComfyUI Node

Node Controller [BETA]

One node to bypass or mute a dozen — a master switchboard for your graph

By DemonAlone·Created about a month ago·Updated a day ago· 1
Node Controller [BETA]
      modeBypass
      slot_count3
      toggle_restrictiondefault
      AllSwitchfalse
      show_AllSwitchfalse
      label_1
      targets_10
      switch_1false
      target_type_1ID
      label_2
      targets_20
      switch_2false
      target_type_2ID
      label_3
      targets_30
      switch_3false
      target_type_3ID
      label_4
      targets_40
      switch_4false
      target_type_4ID
      label_5
      targets_50
      switch_5false
      target_type_5ID
      label_6
      targets_60
      switch_6false
      target_type_6ID
      label_7
      targets_70
      switch_7false
      target_type_7ID
      label_8
      targets_80
      switch_8false
      target_type_8ID
      label_9
      targets_90
      switch_9false
      target_type_9ID
      label_10
      targets_100
      switch_10false
      target_type_10ID
      label_11
      targets_110
      switch_11false
      target_type_11ID
      label_12
      targets_120
      switch_12false
      target_type_12ID
      label_13
      targets_130
      switch_13false
      target_type_13ID
      label_14
      targets_140
      switch_14false
      target_type_14ID
      label_15
      targets_150
      switch_15false
      target_type_15ID
      label_16
      targets_160
      switch_16false
      target_type_16ID
      label_17
      targets_170
      switch_17false
      target_type_17ID
      label_18
      targets_180
      switch_18false
      target_type_18ID
      label_19
      targets_190
      switch_19false
      target_type_19ID
      label_20
      targets_200
      switch_20false
      target_type_20ID

      There's a moment in every serious ComfyUI workflow where the graph gets too big to reason about and you start wanting a cockpit instead of a canvas. DA_NodeController is that cockpit for node-level on/off. It's a single node that lets you bypass or mute specific nodes - or batches of them - from a row of labeled toggles, live, with zero re-queueing. The group version of this same idea lives in DA_GroupController; this one targets individual nodes.

      It ships in DemonAlone-JS_Addon-ComfyUI, the JS-focused companion pack to the author's main DemonAlone-nodes repo, and it's explicitly based on the AUNMultiUniversal node from AUN-ComfyUI-Nodes. It's one of those "I got tired of right-clicking 14 nodes" tools - the pack is mostly that philosophy: responsive UI work in the browser, not in Python.

      How it works

      Like its group sibling, the Python half is a thin layer. It reads your slots, splits the targets strings on commas and semicolons, and passes two lists to the frontend: IDs/titles that should be active and ones that shouldn't. The JS then walks the actual graph and flips each matched node's mode to ALWAYS, BYPASS, or NEVER.

      Two targeting modes, set per slot via target_type_N:

      • ID - matches the node's numeric ID exactly. Stable per workflow, precise, but you have to know the numbers (hover or check the workflow JSON).
      • Title - matches the node's display title with a case-insensitive substring match. denoise will hit a node titled "KSampler denoise pass". Fuzzier, easier to remember.

      Because IS_CHANGED is always false, flipping a switch doesn't mark the graph dirty and doesn't fire a run. You're just editing state, which is what makes it feel like a hardware panel rather than an edit operation.

      The inputs that matter

      The top-level trio is shared with the group controller: mode (Bypass or Mute - how "off" behaves), slot_count (1–20 rows, 3 default), and toggle_restriction (default, max one for radio-button A/B, always one to guarantee at least one slot stays on). AllSwitch turns everything on at once; show_AllSwitch keeps that toggle visible in compact mode.

      Each slot gets four fields, and the only one you genuinely need to fill is targets_N - node IDs or titles, comma or semicolon separated, with target_type_N choosing how they're interpreted. label_N is just a caption for the row. switch_N is the actual toggle. There are no outputs; it's a OUTPUT_NODE control panel, not a data node.

      Installing it

      Same as any pack in this repo:

      cd ComfyUI/custom_nodes
      git clone https://github.com/DemonAlone/DemonAlone-JS_Addon-ComfyUI
      

      Or search "DemonAlone-JS_Addon-ComfyUI" in ComfyUI Manager and hit install. Restart, and it appears under Node Control. No models, no pip dependencies.

      Where people get burned

      The Title substring match is both the feature and the trap: a title that contains another title's text will catch both. If you have "denoise" and "denoise final", one slot targeting denoise grabs both. Be more specific, or switch that slot to ID targeting.

      Also remember it only controls nodes present in the graph when you toggle. Nodes you add later with matching titles won't be affected until you toggle again - and since toggling is a live event rather than an execution, the change applies to what's on the canvas at that moment. It's a workflow-organizing tool, not a save-file validator. Name things deliberately, and this thing genuinely feels like magic the first time you A/B two upscale paths with a single click.

      CategoryNode Control

      Inputs (85)

      NameTypeDefaultDescription
      modeoptCOMBOBypassChoose how to disable nodes: Bypass (🔴) or Mute (🔇).
      slot_countoptINT31–20Number of control slots to show (1-20).
      toggle_restrictionoptCOMBOdefaultLogic for toggles: 'max one' allows only one active, 'always one' ensures at least one is active.
      AllSwitchoptBOOLEANfalseON = all groups active (🟢). OFF = use individual group switches.
      show_AllSwitchoptBOOLEANfalseShow the AllSwitch toggle even in compact mode.
      label_1optSTRINGDescriptive label for slot 1 (other slots follow the same layout).
      targets_1optSTRING0Target node IDs or Titles for slot 1 (comma or semicolon separated). Example: '123, 456' or 'upscale; denoise'.
      switch_1optBOOLEANfalseToggle state for slot 1. 🟢 = active, 🔴 = controlled by mode.
      target_type_1optCOMBOIDTargeting method for slot 1: ID (numeric) or Title (display name).
      label_2optSTRING
      targets_2optSTRING0
      switch_2optBOOLEANfalse
      target_type_2optCOMBOID2 options: ID, Title
      label_3optSTRING
      targets_3optSTRING0
      switch_3optBOOLEANfalse
      target_type_3optCOMBOID2 options: ID, Title
      label_4optSTRING
      targets_4optSTRING0
      switch_4optBOOLEANfalse
      target_type_4optCOMBOID2 options: ID, Title
      label_5optSTRING
      targets_5optSTRING0
      switch_5optBOOLEANfalse
      target_type_5optCOMBOID2 options: ID, Title
      label_6optSTRING
      targets_6optSTRING0
      switch_6optBOOLEANfalse
      target_type_6optCOMBOID2 options: ID, Title
      label_7optSTRING
      targets_7optSTRING0
      switch_7optBOOLEANfalse
      target_type_7optCOMBOID2 options: ID, Title
      label_8optSTRING
      targets_8optSTRING0
      switch_8optBOOLEANfalse
      target_type_8optCOMBOID2 options: ID, Title
      label_9optSTRING
      targets_9optSTRING0
      switch_9optBOOLEANfalse
      target_type_9optCOMBOID2 options: ID, Title
      label_10optSTRING
      targets_10optSTRING0
      switch_10optBOOLEANfalse
      target_type_10optCOMBOID2 options: ID, Title
      label_11optSTRING
      targets_11optSTRING0
      switch_11optBOOLEANfalse
      target_type_11optCOMBOID2 options: ID, Title
      label_12optSTRING
      targets_12optSTRING0
      switch_12optBOOLEANfalse
      target_type_12optCOMBOID2 options: ID, Title
      label_13optSTRING
      targets_13optSTRING0
      switch_13optBOOLEANfalse
      target_type_13optCOMBOID2 options: ID, Title
      label_14optSTRING
      targets_14optSTRING0
      switch_14optBOOLEANfalse
      target_type_14optCOMBOID2 options: ID, Title
      label_15optSTRING
      targets_15optSTRING0
      switch_15optBOOLEANfalse
      target_type_15optCOMBOID2 options: ID, Title
      label_16optSTRING
      targets_16optSTRING0
      switch_16optBOOLEANfalse
      target_type_16optCOMBOID2 options: ID, Title
      label_17optSTRING
      targets_17optSTRING0
      switch_17optBOOLEANfalse
      target_type_17optCOMBOID2 options: ID, Title
      label_18optSTRING
      targets_18optSTRING0
      switch_18optBOOLEANfalse
      target_type_18optCOMBOID2 options: ID, Title
      label_19optSTRING
      targets_19optSTRING0
      switch_19optBOOLEANfalse
      target_type_19optCOMBOID2 options: ID, Title
      label_20optSTRING
      targets_20optSTRING0
      switch_20optBOOLEANfalse
      target_type_20optCOMBOID2 options: ID, Title

      Outputs (0)

      No outputs