easy PassOrNone
The plumbing node that turns 'not wired' into a signal you can branch on
- anything
- output
- is_none
easy PassOrNone is the kind of node you scroll past twenty times before you need it once - and then it's quietly the difference between a workflow that breaks and one that degrades gracefully. It does exactly one thing: whatever you feed into its single anything input comes out the other end unchanged, and if nothing is connected (or the input is None), it outputs None plus a handy boolean telling you which case you're in. That's it. No model, no math, no settings.
The name undersells why that matters. In ComfyUI, an optional input you leave unwired simply isn't passed to the node - that convention is the whole basis of "first non-null" fallback logic. But a wildcard * socket hides whether a branch is actually live, and downstream nodes can't tell "you wired nothing here" from "you wired something that happens to be empty." PassOrNone makes that distinction explicit, which is why it belongs to the Easy-Use logic family and is the glue for its ifElse and switch nodes.
How it works
It's a genuine pass-through, written against ComfyUI's newer backend authoring API (io.ComfyNode, the V3 schema style) rather than the old class-mapping registration - so it's one of the newer-feeling Easy-Use nodes and updates with the modern frontend. In code terms it returns anything and anything is None. There is no hidden behavior: no caching trick, no type conversion, nothing that mutates your data. If you're comfortable that an unconnected optional input already arrives as None in vanilla ComfyUI, you're right - this node's value isn't that it changes the engine, it's that it gives you:
- an
outputthat's cleanlyNonewhen the upstream branch is absent, ready for a downstream fallback to skip, - an
is_noneboolean you can wire into aneasy ifElse, a boolean-to-anything converter, or a conditional gate so your graph can react to "the ControlNet isn't plugged in this run" instead of erroring.
The tooltip from the author says it plainly: "Passes the input through, or outputs None when no input is provided." Trust that over any cleverer reading.
The inputs and outputs
There's exactly one optional input, anything, typed * (ComfyUI's wildcard type, so it accepts a model, a latent, a string, conditioning, a pipe - anything). That's the full input surface; there are no required widgets, which makes it one of the least intimidating nodes in the pack to drop onto a canvas.
Outputs are output (same wildcard type as the input) and is_none (BOOLEAN). If you only care about pass-through you can ignore is_none entirely. If you're building a reusable template where an optional feature - a second LoRA, an IPAdapter, a background-removal branch - might or might not be wired, output feeds your fallback and is_none feeds your logic.
Install
Same as every Easy-Use node - it ships in the pack, so you install the pack. In ComfyUI Manager search "ComfyUI Easy Use" and install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Use
Restart ComfyUI afterward, and on Windows run install.bat inside the folder (or ./install.sh on Linux/Mac) once so the pack's dependencies install with your Python. For this node specifically you need none of the heavy requirements.txt entries - no onnxruntime, no clip_interrogator - but the pack installs them anyway, so budget a moment for that the first time.
Common issues and honest caveats
There isn't much to break here, and the real "issue" is a trap of expectation. PassOrNone is not a fallback switch - it has no list of inputs and won't pick the first non-null option. If what you actually want is "whichever of these branches is live wins," that's an easy anythingSwitch or an rgthree-style Any Switch; this node is the source that makes such switches behave when a branch is missing. People also reach for it expecting it to coerce types or re-route, and it does neither. It's a deliberately dumb building block.
One genuinely useful habit: when you're debugging a shared workflow and some optional socket downstream keeps erroring on a missing value, insert PassOrNone on the suspect wire. Because it outputs is_none, you can attach a showAnything-style display and see in one run whether the branch was empty - a fast diagnosis that beats guessing which of forty wires didn't get connected. That's the scenario where this tiny node earns its keep.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| anythingopt | * | Passes the input through, or outputs None when no input is provided. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| output | * | — |
| is_none | BOOLEAN | — |