Universal Inspector (Debug)
Stuck on a wire? See exactly what's flowing through it
- any_input
- text_info
You know the feeling: a workflow works until it doesn't, and the graph gives you nothing to go on. Is that tensor actually [1, 3, 512, 512] or did some node silently flip it? Is your mask coming through as zeros? This is the node for that. SimpleDisplayNode - shown in ComfyUI as "Universal Inspector (Debug)" - is a one-slot tap that you wire into anything, queue, and immediately read what's actually traveling down that wire. If it's an image tensor, it even draws the picture right on the node.
It's the only node in the small ComfyUI-Inspector pack by danielwolber-wood, and it's a debugging tool in the purest sense. Everything else in the ecosystem makes this a natural thing to reach for: rgthree and Impact Pack make big graphs usable, but when you're in "why is this black / why is this NaN" territory, the community debugging principle is change one thing at a time and look. This node is the "look."
How it works
The whole trick is a * wildcard input named any_input, meaning it accepts literally any output from any node. On execution it runs a type check and prints the right detail for whatever arrived:
- Tensors - shape, dtype, device, min/max range, mean, and standard deviation. That's the money case: a black image is usually a tensor whose values are all near 0, and the range line tells you in one second.
- Primitives (int, float, bool, str) - just the type and value.
- Lists / dicts - length and keys, plus a truncated sample.
- Anything else - the Python type name and a stringified snippet, so even a weird object won't silently pass.
Then it checks a heuristic: if the input is a 4D tensor whose last dimension is 1, 3, or 4, it assumes [B, H, W, C] image layout, multiplies by 255 (it expects 0–1 range), clips, and saves a WEBP preview to ComfyUI's temp folder. Batches bigger than one become an animated WEBP at ~10fps so you can scrub through frames. The bundled display_text.js frontend does the rest - a read-only displayed_text widget on the node, auto-resizing, and the preview painted directly onto the node's canvas.
The inputs and outputs
One input, one output, no configuration. any_input is required and takes anything; the only output is text_info (a STRING with the full report). The node is marked as an output node, so it's meant to sit at the end of a wire as a tap - but you can still route text_info into a text-save node if you want the report on disk rather than on screen.
Where people get burned: the image preview only fires for NHWC tensors (the layout VAE-decode and image loaders hand you). Latents are [B, C, H, W] with four channels, so they won't preview - you'd VAE-decode first anyway, and the stats still print, which is the part you usually want. Also, the tensor stats do a full reduce, so on a giant batch there's a small hitch. Harmless for debugging.
Install
No Manager listing drama here, but you can still install it the easy way: ComfyUI Manager → Install Custom Nodes → search "ComfyUI-Inspector", or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/danielwolber-wood/ComfyUI-Inspector
pip install -r ComfyUI-Inspector/requirements.txt # torch, numpy, Pillow - all already in ComfyUI
Restart, double-click, search "Universal Inspector", and you'll find it under DLWW/Utils. There are no model files, no API keys, no heavy dependencies - the requirements are just torch, numpy, and Pillow, all of which your ComfyUI install already has.
Troubleshooting
Honest caveat: this pack has essentially no community footprint - no forum threads, no big-name endorsements, nothing. It's a small personal utility that got published, and it shows: the code is straightforward but the preview resize is a visual hack and there are no knobs. If the preview doesn't appear, check you're feeding it an NHWC image tensor in 0–1 range; if the text widget looks dimmed, that's intentional (read-only styling). For a fix-it node it's genuinely handy, but treat it as a tool, not a dependency - if it stops getting updates, the core _get_details logic is simple enough to lift into your own custom node.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| any_input | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text_info | STRING | — |