Nodes/HommageTools for ComfyUI/HT Node State Controller
ComfyUI Node

HT Node State Controller

Mute a whole group of nodes by ID, from inside the graph

By ArtHommage·Created 2 years ago·Updated about a year ago· 4
HT Node State Controller
  • signal_in
  • signal_out
node_ids0
default_statetrue
boolean_input

When you're A/B testing in ComfyUI - "does the refiner help or not?" - the standard move is to mute a branch by hand, run, unmute, run, compare. HT Node State Controller turns that manual dance into a workflow input. It's a control node: you give it a comma-separated list of node IDs and a boolean, and when it runs it mutes or unmutes those nodes for you. It's automation for the graph itself.

What it does

Three required inputs:

  • node_ids - a string like "12, 27, 31". The numbers are the ComfyUI node IDs, the same ones you see when you look at a workflow's node properties or in the graph JSON. That's the part people trip on: it's not node names, it's IDs, and they're per-workflow - copy them from the workflow you're actually testing.
  • default_state (boolean, default true) - the state applied when the controller runs: true = active, false = muted.
  • boolean_input (boolean) - the flip switch, and the source is explicit about it: final_state = default_state if boolean_input else not default_state. When boolean_input is true the group is set to default_state; when false it's set to the opposite. So one workflow run with true engages the group and the next with false disengages it - that's your A/B toggle, driven by a graph input rather than a right-click.

There's an optional signal_in (* wildcard) that passes straight through to signal_out, so you can hang it on an existing wire and use it to sequence the state change - when the signal arrives, the mute/unmute happens. That's the neat trick: it turns "mute this branch" into a point on the timeline of a workflow.

How it works

The mechanism is where the gotcha lives. It sends a impact-node-mute-state command through ComfyUI's PromptServer to the frontend for each target node ID. That event name is the giveaway: the mute/unmute state lives in the Impact Pack's node-control machinery. So this node effectively depends on Impact Pack being installed for the frontend handler that reacts to those commands. It's an output node (is_output_node true) that otherwise just echoes its signal.

When you'd use it

  • A/B testing: one run with boolean_input true (refiner active), one with false (refiner muted), same seed, compare outputs - without touching the graph between runs.
  • Workflow organization: keep heavy branches (an IPAdapter pass, a second sampler) muted by default and enable them only when a condition is met.
  • Sequence control: trigger a big group's state at a specific point in a longer pipeline via the signal input.

Installing

Standard pack install:

cd ComfyUI/custom_nodes
git clone https://github.com/ArtHommage/HommageTools.git
cd HommageTools && pip install -r requirements.txt

restart, or Manager → "HommageTools for ComfyUI". No models.

The honest take

It's a fiddly node with real upside. The fiddliness: node IDs are fragile (edit the workflow and IDs reshuffle, breaking your list), and it leans on Impact Pack's mute event, so it's not a self-contained tool - the ecosystem essay's point about utility packs sitting on each other's machinery applies here literally. If you're already using rgthree's Fast Groups Muter, you may find that covers the same need with less setup. But if you want state changes driven by the graph rather than by hand, this is the node that does it. Given the alpha disclaimer, check it after updates - it's the kind of node that breaks silently when ComfyUI changes its frontend messaging.

CategoryHommageTools/Control

Inputs (4)

NameTypeDefaultDescription
node_idsSTRING0
default_stateBOOLEANtrue
boolean_inputBOOLEAN
signal_inopt*

Outputs (1)

NameTypeDescription
signal_out*