Terminal UI for keeping multiple git worktrees in flight at once.
Each row shows live status, PR state, preview deployment, issue link, and coding-agent session activity (Claude Code, Codex, OpenCode) for one worktree, so the whole pile of in-progress work is visible on one screen. The details pane can also pull an AI-generated title and description for each branch from a local OpenAI-compatible LLM endpoint or Google's Gemini API.
Required
- Bun — runtime.
git— worktree mechanics.- A Nerd Font — the TUI uses Nerd Font glyphs for status, PRs, checks, merge-queue position, etc. Without one, those cells render as tofu.
- macOS —
openandpbcopyare assumed for URL/clipboard handling; the webhook daemon installs as a launchd agent.
Optional, per integration
gh(GitHub CLI, authenticated) — the PR row and every in-TUI PR action (auto-merge, mark ready, reviewers, CI log tails).awsCLI with a profile that can read your SST state bucket — when[deploy.sst]is configured (stage row +wt stages).zedCLI —wt openand theo/Okeybindings (the editor is not currently configurable).revdiff— the default F11 diff command. Override[diff].commandto usegitu,lazygit,tig, adeltapipe, etc. instead.- Issue tracker — no CLI or token; the issue id is parsed from branch slugs and linked via a URL template (
[issue_tracker], with a Linear preset), and PRs can open in Linear Reviews. - Dev server — one supervised
npm run dev-style process per worktree ([dev_server]): wt-owned ports, crash restarts with give-up, tmux-backed so it survives wt restarts. - Review bot — the CodeRabbit badge/automation track, retargetable at any PR-review bot (
[review_bot]), including checklist-style GitHub Actions reviewers. - Coding agents — live sessions are detected by reading each agent's local files, no CLI needed; spawning from the TUI needs that agent's CLI on PATH (
claude,codex,opencode). Claude is the most complete integration; Codex and OpenCode are partial today. - An AI provider (OpenAI-compatible endpoint or Gemini) — the generated title + description in the details pane.
rift— an opt-in copy-on-write worktree backend ([backend] kind = "rift"): near-instant checkouts that bringnode_modulesacross for free. See docs/backends.md.
git clone https://github.com/micthiesen/wt.git ~/.wt
cd ~/.wt && bun installAdd to your shell rc:
alias wt='~/.wt/bin/wt'wt refuses to start without a config. The minimal ~/.config/wt/config.toml:
[paths]
main_clone = "~/Code/your-repo"
worktree_root = "~/Code/your-repo-wt"
[branch]
prefix = "yourname" # branches you create get `yourname/<id>-<slug>`Everything else is optional and section-gated: add [deploy.sst], [issue_tracker], [review_bot], [ai], or [github.events] to turn on or retarget that integration; omit it and the related rows hide themselves (the review-bot track defaults to CodeRabbit). The loader validates everything at startup and prints every missing or malformed field at once.
For multiple repositories, put shared personal defaults in the user config and add a .wt.toml at each repository root. Running wt within a repository recursively merges its nearest .wt.toml over the user config, so repository-specific paths and settings win.
The full reference — every option, default, the [[actions]] menu, and [[automations]] — is in docs/configuration.md.
wt with no arguments launches the TUI; press ? inside for the full keymap and glyph legend. Subcommands (wt new, wt rm, wt clean, wt restack, …) run the same operations one-shot from a shell. An opt-in hub mode (wt hub, or [ui] mode = "hub") swaps in a tmux-hosted task inbox next to an always-live coding-agent session; wt classic / wt hub switch freely since both share all on-disk state.
An optional [remote] SSH target lets Ctrl+N create worktrees on a second
machine while keeping them in a server-named section of the same list;
F10/F11/F12 route the selected row's shell, diff, or AI session over SSH, and
d removes it on that host
using the same safety checks as a local worktree. See
docs/configuration.md.
State is push-based: filesystem watchers on git refs, worktree dirs, and wt's own state feed the UI, so it tracks commits, pushes, installs, and deploys without manual refreshing. An optional webhook daemon extends that to GitHub-side events.
| doc | contents |
|---|---|
| docs/tui.md | TUI tour: layout, full keymap, picker conventions |
| docs/hub.md | hub mode: the opt-in task-inbox UI |
| docs/cli.md | every subcommand and flag |
| docs/configuration.md | complete config.toml reference |
| docs/automations.md | the [[automations]] engine: triggers, settle windows, breaker |
| docs/github-events.md | push-based PR/CI updates via a repo webhook |
| docs/stacked-prs.md | stacked PRs: fork-base records, inferred stacks, wt restack |
| docs/backends.md | worktree backends: git-worktree (default) vs rift copy-on-write clones |
| docs/architecture.md | internals: layers, freshness model, module conventions |
| docs/discord.md | Discord server wiring: #updates digest, #github feed, badge |
Questions, ideas, or a setup to show off — join the Discord.
Every action and error goes to a daily file at ~/.cache/wt/logs/app/wt-YYYY-MM-DD.log (14-day retention) — a strict superset of what the activity pane shows. Per-worktree destroy logs live at ~/.cache/wt/logs/<slug>-*.log; wt logs <slug> tails the latest.

