git-paw
Parallel AI Worktrees โ orchestrate multiple AI coding CLI sessions across git worktrees from a single terminal using tmux.
Demo
$ git paw
๐พ git-paw โ Parallel AI Worktrees
? Select mode:
> Same CLI for all branches
Different CLI per branch
? Select branches (space to toggle, enter to confirm):
> [x] feat/auth
[x] feat/api
[ ] fix/typo
[ ] main
? Select AI CLI:
> claude
codex
gemini
โ Creating worktrees...
../myproject-feat-auth/
../myproject-feat-api/
โ Launching tmux session: paw-myproject
Pane 1: feat/auth โ claude
Pane 2: feat/api โ claude
Attaching to tmux session...
What It Does
git-paw lets you run multiple AI coding assistants in parallel, each in its own git worktree and tmux pane. Pick your branches, pick your AI CLI(s), and git-paw handles the rest โ creating worktrees, launching a tmux session, and wiring everything together. Stop and resume sessions at will; your worktrees and uncommitted work are preserved.
Features
- Parallel AI sessions โ run Claude, Codex, Gemini, or any AI CLI across multiple branches simultaneously
- Git worktree isolation โ each branch gets its own working directory, no stashing or switching needed
- Smart session management โ reattach to active sessions, auto-recover after crashes or reboots
- Interactive or scripted โ fuzzy branch picker and CLI selector, or pass
--cliand--branchesflags - Per-branch CLI assignment โ use Claude on one branch and Gemini on another in the same session
- Presets โ save branch + CLI combos in config for one-command launches
- Custom CLI support โ register any AI CLI with
git paw add-cli - Session persistence โ state saved to disk, survives tmux crashes and system reboots
- Dry run โ preview the session plan before executing with
--dry-run - Mouse-friendly tmux โ click to switch panes, drag borders to resize, scroll with mouse wheel
- Spec-driven launch โ auto-discover specs and launch sessions with
--from-specs - AGENTS.md integration โ auto-inject session context into worktree AGENTS.md files
- Session logging โ capture raw terminal output per pane for later review
- Replay โ view session logs with ANSI stripping or colored output via
less -R - Project init โ
git paw initbootstraps.git-paw/, config, and gitignore - Standards-based โ uses
AGENTS.mdfollowing the Linux Foundation standard for AI agent instructions - Agent coordination โ built-in HTTP broker lets agents share status, artifacts, and blocked requests
- Dashboard TUI โ live status table in pane 0 shows agent progress at a glance
- Broker messages panel โ optional dashboard section showing real-time agent communication (configurable via
[dashboard] show_message_log = true) - Skill templates โ coordination instructions auto-injected into each agent's AGENTS.md
- Boot-prompt injection โ standardized boot instructions automatically prepended to all agent prompts, ensuring reliable self-reporting (register, done, blocked, question operations) โ always enabled for broker sessions
- Cursor-based messaging โ lossless message polling with sequence tracking
Tip: git-paw uses
AGENTS.mdas the standard agent instruction file. If your AI CLI reads a different file (e.g.,CLAUDE.md,GEMINI.md), you can symlink it:Add these symlinks to
.gitignoreso they stay local to each developer.
Platform Support
| Platform | Status | Notes |
|---|---|---|
| macOS (ARM) | Supported | Primary development platform |
| macOS (x86) | Supported | |
| Linux (x86_64) | Supported | |
| Linux (ARM64) | Supported | |
| Windows | WSL only | tmux is a Unix tool โ use Windows Subsystem for Linux |
Why no native Windows? git-paw relies on tmux for terminal multiplexing, which is not available natively on Windows. WSL provides a full Linux environment where git-paw works perfectly.
Quick Start: Same CLI
Use the same AI CLI across all branches:
# Interactive โ pick branches and CLI from prompts
# Non-interactive โ specify everything upfront
This creates:
- A worktree for each branch (
../yourproject-feat-auth/,../yourproject-feat-api/) - A tmux session with one pane per branch, each running
claude
Quick Start: Per-Branch CLI
Use different AI CLIs on different branches:
# Interactive mode โ select "Different CLI per branch"
# โ Pick branches: feat/auth, feat/api
# โ Pick CLI for feat/auth: claude
# โ Pick CLI for feat/api: gemini
Result: a tmux session where feat/auth runs Claude and feat/api runs Gemini, side by side.
Quick Start: Supervisor Mode
Run an unattended supervisor agent that orchestrates the worker agents on your behalf:
The supervisor agent runs in its own pane, polls each worker agent for progress and artifacts via the broker, runs the configured test command between merges, and writes a session summary when work completes. Use this mode when you want to leave a multi-branch session running without continually steering each agent yourself.
Installation
From crates.io
Homebrew
Shell installer
|
Windows (WSL)
Install WSL, then use any of the Linux installation methods above inside your WSL environment:
# Inside WSL
Prerequisites
git paw vs git-paw
Once installed to your PATH, git-paw works as a git subcommand:
You can also call the binary directly โ useful during development or if it's not on PATH:
All examples below use git paw, but git-paw works identically.
Usage
init โ Initialize project
Creates .git-paw/ directory with default config and sets up .gitignore for logs.
start โ Launch or reattach
# Interactive launch
# Specify CLI and branches
# Launch from spec files (OpenSpec or Markdown)
# Use a preset from config
# Preview without executing
Smart behavior:
- Active session exists โ reattaches
- Stopped/crashed session โ auto-recovers (reuses worktrees, relaunches CLIs)
- No session โ full interactive launch
stop โ Pause session
Kills the tmux session but preserves worktrees and state. Run git paw start later to pick up where you left off.
purge โ Remove everything
# With confirmation prompt
# Skip confirmation
Removes the tmux session, all worktrees, and session state.
status โ Check session state
Shows session name, branches, CLIs, and status (active/stopped/no session).
list-clis โ Show available CLIs
Lists auto-detected and custom AI CLIs with their source.
add-cli โ Register a custom CLI
# With absolute path
# With display name
remove-cli โ Unregister a custom CLI
Only custom CLIs can be removed โ auto-detected CLIs cannot.
replay โ View session logs
# List available log sessions
# View a branch's log (ANSI stripped)
# View with colors via less -R
# Replay from a specific session
Requires session logging to be enabled in config.
Configuration
Per-repo config (.git-paw/config.toml)
# Pre-select a CLI in the interactive picker
= "my-cli"
= true
# Bypass picker entirely for --from-specs mode
= "my-cli"
# Prefix for spec-derived branches (default: "spec/")
= "spec/"
# Spec scanning
[]
= "specs"
= "openspec" # or "markdown"
# Session logging
[]
= true
# Dashboard configuration
[]
# Show broker messages panel for real-time agent communication
= true
[]
= ["feat/api", "fix/db"]
= "my-cli"
Global config (~/.config/git-paw/config.toml)
= "my-cli"
= true
[]
= "/usr/local/bin/my-agent"
= "My Agent"
[]
= "ollama-code"
= "Local LLM"
[]
= ["feat/api", "fix/db"]
= "my-cli"
Per-repo config overrides global config for overlapping fields.
Supported AI CLIs
| CLI | Binary | Link |
|---|---|---|
| Claude Code | claude |
claude.ai |
| OpenAI Codex | codex |
github.com/openai/codex |
| Google Gemini CLI | gemini |
github.com/google-gemini/gemini-cli |
| Aider | aider |
aider.chat |
| Vibe | vibe |
docs.mistral.ai/capabilities/vibe |
| Qwen | qwen |
github.com/QwenLM/qwen-agent |
| Amp | amp |
amp.dev |
Don't see your CLI? Register it:
How It Works
git paw start
โ
โโ 1. Validate git repo
โโ 2. Load config (global + repo)
โโ 3. Detect AI CLIs on PATH + custom
โโ 4. Interactive selection (or use flags)
โโ 5. Create git worktrees
โ ../project-feat-auth/
โ ../project-feat-api/
โโ 6. Create tmux session (paw-project)
โ โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
โ โ feat/auth โ feat/api โ
โ โ โ claude โ โ claude โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโ
โโ 7. Save session state to disk
โโ 8. Attach to tmux session
git paw stop โ kills tmux, keeps worktrees + state
git paw start โ auto-recovers from saved state
git paw purge โ removes everything
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Releases
Releases follow a single chore: prepare vX.Y.Z release commit on main that
bumps Cargo.toml, regenerates CHANGELOG.md via git cliff, and archives
completed OpenSpec changes (moving them under
openspec/changes/archive/<date>-<change>/ and syncing their delta specs into
openspec/specs/). Pushing the vX.Y.Z tag triggers
cargo-dist on GitHub Actions to
build cross-platform binaries and update the Homebrew tap.
After the tag, the maintainer publishes to crates.io manually (it is not wired into cargo-dist):
The full procedure (archive ordering, changelog regeneration, tag rules,
crates.io publish step, recovery from a botched prep commit) lives in
AGENTS.md ยง Release & Distribution.
License
MIT โ Copyright 2026 bearicorn