ND Multi Switch
Flip a whole branch's worth of wires with one toggle
- true_1
- false_1
- true_2
- false_2
- true_3
- false_3
- true_4
- false_4
- true_5
- false_5
- true_6
- false_6
- true_7
- false_7
- true_8
- false_8
- true_9
- false_9
- true_10
- false_10
- true_11
- false_11
- true_12
- false_12
- true_13
- false_13
- true_14
- false_14
- true_15
- false_15
- true_16
- false_16
- true_17
- false_17
- true_18
- false_18
- true_19
- false_19
- true_20
- false_20
- true_21
- false_21
- true_22
- false_22
- true_23
- false_23
- true_24
- false_24
- true_25
- false_25
- true_26
- false_26
- true_27
- false_27
- true_28
- false_28
- true_29
- false_29
- true_30
- false_30
- true_31
- false_31
- true_32
- false_32
- out_1
- out_2
- out_3
- out_4
- out_5
- out_6
- out_7
- out_8
- out_9
- out_10
- out_11
- out_12
- out_13
- out_14
- out_15
- out_16
- out_17
- out_18
- out_19
- out_20
- out_21
- out_22
- out_23
- out_24
- out_25
- out_26
- out_27
- out_28
- out_29
- out_30
- out_31
- out_32
Two workflows in one file - the "fast" path and the "good" path - is a normal thing to want. The annoying part is that switching between them means changing six wires at once: model, vae, positive conditioning, negative conditioning, latent, and whatever you're saving. Miss one and you get a Frankenstein run.
What it is
ND Multi Switch is a column of paired inputs, true_N and false_N, with one output per pair, out_N. A single condition boolean decides which column the outputs come from: out_N is true_N when it's on, false_N when it's off. Same node, six values, one click.
The trick that makes it usable rather than fragile: each pair has its own type, set by the first wire you connect to it. Wire an IMAGE into true_1, and true_1, false_1 and out_1 all become IMAGE and are named after the source - image (true), image (false), image (out). The second pair can be a CONDITIONING, the third a LATENT. Pairs are independent, so you're not declaring a schema up front, and ComfyUI won't let you plug the wrong thing into half a pair.
The inputs that matter
condition(BOOLEAN, default on). The author's tooltip: "true: the outputs come from the true inputs. false: from the false inputs." Convert it to an input and drive it from a Primitive Boolean if you want a labelled switch on the canvas, or from a comparison node if you want the graph to decide.true_1…true_32andfalse_1…false_32(all*, optional) - the two columns. You see the pairs in use plus the next free one; a new pair appears as soon as you connect the last.out_1…out_32- one per pair, typed and named after the wires.
Why only half of it runs
Inputs are lazy: the unselected column isn't evaluated. If your "good" path loads a 20 GB checkpoint and a stack of LoRAs, flipping the switch to the fast path means none of that loads. That's not a caching nicety - it's the difference between a snappy workflow and one that loads both models every time you hit queue.
The one behaviour that catches people: if the selected side of a pair is empty while the other side is connected, that output blocks the nodes behind it. They're skipped silently - no red error, no stack trace, just a run that finished without producing what you expected. It's implemented with ComfyUI's execution blocker, so it's deliberate: an empty out_3 means "this value doesn't exist right now", and the nodes that needed it are correctly not run. But if you wired true_3 and left false_3 bare, then flipped the toggle, your output node simply doesn't execute.
Install
Part of Neural Dreamer Nodes (v1.1.0, MIT). No Python dependencies, no model files - the pyproject.toml declares an empty dependency list.
cd ComfyUI/custom_nodes
git clone https://github.com/neural-dreamer/ComfyUI-NeuralDreamer-Nodes.git
Restart ComfyUI and refresh the browser tab; the dynamic pairs are frontend code, so a stale tab shows a stale node. Manager users can search "Neural Dreamer Nodes".
Common issues
The pairs renumbered themselves. As designed, an empty pair between used pairs stays in place so output numbers don't shift under your wiring. If numbers did move, you deleted a pair that was in the middle - check nothing downstream is now reading the wrong out_N.
A pair shows true +, false +, out. That's a free pair: every wire into it was removed, so it went back to untyped. Connect the first wire and it names itself again. A name you set with Rename Slot survives.
Nothing downstream runs. You're on the empty side of a pair. Either wire both sides, or accept the block.
Toggle flips an unrelated widget. If your two paths share a seed or a step count, those come from the same node; the switch only moves the wires you gave it. Convert those widgets to inputs and route them through the switch as a pair too.
I want to compare against a switch that picks by value, not by toggle. That's a different node in the same pack - ND Any Switch picks by index, this one picks by boolean across many values at once. Use this one when the values travel together.
Inputs (65)
| Name | Type | Default | Description |
|---|---|---|---|
| condition | BOOLEAN | true | true: the outputs come from the true inputs. false: from the false inputs. |
| true_1opt | * | — | |
| false_1opt | * | — | |
| true_2opt | * | — | |
| false_2opt | * | — | |
| true_3opt | * | — | |
| false_3opt | * | — | |
| true_4opt | * | — | |
| false_4opt | * | — | |
| true_5opt | * | — | |
| false_5opt | * | — | |
| true_6opt | * | — | |
| false_6opt | * | — | |
| true_7opt | * | — | |
| false_7opt | * | — | |
| true_8opt | * | — | |
| false_8opt | * | — | |
| true_9opt | * | — | |
| false_9opt | * | — | |
| true_10opt | * | — | |
| false_10opt | * | — | |
| true_11opt | * | — | |
| false_11opt | * | — | |
| true_12opt | * | — | |
| false_12opt | * | — | |
| true_13opt | * | — | |
| false_13opt | * | — | |
| true_14opt | * | — | |
| false_14opt | * | — | |
| true_15opt | * | — | |
| false_15opt | * | — | |
| true_16opt | * | — | |
| false_16opt | * | — | |
| true_17opt | * | — | |
| false_17opt | * | — | |
| true_18opt | * | — | |
| false_18opt | * | — | |
| true_19opt | * | — | |
| false_19opt | * | — | |
| true_20opt | * | — | |
| false_20opt | * | — | |
| true_21opt | * | — | |
| false_21opt | * | — | |
| true_22opt | * | — | |
| false_22opt | * | — | |
| true_23opt | * | — | |
| false_23opt | * | — | |
| true_24opt | * | — | |
| false_24opt | * | — | |
| true_25opt | * | — | |
| false_25opt | * | — | |
| true_26opt | * | — | |
| false_26opt | * | — | |
| true_27opt | * | — | |
| false_27opt | * | — | |
| true_28opt | * | — | |
| false_28opt | * | — | |
| true_29opt | * | — | |
| false_29opt | * | — | |
| true_30opt | * | — | |
| false_30opt | * | — | |
| true_31opt | * | — | |
| false_31opt | * | — | |
| true_32opt | * | — | |
| false_32opt | * | — |
Outputs (32)
| Name | Type | Description |
|---|---|---|
| out_1 | * | — |
| out_2 | * | — |
| out_3 | * | — |
| out_4 | * | — |
| out_5 | * | — |
| out_6 | * | — |
| out_7 | * | — |
| out_8 | * | — |
| out_9 | * | — |
| out_10 | * | — |
| out_11 | * | — |
| out_12 | * | — |
| out_13 | * | — |
| out_14 | * | — |
| out_15 | * | — |
| out_16 | * | — |
| out_17 | * | — |
| out_18 | * | — |
| out_19 | * | — |
| out_20 | * | — |
| out_21 | * | — |
| out_22 | * | — |
| out_23 | * | — |
| out_24 | * | — |
| out_25 | * | — |
| out_26 | * | — |
| out_27 | * | — |
| out_28 | * | — |
| out_29 | * | — |
| out_30 | * | — |
| out_31 | * | — |
| out_32 | * | — |