Skip to content

About

A native macOS terminal for running coding agents across many git worktrees at once.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

227 Commits

Folders and files

Repository files navigation

Multishell icon

Multishell

A native macOS terminal for running coding agents across many git worktrees at once.

CI macOS 26 or later AGPL-3.0 license

Install · Features · Compatibility · Contributing

Multishell with projects and worktrees in the sidebar, Claude Code split above a shell on the left, a second Claude Code on the right, pull request and CI marks on the worktree rows, and the Git panel listing the branch's changes

Five agents in five worktrees usually means five terminal windows and no idea which one is waiting on you. Multishell puts every project and worktree in one sidebar. Pick one and its tabs, splits and agents fill the window. Switch away and they keep running, with a dot on each tab and row saying which agents are working, waiting on you, or done.

Note

There is no notarised release yet. Multishell builds from source in a few commands; see Install.

Why Multishell

  • Agents run in a real terminal. Each one is its own CLI in a libghostty pane, so its slash commands and keys work as they do anywhere else.
  • A worktree per task. Each agent gets its own branch, checkout, ports and environment files, so two of them never share a checkout or bind the same port.
  • You see who needs you. Dots on every tab and row, an Agents board, a Dock badge and notifications. ⌘P opens on the agents waiting on you, longest first.
  • Native and local. Swift, SwiftUI and AppKit, not Electron. No account and no telemetry. The app makes no network calls of its own, and agents use your own logins.

Features

Every worktree, and what its agents are doing

Each project has its own symbol and colour, with its worktrees and their tabs under it. A dot says working, waiting on you, done or failed. Rows add the lines changed, the branch's pull request and its latest CI run.
The sidebar: three projects, their worktrees with state dots, line counts, pull request and CI marks, and the agent tabs of the selected worktree

Terminals that keep running

Tabs, splits and side-by-side groups per worktree, drawn by libghostty. Every terminal keeps running while you look at another worktree, and a tab dragged to another worktree moves without restarting.
A tab group with Claude Code split above a shell

See what the branch changed

Modified counts from HEAD. Branch counts from where the branch left its base, so an agent's commits stay listed. Every file shows the lines it gained and lost.
The Git panel under Branch, listing changed files with their line counts

Review the diff beside the agents

A changed file opens as a tab beside the terminals, highlighted, unified or side by side. Arrows step from one change to the next. An image opens too, its committed copy beside the new one.
A file tab showing rate-limit.js side by side, the committed lines on the left and the new ones on the right, highlighted as JavaScript

Send review comments to an agent

Comment on any lines of a diff from its gutter. Review in the Files panel gathers every comment, and Send writes them to one file and mentions it in the prompt of the agent you pick, leaving Return to you. A comment follows its lines through later edits.
A side-by-side diff of rate-limit.js with two comment cards under the lines they are on, and the Review panel listing both comments to send to Claude Code

Merge once the checks pass

A row's pull request or CI mark opens its page in the side panel: each step left before the merge and what clears it, every check, and the failing job's log. Merge from there with GitHub's own commit message, or turn on auto-merge while required checks still run.
A pull request page as steps toward its merge: no conflicts, four of four required checks passed, review approved, and a Merge button A CircleCI page for a failed run, with the failing test job's log excerpt

Jump to whoever is waiting

⌘P lists the agents waiting on you first, longest wait at the top, then those still working. Type to reach any worktree, tab or file, or start with > to run a menu command.
The quick switcher on its Agents scope: two agents waiting for input, two working, one done, then those with nothing running

Every agent on one board

⇧⌘A lays every agent out by state: waiting on you, working, done or idle. Each card names its project and worktree, the lines it changed and how long it has been in that state.
The Agents board: columns for waiting, working, done and idle, each card naming its project, worktree, lines changed and how long it has been in that state

Agents

  • The agent you already use. Claude Code, Codex, Gemini CLI, Antigravity CLI, Copilot CLI and OpenCode, each marked on its tab, or any command you name.
  • An Agents board of every running agent, with a chip counting the subagents and background shells each has out.
  • A Dock badge for the agents waiting on you, and notifications for tabs you are not looking at, toggled per state.
  • Your preferred agent one shortcut away, with its flags set globally or per project.
  • Sessions resume. Saved agent tabs pick up their session on the next launch.

Worktrees

  • A branch and worktree in one step, with a shell or agent already running in it. Bare clones work too.
  • Rows show ahead and behind, and a badge once the branch has landed. Sort, filter and rename them.
  • .env, node_modules and the like copied or symlinked into each new worktree.
  • Hooks before and after create and remove, shared with your team in .multishell.json.
  • A block of ports per worktree, in MULTISHELL_PORT and {{port}}, so dev servers in two worktrees never collide.
  • Auto Rename asks an agent's CLI to name a worktree from its branch's changes. No API key, and the git branch keeps its name.
  • Removing a worktree moves it to the Trash, or deletes it if you prefer.

Pull requests and CI

  • Read through gh and circleci, both optional. A row's pull request or CI mark opens its full page in the side panel.
  • Create Pull Request pushes the branch after asking, then opens GitHub's page for it.
  • Merge from the pull request page, with GitHub's own commit message to edit first, or turn auto-merge on while required checks still run.
  • Settings > (a project) > Integrations shows each tool's version and login, and turns either off per project.

Terminals and files

  • Themes colour the whole window. Multishell's light and dark, ten editor ports such as Dracula, Nord and Catppuccin, or your own in JSON.
  • Drop or paste files onto a terminal as @ mentions or quoted paths. A copied image is saved to a file and pasted the same way.
  • Click in the prompt to move the cursor there.
  • Syntax highlighting follows embedded code, such as a Svelte file's scripts and styles or a Markdown fence in the language it names.
  • Arrows in a file tab step from one change to the next.
  • Review comments on a diff's lines go to an agent all at once.
  • Your shell rc files are never edited.

Keyboard

Keys Action
⌘P Go to any agent, worktree, tab, project or file, waiting first
⇧⌘P Run any menu command
⌘N New worktree
⌥⌘T New tab with your preferred agent
⇧⌘T New shell tab
⌘D Split right
⇧⌘D Split down
⌥⌘G Move the tab to a new group
⇧⌘A Agents board
⌘F Find in the pane or file
⇧⌘O Open the worktree in your editor

Scripting

The multishell command drives the app: projects, worktrees, tabs, panes, review comments, settings and screenshots. Multishell's own terminals have it on their PATH, and Settings > Agents > Agent hooks > Install CLI links it into /usr/local/bin.

multishell tabs open WORKTREE_ID --agent claude --prompt "Plan the auth fix"
multishell panes wait PANE_ID --state done
multishell state running --message "building"   # set this tab's dot from any script

multishell help lists every command. View > Enable Debug Tools shows frame rate, CPU, memory and git timings.

Install

You need:

  • an Apple silicon Mac; Intel Macs are not supported
  • macOS 26 Tahoe or later
  • Xcode 26 or later (Swift 6.2), not only the command line tools
  • the Zig version Ghostty pins, zig@0.17 today
  • git on your PATH

Set up the toolchain once, and again after each Xcode update. Skip xcode-select if Xcode is already the active developer directory.

brew install zig@0.17                          # Scripts/build-ghostty.sh --zig-version names the version
sudo xcode-select -s /Applications/Xcode.app
sudo xcodebuild -license
sudo xcodebuild -runFirstLaunch
xcodebuild -downloadComponent MetalToolchain

Then clone, build and install into /Applications:

git clone https://github.com/KieranP/multishell.git
cd multishell
make signing-identity   # once per machine, so macOS keeps your permission grants across rebuilds
make install

The first build compiles libghostty from the ThirdParty/ghostty submodule, which takes a minute or two. Open Multishell and add a repository with the folder button at the top of the sidebar, or ⌘O.

Debug builds and build trouble
  • make run builds and opens a debug copy with its own state, so it can run beside the installed one.
  • If a build fails after a pull that moved files, run make clean once.
  • If it stops because the submodule is past its pin, run git submodule update ThirdParty/ghostty.

The full build notes are in Docs/develop/build/building-locally.md.

Agent hooks

zsh, bash and fish report their state with no setup, and Claude Code and Codex report theirs to the terminal themselves. Hooks add the subagents and background shells those two have out. Every other agent reports only through its hooks, so its dots stay still until you add them:

  1. Open Settings > Agents > Agent hooks.
  2. Click Add beside each agent. Multishell adds its entries to the agent's config, keeping a copy of the file the first time, or writes a file of its own. Remove takes out only what it added.
  3. In Codex, trust the new hooks once with /hooks.

COMPAT.md lists every file Multishell touches and how far each shell and agent goes.

Status

  • macOS 26 and later on Apple silicon. Intel Macs are not supported.
  • English only.

Every line of code was written by an AI (Claude), directed by a human who set the requirements and reviewed the results in the running app. The design decisions under Docs/design/ were argued out in that conversation; the architecture, the trade-offs and what shipped were human calls.

Contributing

Start with AGENTS.md, which indexes Docs/develop/ for the build, tests and rules, and Docs/design/ for why things are the way they are. Pull requests are from collaborators only, as CONTRIBUTING.md explains. Issues are open to anyone. Report a vulnerability through SECURITY.md instead of an issue.

License

Copyright (C) 2026 Kieran Pilkington. GNU Affero General Public License v3.0; see LICENSE. Third party notices are in THIRD-PARTY-NOTICES.md.

About

A native macOS terminal for running coding agents across many git worktrees at once.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Contributors

Languages