Where a task run spends its time
Where a task run spends its time
We traced one workspace through vx, Turborepo 2.11.8 and Nx 23.3.0, cold and warm. A cold run is the tasks. A warm run is how little the tool does.
984 task-runner cases, compiled from the test suites of Nx, Turborepo, Vite Task, moon, Nix and vx, run sandboxed against all six. Every result is on one page.
Each case is a small workspace and the outcome a user would see. All six tools run the same 984 cases, each in a sandbox.
xychart-beta title "Cases passed, of 984" x-axis [vx, Nx, Turborepo, moon, "Vite Task", Nix] y-axis "cases" 0 --> 984 bar [982, 640, 627, 579, 499, 473]
vx 747b26f · Turborepo 2.11.10 · Nx 24.0.2 · Vite Task 1.4.0 · moon 2.6.5 · Nix 2.34.6 · 2026-11-07 · every case
The cases are compiled from the test suites of Nx, Turborepo, Vite Task, moon, Nix and vx. A case names no tool’s config. It says which projects exist, what each task runs, and what must hold afterwards.
flowchart LR W[small workspace] --> S[steps: edit, commit, run] S --> A1[which commands ran] S --> A2[files left on disk] S --> A3[exit code] S --> A4[what the tool reports]
A thin adapter turns the case into each tool’s own config. The harness marks each command as it starts and ends, so “ran” means it ran.
| Group | Cases | vx | Nx | Turborepo | moon | Vite Task | Nix |
|---|---|---|---|---|---|---|---|
| graph | 149 | 149 | 113 | 91 | 84 | 86 | 57 |
| inputs | 302 | 302 | 186 | 187 | 192 | 177 | 175 |
| outputs | 223 | 223 | 156 | 160 | 122 | 139 | 158 |
| affected | 97 | 97 | 57 | 68 | 69 | 0 | 0 |
| watch | 31 | 31 | 27 | 28 | 0 | 0 | 0 |
| sandbox | 18 | 18 | 0 | 1 | 0 | 1 | 15 |
A case a tool cannot express counts as not passed. Its users cannot get that behaviour either.
Args forwarded to a server reach it as typed, never expanded by a shellvx passmoon passNx fail seen.txt is "<0><0>…", expected "<$(id -u)><`id -u`>…"Every case carries three or four sentences on what goes wrong without
it. Here a second shell ran $(id -u), a command nobody typed.
vx misses 2 cases. Both need programs a dependency puts on PATH, which vx left to the tools you already have.
All cases, filters and each tool’s detail: Conformance. More at vznjs.github.io/vx.