Peek Bundle (obvpm)
The debug window for a wire that hides everything
- in
- text
A bundle is one wire carrying a whole name/value mapping - model, clip, vae, your latent, your masks, whatever you packed. That's the whole point of it, and it's also the trap: the moment a dozen values ride one wire, you can no longer see what's on it. A bundle that quietly stopped carrying the thing you think it's carrying looks exactly like a bundle that's fine.
Peek Bundle is the answer to that. It hangs off a bundle wire and prints what's inside it, one line per field, straight onto the node body.
What it shows you
Per field: the name, then a description of the value. Images, masks and raw tensors report type, shape and dtype (Tensor (1, 1024, 1024, 3) float32). Latents report their sample shape. Audio reports waveform shape, sample rate and duration in seconds. Numbers and booleans print themselves, strings are quoted and trimmed at 120 characters, and a nested bundle just lists the names of its own fields. A field that is there but empty reads None.
That's deliberate. Printing the pixel values of a batch would give you pages of numbers that don't answer the question you actually have, which is "is the right thing on this wire, in the right shape?" Shape does answer that. If you want to look at the contents, that's what preview nodes are for.
Nothing is unpacked, converted or loaded while it does this, so leaving one wired in costs you nothing.
Inputs and outputs
Two of them, and you need to know one thing about the shape of the node: there is no bundle pass-through. The only output is text (STRING). So you don't splice Peek Bundle into the middle of a wire - you fan the same bundle output to both your Unbundle and the Peek. One output can feed both, the value is shared, and the Peek never touches execution order for anything downstream.
in takes the packed bundle (OBVPM_BUNDLE). Wire anything else into it and it refuses, with a message naming what you actually sent: the node wants a name/value mapping, not your image.
text is the same report as a plain string, so you can send it to a Show Text or a save-to-file node if you want a record. When text isn't wired, the report still appears on the node - Peek Bundle is an output node, which is why it runs on every queue even when nothing consumes its output. Cheap, but it will show up in the queue every time regardless.
The report survives a reopen - it's the last run's - so you don't have to re-run a forty-minute video graph to find out what was on the wire.
Where it earns its place
Every bundle - through a Lazy Case Switch, into a subgraph, across a Set/Get pair - trades legibility for tidiness, and the bill comes due as a mystery None three nodes downstream. Peek turns "why is my mask empty" into a two-second glance, and Unbundle's own logging (which names weren't in the bundle) covers the other end of the wire.
A plain sanity check too: an output labelled mask is a name, not a promise that the thing behind it isn't a latent.
Installing it
Same pack, same steps as every node here:
cd ComfyUI/custom_nodes
git clone https://github.com/chanon/comfyui-obvpm
Restart ComfyUI. Or install through ComfyUI Manager - search comfyui-obvpm. There are no extra Python dependencies: the pack deliberately ships an empty dependency list because everything it imports (torch, numpy, and friends) already comes with ComfyUI itself.
The pack is new (0.2.0 landed 2026-09-13), so this node has essentially no community track record yet - which is the main reason to read the source-level detail above rather than a forum thread. Search the node menu for obvpm and you'll get every node in the pack; each one carries that suffix on its class id.
Common issues
A report box that looks wrong or won't grow. The report is drawn directly on the node body with a fixed line height, and the drawing code explicitly handles both the classic canvas and Nodes 2.0 mode. If you get a long report and want to read it all, drag the node taller rather than assuming it's broken.
Everything says None. The bundle is reaching you, but the fields you expected aren't in it - usually because a Bundle upstream was rewired or a case-switch branch packed a different set of names. That's the finding, not a bug.
The node vanished from a workflow you opened. Until version 0.2.0 every node in this pack used a bare id (BundlePeek), and Bundle clashed with another pack's node of the same name. 0.2.0 suffixed every id with (obvpm) and old workflows are migrated automatically when they open. If something still misbehaves after opening an old workflow, delete the offending node and drop in a fresh one.
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. |