Switch from any (Arrssenne)
The two-way switch that actually skips the branch you don't want
- any
- on_true
- on_false
If you've ever wired a switch node and watched it do nothing - the "off" branch still saved an image, or a node you were sure was skipped still ran - this is the fix. Switch from any (Arrssenne) is a tiny two-way router from a small personal pack called ComfyUI-Arrssenne. It takes one value of any type and sends it to one of two outputs based on a boolean. Nothing glamorous. But how it does that is the reason it exists: the output you don't pick doesn't return None, it returns an ExecutionBlocker, and ComfyUI treats that as "this branch does not exist this run." Nodes downstream of it simply don't execute.
Why that matters: ComfyUI's output nodes - SaveImage, PreviewImage, SaveAnimatedWEBP - run on every execution no matter what's feeding them. A plain switch can't turn one off, because there's still a connection and output nodes don't respect "inactive" paths. Feed the unselected branch None and some downstream nodes crash on it. The blocker sidesteps both problems: the whole branch is skipped, no crash, no surprise file landing in your output folder.
Mechanically it's a port of crystools' CSwitchFromAny (MIT), and the clever part is the any-type slot trick that traces back to pythongosssss's core code. The input and both outputs are typed *, which matches anything - IMAGE, LATENT, MODEL, CONDITIONING, STRING, whatever you throw at it. One node handles every type, no per-type variants to hunt down.
The inputs you actually set:
any- the value being routed. Wire it from wherever it comes out of your graph.boolean- the switch itself, defaultTrue, so it ships on theon_truebranch until you flip it.
The outputs are on_true and on_false. Only one carries the value per run; the other carries the blocker.
Real uses: A/B two samplers without rewiring, pick between two upscalers, choose a save destination, or toggle a LoRA stack on and off. You can even drive boolean from another node so the graph picks the branch for you. Where people get burned: everything being * means ComfyUI won't warn you when you wire the wrong type in - the error shows up at execution, not when you draw the connection. And the blocked branch genuinely does not run; if you expected something there to always execute, it won't.
Install it through ComfyUI Manager (search "ComfyUI-Arrssenne"), or the old-fashioned way:
cd ComfyUI/custom_nodes
git clone https://github.com/arrssenne/comfyui-arrssenne
then restart ComfyUI. requirements.txt ships just Pillow (which ComfyUI already has) and there are no model downloads - this is a featherweight pack. If you already run crystools or rgthree you've got equivalent switches, so this one is worth knowing mainly because it shows up in the author's shared workflows. For a plain two-way branch, though, the ExecutionBlocker behavior is the part that makes it genuinely useful - and it's the part the bigger packs tend not to tell you about.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| any | * | — | |
| boolean | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| on_true | * | — |
| on_false | * | — |