π WTF?
Stop guessing what's on that wire β ask WTF?
- anything
Every ComfyUI user eventually stares at a workflow and asks a very specific question: what is actually coming out of that node? The wire is labeled TENSOR, the workflow you downloaded runs, and yet the image is black - or the next node explodes with "expected a list, got a tensor." The WTFDebugNode (display name "π WTF?") is the five-second answer: a tiny debug node that shows you what any output really is, right on the canvas, without leaving ComfyUI. The name is the point - it's for the moments you're wondering what the hell a port is emitting, and it lets you find out instead of guessing.
How it works
One input, one idea. Drag it in, connect anything to its single anything input - any output of any type - queue the workflow, and the node's body fills with a few read-only fields: the Python type of the value, its len() if it's sized, its .shape if it's a tensor, the type of its first child if it's a list, and a multiline box with the string representation of the whole value.
The mechanics are about as clean as ComfyUI node code gets. The input is typed * (ComfyUI's ANY wildcard), INPUT_IS_LIST is on, and execute() walks each item grabbing type, len, .shape, and the first iterable child's type - each wrapped in its own try/except, so a field quietly disappears when it doesn't apply to that type. A string has no .shape; a scalar has no len(); you just see fewer fields, not an error. The node returns only a ui dict - no data outputs - so it's a dead-end by design. It cannot corrupt anything downstream because there is no downstream.
The frontend half is a small JS extension. It renders those fields as disabled text widgets, numbers them when a list has more than one entry (so a 12-image batch shows type 0, type 1, β¦), caps the display at 100 items, and even recolors the connection so an ANY-typed link shows the real type of the source node. It also console.logs every result to your browser devtools - handy, since you can copy clean text out of there.
The one input that matters
anything(type*) - feed it a single output from any node. That's the entire config: no optional inputs, no knobs, no outputs.
The pass-through absence is the real gotcha. Because there's no output, you can't splice this into a pipeline - to inspect mid-chain you duplicate the wire or add a second instance. And it tells you the shape and type of a tensor, not the raw numbers; if you need actual pixel values, grab a PreviewImage or save the image instead.
It's an ANY-typed node, the same wildcard behind the "Anything Anywhere" style of routing node that half the community argues makes workflows unmaintainable. But this one only reads and displays - never routes - so it's the harmless use of the wildcard.
Installing
It's on the ComfyUI Registry, so the normal path is ComfyUI Manager β Install Custom Nodes β search "WTF" (or "DebugNode-ComfyUI"). Or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/webfiltered/DebugNode-ComfyUI
then restart ComfyUI. That's the whole install: there's no requirements.txt, no model downloads, no torch-version fights. It's one Python file, one JS file, MIT-licensed - the rare pack that can't break anything at install time.
Troubleshooting
- The node looks empty until you actually queue a run - it fills on execution, not on connection. Queue, then look.
- A grayed-out field just means that attribute doesn't exist on your value. Not a bug.
- Old data still showing after you rewired? Re-run, or disconnect and reconnect.
- Before you share a workflow, delete it. It's harmless dead weight, but it prints to the console on every single run.
It's a small single-purpose tool, and it earns its place: use it alongside the old community debugging discipline - lock the seed, change one variable at a time - and you'll actually find the bug instead of flailing.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| anything | * | β |
Outputs (0)
No outputs