Skip to main content

Split your work.Not your focus.

Every branch gets its own worktree, tmux session, and AI agent, so you can work in parallel without ever losing your place.

Install via Homebrew
$brew tap joegrabski/sprout
$brew install sprout

git 2.5+  ·  tmux  ·  macos & linux  ·  mit

Everything your workflow needs

Sprout handles the overhead so you stay in flow.

01

See everything at once

A TUI showing all your worktrees with live status, active sessions, and git diffs, without leaving the terminal.

02

Tailored multi-pane sessions

Per-project multi-pane layouts, auto-running dev servers, and a consistent toolset, scaffolded from one TOML rule.

03

An AI agent per branch

Run Codex, Aider, Claude Code, or Gemini inside each worktree. Each agent keeps its own independent context.

04

Work in parallel, ship faster

Tackle a hotfix, a feature, and a review at the same time. No stashing. No branch juggling. Every worktree stays ready.

05

Always a clean repo root

Worktrees live in a sibling directory. Your main checkout stays clean and easy to navigate.

06

Feels native to your shell

Shell hooks for zsh, bash, and fish let you navigate worktrees exactly like any other directory. Preview panes load your full shell profile, so your tools are always on PATH.

07

Preview any branch, live

Promote any worktree to a live preview: your whole stack (APIs, web apps, mobile bundler) runs from that branch in a dedicated session. Switch which branch is live with one command.

08

Configs that follow your tunnels

Expose a service through ngrok and Sprout rewrites the URL into your app config whenever it changes. No stale tunnel URLs, no hand-editing, no rebuilds.

A few commands.

Simple, memorable commands that stay out of your way.

create a worktree
$sprout new feat checkout-redesign
✓ Created worktree: ~/projects/myapp.worktrees/feat-checkout-redesign
list all worktrees
$sprout list
* feat/checkout-redesign dirty
  main clean
  fix/login-bug clean
switch instantly
$spr go fix/login-bug
✓ ~/projects/myapp.worktrees/fix-login-bug
sprout preview
$sprout preview feat/checkout-redesign
✓ Preview now running from feat/checkout-redesign
  api → https://a1b2c3.ngrok.app

Preview any branch. Configs follow.

Promote any worktree to a live preview and Sprout runs your whole stack from it. Expose a service through ngrok and Sprout rewrites the URL into your app config whenever it changes — no editing, no rebuilds.

.sprout.toml
[[preview_sync]]
file = "{worktree}/web/config.json"
reload_windows = ["web"]

  [[preview_sync.set]]
  path = "api.baseUrl"
  tunnel = "api"
  • Run your real stack against any agent's branch
  • Tunnel URLs synced into your config automatically
  • Switch previews with one command, no rebuilds

A TUI built for parallel work.

Run sprout ui for a three-pane interface: every branch, its tmux session, and the current git diff, all visible at once.

  • Jump between worktrees with a single keypress
  • Scan dirty branches and active tmux sessions at a glance
  • Review diffs in place, then attach to tmux for the full session
sprout ui
[1]-Status
myapp -> main selected: feat/checkout
[2]-Details
GIT DIFF
src/hooks/useCart.ts
- const total = cart.total
+ const total = cart?.total ?? 0
 
src/components/Cart.tsx
+ if (!items) return null
[3]-Worktrees
CURBRANCHSTATUSTMUX
*maindirtyyes
feat/checkoutdirtyyes
fix/auth-bugdirtyyes
chore/cleanupcleanno
╰─ j/k move │ p preview │ enter attach │ tab pane │ ? help INFO: ready─ sprout ╯
neovim
1 func main() {
2 fmt.Println("hello sprout")
3 }
-- INSERT --
dev server
[ready] listening on :8080
GET /api/health 200 OK
POST /api/worktrees 201 Created
[sprout-myapp-feat-api]
0:main*1:agent2:git
Feb 20 14:30

Configure your ideal environment.

Define every window and pane exactly how you work. Sprout scaffolds your entire workspace from simple TOML rules, from code editors to auto-running development servers.

.sprout.toml
# Match the layout shown on the left
[[windows]]
name = "main"
layout = "main-horizontal"
panes = [
  { run = "nvim ." },
  { run = "go run main.go" }
]

[[windows]]
name = "agent"
panes = [{ run = "codex" }]

[[windows]]
name = "git"
panes = [{ run = "lazygit" }]
  • Define project-specific split layouts
  • Auto-run your dev server or logs on launch
  • Perfectly consistent environments every time

Stop stashing. Start sprouting.

brew tap joegrabski/sprout && brew install sprout