Git worktrees,
without the ceremony.
Create, navigate, and clean up worktrees in seconds. wt handles path resolution, node_modules symlinking, and lifecycle hooks, so you can get to work instead of setting up work.
One repo.
Many concurrent minds.
Git worktrees let one repository check out many branches at once, each in its own directory. Pair that with an agent reviewing a PR, a human shipping a fix, and a second agent exploring a spike. All running in parallel, none stepping on each other's working tree.
- feat-authclean.worktrees/feat-authA human shipping a featureSymlinks node_modules, runs post_create hook
- claude-agentdirty · 7 files.worktrees/claude-agentAn AI agent reviewing a PRNon-TTY, plain text, exits with status codes
- fix-typoclean.worktrees/fix-typoA quick throwaway editCreated, pushed, and pruned in under a minute
- spike-ragqueuedwt add spike-ragThe next one you'll addTwo seconds away.
One line.
No dependencies to chase.
A precompiled macOS binary. No runtime, no package manager, no path hacks beyond adding ~/.local/bin to your shell.
A small vocabulary,
carefully chosen.
Seven commands cover the entire lifecycle of a worktree. They read aloud like English. They're safe by default, and they exit cleanly for scripts and agents.
Create a new worktree for a branch.
Creates .worktrees/<branch>, symlinks node_modules and .env files, runs your post_create hook.
List every worktree at a glance.
Branch name, path, and clean/dirty state. Also available as wt ls. Renders plain text in non-TTY contexts.
Jump into a worktree's directory.
Prints the path for scripts. With the shell wrapper, cd's your current shell into the worktree directly.
Remove a worktree safely.
Refuses to delete dirty worktrees unless you pass -f. Runs your pre_remove hook before cleanup.
Clean up orphaned references.
Removes metadata for worktrees whose directories were deleted manually. Safe to run anytime.
Open the interactive TUI.
Run with no arguments to browse worktrees. j/k to navigate, enter to jump, d to remove. Piped output falls back to wt list.
Print the shell wrapper function.
Pipe into your rc file once. It enables wt cd and bare wt to change directory in your current shell.
The shortest path
is muscle memory.
Type wt with no arguments. A quiet Ink-based TUI opens. Move with j and k. Jump, remove, or quit without reaching for your mouse.
Optional.
Always sensible.
Drop a .wt.toml in your repo root to customize. Every setting is optional; defaults do the right thing. Read left to right.
Machines are
first-class citizens.
Every command is non-interactive by default. Output is clean text. Destructive operations use explicit flags, not prompts. Exit codes mean what you'd expect.
Plain text, on demand.
Pipe anywhere. The TUI is reserved for humans in a real terminal.
Predictable, scriptable.
Zero on success, non-zero on failure. Errors go to stderr, never stdout.
Opt in to danger.
Destructive actions require -f. No confirmation prompts to derail a pipeline.