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

DA_NodeController [BETA]

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

By DemonAlone·Created 2 months ago·Updated about 17 hours ago· 1
DA_NodeController [BETA]
      ◄modeBypass►
      ◄slot_count3►
      ◄toggle_restrictiondefault►
      ◄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 (84)

      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.
      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