1. Paste your extension snapshot
2. What changed
Surface changed since the older snapshot
| Extension | Versions | Risk flags |
|---|
Updated version only (no declared surface change)
| Extension | Versions |
|---|
Newly installed
| Extension | Version |
|---|
No longer installed
| Extension | Version |
|---|
Activates unconditionally on every startup
Informational, not a finding on its own -- some extensions legitimately need this. Worth knowing which ones do.
| Extension | Version |
|---|
Prefer a CLI, or want this as a CI gate?
Same logic, zero dependencies, one file — and it can read your local extensions directory directly, which a browser cannot do:
node cli.mjs snapshot --out baseline.json # scans your extensions dir, commit this once after review # ...time passes; an extension auto-updates... node cli.mjs snapshot --out current.json node cli.mjs diff baseline.json current.json # exit 1 only if something's surface changed node cli.mjs diff baseline.json current.json --ignore ms-python.python node cli.mjs check current.json # live Marketplace lookup -- the only command that touches the network
Get cli.mjs — Node 18+, nothing to install. snapshot and diff read only local files: no network call, ever. Only check talks to the network, from your machine, and only when you run it.
Real, dated incidents that used exactly this mechanism
| Campaign | Marketplace | Since | What happened |
|---|
More: why VS Code doesn't warn you when an extension is delisted, and how to wire the CLI into CI. Comparing against a pre-install code scanner instead? See this checker vs. vsix-audit or this tool vs. VSCan.
Common questions
Why doesn't VS Code already warn me about this?
VS Code auto-updates extensions silently and has no mechanism to tell you an installed extension's activation surface changed, or that it was later pulled from the marketplace for being malicious. If you already have it installed when that happens, it keeps running with no notice — auto-update just quietly stops offering a newer version.
Is this a malware scanner?
No. It reports a structural difference between two snapshots of an extension's declared manifest fields (when it activates, what it depends on, its entry point), and a factual marketplace-resolution check. A flag means "read this one", not "this is malware" — it is not exhaustive and it is not a verdict.
Is my extension list uploaded anywhere?
No. The browser page parses the snapshot you paste entirely in your own browser and never sends it anywhere. The CLI's snapshot and diff commands read only local files — no network call, ever. Only the CLI's separate check command talks to the network, on your own machine, and only when you run it.
What do I paste in?
The output of node cli.mjs snapshot for the full picture, or the plain output of code --list-extensions --show-versions (Cursor and Windsurf have the same flag) for a quick id/version-only check.