Longest chain first
The slow task stops starting last.

@vzn/vx-schedule-history learns task durations from your local run history and starts the longest remaining chain first. Short tasks fill the gaps.
A fresh CI runner has no history, so assume names durations up front for the tasks it has not seen.
// config
// vx.workspace.ts
import { defineWorkspace } from '@vzn/vx/config'
import { scheduleHistoryPlugin } from '@vzn/vx-schedule-history'
export default defineWorkspace({
plugins: [scheduleHistoryPlugin({ assume: { 'docs#build': 30_000 } })],
})More in Plugins

A pipeline with seams
Fourteen seams, and core applies no plugin by default.

Remote cache and execution
Distributed builds over Bazel’s open Remote Execution API.

OpenTelemetry
Every run as OTLP traces, metrics and logs, with no SDK.

vx mcp for coding agents
Give your agent the build’s memory over MCP.

This machine is always the floor
Running and caching locally are built in, so a declined plugin hands work back, never drops it.

Ship one app, not the monorepo
vx prune copies a project and its dependencies with a pruned lockfile, for a Docker build.

What the scheduler learned
vx history shows each task’s typical time, peak memory and CPU from past runs.

Code around the run
A plugin can start something before the run and clean up after, within a deadline.

Hosted remote servers, Bazel-style
TLS, mutual TLS and auth headers connect vx to servers such as BuildBuddy.

Remote runs that never repeat
A remote action that already ran replays its outputs and log, without a worker.

A wedged server is just a miss
Downloads are verified and calls have deadlines, so a bad server never hangs a run.

node_modules for stateless workers
Run the install as a remote action, so every worker has node_modules without a shared disk.

Watch CI while it runs
Spans and metrics stream as tasks end, so a dashboard follows the run live.

Tasks packed by memory
The history plugin admits tasks by the peak memory they used before, so a run never runs out.