A local, repo-first web board for triaging git worktrees across parallel coding-agent sessions.
It discovers every repo under your roots, classifies each worktree by lifecycle, surfaces PR / CI /
review state, and does the cleanup itself. Zero runtime dependencies (Node ≥ 18 + git; gh
optional for the PR panel).
Board overview → a worktree's PR / changes detail → filtering by lifecycle (In review, Reclaimable).
# from anywhere
node /path/to/wt-dash/wt-dash.mjs serve # → http://127.0.0.1:4600
# or link it as a command
cd wt-dash && npm link # then: wt-dash serve
# first-time checks
wt-dash doctor # verifies git, gh, editor, terminal, claude, rootsBy default it scans the current working directory. Point it at your code roots via a config file or env (see below).
~/.wt-dash/config.json (all fields optional):
{
"roots": ["/path/to/your/code"],
"bases": ["prod"],
"editor": "code",
"prSkill": "create-pr",
"onCreate": ["cp ../<repo>/.env .env", "npm install"],
"attentionStaleDays": 7,
"maxDepth": 4,
"staleDays": 14,
"port": 4600,
"host": "127.0.0.1",
"ignoreDirs": ["target", "dist"]
}-
prSkill — the Claude Code skill the "Create PR" button runs (
claude "/<prSkill>"). Defaultcreate-pr. -
onCreate — shell commands run inside a new worktree after
wt new/ the + New button (copy env, install deps…). -
attentionStaleDays — a WIP worktree older than this is flagged ⚠ "needs you".
-
roots — where to look for repos (recursively, up to
maxDepth). Default: cwd. -
bases — extra integration branches to test "merged" against, beyond each repo's default branch (which is detected automatically from
origin/HEAD). E.g. add"prod"if you also merge toprod. -
editor — command for the "Open in editor" action (
code,cursor,subl, …). Auto-detected if unset (falls back to the OS file handler; on macOS, a detected VS Code/Cursor/Zed app).
Env overrides: WT_ROOTS (:/;-separated), WT_MAXDEPTH, WT_STALE_DAYS, WT_PORT, WT_HOST,
WT_EDITOR.
- Global chips — counts by lifecycle: Needs you · In review · Active · Stale · Reclaimable — plus ⚠ Attention (CI failing / changes-requested / stale-WIP), a search box, + New worktree, Reclaim all / Prune across every repo, and a 🔔 to enable desktop notifications when something needs you.
- Repo list — each repo, its worktree counts, and bulk Reclaim merged / Prune actions.
- Detail pane — per worktree: lifecycle badges, session link, Resume/Start Claude, editor,
terminal, remove; an editable purpose; the Pull request panel (state, CI, review decision,
reviews, comments via
gh) with Create PR (runs yourprSkillClaude skill), Merge, Re-run failed CI, and Fix CI (launches Claude in the worktree with the failed job logs to diagnose + fix); and the Changes (split/unified diff — commits ahead of base + uncommitted work).
Lifecycle is derived from git: wip (uncommitted) · unpushed · in-review (pushed & ahead) ·
active · stale (>staleDays) · merged (landed → reclaim) · prunable. The PR panel is the
source of truth for actual PR/CI state.
The board reads a manifest per worktree instead of only inferring:
~/.wt-dash/manifests.json, keyed by worktree path — createdAt, creator, baseBranch, status, task, purpose, sessionId, prUrl. Manifest fields win over git-derived ones.
wt-dash new <base> <branch> [--task X --purpose "..." --creator human|agent|pipeline --json]
# canonical create: git worktree add + record a manifest
wt-dash link <path> --session <id> # upsert (used by the SessionStart hook)
wt-dash import # seed manifests for existing worktrees that lack oneClaude Code keys sessions by launch directory. To make a worktree's session discoverable/resumable:
wt-dash install # writes ~/.claude/hooks/wt-manifest-sync.sh (SessionStart back-fill) + prints
# the settings.json snippet to enable itWith the hook enabled, any Claude session run inside a worktree stamps its session id onto the
manifest, so the board can offer Resume Claude. The /new-worktree skill creates worktrees
through wt-dash new so they're tracked from the start.
serve · scan · new · link · import · doctor · config · install — run wt-dash with
no args for the full list.
| OS | Status |
|---|---|
| macOS | ✅ Verified end-to-end. |
| Linux | ✅ Works by design, not yet run in CI. Core is pure Node + git; launchers use xdg-open and gnome-terminal/konsole/xfce4-terminal/xterm; the SessionStart hook is bash (present on Linux). |
| Windows |
Repo discovery is a Node filesystem walk (no Unix find); base branches come from each repo's
origin/HEAD (+ configured bases); the server binds 127.0.0.1.
- The server binds to
127.0.0.1only (it runs git and can remove worktrees). No auth beyond that. ghis optional; without it the PR panel is empty but everything else works.manifests.jsonis a single JSON file without write-locking — fine for single-user local use.- The
install-generated hook and/new-worktreeskill are per-user artifacts (they embed the absolute path of your local copy).
