Peek Bundle (obvpm)
Finally, proof of what is on that wire
- in
- text
Bundling wires into one cable is the best thing that happened to large ComfyUI graphs, and it is also how you lose an afternoon. The moment several values travel together, the graph stops telling you what's inside them: with ten loose wires you can see at a glance that the LoRA output isn't feeding the sampler, and with one bundle wire you can only see that something is connected - the connection is present, the contents are wrong, and there's nowhere on screen to look.
Peek Bundle is the node that gives you somewhere to look.
What it does
Wire a bundle in. It prints one line per field - the name, then a short description of the value - on the node itself, and hands the same report out as a STRING. Images, masks and latents report shape and dtype; audio reports its tensor shape, sample rate and duration in seconds; numbers, booleans and strings report the value itself (long strings get clipped); nested bundles list their field names rather than trying to expand.
It's deliberately a summary, not a dump, and that's the right call. Printing a batch of images produces pages of floats that tell you nothing about whether you grabbed the right tensor, whereas IMAGE torch.Size([4, 1024, 1024, 3]) answers the actual question in one glance. The input is in (type OBVPM_BUNDLE) and the single output is text. There is nothing to configure.
Why it costs nothing to leave in
This is the part that makes it a permanent fixture rather than a debugging node you unplug. Peek Bundle doesn't unpack, convert, or copy anything - it reads the mapping and formats strings. And its text output being unconsumed doesn't stop it running, because it's declared an output node, which is exactly the same mechanism that keeps Preview Image and Save Image alive at the end of a graph. So it runs every time, and the last run's report is still sitting on the node when you reopen the workflow tomorrow morning.
Compare that with the usual diagnostic: wiring a bundle into several Unbundles just to look at things, which both clutters the graph and can change what runs.
When to reach for it
- After a case switch. The pack's Lazy Case Switch picks a branch by name at runtime. When the answer comes out wrong, Peek on the switch's output tells you which branch actually won, and whether its fields are even the ones you thought.
- Before a shared subgraph. If you're feeding one bundle into several consumers, confirm the names match what the consumers are traced to expect.
- When a field is silently
None. An unconnected bundle field unpacks asNone, andNoneon the report line is a much clearer signal than a downstream error three nodes later. - After you rename something. The whole reason bundles are safe is that everything is keyed by name - and Peek is how you check the names that were actually packed, rather than the ones you meant to pack.
It also has a natural partner in the config dialog on Bundle and Unbundle, which is where fields get renamed and hidden. The pack traces Unbundle's pin names back through the wire to whichever Bundle packed them - including through a Lazy Case Switch, across subgraph boundaries, and through KJNodes Set/Get pairs. When two Bundle nodes on different branches disagree about field names, that tracing is exactly where the confusion starts, and Peek is how you find out which one you're holding.
Install
Manager, searching comfyui-obvpm, or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/chanon/comfyui-obvpm
Restart ComfyUI. No extra Python dependencies (the pack declares none - everything it imports already ships with ComfyUI), no models to download. All its nodes appear in the node search under obvpm.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| in | OBVPM_BUNDLE | The packed value to look inside. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | The same report, as text. |