Worktrunk logo  Worktrunk

[![Docs](https://img.shields.io/badge/docs-worktrunk.dev-blue?style=for-the-badge&logo=gitbook)](https://worktrunk.dev) [![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue?style=for-the-badge)](https://opensource.org/licenses/MIT) [![CI](https://img.shields.io/github/actions/workflow/status/max-sixty/worktrunk/ci.yaml?event=push&branch=main&style=for-the-badge&logo=github)](https://github.com/max-sixty/worktrunk/actions?query=branch%3Amain+workflow%3Aci) [![Codecov](https://img.shields.io/codecov/c/github/max-sixty/worktrunk?style=for-the-badge&logo=codecov)](https://codecov.io/gh/max-sixty/worktrunk) [![Stars](https://img.shields.io/github/stars/max-sixty/worktrunk?style=for-the-badge&logo=github)](https://github.com/max-sixty/worktrunk/stargazers) [![maintained with tend](https://img.shields.io/badge/maintained_with-tend-bba580?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwxNikgc2NhbGUoMC4wMTI1LC0wLjAxMjUpIiBmaWxsPSIjZmZmIiBzdHJva2U9Im5vbmUiPjxwYXRoIGQ9Ik02ODAgMTEyOCBjNjIgLTk2IDY5IC0xNzggMjAgLTI0MSAtMTcgLTIyIC0yMCAtNDAgLTIwIC0xMzQgbDEgLTEwOCAyMSAyOCBjMTEgMTYgMzAgNDcgNDIgNzAgMTIgMjIgMzIgNDkgNDYgNTkgMzcgMjcgMTE0IDM4IDE4NCAyNyA5MyAtMTUgOTQgLTE4IDQ0IC03OSAtNzIgLTg4IC0xMDkgLTExMyAtMTc2IC0xMTcgLTMxIC0yIC02NCAxIC03MiA2IC0yMyAxNSAyMSA1NiAxMDcgOTggNDAgMjAgNzEgMzggNjkgNDAgLTYgNyAtODggLTE3IC0xMjYgLTM3IC00OSAtMjUgLTEwMCAtNzggLTEyMSAtMTI1IC0xNSAtMzMgLTE5IC02NiAtMTkgLTE4OCAwIC0xNTcgOCAtMTk1IDUwIC0yMzIgMTcgLTE2IDM2IC0yMCA4NSAtMTkgNjIgMSA2MyAxIDczIC0zMiA5IC0zMiA5IC0zMyAtMjIgLTQwIC01MCAtMTIgLTEzMiAtNyAtMTY0IDEwIC00MCAyMSAtNzkgNjkgLTkyIDExNCAtNSAyMCAtMTAgMTAyIC0xMCAxODIgMCA4MCAtNSAxNjIgLTExIDE4NCAtMjIgNzkgLTEzNSAxNjYgLTIzNCAxODEgLTM3IDYgLTM1IDMgMzAgLTI4IDc4IC0zOSAxNDQgLTkxIDEzMiAtMTA0IC01IC00IC0zNyAtOCAtNzEgLTggLTc3IDAgLTExNyAyNCAtMTgyIDEwOSAtNTIgNjggLTUxIDcwIDQyIDg1IDcxIDExIDE0MyAwIDE4MyAtMjkgMTYgLTExIDQwIC00MyA1NCAtNzMgMTMgLTI5IDMyIC01OSA0MSAtNjYgMTQgLTEyIDE2IC03IDE2IDU4IDAgNTkgNCA3NyAyMyAxMDIgMTkgMjYgMjMgNDYgMjUgMTMwIDMgNjcgMCA5OSAtNyA5OSAtNyAwIC0xMSAtMjMgLTEyIC01NyAwIC0zMiAtNiAtNzYgLTEyIC05NyBsLTEyIC00MCAtMjcgMzIgYy0zNCA0MSAtNDMgOTYgLTI0IDE1MSAxNCA0MSA3NSAxNDEgODYgMTQxIDMgMCAyMSAtMjQgNDAgLTUyeiIvPjwvZz48L3N2Zz4K)](https://github.com/max-sixty/tend) > **June 2026**: Worktrunk was [released](https://x.com/max_sixty/status/2006077845391724739?s=20) at the start of the year, and has quickly become the most popular git worktree manager. It's built with love (there's no slop!). Please let me know any frictions at all; I'm intensely focused on continuing to make Worktrunk excellent, and the biggest help is folks posting problems they perceive. Worktrunk is a CLI for git worktree management, designed for running AI agents in parallel. Worktrunk's three core commands make worktrees as easy as branches. Plus, Worktrunk has a bunch of quality-of-life features to simplify working with many parallel changes, including hooks to automate local workflows. A quick demo: ![Worktrunk Demo](https://cdn.jsdelivr.net/gh/max-sixty/worktrunk-assets@main/assets/docs/light/wt-core.gif) > ### πŸ“š Full documentation at [worktrunk.dev](https://worktrunk.dev) πŸ“š ## Context: git worktrees AI agents like Claude Code and Codex can handle longer tasks without supervision, such that it's possible to manage 5-10+ in parallel. Git's native worktree feature give each agent its own working directory, so they don't step on each other's changes. But the git worktree UX is clunky. Even a task as small as starting a new worktree requires typing the branch name three times: `git worktree add -b feat ../repo.feat`, then `cd ../repo.feat`. ## Worktrunk makes git worktrees as easy as branches Worktrees are addressed by branch name; paths are computed from a configurable template. > Start with the core commands **Core commands:**
Task Worktrunk Plain git
Switch worktrees
wt switch feat
cd ../repo.feat
Create + start Claude
wt switch -c -x claude feat
git worktree add -b feat ../repo.feat && \
cd ../repo.feat && \
claude
Clean up
wt remove
cd ../repo && \
git worktree remove ../repo.feat && \
git branch -d feat
List with status
wt list
git worktree list
(paths only)
> Expand into the more advanced commands as needed **Workflow automation:** - **[Hooks](https://worktrunk.dev/hook/)** β€” run commands on create, pre-merge, post-merge, etc - **[LLM commit messages](https://worktrunk.dev/llm-commits/)** β€” generate commit messages from diffs - **[Merge workflow](https://worktrunk.dev/merge/)** β€” squash, rebase, merge, clean up in one command - **[Interactive picker](https://worktrunk.dev/switch/#interactive-picker)** β€” browse worktrees with live diff and log previews - **[Copy build caches](https://worktrunk.dev/step/#wt-step-copy-ignored)** β€” skip cold starts by sharing `target/`, `node_modules/`, etc between worktrees - **[`wt list --full`](https://worktrunk.dev/list/#full-mode)** β€” [CI status](https://worktrunk.dev/list/#ci-status) and [AI-generated summaries](https://worktrunk.dev/list/#llm-summaries) per branch - **[PR checkout](https://worktrunk.dev/switch/#pull-requests-and-merge-requests)** β€” `wt switch pr:123` to jump straight to a PR's branch - **[Dev server per worktree](https://worktrunk.dev/tips-patterns/#dev-server-per-worktree)** β€” `hash_port` template filter gives each worktree a unique port - **[Aliases](https://worktrunk.dev/extending/#aliases) & [per-branch variables](https://worktrunk.dev/config/#wt-config-state-vars)** β€” custom `wt ` commands and branch-scoped state for hook templates - ...and **[lots more](#next-steps)** Multiple parallel agents, same simple commands: ![Worktrunk omnibus demo: multiple Claude agents in Zellij tabs with hooks, LLM commits, and merge workflow](https://raw.githubusercontent.com/max-sixty/worktrunk-assets/main/assets/docs/light/wt-zellij-omnibus.gif) ## Install **Homebrew (macOS & Linux):** ```bash brew install worktrunk && wt config shell install ``` Shell integration allows commands to change directories. **Cargo:** ```bash cargo install worktrunk && wt config shell install ```
Windows & other **Windows.** `wt` defaults to Windows Terminal's command, so Winget additionally installs Worktrunk as `git-wt` to avoid the conflict: ```bash winget install max-sixty.worktrunk git-wt config shell install ``` Alternatively, disable Windows Terminal's alias (Settings β†’ Privacy & security β†’ For developers β†’ App Execution Aliases β†’ disable "Windows Terminal") to use `wt` directly. **Arch Linux:** ```bash sudo pacman -S worktrunk && wt config shell install ``` **Conda / Pixi** (community-maintained [feedstock](https://github.com/conda-forge/worktrunk-feedstock)): ```bash conda install -c conda-forge worktrunk && wt config shell install ``` Or with [Pixi](https://pixi.sh): `pixi global install worktrunk && wt config shell install`.
## Quick start Create a worktree for a new feature: ```console $ wt switch --create feature-auth βœ“ Created branch feature-auth from main and worktree @ ~/repo.feature-auth ``` This creates a new branch and worktree, then switches to it. Do your work, then check all worktrees with [`wt list`](https://worktrunk.dev/list/): ```console $ wt list Branch Status HEADΒ± main↕ Remoteβ‡… Commit Age Message @ feature-auth + ↑ +27 -8 ↑1 4bc72dc9 2h Add authentication module ^ main ^⇑ ⇑1 0e631add 1d Initial commit β—‹ Showing 2 worktrees, 1 with changes, 1 ahead, 1 column hidden ``` The `@` marks the current worktree. `+` means staged changes, `↑1` means 1 commit ahead of main, `⇑` means unpushed commits. When done, either: **PR workflow** β€” commit, push, open a PR, merge via GitHub/GitLab, then clean up: ```bash wt step commit # commit staged changes gh pr create # or glab mr create wt remove # after PR is merged ``` **Local merge** β€” squash, rebase onto main, fast-forward merge, clean up: ```console $ wt merge main β—Ž Generating commit message and committing changes... (2 files, +53, no squashing needed) Add authentication module βœ“ Committed changes @ a1b2c3d β—Ž Merging 1 commit to main @ a1b2c3d (no rebase needed) * a1b2c3d Add authentication module auth.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib.rs | 2 ++ 2 files changed, 53 insertions(+) βœ“ Merged to main (1 commit, 2 files, +53) β—Ž Removing feature-auth worktree & branch in background (same commit as main, _) β—‹ Switched to worktree for main @ ~/repo ``` For parallel agents, create multiple worktrees and launch an agent in each: ```bash wt switch -x claude -c feature-a -- 'Add user authentication' wt switch -x claude -c feature-b -- 'Fix the pagination bug' wt switch -x claude -c feature-c -- 'Write tests for the API' ``` The `-x` flag runs a command after switching; arguments after `--` are passed to it. Configure [post-start hooks](https://worktrunk.dev/hook/#hook-types) to automate setup (install deps, start dev servers). ## Next steps - Learn the core commands: [`wt switch`](https://worktrunk.dev/switch/), [`wt list`](https://worktrunk.dev/list/), [`wt merge`](https://worktrunk.dev/merge/), [`wt remove`](https://worktrunk.dev/remove/) - Set up [hooks](https://worktrunk.dev/hook/) for automated setup - Explore [LLM commit messages](https://worktrunk.dev/llm-commits/), [interactive picker](https://worktrunk.dev/switch/#interactive-picker), [Claude Code integration](https://worktrunk.dev/claude-code/), [CI status & PR links](https://worktrunk.dev/list/#ci-status) - Browse [tips & patterns](https://worktrunk.dev/tips-patterns/) for recipes: aliases, dev servers, databases, agent handoffs, and more - [Extending Worktrunk](https://worktrunk.dev/extending/) β€” customize workflows with hooks & aliases - Run `wt --help` or `wt --help` for quick CLI reference ## Further reading - [Claude Code: Best practices for agentic coding](https://www.anthropic.com/engineering/claude-code-best-practices) β€” Anthropic's official guide, including the worktree pattern - [Shipping faster with Claude Code and Git Worktrees](https://incident.io/blog/shipping-faster-with-claude-code-and-git-worktrees) β€” incident.io's workflow for parallel agents - [Git worktree pattern discussion](https://github.com/anthropics/claude-code/issues/1052) β€” Community discussion in the Claude Code repo - [@DevOpsToolbox's video on Worktrunk](https://youtu.be/WBQiqr6LevQ?t=345) - [git-worktree documentation](https://git-scm.com/docs/git-worktree) β€” Official git reference ## Contributing - ⭐ Star the repo - Tell a friend about Worktrunk - [Open an issue](https://github.com/max-sixty/worktrunk/issues/new?title=&body=%23%23%20Description%0A%0A%3C!--%20Describe%20the%20bug%20or%20feature%20request%20--%3E%0A%0A%23%23%20Context%0A%0A%3C!--%20Any%20relevant%20context%3A%20your%20workflow%2C%20what%20you%20were%20trying%20to%20do%2C%20etc.%20--%3E) β€” feedback, feature requests, even a small friction or imperfect user message, or [a worktree pain not yet solved](https://github.com/max-sixty/worktrunk/issues/new?title=Worktree%20friction%3A%20&body=%23%23%20The%20friction%0A%0A%3C!--%20What%20worktree-related%20task%20is%20still%20painful%3F%20--%3E%0A%0A%23%23%20Current%20workaround%0A%0A%3C!--%20How%20do%20you%20handle%20this%20today%3F%20--%3E%0A%0A%23%23%20Ideal%20solution%0A%0A%3C!--%20What%20would%20make%20this%20easier%3F%20--%3E) - Share: [X](https://twitter.com/intent/tweet?text=Worktrunk%20%E2%80%94%20CLI%20for%20git%20worktree%20management&url=https%3A%2F%2Fworktrunk.dev) Β· [Reddit](https://www.reddit.com/submit?url=https%3A%2F%2Fworktrunk.dev&title=Worktrunk%20%E2%80%94%20CLI%20for%20git%20worktree%20management) Β· [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fworktrunk.dev) > ### πŸ“š Full documentation at [worktrunk.dev](https://worktrunk.dev) πŸ“š ### Star history Star History Chart