One window. N isolated git worktrees. N agents working in parallel. You pick the winner.
Electron · React · TypeScript · git worktrees · Claude Code
Chorus is an interface for running multiple Claude Code agents in parallel — without them stepping on each other.
Instead of opening five terminals, juggling five branches, and praying nothing collides, Chorus gives you one panel where you:
- Pick a repo.
- Choose how many agents you want (1–8).
- Give each one a task.
- Hit Fan out →.
Each agent gets its own throwaway git worktree on its own throwaway branch, so they can edit, install, run, and break things in complete isolation. You watch their thinking, tool calls, and edits stream in real time. When one of them nails it, you click Promote — Chorus merges it back into your base branch with --no-ff. The losers get force-removed with one click.
Think of it as
tmuxfor Claude Code, but git-aware.
| Use case | What you do |
|---|---|
| Three shots at the same problem | Same prompt × 3 agents → keep the best implementation |
| A/B/C/D experiments | Try four different approaches at once, compare results side-by-side |
| Parallel chores | Five unrelated tasks (refactor X, write tests for Y, fix bug Z…) running concurrently |
| Spec exploration | One agent writes the API, one writes tests, one writes docs — all from the same starting point |
| Risk-free experimentation | Every agent is sandboxed in a worktree — your main branch is untouched until you promote |
- Fan-out orchestration — one click spawns N Claude Code subprocesses, each with their own task
- Git worktree isolation — every agent lives on its own
chorus/<runId>branch in its own working directory - Live streaming UI —
claude -p --output-format stream-jsonparsed into a per-agent timeline of thinking, tool calls, and file edits - One-click promote — merges the winner back into base with
--no-ff, branch preserved for history - One-click discard — force-removes the worktree and deletes the branch
- Graceful stop — SIGTERM lets
claudeflush a final result before exiting (per-agent or all at once) - Keyboard-first —
Cmd/Ctrl + Enterto fan out,Cmd/Ctrl + Kfor the command palette
git clone https://github.com/natedemoss/Chorus.git
cd Chorus
npm install
npm run devRequirements:
| Node | >= 20 |
| Claude Code | claude on your PATH — install guide |
| Git | A repository you'd like the agents to work in |
Then: pick the repo, write a distinct task in each of the N textareas, and hit Fan out → (or Cmd/Ctrl + Enter).
┌──────────────────────────────────────────────────────────┐
│ user picks repo → picks N, writes N tasks │
└──────────────────────────────┬───────────────────────────┘
│ fanout
▼
┌──────────────────────────────────┐
│ RunManager (main process) │
│ • git worktree add × N │
│ • spawn `claude -p` × N │
│ • stream-json → timeline events│
└──────────────────────────────────┘
│ │ │ │
▼ ▼ ▼ ▼
worktree worktree worktree worktree
agent #0 agent #1 agent #2 agent #3
Each agent runs with --dangerously-skip-permissions so it has the full tool surface (WebSearch, WebFetch, Bash, file edits).
That sounds scary. It isn't. The blast radius is a throwaway worktree on a throwaway branch. Even a malicious agent can only wreck its own sandbox — your main branch and working tree are untouched until you hit promote.
| Shortcut | Action |
|---|---|
Cmd/Ctrl + Enter |
Fan out (when all tasks are filled) |
Cmd/Ctrl + K |
Open command palette |
Esc |
Close palette / unfocus pane |
src/
main/ Electron main process
main.ts app lifecycle + IPC wiring
run.ts RunManager — owns all active runs
stream.ts claude stream-json → TimelineItems
worktree.ts git worktree add / merge / remove
preload/ contextBridge → window.chorus
renderer/ React UI
components/ TopBar, RunGrid, RunList, CommandPalette
styles.css Claude-themed tokens + components
shared/
events.ts IPC + event schema
Alpha. It works on my Windows 11 machine, runs claude subprocesses without mangling prompts, streams their output cleanly, and has survived several dozen real fanouts.
Use it. Break it. Open an issue and tell me what broke.
MIT — see LICENSE.