Quickstart
Cache your first task in two minutes, in a workspace you already have.
-
Set up vx
Run this at the root of your workspace, inside a git checkout:
Terminal window bunx @vzn/vx initinitinstallsvx, writes an emptyvx.config.tsat the root, and declares your lockfile’s plugin (bun()besidebun.lock) in.vx/workspace.ts. -
Add a task
Give
vx.config.tsabuildtask: the tool it runs, the files it reads, and the files it writes. vx runs the tool itself, with no package script in between.vx.config.ts import type { ProjectConfig } from '@vzn/vx/config'export default {tasks: {build: {exec: { command: 'tsc' },inputs: { files: ['src/**', 'tsconfig.json'] },outputs: { files: ['dist/**'] },cache: true,},},} satisfies ProjectConfigIn a monorepo, give each package its own
vx.config.tsbeside itspackage.json, and adddependsOn: ['^build']to build a package’s dependencies first.At the root,
vx run build --allruns every package’s build.Then save the change for every run to read:
Terminal window vx lockCommit
.vx/and eachvx.lock.jsonit writes beside a config: runs read the lock, and a reviewer reads a config’s tasks in itsvx.lock.json.vx showlists every project the lock holds. -
Run it twice
Terminal window vx run buildvx run buildThe first run builds and stores the result. The second finds nothing changed and skips the work (
up-to-date).my-appis thenamein yourpackage.json:second run ┌─ my-app#build > $ tsc└─ my-app#build ── (3ms) up-to-date -
Change a file and ask why
Edit a file in
src/, run again, and ask vx what changed.verdictnames the file you edited:Terminal window vx run buildvx why buildTerminal window Why my-app#buildrun 01a1a6e5-f341-73e6-9beb-422ab5657b82this run 2026-11-04T14:10:50.333Z · success · executed · key e5165ba21c5d5286previous 2026-11-04T14:10:50.163Z · cache-hit · up-to-date · key 1d1cb0c5a5a357f3verdict cache key changed: file src/index.tsWhat changed 1 of 6change kind name before → afterchanged file src/index.ts d00491fd7e5bb6fa28c517a0bb32b8b506539d4d → 0cfbf08886fca9a91cb753ec8734c84fcbe52c9fWhat to dofile an edit re-runs by design; a file the task does not read belongs out of inputs.files