Timeouts
A hung task is killed and reported as a timeout, not left to stall the run.

A test that waits on a socket forever holds the whole pipeline hostage. Give a task a limit and vx kills it when the limit passes, then marks it failed with the reason.
Set it per task with exec.timeout, for the workspace with timeout, or for one run with --timeout or VX_TASK_TIMEOUT. The task’s own limit always wins.
// config
// packages/api/vx.config.ts
import { defineProject } from '@vzn/vx/config'
export default defineProject({
tasks: {
test: { exec: { command: 'vitest run', timeout: 120_000 } },
},
})More in Run what you mean

Run just the task
Skip the dependency chain when you know it is already built.

Pass arguments through
Arguments after -- reach the task, and the cache keeps each set apart.

Group tasks
Name a set of tasks once and run them with one word.

Source-only packages still count
A package with no build step still moves its dependants’ cache keys when its files change.

Say what a task needs
One short syntax for upstream, cross-project and pattern edges.

A typo never runs half the graph
Ask for a task no project has and vx stops before anything starts.

Filter by tag
Tag projects once, then run a task across every project with that tag.

Filter by folder
Pick projects by where they live, or the root project alone.

Remote pools at their own width
Send work to a remote pool and vx fills the pool, not your laptop’s core count.

Runs take turns
Two runs in one checkout wait for each other instead of fighting over files.