Herdr UI
Herdr의 TUI가 뛰어나며, 창을 통해 추가되는 기능
JavaScript 모노레포용 작업 실행기와 캐시, 선언에 따라 명령 순서와 건너뛰기 결정, 결과를 키로 캐시
A task runner and cache for JavaScript monorepos. It decides which of hundreds of commands must run, in what order, and which to skip, from what each task declares, and caches each result under a key
개발 도구TypeScript · MDXGitHub @vznjs온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
A task runner and cache for JavaScript monorepos. It decides which of hundreds of commands must run, in what order, and which to skip, from what each task declares, and caches each result under a key made from its inputs.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
The fastest way to build a monorepo.
vx runs your task graph, remembers every result, and never does the
same work twice.
The runner adds seconds to a cold build where others add minutes. On a
1,090-package graph of 3,270 tasks whose ideal schedule is 3m 38s,
vx finishes in 3m 46s (+0:08), Turborepo in 5m 13s (+1:35) and Nx in
34m 44s (+31:06) — 8 ms of overhead per package against 88 ms and
1,712 ms, so the graph can grow and the runner stays in seconds. The cold build
burns 35 s of CPU in vx, 73 s in Turborepo and 114 minutes in Nx; a
fully cached run replays the graph in 510 ms.README 전문 보기 ↗Task orchestration with a cache you can trust, on a core you can extend. Each task is one shell command with declared inputs and outputs; vx runs them in dependency order and replays results from a content-addressed cache.
In a git repo:
bunx @vzn/vx init # installs vx, writes an empty root vx.config.ts and the lockfile plugin
A prebuilt binary for Linux (glibc, not Alpine's musl) and macOS, x64 and arm64. Windows: run vx inside WSL2.
A task runs its tool directly, never through a package script. Cache one by saying what it reads and writes:
// packages/app/vx.config.ts
import { defineProject } from '@vzn/vx/config'
export default defineProject({
tasks: {
build: {
exec: { command: 'tsc -b' },
dependsOn: ['^build'], // dependencies build first
inputs: { files: ['src/**', 'tsconfig.json'] },
cache: {
outputs: { files: ['dist/**'] },
},
},
},
})
vx run build --all # builds, in dependency order; stores the results
vx run build --all # nothing changed: up-to-date, in milliseconds
rm -rf packages/*/dist
vx run build --all # restored from the cache, not rebuilt
vx lockinit also writes .vx/projects.lock.json, every project's config as it evaluated.
Commit it. Every run reads its configs from the lock, so run
vx lock and commit the lock again after you:
vx.config.ts or .vx/workspace.ts,Otherwise runs keep the old configs. On CI, vx lock --check fails a
stale lock before any task runs.
Starters: examples/basic, and
examples/ci with a GitHub Actions workflow; CI runs both
on every commit. The CI guide
explains the workflow.
More: Quickstart ·
Configure ·
CLI · every config field.
commands included): remote cache, remote execution, telemetry,
CLI verbs. Core ships none and needs none.What vx can do, not what it is limited to. Declared in .vx/workspace.ts; without any, vx runs and caches locally.
| Package | What it adds |
|---|---|
@vzn/vx-migrate | Migrate from Turbo or Nx: write native configs, keep its remote cache |
@vzn/vx-reapi | Remote cache and remote execution over Bazel's REAPI (NativeLink, BuildBuddy) |
@vzn/vx-lockfile | Key each project on its own lockfile slice: pnpm, bun, npm, yarn |
@vzn/vx-otel | OpenTelemetry traces, metrics and logs, no SDK |
@vzn/vx-ci | GitHub Actions job summary |
@vzn/vx-history | Schedule by the critical path learned from past runs |
@vzn/vx-cache | Remote cache for CI jobs, on a vx cache server |
@vzn/vx-cache-server | The cache server you host: Bun or Docker with S3, or Workers with R2 |
@vzn/vx-history-server | The task timings server vxHistory() reads: Bun, Docker or Workers |
Hosting the three servers: servers docs.
Write your own: plugin guide · architecture.
Beside turbo.json or nx.json, bunx @vzn/vx init runs @vzn/vx-migrate:
it writes a vx.config.ts per package from turbo.json or the Nx graph,
and you keep those and delete the old config. vx init --keep writes only
a .vx/workspace.ts that maps the old config instead, and its lock: a temporary start,
not a way to run the repo. The benchmark below uses native vx config.
Migration guide.
| vx | Turborepo | Nx | |
|---|---|---|---|
| Config | TypeScript, evaluated into the cache key | JSON (static) | JSON (static) |
| Output ownership | Strict: wiped before exec and restore | Additive (stale files survive) | Additive |
| Clean-tree hashing | No source reads (git index OIDs) | git OIDs | re-hash / daemon |
| Daemon | None | None for turbo run | On by default |
| Per-task sandbox | Yes: kernel-level, opt-in, local | No | On Nx Cloud only |
| Plugin API | Yes: every pipeline stage | No | Yes (TS-tied) |
| Install | Single binary; no Bun, Node optional | npm + Node | npm + Node |
Every gap, and when another tool is the better pick: comparison · vx, Turborepo, Nx, Bazel.
package.json and the lockfile are still read.The head-to-head against Turborepo, Nx and Vite Task, each in its own native config, is re-measured on every change to vx and published on the site: benchmarks.
Pre-alpha, dogfooded: this repo lints, tests and builds itself with vx. The schema may still change; 1.0's promise: versioning-1.0.md.
vx is maintained by VZN and takes issues, not pull requests: report a bug or ask for a feature in issues.
vx is MIT licensed. The prebuilt binaries embed Bun and a few npm packages under permissive licenses; their notices ship as THIRD_PARTY_NOTICES.txt in each platform package and GitHub release.
@vzn/vx-devtools| Code the servers and plugins share: the CI OIDC token check |
@vzn/vx-dte | Spread one run over workers your own CI starts |
@vzn/vx-dte-server | The relay dte() meets its workers at: Workers, Bun or Docker |