POLICY deny-by-default · js + ts runtime in rust
A secure JavaScript & TypeScript runtime.
DENY Nothing runs until you grant it.
Runtime, package manager, process manager, test runner, bundler and dev server in a single Rust binary. Filesystem, network, environment, child processes and native addons are blocked by default — for your code and for every dependency it pulls in.
npm install -g @edge_166/3va| Capability | Node.js | Bun | 3va |
|---|---|---|---|
| Filesystem | open | open | DENIED--allow-read |
| Network | open | open | DENIED--allow-net |
| Environment vars | open | open | DENIED--allow-env |
| Child processes | open | open | DENIED--allow-run |
| Native addons | open | open | DENIED--allow-ffi |
| Post-install scripts | runs | allowlist | NEVERopt-in: 3VA_ALLOW_SCRIPTS=1 |
| Per-dependency grants | none | none | SCOPEDenforced per package |
Every capability starts blocked. Grant per invocation — 3va run app.ts --allow-net=api.example.com --allow-read=./data | |||
Runtime benchmarks — 3va vs Node.js vs Bun
Every number is produced by CI on the same GitHub-hosted runner, with all three runtimes built in release mode inside the same run — not hand-edited, not cherry-picked. Bun is the fastest raw engine; 3va beats Node.js on HTTP and Express while enforcing a permission model that costs it tail latency and memory. That cost buys a supply-chain breach you don’t have — a few milliseconds and megabytes are cheap next to what an unscoped post-install script or a spoofed allowlist entry can take from you in production. Security first, numbers honest.
| Metric | 3va | node | bun |
|---|---|---|---|
| Cold starthello world · ms ↓ | 24.1 | 24.9 | 3.9BEST |
| Cold start, TypeScriptno build step · ms ↓ | 24.9 | 65.7 | 3.9BEST |
| HTTP throughput100k req, 1k conn · req/s ↑ | 28,483 | 21,520 | 81,093BEST |
| Express 5 throughputBun's bench/express · req/s ↑ | 18,381 | 6,890 | 18,655BEST |
| p99 latencyHTTP hello world · ms ↓ | 570.65 | 56.78 | 29.1BEST |
| Peak memoryunder 100k requests · MB ↓ | 307.9 | 88.5 | 38.2BEST |
| Install a Next.js appT3 stack, warm cache · ms ↓ | 1,719 | 8,094 | 253BEST |
| Measured on GitHub Actions · 4 vCPU, 15Gi RAM, 6.17.0-1022-azure · commit 466fddc · run #35753909175 on 2026-09-22 · reproduce · test262 conformance: 96.9% (95459/98558, 0 skipped) | |||
The CLI
3va run app.ts # nothing granted by default
3va run app.ts --allow-net=api.example.com # explicit, scoped grants
3va install express --allow-net=registry.npmjs.org
3va audit --secrets # malware + secrets + OSV CVEs
3va start app.js --name my-api # built-in process manager
3va test · 3va bundle · 3va devCI status
Live from GitHub Actions on main.
The benchmark workflow above is the source of every published number —
refreshed with pnpm bench:sync.
- CIsuccess · 2026-09-22
- Security Auditsuccess · 2026-09-22
- Security Pipelinesuccess · 2026-09-22
- CodeQL Security Analysissuccess · 2026-09-22
- Benchmarksuccess · 2026-09-22
- Dependabot Updatessuccess · 2026-09-21
Philosophy
The JavaScript ecosystem has a supply chain security problem. Post-install scripts run arbitrary code at install time. Packages silently access the filesystem and network. There is no enforced boundary between trusted application code and untrusted dependencies.
3va starts from a different premise: deny everything, grant explicitly. The design draws from QubesOS, WASI, and the Chrome sandbox — not from Node.js. Every capability (filesystem, network, env vars, child processes, native addons) is blocked by default and must be declared at the command line. This applies uniformly to application code and to every dependency it pulls in.
Quick start
git clone https://github.com/OdinoCano/3va.git
cd 3va
cargo build --release
sudo cp target/release/3va /usr/local/bin/# Run a script — no permissions granted by default
3va run app.ts # or: 3va r app.ts
# Grant specific capabilities
3va run app.ts --allow-net=api.example.com --allow-read=./data
# Install packages — post-install scripts never run
3va install express --allow-net=registry.npmjs.org
# Audit the dependency tree
3va audit --secrets
# Start as a background daemon
3va start app.js --name my-apiWhy not just use an allowlist?
Bun ships trustedDependencies — an allowlist of packages permitted to run
install scripts. 3va doesn’t have an allowlist for install scripts at all:
they never run, full stop. There’s no list to spoof, no bypass to patch.
See the Comparison page for how this played out in practice
(CVE-2026-24910).
Source of truth
This site is generated from the 3va source repository
— its code, its test suite, and its docs/ folder — not just the README.
Where the README and the code disagree, the code wins.