Scale without the platform
Nx-grade graphs build ~2× faster, and replay fully cached in
0.55s. No daemon, no nx reset, no plugin graph — the win grows
with your repo.
Nx for big repos — and the platform tax: a daemon, a plugin graph, generators. Turborepo for small — until you hit the ceiling. vx is the third option that never existed: the power, the simplicity, faster than either, the tradeoffs of neither.
Cold — built from scratch
Fully cachednothing to rebuild
Restoring outputscache → disk
CPU burnedcold build · user time
vx builds the whole graph in under 4 minutes where Turborepo and Nx take over 8 — burning ~50× less CPU doing it. Once it’s cached, every repeat run replays in under a second, and Nx never catches up. Full benchmarks →
Scale without the platform
Nx-grade graphs build ~2× faster, and replay fully cached in
0.55s. No daemon, no nx reset, no plugin graph — the win grows
with your repo.
Simplicity without the ceiling
Turbo-easy, no wall. Config is real TypeScript, tasks are shell
commands, and vx migrate converts your turbo.json or Nx graph for you.
Caching you can trust
Stale files wiped before every run; resolved-config hashing sees what JSON hashers miss. Neither exists in Turbo or Nx.
Sandboxed builds, built in
Any task under an OS-level file + network allow-list — sandbox: {}. An
undeclared read or a phone-home fails the run. No other runner has it.
bun add -d @vzn/vx# …or grab the standalone binary (no Node or Bun required):curl -fsSL https://raw.githubusercontent.com/vznjs/vx/main/install.sh | sh// vx.config.ts — next to any package's package.jsonimport { defineProject } from '@vzn/vx'
export default defineProject({ tasks: { build: { exec: { command: 'tsc -b' }, dependsOn: ['^build'], cache: { inputs: { files: ['src/**'] }, outputs: { files: ['dist/**'] } }, }, test: { dependsOn: ['build'], exec: { command: 'bun test' }, cache: { inputs: { files: ['src/**', 'tests/**'] }, outputs: { files: [] } }, }, },})vx run build test --all # every package, one shared graphvx run test --affected # only what changed vs the base branchvx run build # again → replays from cache in milliseconds