[ The capability firewall for npm ]
Your dependencies run with root. Take it back.
Android-style runtime permissions for node_modules. Every package you install can read process.env, spawn processes and open sockets, the exact powers behind every npm supply-chain attack to date. Capwall makes those powers explicit and blocks every one you didn't grant.
Apache-2.0 · Node ≥ 20.6 · Fail-closed by default
Built on peer-reviewed research
Mir · RWXi membranes · CCS 2021Defensive Capability Analysis · 72.9% of npm needs zero caps · ASE 2026NodeShield & GHunter · import locks · gadget isolation · CCS 2025in-toto · signed attestations · USENIX 2019Runtime Contracts & DIFC · taint lattices · MCP-ITP · 2025–26
[ The problem ]
Ambient authority is the bug. Scanners can't see it.
A string-padding utility can read your Stripe key.
Every package eight levels deep inherits your app's full permissions: env vars, filesystem, network and shell.
Hijacked releases arrive signed and clean.
When a maintainer token is stolen, the malicious version is an official release with no CVE. Static scanners have nothing to flag.
Agents follow instructions they shouldn't.
Coding agents install packages, run scripts and obey text hidden in issues, READMEs and MCP tool descriptions.
[ How it works ]
One file decides what every package can touch.
capabilities.lock sits on exactly one hop: between their packages and your secrets, processes and network. Your own code is never restricted.
- 01
Scan
AST-scans node_modules, a registry tarball or a GitHub repo, with zero install, and writes what each package reaches for.
$ npx @extodan/capwall init → wrote capabilities.lock - 02
Revoke
Deny what you don't trust, allow what you do. The lockfile is plain text, so every change shows up in review.
$ capwall deny some-package child_process $ capwall allow stripe env.read:STRIPE_SECRET_KEY → net.connect:api.stripe.com:443 scoped - 03
Enforce
Loader hooks, module patches and guarded globals. A package stepping outside its grant stops the process cold.
$ capwall run -- node app.js ERR_CAPWALL_CAPABILITY_DENIED
[ Agent Shield · beta ]
Agent safety is a runtime contract, not a prompt.
A system prompt is a suggestion. Capwall sits between your agent and every tool it calls, and tracks what the session has touched, so one poisoned issue can't turn your agent against you.
Bumping axios 1.14.0 → 1.14.1 adds transitive package plain-crypto-js@4.2.1, which requests:
[ PR bot · free for open source ]
Review permissions, not just code.
Capability diff on every PR. Renovate, Dependabot or an agent bumps a package? You see exactly what new power it asks for. Free for public repos and up to 3 private ones.
Merge gates on Team. Turn the comment into a required check that only a signed security-owner approval can clear.
Fleet-wide quarantine. A worm breaks out at 2 a.m. Push a signed policy to every node in seconds, without a redeploy.
[ Free scanner · no signup ]
How many packages can read your secrets right now?
Illustrative numbers. Your report shows the real counts and every package by name.
[ Pricing ]
Free on your laptop. Paid when your team needs a control plane.
[ Open challenge ]
Break the wall.
We put a funded wallet key behind Capwall. Ship a malicious dependency that gets the key out, and the wallet is yours. Bounty: $500 USDC (Verified On-Chain).