Unbundle
Un-knotting the wire spaghetti in Mickmumpitz workflows
- bundle
- 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
There's a moment in every big ComfyUI build where the canvas stops being a graph and becomes pasta. Thirty wires crossing each other, none of them pointing where you expect. Mickmumpitz's answer - and it's a good one - is the Bundle/Unbundle pair: Bundle collapses up to 32 wires into one cable for transit, and Unbundle is the other end that splits them back out.
It lives in the Utils section of Mickmumpitz-Nodes, the pack behind the author's consistent-character and long-form video workflows. This node by itself does nothing - it's the counterpart that makes the Bundle node useful, and it's aimed squarely at the "this workflow is too big to read" problem that the ComfyUI ecosystem keeps producing.
How it works
On the way in, the Bundle node builds a single payload dict: the values of every connected slot plus the slot names and types, recorded at graph-design time by the pack's JS extension. That metadata is what makes the bundle survivable - the payload can be copied, pasted, and routed through Reroute nodes without losing track of which wire is which.
Unbundle is the decoder. It takes that payload, unpacks the values in order, and pads the rest with None up to its 32 output slots. Because the slots are wildcard-typed, the JS extension retypes and renames each output to match the source Bundle node when you connect it, walking through Reroutes to find the origin. So you see real names like prompt, latent, image on the outputs instead of output_1, output_2, …
Inputs and outputs that matter
- bundle - the
BUNDLEcable to split. - saved_meta - an optional hidden-ish string that carries the slot metadata; you shouldn't need to touch it.
Outputs are output_1 through output_32, wildcard-typed, and the JS renames them to match the source bundle.
Where you'd actually use it
Any workflow where the visual wiring is the bottleneck: subgraphs, shared node groups, or graphs you know other people will open and need to understand. Bundle the noisy wires going into a region, Unbundle on the other side, and the section in the middle becomes one clean line. If you only have one bundle, plain Unbundle is all you need; the pack's Unbundle by Name variant is for when you have many bundles and want to pick one by name instead of by wire.
Install
It ships in Mickmumpitz-Nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes
then restart - or search "Mickmumpitz" in ComfyUI Manager. No models, light deps (numpy/Pillow/opencv-python).
The caveat
If an output comes out None, that's the signal a slot wasn't connected on the Bundle side - and whatever's downstream will throw its own confusing error. It's the price of the * wildcard type: the graph will let you mis-wire things that a typed socket would have caught. Used for tidiness it's great; used as a hiding place for bad wiring, it's a debugging trap.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| bundle | BUNDLE | — | |
| saved_metaopt | STRING | {} | — |
Outputs (32)
| 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 | * | — |