Compatibility Check (obvpm)
Stop answering 'why doesn't your workflow work' — make the workflow check itself
You share a workflow. Someone loads it, and it half-works: a node is red, a sampler quietly uses settings it didn't have in your version, or nothing errors until a step ten nodes later. ComfyUI Manager will tell them which packs are missing. It has never once told them a pack is installed but too old, or that a fork registered the same node name with different widgets.
Compatibility Check is that missing half. A node with no sockets that you drop into a workflow and fill with plain-text requirements: anyone who opens it sees on the node's face whether their install can run it, and if it can't, a run stops there - before a single model loads - with the list of what to fix.
How it works
The whole node is one widget: rules, a multiline string, parsed line by line on the server (compat.py in the pack). Nothing in it is imported or evaluated - a pack is found with a dict lookup, a version is a file read. That matters when the rules arrive inside a stranger's workflow file.
Two places check it. Open the workflow and the frontend posts the rules to /obvpm/compat and paints the result on the node; at run time the node re-checks and refuses. It stops a run early for a structural reason worth knowing: it's an output node with no inputs, so it's ready the moment execution starts and the executor takes it first - the refusal lands before your checkpoint is touched, not after eight minutes of sampling.
Five kinds of rule, six forms:
comfyui >= 0.35.0
frontend >= 1.53.0
comfyui-obvpm >= 0.2.3 https://github.com/chanon/comfyui-obvpm
node SomeNode https://github.com/owner/repo
node SomeNode has some_input https://github.com/owner/repo # the original, not the fork
not node SomeForkNode # its pack replaces a node this workflow needs
not pack ComfyUI-Workflow-Encrypt # rewrites saved workflows
The not forms go the other way - a node or pack that must be absent, for the packs known to break a workflow by being installed alongside it.
some-pack >= 1.2.0 reads the version out of the installed pack's pyproject.toml, and finds the pack by the repository URL on the line first - matched against its [project.urls] and its git remote - falling back to its name, so it works whatever the folder is called. node NodeId has input_name is the sneaky-good one: it catches a fork registering the same node name with different widgets, which loads a saved workflow wrong and reports nothing at all.
Straight from the source: 64 rules max, 16 KB of text. A line that can't be parsed shows as a failure naming that line, and a check that can't be made - a node that won't describe its own inputs - passes rather than blocking you.
The inputs and outputs that matter
Inputs: rules. That's it, and the tooltip is the author's own - one requirement per line, # at the start of a line is a comment, text after # is shown with a failure. You rarely type in it directly: press view details and it renders as a table per rule kind, then hit the ⚙ to make those tables editable, with + Add and a per-row remove. Edit as Text opens the same rules as text for pasting a list in. Nothing applies until you press Apply.
Outputs: none. RETURN_TYPES is empty. Drop it in and leave it.
Two more buttons: copy report copies the install for a bug report - ComfyUI and its commit, frontend version, Nodes 2.0 or classic, Python, torch, OS, UI language, every loaded pack with version and commit. Message & Links puts a short message and links under the all-clear: a tutorial video, a Discord, a support page. Links only open on trusted sites.
Installing it
ComfyUI Manager → Custom Nodes Manager → search comfyui-obvpm → Install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/chanon/comfyui-obvpm
No extra Python dependencies - the pack's pyproject.toml deliberately lists none, because everything it imports (torch, numpy and friends) already ships with ComfyUI. Nothing to download, no models. Every node in the pack has (obvpm) after its name, so typing obvpm in the node search finds them all.
Common issues
A fresh node always says you're fine. The default rules text is entirely comments - every example line starts with #. Out of the box it checks nothing. That's deliberate (a workflow with no stated requirements shouldn't fail), but if you dropped it in expecting an install audit, write some lines.
It isn't a replacement for Manager. Manager installs missing packs; this tells you when what's already installed is the wrong thing - and only one of the two can tell you a version is too old.
A pack rule that says "found, but from a different repository." That's the fork case: the pack was located by name and its origin doesn't match the URL on the line. It's reported, not refused.
The frontend rule reads two different numbers. On the node's face it's the version the page runs; queued, it's whatever ComfyUI serves (its installed comfyui-frontend-package, or the one named with --front-end-version).
A failed check isn't for the person who wrote it. The fix line under each failure is the deliverable: update this pack, uninstall that one, restart. If it doesn't say what to do, the rule was written badly - re-anchor it on the repository URL and check again.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| rules | STRING | # one requirement per line; text after # is shown when it fails # comfyui >= 0.35.0 # frontend >= 1.53.0 # some-pack >= 1.2.0 https://github.com/someone/some-pack # node SomeNode https://github.com/someone/some-pack # node SomeNode has some_input https://... # the original pack, not a fork # not node SomeForkNode # a node whose pack breaks this workflow # not pack Some-Pack-Folder # a pack (by its folder name) that breaks this workflow | One requirement per line: comfyui >= X, frontend >= X, some-pack >= X [repository URL], node NodeId, node NodeId has input_name, not node NodeId, or not pack Name [repository URL]. A github.com URL on the line is shown as a link; text after ' #' with the result. Lines starting with # are ignored. |
Outputs (0)
No outputs