Skip to Content

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.

Installsingle rust binary
$npm install -g @edge_166/3va

Follow the quick start →3va vs Node.js vs Bun

First-run capability policynode · bun · 3va
CapabilityNode.jsBun3va
FilesystemopenopenDENIED--allow-read
NetworkopenopenDENIED--allow-net
Environment varsopenopenDENIED--allow-env
Child processesopenopenDENIED--allow-run
Native addonsopenopenDENIED--allow-ffi
Post-install scriptsrunsallowlistNEVERopt-in: 3VA_ALLOW_SCRIPTS=1
Per-dependency grantsnonenoneSCOPEDenforced 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.

Metric3vanodebun
Cold starthello world · ms ↓24.124.93.9BEST
Cold start, TypeScriptno build step · ms ↓24.965.73.9BEST
HTTP throughput100k req, 1k conn · req/s ↑28,48321,52081,093BEST
Express 5 throughputBun's bench/express · req/s ↑18,3816,89018,655BEST
p99 latencyHTTP hello world · ms ↓570.6556.7829.1BEST
Peak memoryunder 100k requests · MB ↓307.988.538.2BEST
Install a Next.js appT3 stack, warm cache · ms ↓1,7198,094253BEST
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 dev

CI status

Live from GitHub Actions  on main. The benchmark workflow above is the source of every published number — refreshed with pnpm bench:sync.

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

Terminal
git clone https://github.com/OdinoCano/3va.git cd 3va cargo build --release sudo cp target/release/3va /usr/local/bin/
Terminal
# 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-api

Why 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.