Skip to content

vx

End the Nx-or-Turbo compromise. Nx-scale power, Turbo-grade simplicity — faster than both, with the tradeoffs of neither.

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

vx
3m 48s
Turborepo
8m 18s
Nx
8m 27s

Fully cachednothing to rebuild

vx
0.55s
Turborepo
1.60s
Nx
9.86s

Restoring outputscache → disk

vx
0.89s
Turborepo
2.00s
Nx
10.44s

CPU burnedcold build · user time

vx
22.7s
Turborepo
1,250s
Nx
2,038s

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.

Terminal window
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.json
import { 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: [] } },
},
},
})
Terminal window
vx run build test --all # every package, one shared graph
vx run test --affected # only what changed vs the base branch
vx run build # again → replays from cache in milliseconds