What a run does not do
What a run does not do
A run does no cleanup at exit, never walks the shared store, and shows no "time saved" it did not measure.
vx has no background process watching your files. A run with nothing to do stays quick, and it can never act on a stale view of the tree.
vx runs no background process. When nothing changed, a run over 9,603 tasks still finishes in 559 ms.
| Runner | Nothing changed | Daemon |
|---|---|---|
| vx | 559 ms | none |
| Turborepo | 689 ms | not for turbo run |
| Nx | 12.07 s | off, as in CI |
Synthetic monorepo, 1,601 projects, 9,603 tasks · concurrency 10 · benchmarks
Measured: vx 0.0.0 @ ee4c63a57 on 2026-11-12, Turborepo 2.11.10 on 2026-11-12, Nx 24.0.2 on 2026-11-12, Vite Task 1.4.0 on 2026-11-12; linux x64, 4 cores (AMD EPYC 7763 64-Core Processor), 16 GB.
Nx runs a daemon by default. Turborepo shipped one and, since 2.8.11,
no longer uses it for turbo run.
flowchart LR E[file edit] -->|event| D[daemon's copy of the tree] D -->|what changed| R[run] X[missed event, branch switch, crash] -.-> D D -.->|wrong answer| H[stale cache hit]
A daemon keeps its own copy of your tree. One missed file event and that copy is wrong. For a build cache, wrong means old bytes under a green check.
flowchart LR G[git index] -->|file list + hashes| K[cache keys] S[git status] -->|dirty files| K L[.vx/projects.lock.json] -->|resolved config| K K --> R[run: stat outputs, write nothing]
Each run asks git, which already holds a hash for every clean file. A clean tree is keyed with no read of a source file (how).
Config comes from the lock file, so no vx.config.ts is evaluated. A
hit on an up-to-date tree only checks that the outputs are there
(how).
That is the 559 ms. Nothing stays running after it, and a run in a terminal, in CI or in a container gives the same answer.
More at vznjs.github.io/vx.