Config errors that point
A bad config fails at load with the file, the line and the key, no stack trace.

A stack trace from inside a tool tells you nothing about your config. vx shows the line in your file, a caret under the value and what it should be.
Fix it and run again; nothing ran with the broken config.
// what it prints
vx: packages/api/vx.config.ts:8:42: tasks.hang.exec.timeout must be a positive integer (milliseconds)
> 8 | hang: { exec: { command: 'sleep 30', timeout: '1s' } },
| ^More in Config

One command per task
A task is a shell command with edges and a cache block; nothing boots in between.

Rules that catch slow configs
Checks for configs that would make runs slow or wrong, on by default, each one optional.

A config that hangs, named
A config whose evaluation runs away fails after a deadline, naming the file.

No runs inside runs
A vx run inside a task of the same workspace is refused, with the reason.

Config with autocomplete
defineProject gives you completion and errors while you type.

Presets are just functions
Share task setups across projects with a TypeScript function, no new concept.