vx runs and caches a task graph, correctly, and stops there. It is a
task runner and a content-addressed cache for JavaScript monorepos, built
on Bun, with nothing hidden behind a paid cloud.
One run, then the same run again
Eight tasks across four packages, run cold, then run again with nothing
changed:
$ vx run build test --all --force result 8 tasks · 0 cached (0%) · 879ms $ vx run build test --all result 8 tasks · all cached · 2.06s saved · 26ms The second run is 34× faster, because every key matched and every output
was already on disk. A cold run spends its time in your tools, not in the
runner.
What is in the box, and what is not
- In core: the graph, the keys, the scheduler, the local cache and running on this machine. A workspace with no plugins runs and caches.
- Plugins: remote caches, remote execution, telemetry, CI summaries, lockfile-aware keys, AI agents over MCP. Each one sits on a documented seam, and you declare it in
vx.workspace.ts. - Never: a hosted dashboard, a daemon, or a cloud you have to buy into.
Where to go next
- Quickstart: a workspace running under vx in a few minutes, or add vx to an existing repo one package at a time.
- What vx is, and what it refuses to be: the next story.
- Benchmarks: vx, Turborepo, Nx and Vite Task on the same graph, each in its own native config.
- Features: every feature, each with a short post.
Originally published on the vx blog. vx is an MIT task runner and build cache for JS monorepos: github.com/vznjs/vx. Written with AI assistance.

![Why Object.keys(user) Returns string[], Not (keyof User)[]: TypeScript Means It](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2q4w48b9bzs43tynyhsf.png)