XPipe
Twenty wires in one, and a graph that finally stays readable
- xpipe_in
- value_1
- value_2
- value_3
- value_4
- value_5
- value_6
- value_7
- value_8
- value_9
- value_10
- value_11
- value_12
- value_13
- value_14
- value_15
- value_16
- value_17
- value_18
- value_19
- value_20
- value_21
- value_22
- value_23
- value_24
- value_25
- value_26
- value_27
- value_28
- value_29
- value_30
- value_31
- value_32
- value_33
- value_34
- value_35
- value_36
- value_37
- value_38
- value_39
- value_40
- value_41
- value_42
- value_43
- value_44
- value_45
- value_46
- value_47
- value_48
- value_49
- value_50
- xpipe_out
- value_1
- value_2
- value_3
- value_4
- value_5
- value_6
- value_7
- value_8
- value_9
- value_10
- value_11
- value_12
- value_13
- value_14
- value_15
- value_16
- value_17
- value_18
- value_19
- value_20
- value_21
- value_22
- value_23
- value_24
- value_25
- value_26
- value_27
- value_28
- value_29
- value_30
- value_31
- value_32
- value_33
- value_34
- value_35
- value_36
- value_37
- value_38
- value_39
- value_40
- value_41
- value_42
- value_43
- value_44
- value_45
- value_46
- value_47
- value_48
- value_49
- value_50
Big ComfyUI workflows die by a thousand wires. The fix the ecosystem settled on is bundling - carry a whole group of related values down one cable and unpack it at the other end, the way rgthree's Context nodes do. XPipe is this pack's take: a pipe-bundle node with up to 20 any-type slots, per-slot overrides, and a single bundle wire that carries both the data and the slot names. If you've ever tried to move a dozen settings from a control section to a sampler section and watched the canvas turn into a spiderweb, this is the node that collapses that spiderweb into one line.
How it works
Each of the 20 slots (value_1 … value_20) is a MatchType input/output pair, so slot 3 can carry an IMAGE while slot 7 carries a FLOAT - every slot independently conforms to whatever you connect. The bundle wire is the xpipe_in / xpipe_out pair using the pack's custom xpipe type. Connect one XPipe's xpipe_out to another's xpipe_in and the entire group of values plus their names travels as one bundle.
The merge logic is where it gets useful. When a slot has its own input connected, that value overrides whatever came in the bundle at that position; when a slot is empty, it falls back to the bundle's value. So you can chain two XPipes and surgically override just the slots you care about at each stage, which makes it a building block for "config here, override there" workflows. The bundle format is a simple dict tagged __xpipe_bundle__ with a version number, so the node can detect a real bundle vs. garbage on the input.
Port names are customizable - you give slot 5 the name "seed" and slot 12 "cfg" and those names travel in the bundle, so downstream nodes and panels know what each value means without you memorizing positions. The names live in port_names, a serialized JSON string that the XPipe naming panel manages. The tooltip is blunt: don't edit it by hand.
Inputs that matter
- xpipe_in - the upstream bundle.
- value_1 … value_20 - the individual slots; a connected value overrides the bundle at that position.
- port_names - the slot-name JSON, managed by the panel.
Outputs: xpipe_out (the new bundle) plus value_1 … value_20 (the merged values, so you can unpack at the far end or tap individual slots).
Installing it
Part of ComfyUI-Xz3r0-Nodes. ComfyUI Manager: search ComfyUI-Xz3r0-Nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Xz3r0-M/ComfyUI-Xz3r0-Nodes.git
cd ComfyUI-Xz3r0-Nodes
pip install -r requirements.txt
Restart ComfyUI. No extra dependencies.
Gotchas
The author is refreshingly honest here: in the changelog they admit the current interface is a compromise - ComfyUI's frontend constraints forced a less slick design than they wanted, with some efficiency loss in the UI. So expect the naming panel to feel a little clunky; the data machinery is solid, the polish is the trade-off. Second, keep a mental model of the override rule: a connected slot always beats the bundle, so if you're debugging "why isn't my override applying," it's usually the reverse - a leftover connection is overriding the bundle. And 20 slots is a lot of ports on one node; on a small canvas it's visually dense, so the bundle wire is really the way to use it end-to-end. If you just need three wires grouped, rgthree's Context might be lighter; at ten-plus values, XPipe's flat slot model shines.
Inputs (53)
| Name | Type | Default | Description |
|---|---|---|---|
| port_names | STRING | [] | Serialized JSON list of slot names, managed by the XPipe naming panel. Do not edit by hand. |
| type_warning | BOOLEAN | true | Show visual warning on links and output ports when a type mismatch is detected. Disable to hide the warning effect. |
| xpipe_inopt | xpipe | Connect an upstream XPipe bundle here to receive the whole group of data and names at once. A connected slot input still overrides the same position. | |
| value_1opt | COMFY_MATCHTYPE_V3 | Slot 1 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_2opt | COMFY_MATCHTYPE_V3 | Slot 2 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_3opt | COMFY_MATCHTYPE_V3 | Slot 3 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_4opt | COMFY_MATCHTYPE_V3 | Slot 4 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_5opt | COMFY_MATCHTYPE_V3 | Slot 5 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_6opt | COMFY_MATCHTYPE_V3 | Slot 6 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_7opt | COMFY_MATCHTYPE_V3 | Slot 7 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_8opt | COMFY_MATCHTYPE_V3 | Slot 8 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_9opt | COMFY_MATCHTYPE_V3 | Slot 9 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_10opt | COMFY_MATCHTYPE_V3 | Slot 10 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_11opt | COMFY_MATCHTYPE_V3 | Slot 11 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_12opt | COMFY_MATCHTYPE_V3 | Slot 12 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_13opt | COMFY_MATCHTYPE_V3 | Slot 13 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_14opt | COMFY_MATCHTYPE_V3 | Slot 14 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_15opt | COMFY_MATCHTYPE_V3 | Slot 15 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_16opt | COMFY_MATCHTYPE_V3 | Slot 16 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_17opt | COMFY_MATCHTYPE_V3 | Slot 17 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_18opt | COMFY_MATCHTYPE_V3 | Slot 18 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_19opt | COMFY_MATCHTYPE_V3 | Slot 19 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_20opt | COMFY_MATCHTYPE_V3 | Slot 20 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_21opt | COMFY_MATCHTYPE_V3 | Slot 21 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_22opt | COMFY_MATCHTYPE_V3 | Slot 22 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_23opt | COMFY_MATCHTYPE_V3 | Slot 23 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_24opt | COMFY_MATCHTYPE_V3 | Slot 24 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_25opt | COMFY_MATCHTYPE_V3 | Slot 25 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_26opt | COMFY_MATCHTYPE_V3 | Slot 26 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_27opt | COMFY_MATCHTYPE_V3 | Slot 27 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_28opt | COMFY_MATCHTYPE_V3 | Slot 28 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_29opt | COMFY_MATCHTYPE_V3 | Slot 29 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_30opt | COMFY_MATCHTYPE_V3 | Slot 30 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_31opt | COMFY_MATCHTYPE_V3 | Slot 31 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_32opt | COMFY_MATCHTYPE_V3 | Slot 32 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_33opt | COMFY_MATCHTYPE_V3 | Slot 33 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_34opt | COMFY_MATCHTYPE_V3 | Slot 34 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_35opt | COMFY_MATCHTYPE_V3 | Slot 35 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_36opt | COMFY_MATCHTYPE_V3 | Slot 36 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_37opt | COMFY_MATCHTYPE_V3 | Slot 37 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_38opt | COMFY_MATCHTYPE_V3 | Slot 38 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_39opt | COMFY_MATCHTYPE_V3 | Slot 39 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_40opt | COMFY_MATCHTYPE_V3 | Slot 40 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_41opt | COMFY_MATCHTYPE_V3 | Slot 41 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_42opt | COMFY_MATCHTYPE_V3 | Slot 42 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_43opt | COMFY_MATCHTYPE_V3 | Slot 43 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_44opt | COMFY_MATCHTYPE_V3 | Slot 44 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_45opt | COMFY_MATCHTYPE_V3 | Slot 45 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_46opt | COMFY_MATCHTYPE_V3 | Slot 46 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_47opt | COMFY_MATCHTYPE_V3 | Slot 47 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_48opt | COMFY_MATCHTYPE_V3 | Slot 48 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_49opt | COMFY_MATCHTYPE_V3 | Slot 49 input (optional, accepts any data). Overrides the same slot from the bundle when present. | |
| value_50opt | COMFY_MATCHTYPE_V3 | Slot 50 input (optional, accepts any data). Overrides the same slot from the bundle when present. |
Outputs (51)
| Name | Type | Description |
|---|---|---|
| xpipe_out | xpipe | Send the current grouped data and names onward as a single XPipe bundle connection. |
| value_1 | COMFY_MATCHTYPE_V3 | Slot 1 output (data or bundle fallback) |
| value_2 | COMFY_MATCHTYPE_V3 | Slot 2 output (data or bundle fallback) |
| value_3 | COMFY_MATCHTYPE_V3 | Slot 3 output (data or bundle fallback) |
| value_4 | COMFY_MATCHTYPE_V3 | Slot 4 output (data or bundle fallback) |
| value_5 | COMFY_MATCHTYPE_V3 | Slot 5 output (data or bundle fallback) |
| value_6 | COMFY_MATCHTYPE_V3 | Slot 6 output (data or bundle fallback) |
| value_7 | COMFY_MATCHTYPE_V3 | Slot 7 output (data or bundle fallback) |
| value_8 | COMFY_MATCHTYPE_V3 | Slot 8 output (data or bundle fallback) |
| value_9 | COMFY_MATCHTYPE_V3 | Slot 9 output (data or bundle fallback) |
| value_10 | COMFY_MATCHTYPE_V3 | Slot 10 output (data or bundle fallback) |
| value_11 | COMFY_MATCHTYPE_V3 | Slot 11 output (data or bundle fallback) |
| value_12 | COMFY_MATCHTYPE_V3 | Slot 12 output (data or bundle fallback) |
| value_13 | COMFY_MATCHTYPE_V3 | Slot 13 output (data or bundle fallback) |
| value_14 | COMFY_MATCHTYPE_V3 | Slot 14 output (data or bundle fallback) |
| value_15 | COMFY_MATCHTYPE_V3 | Slot 15 output (data or bundle fallback) |
| value_16 | COMFY_MATCHTYPE_V3 | Slot 16 output (data or bundle fallback) |
| value_17 | COMFY_MATCHTYPE_V3 | Slot 17 output (data or bundle fallback) |
| value_18 | COMFY_MATCHTYPE_V3 | Slot 18 output (data or bundle fallback) |
| value_19 | COMFY_MATCHTYPE_V3 | Slot 19 output (data or bundle fallback) |
| value_20 | COMFY_MATCHTYPE_V3 | Slot 20 output (data or bundle fallback) |
| value_21 | COMFY_MATCHTYPE_V3 | Slot 21 output (data or bundle fallback) |
| value_22 | COMFY_MATCHTYPE_V3 | Slot 22 output (data or bundle fallback) |
| value_23 | COMFY_MATCHTYPE_V3 | Slot 23 output (data or bundle fallback) |
| value_24 | COMFY_MATCHTYPE_V3 | Slot 24 output (data or bundle fallback) |
| value_25 | COMFY_MATCHTYPE_V3 | Slot 25 output (data or bundle fallback) |
| value_26 | COMFY_MATCHTYPE_V3 | Slot 26 output (data or bundle fallback) |
| value_27 | COMFY_MATCHTYPE_V3 | Slot 27 output (data or bundle fallback) |
| value_28 | COMFY_MATCHTYPE_V3 | Slot 28 output (data or bundle fallback) |
| value_29 | COMFY_MATCHTYPE_V3 | Slot 29 output (data or bundle fallback) |
| value_30 | COMFY_MATCHTYPE_V3 | Slot 30 output (data or bundle fallback) |
| value_31 | COMFY_MATCHTYPE_V3 | Slot 31 output (data or bundle fallback) |
| value_32 | COMFY_MATCHTYPE_V3 | Slot 32 output (data or bundle fallback) |
| value_33 | COMFY_MATCHTYPE_V3 | Slot 33 output (data or bundle fallback) |
| value_34 | COMFY_MATCHTYPE_V3 | Slot 34 output (data or bundle fallback) |
| value_35 | COMFY_MATCHTYPE_V3 | Slot 35 output (data or bundle fallback) |
| value_36 | COMFY_MATCHTYPE_V3 | Slot 36 output (data or bundle fallback) |
| value_37 | COMFY_MATCHTYPE_V3 | Slot 37 output (data or bundle fallback) |
| value_38 | COMFY_MATCHTYPE_V3 | Slot 38 output (data or bundle fallback) |
| value_39 | COMFY_MATCHTYPE_V3 | Slot 39 output (data or bundle fallback) |
| value_40 | COMFY_MATCHTYPE_V3 | Slot 40 output (data or bundle fallback) |
| value_41 | COMFY_MATCHTYPE_V3 | Slot 41 output (data or bundle fallback) |
| value_42 | COMFY_MATCHTYPE_V3 | Slot 42 output (data or bundle fallback) |
| value_43 | COMFY_MATCHTYPE_V3 | Slot 43 output (data or bundle fallback) |
| value_44 | COMFY_MATCHTYPE_V3 | Slot 44 output (data or bundle fallback) |
| value_45 | COMFY_MATCHTYPE_V3 | Slot 45 output (data or bundle fallback) |
| value_46 | COMFY_MATCHTYPE_V3 | Slot 46 output (data or bundle fallback) |
| value_47 | COMFY_MATCHTYPE_V3 | Slot 47 output (data or bundle fallback) |
| value_48 | COMFY_MATCHTYPE_V3 | Slot 48 output (data or bundle fallback) |
| value_49 | COMFY_MATCHTYPE_V3 | Slot 49 output (data or bundle fallback) |
| value_50 | COMFY_MATCHTYPE_V3 | Slot 50 output (data or bundle fallback) |