Soft Switch (Inverse) (Legacy)
Pick a branch, or just pass through
- on_true
- on_false
- output
The difference between "Switch" and "Soft Switch" is one word, and it's the whole point: optional. Soft Switch (Inverse) (Legacy) is the same any-type A/B routing valve as its sibling, except the two inputs are optional, so you can leave one side unwired and the node happily passes through whatever is connected.
Mechanically it's the same lazy engine as the regular switch - the boolean picks on_true or on_false, and the unselected branch isn't evaluated. The "soft" part means each side has a None fallback: if the branch you selected isn't connected, the node returns nothing rather than erroring, and downstream optional inputs just read it as unconnected. That's the behavior that makes a graph where some branch "sometimes exists" work without you editing wires every run.
Like its sibling, the "(Inverse)" in the name is legacy branding - the selection logic is the plain one: switch true gives you on_true, false gives on_false. Don't overthink the label.
The inputs that matter
- switch - the boolean selector. Only the selected branch is evaluated.
- on_true / on_false - both optional, both any-type. Connect one, or both. This is the input set that makes it "soft."
The output
output, typed to whatever's connected. Leave the unselected side empty and it behaves like a passthrough; fill both and it behaves like a normal switch. The useful pattern: a workflow where a LoRA or a reference image is optional - wire it into on_true, leave on_false empty, and flip the boolean to include or exclude it without deleting nodes.
Installing it
Ships in silveroxides/ComfyUI-UtilsCollection. Install through ComfyUI Manager (search ComfyUI-UtilsCollection) or:
cd ComfyUI/custom_nodes
git clone https://github.com/silveroxides/ComfyUI-UtilsCollection
Then restart. Requirements: opencv-python and typing-extensions only - no models. The "(Legacy)" tag again means it's a compat alias for the pack's canonical UC_SoftSwitchInverseNode.
Where people get burned
The softness is the trap. Because an unconnected side is fine, it's easy to build a "switch" that's actually a passthrough and not notice - flip the boolean and nothing changes because the other side was never wired. Check your wires before you check your boolean. And same lazy-evaluation caveat as the plain switch: the dead branch doesn't run, so if a node on the unselected side has side effects (file writes, API calls), they won't happen when it's off. That's the feature, until it isn't.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| switch | BOOLEAN | — | |
| on_trueopt | COMFY_MATCHTYPE_V3 | — | |
| on_falseopt | COMFY_MATCHTYPE_V3 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| output | COMFY_MATCHTYPE_V3 | — |