Bundle
Collapse a dozen wires into one cable
- input_1
- input_2
- input_3
- input_4
- input_5
- input_6
- input_7
- input_8
- input_9
- input_10
- input_11
- input_12
- input_13
- input_14
- input_15
- input_16
- input_17
- input_18
- input_19
- input_20
- input_21
- input_22
- input_23
- input_24
- input_25
- input_26
- input_27
- input_28
- input_29
- input_30
- input_31
- input_32
- bundle
There's a moment in every big ComfyUI workflow where the wires stop being a graph and start being a plate of spaghetti - ten connections from the same branch, all going to different places. Bundle is the decluttering node that collapses many typed wires into a single BUNDLE cable, then lets Unbundle (its sibling) split them back out at the destination. The middle of your graph becomes one clean line instead of a fan of spaghetti.
It's a wildcard node - every slot accepts any type - and it leans on a companion JS extension to make that usable. When you connect a source to an input slot, the extension retypes that slot to match the source and keeps one trailing empty slot visible, so the UI shows you real types even though Python declares everything as *.
How it works
Bundle has up to 32 input_N wildcard slots plus three string widgets. Two of those - bundle_meta and slot_names - are hidden JSON widgets the JS fills with the ordered {names, types} of your connected slots. Why bother? Because that metadata rides along inside the BUNDLE payload, which means Unbundle downstream can restore the correct names and types even across copy-paste or Reroute boundaries, where plain positional unwrapping would fall apart. The user-facing name widget lets UnbundleByName (the same pack) find a Bundle by name even across subgraph boundaries.
The output is a single bundle (a Python dict: name, names, types, sources, values). Unbundle reads it back and returns up to 32 wildcard outputs, retyped and renamed by the JS from the source bundle's metadata. The order is preserved by sources - the JS records the actual slot names, since disconnecting a middle slot can leave gaps.
What you set
- The
input_Nslots - plug in what you want carried. This is the only part you really interact with. name(STRING) - optional, for named unbundling across subgraphs.bundle_meta/slot_names- leave them; the JS manages them.
Where it fits
Big multi-branch workflows - character pipelines, multi-iteration video, anything where a group of values (a latent, a mask, a prompt, a seed) travels together from one stage to the next. If you've ever bundled four wires just to keep a graph readable, this is that, but structured: the types survive the trip, which the DIY reroute approach can't promise.
Installing
Part of Mickmumpitz-Nodes - ComfyUI Manager → "Mickmumpitz" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes
Deps are just numpy, Pillow, opencv-python. The JS companion (bundle.js) loads automatically - if your slots look like generic wildcard * instead of real types, the JS didn't load, which usually means a stale install or a browser cache that needs a hard refresh.
Gotchas
Bundles are resolved at execution time from the metadata - so if you disconnect and reconnect slots after design, the payload reflects the current wiring, and Unbundle's outputs follow it. If your types come out wrong on the far side, rebuild the bundle (disconnect/reconnect one slot) to refresh the metadata. And a fully unconnected Bundle still returns a valid (empty) payload rather than erroring - fine for iterating, easy to forget.
Inputs (35)
| Name | Type | Default | Description |
|---|---|---|---|
| input_1opt | * | — | |
| input_2opt | * | — | |
| input_3opt | * | — | |
| input_4opt | * | — | |
| input_5opt | * | — | |
| input_6opt | * | — | |
| input_7opt | * | — | |
| input_8opt | * | — | |
| input_9opt | * | — | |
| input_10opt | * | — | |
| input_11opt | * | — | |
| input_12opt | * | — | |
| input_13opt | * | — | |
| input_14opt | * | — | |
| input_15opt | * | — | |
| input_16opt | * | — | |
| input_17opt | * | — | |
| input_18opt | * | — | |
| input_19opt | * | — | |
| input_20opt | * | — | |
| input_21opt | * | — | |
| input_22opt | * | — | |
| input_23opt | * | — | |
| input_24opt | * | — | |
| input_25opt | * | — | |
| input_26opt | * | — | |
| input_27opt | * | — | |
| input_28opt | * | — | |
| input_29opt | * | — | |
| input_30opt | * | — | |
| input_31opt | * | — | |
| input_32opt | * | — | |
| nameopt | STRING | — | |
| bundle_metaopt | STRING | {} | — |
| slot_namesopt | STRING | {} | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| bundle | BUNDLE | — |