A fast, correct task runner for JavaScript monorepos.

vx run ci --all on the starter: cold, three tasks run; again, three up-to-date.

// one run, after you edit app

Everything vx does, in one picture.

at oncesandboxa run’s stages✕ deniedutils#buildfrom cacheui#buildfrom cacheapi#buildfrom cacheapp#buildyou edited app../secrets.envgraphkeyscheduleruncachetelemetryremote cacheOpenTelemetry①②③④✎ runs⑤⑥yours plugs in the same wayat oncesandboxa run’s stages✕ deniedutils#buildfrom cacheui#buildfrom cacheapi#buildfrom cacheapp#buildyou edited app../secrets.envgraphkeyscheduleruncachetelemetryremote cacheOpenTelemetry①②③④✎ runs⑤⑥yours plugs in the same way
One run of vx run build, after you edit app.
  1. 1Tasks. app builds after what it uses.
  2. 2Parallel. ui and api build at once.
  3. 3Cache. Unchanged work comes back from the cache.
  4. 4Only what changed. You edited app; only app runs.
  5. 5Sandbox. A read you did not declare fails the task.
  6. 6Plugins. Swap the cache, runner or telemetry. No fork.

// 3,270 tasks · 1,090 packages · 100 layers · identical commands, identical concurrency

First in every row.

The same synthetic 3,270-task graph under vx, Turborepo and Nx, each bar a multiple of vx.

vxturboreponx

Runner overhead · cold build over the ideal schedule

vx+0:08fastest
turbo+1:3511× vx
nx+31:06221× vx

Cold build · from scratch

baseline3m 38s
vx3m 46sfastest
turbo5m 13s1.4× vx
nx34m 44s9.2× vx

Fully cached · nothing to rebuild

baseline0
vx510msfastest
turbo760ms1.5× vx
nx3.59s7.0× vx

Restoring outputs · cache → disk

baseline0
vx777msfastest
turbo1.17s1.5× vx
nx4.15s5.3× vx

CPU burned · cold build, user + system

baseline0
vx34.61sfastest
turbo1m 13s2.1× vx
nx114m 06s198× vx