Nodes/comfyui-obvpm/Unbundle (obvpm)
ComfyUI Node

Unbundle (obvpm)

The outputs name themselves

By chanon·Created 3 months ago·Updated 2 days ago· 120
Unbundle (obvpm)
  • in
  • 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
  • out_33
  • out_34
  • out_35
  • out_36
  • out_37
  • out_38
  • out_39
  • out_40
  • out_41
  • out_42
  • out_43
  • out_44
  • out_45
  • out_46
  • out_47
  • out_48
  • out_49
  • out_50
  • out_51
  • out_52
  • out_53
  • out_54
  • out_55
  • out_56
  • out_57
  • out_58
  • out_59
  • out_60
  • out_61
  • out_62
  • out_63
  • out_64
  • out_65
  • out_66
  • out_67
  • out_68
  • out_69
  • out_70
  • out_71
  • out_72
  • out_73
  • out_74
  • out_75
  • out_76
  • out_77
  • out_78
  • out_79
  • out_80
  • out_81
  • out_82
  • out_83
  • out_84
  • out_85
  • out_86
  • out_87
  • out_88
  • out_89
  • out_90
  • out_91
  • out_92
  • out_93
  • out_94
  • out_95
  • out_96
  • out_97
  • out_98
  • out_99
  • out_100
  • out_101
  • out_102
  • out_103
  • out_104
  • out_105
  • out_106
  • out_107
  • out_108
  • out_109
  • out_110
  • out_111
  • out_112
  • out_113
  • out_114
  • out_115
  • out_116
  • out_117
  • out_118
  • out_119
  • out_120
  • out_121
  • out_122
  • out_123
  • out_124
  • out_125
  • out_126
  • out_127
  • out_128
◄names►
◄get►

A Bundle node packs several values into one wire. Unbundle is the other end: connect the bundle and the outputs appear, already labelled with whatever was packed - model, latent, mask, your own renamed fields. There's no list to type in and nothing to keep in step with the packing side.

Which is the opposite of how the pipe-style nodes in other packs behave, and it's what drives everything below.

How it knows the names

A bundle is an ordered name/value mapping, so the field names are already on the wire. The node's outputs are built in the browser by tracing that wire backwards to whichever node packed it; the server side reads the same keys off the bundle in the same order. Both ends are looking at one list, which is why they agree without you maintaining anything.

The trace is more persistent than you'd expect: it follows the wire through subgraph boundaries, through KJNodes Set/Get pairs, and through a Lazy Case Switch - that last one only when every connected branch packs the same field names, which is exactly when the answer is the same whichever branch runs. Branches that pack different fields have no single answer, so no names are offered and you give the consumer an explicit list instead, matched by name.

Inputs and outputs

in takes the bundle. It's required and it's strict: wire anything that isn't a name/value mapping into it and the node refuses rather than guessing.

names is optional and normally invisible - the config dialog writes it. One field per line, in output order; leave it empty and you get the bundle's own fields as packed. This is also the switch for taking a subset: hide the fields a branch doesn't need and only those get exposed.

The outputs are out_1 through out_16, all typed as wildcards (*). Sixteen matches Bundle's ceiling, so you won't hit it from this side. The wildcard typing is convenience with a catch: ComfyUI will let you plug an output into anything, including something wrong.

The config dialog is the other half of the node

Click the ⚙, right-click → Configure…, or double-click the node: you get the field list, where you can reorder and hide. Two behaviours matter:

  • Reordering moves the wires with their fields. A wire carrying mask still carries mask wherever it ends up. You're rearranging labels, not shuffling values by position.
  • Hiding is how you take a single field. A field with something connected to it can't be hidden - unplug it first, deliberately, so a live wire can't disappear behind a checkbox.

Once you've set a layout, it also pins the outputs. Fields added upstream later append at the end instead of shifting every pin down; a field that disappears upstream while still wired keeps its pin and outputs None (with a log line naming it) rather than silently re-meaning everything below it. That's the behaviour you want, and it's the opposite of what most people expect from a dynamic-socket node.

Debugging what comes out

When an output is None, ask whether the bundle ever had that field. Peek Bundle, from the same pack, prints every field name and a one-line shape summary onto its node body - hang one off the same bundle wire. The log is the second place to look: Unbundle logs which names it asked for and which the bundle didn't have.

Bundles also nest: put a bundle inside another bundle and a second Unbundle on that field exposes its members - the trace follows back through the outer Unbundle to whichever Bundle packed it, at any depth.

Installing it

cd ComfyUI/custom_nodes
git clone https://github.com/chanon/comfyui-obvpm

Restart, or install through ComfyUI Manager by searching comfyui-obvpm. No Python dependencies - the pack's list is deliberately empty, since everything it imports ships with ComfyUI. The class id is Unbundle (obvpm); searching the node menu for obvpm lists the whole pack.

Common issues

"Expected a bundle" on the input. You've wired a raw value - an image, a latent - into in. Only a Bundle-family output goes here. Unbundle is also the node that refuses unsaved/renamed field wiring loudest, so read the log rather than assuming the node is broken.

An output is None and you can't see why. Either the field was renamed on the packing side (names are matched exactly), or you're downstream of a case switch whose branches pack different fields, in which case your names list is doing the matching and one branch simply doesn't have that key.

No outputs appear at all. The client-side trace failed - which happens when you paste an Unbundle into a fresh workflow with nothing connected. Connect the bundle and they populate.

Nodes from a workflow saved before 2026-09-13. The pack renamed all its class ids in 0.2.0 after an id clash with another pack's Bundle node; old workflows migrate automatically on open, and an API-format prompt is rewritten server-side. If the Bundle node still doesn't work after the migration, delete it and create a new one.

Categoryobvpm/bundle

Inputs (3)

NameTypeDefaultDescription
inoptOBVPM_BUNDLEThe packed value from a Bundle node.
namesoptSTRINGWritten by the config dialog: the fields to expose, one per line, in output order. Empty = the bundle's own fields as packed.
getoptSTRINGThe constant's name, shown when 'get' is on in the node's settings. Shared with KJNodes Set/Get: a KJ Get can read a bundle set by a Bundle, and an Unbundle can get a KJ Set that carries a bundle.

Outputs (128)

NameTypeDescription
out_1*The bundle's value for field 1.
out_2*The bundle's value for field 2.
out_3*The bundle's value for field 3.
out_4*The bundle's value for field 4.
out_5*The bundle's value for field 5.
out_6*The bundle's value for field 6.
out_7*The bundle's value for field 7.
out_8*The bundle's value for field 8.
out_9*The bundle's value for field 9.
out_10*The bundle's value for field 10.
out_11*The bundle's value for field 11.
out_12*The bundle's value for field 12.
out_13*The bundle's value for field 13.
out_14*The bundle's value for field 14.
out_15*The bundle's value for field 15.
out_16*The bundle's value for field 16.
out_17*The bundle's value for field 17.
out_18*The bundle's value for field 18.
out_19*The bundle's value for field 19.
out_20*The bundle's value for field 20.
out_21*The bundle's value for field 21.
out_22*The bundle's value for field 22.
out_23*The bundle's value for field 23.
out_24*The bundle's value for field 24.
out_25*The bundle's value for field 25.
out_26*The bundle's value for field 26.
out_27*The bundle's value for field 27.
out_28*The bundle's value for field 28.
out_29*The bundle's value for field 29.
out_30*The bundle's value for field 30.
out_31*The bundle's value for field 31.
out_32*The bundle's value for field 32.
out_33*The bundle's value for field 33.
out_34*The bundle's value for field 34.
out_35*The bundle's value for field 35.
out_36*The bundle's value for field 36.
out_37*The bundle's value for field 37.
out_38*The bundle's value for field 38.
out_39*The bundle's value for field 39.
out_40*The bundle's value for field 40.
out_41*The bundle's value for field 41.
out_42*The bundle's value for field 42.
out_43*The bundle's value for field 43.
out_44*The bundle's value for field 44.
out_45*The bundle's value for field 45.
out_46*The bundle's value for field 46.
out_47*The bundle's value for field 47.
out_48*The bundle's value for field 48.
out_49*The bundle's value for field 49.
out_50*The bundle's value for field 50.
out_51*The bundle's value for field 51.
out_52*The bundle's value for field 52.
out_53*The bundle's value for field 53.
out_54*The bundle's value for field 54.
out_55*The bundle's value for field 55.
out_56*The bundle's value for field 56.
out_57*The bundle's value for field 57.
out_58*The bundle's value for field 58.
out_59*The bundle's value for field 59.
out_60*The bundle's value for field 60.
out_61*The bundle's value for field 61.
out_62*The bundle's value for field 62.
out_63*The bundle's value for field 63.
out_64*The bundle's value for field 64.
out_65*The bundle's value for field 65.
out_66*The bundle's value for field 66.
out_67*The bundle's value for field 67.
out_68*The bundle's value for field 68.
out_69*The bundle's value for field 69.
out_70*The bundle's value for field 70.
out_71*The bundle's value for field 71.
out_72*The bundle's value for field 72.
out_73*The bundle's value for field 73.
out_74*The bundle's value for field 74.
out_75*The bundle's value for field 75.
out_76*The bundle's value for field 76.
out_77*The bundle's value for field 77.
out_78*The bundle's value for field 78.
out_79*The bundle's value for field 79.
out_80*The bundle's value for field 80.
out_81*The bundle's value for field 81.
out_82*The bundle's value for field 82.
out_83*The bundle's value for field 83.
out_84*The bundle's value for field 84.
out_85*The bundle's value for field 85.
out_86*The bundle's value for field 86.
out_87*The bundle's value for field 87.
out_88*The bundle's value for field 88.
out_89*The bundle's value for field 89.
out_90*The bundle's value for field 90.
out_91*The bundle's value for field 91.
out_92*The bundle's value for field 92.
out_93*The bundle's value for field 93.
out_94*The bundle's value for field 94.
out_95*The bundle's value for field 95.
out_96*The bundle's value for field 96.
out_97*The bundle's value for field 97.
out_98*The bundle's value for field 98.
out_99*The bundle's value for field 99.
out_100*The bundle's value for field 100.
out_101*The bundle's value for field 101.
out_102*The bundle's value for field 102.
out_103*The bundle's value for field 103.
out_104*The bundle's value for field 104.
out_105*The bundle's value for field 105.
out_106*The bundle's value for field 106.
out_107*The bundle's value for field 107.
out_108*The bundle's value for field 108.
out_109*The bundle's value for field 109.
out_110*The bundle's value for field 110.
out_111*The bundle's value for field 111.
out_112*The bundle's value for field 112.
out_113*The bundle's value for field 113.
out_114*The bundle's value for field 114.
out_115*The bundle's value for field 115.
out_116*The bundle's value for field 116.
out_117*The bundle's value for field 117.
out_118*The bundle's value for field 118.
out_119*The bundle's value for field 119.
out_120*The bundle's value for field 120.
out_121*The bundle's value for field 121.
out_122*The bundle's value for field 122.
out_123*The bundle's value for field 123.
out_124*The bundle's value for field 124.
out_125*The bundle's value for field 125.
out_126*The bundle's value for field 126.
out_127*The bundle's value for field 127.
out_128*The bundle's value for field 128.