Dynamic Pipe Unpack
Turn one wire back into eight
- pipe
- output_1
- output_2
- output_3
- output_4
- output_5
- output_6
- output_7
- output_8
- output_9
- output_10
- output_11
- output_12
- output_13
- output_14
- output_15
- output_16
- output_17
- output_18
- output_19
- output_20
- output_21
- output_22
- output_23
- output_24
- output_25
- output_26
- output_27
- output_28
- output_29
- output_30
- output_31
- output_32
- output_33
- output_34
- output_35
- output_36
- output_37
- output_38
- output_39
- output_40
- output_41
- output_42
- output_43
- output_44
- output_45
- output_46
- output_47
- output_48
- output_49
- output_50
- output_51
- output_52
- output_53
- output_54
- output_55
- output_56
- output_57
- output_58
- output_59
- output_60
- output_61
- output_62
- output_63
- output_64
Dynamic Pipe Unpack is the receiving end of the pair: you feed it the bundled pipe that a Dynamic Pipe Pack produced on the other side of your graph, and it fans the values back out as separate outputs you can wire into whatever actually does the work. Pack near the source, unpack near the destination, and the middle of your workflow stops looking like a plate of spaghetti.
It fills the same role as the unpacking half of the pipe pattern you see in rgthree's Context nodes and Impact Pack's model pipes - it just does it without knowing or caring what kind of values are inside. Images, latents, prompts, strings, models, whatever was bundled, comes back out.
How it works
The backend reads the pipe - a plain dict holding {"slot_count": n, "values": [...]} - and hands back the values in order. Two details are worth knowing because they bite people:
First, it pads. The node always returns all 64 possible output_1 through output_64 slots internally (ComfyUI needs a fixed shape to validate against), and the frontend hides the extras based on the slot_count widget. But if the Pack that made your pipe only bundled 6 values, slots 7 and beyond come back as None, not as an error. That's exactly what you'll see if the two slot counts don't match.
Second, it trusts the pipe, not your widget. Unpack reads the stored values list from the pipe itself, so your visible slot_count mostly controls how many outputs the UI shows. Keep it in sync with the Pack anyway - mismatch is the number one source of confusion here.
The inputs and outputs
Inputs: pipe (the DYNAMIC_PIPE_BUNDLE output from Dynamic Pipe Pack, required) and slot_count (INT, 1–64, default 8 - how many outputs show). Outputs are output_1 … output_64, all wildcard * type, positional: output_1 is whatever went into the Pack's input_1, and so on. There are no names, no semantic labels, no reordering. If you mixed up the order on the Pack side, the whole bundle comes out scrambled and the node will not warn you.
Install
One install covers both nodes. Via ComfyUI Manager, search comfyui_custom_pipe. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/julienpmorand/comfyui_custom_pipe
Restart ComfyUI. No extra dependencies, no model downloads - the pack is just a Python file plus one JS file. It's a young project, so expect rough edges and don't lean on it for mission-critical workflows you can't rewire.
Troubleshooting
- Outputs come out empty /
None- the Pack bundled fewer slots than your Unpack shows. Match the twoslot_countvalues. - Outputs don't appear - click Refresh slots, then hard-refresh your browser if the widget change didn't trigger it.
- Execution errors downstream - because every output is a wildcard, ComfyUI won't stop you connecting
output_3(a string) to an IMAGE input. It'll fail at run time instead. Keep slot order disciplined on both ends.
The short version: it's a dumb, reliable fan-out that asks you to keep track of slot order. Pay it that small tax and it quietly removes a lot of visual noise from big graphs.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | DYNAMIC_PIPE_BUNDLE | — | |
| slot_count | INT | 81–64 | — |
Outputs (64)
| Name | Type | Description |
|---|---|---|
| output_1 | * | — |
| output_2 | * | — |
| output_3 | * | — |
| output_4 | * | — |
| output_5 | * | — |
| output_6 | * | — |
| output_7 | * | — |
| output_8 | * | — |
| output_9 | * | — |
| output_10 | * | — |
| output_11 | * | — |
| output_12 | * | — |
| output_13 | * | — |
| output_14 | * | — |
| output_15 | * | — |
| output_16 | * | — |
| output_17 | * | — |
| output_18 | * | — |
| output_19 | * | — |
| output_20 | * | — |
| output_21 | * | — |
| output_22 | * | — |
| output_23 | * | — |
| output_24 | * | — |
| output_25 | * | — |
| output_26 | * | — |
| output_27 | * | — |
| output_28 | * | — |
| output_29 | * | — |
| output_30 | * | — |
| output_31 | * | — |
| output_32 | * | — |
| output_33 | * | — |
| output_34 | * | — |
| output_35 | * | — |
| output_36 | * | — |
| output_37 | * | — |
| output_38 | * | — |
| output_39 | * | — |
| output_40 | * | — |
| output_41 | * | — |
| output_42 | * | — |
| output_43 | * | — |
| output_44 | * | — |
| output_45 | * | — |
| output_46 | * | — |
| output_47 | * | — |
| output_48 | * | — |
| output_49 | * | — |
| output_50 | * | — |
| output_51 | * | — |
| output_52 | * | — |
| output_53 | * | — |
| output_54 | * | — |
| output_55 | * | — |
| output_56 | * | — |
| output_57 | * | — |
| output_58 | * | — |
| output_59 | * | — |
| output_60 | * | — |
| output_61 | * | — |
| output_62 | * | — |
| output_63 | * | — |
| output_64 | * | — |