Regatta is a macOS desktop app I built with Electron, React, TypeScript, and node-pty to run multiple terminal sessions and git worktrees side by side without losing track of which pane needs input or accidentally clobbering uncommitted git work.

Because I built and packaged this as a student without a paid $99/year Apple Developer ID account, the .dmg and .zip builds in the GitHub Release are ad-hoc signed (codesign -s -). The first time you open Regatta.app after downloading it, macOS Gatekeeper will block it because of the download quarantine flag.
To open it:
Regatta.app to /Applications.xattr -cr /Applications/Regatta.app
(Or right-click Regatta.app in Finder and click Open.)
| Platform | Architecture | Status |
|---|---|---|
| macOS 13+ | Apple Silicon (arm64) |
Supported and tested (.dmg and .zip on Releases page) |
| macOS 13+ | Intel (x64) |
Build from source (npm run dev) |
| Windows / Linux | x64 / arm64 |
Not supported yet (worktree safety checks use macOS lsof and APFS clonefile) |
Whenever I had three or four terminal tabs open on different git branches or worktrees, I kept running into two problems:
y/n confirmation.git worktree folders when switching branches is surprisingly easy to mess up. If you delete a worktree directory before checking whether it has unmerged commits or staged files, or while a background process is still writing to it, you can lose work.So I built Regatta around two main ideas: a live multi-pane terminal grid that tracks process state per pane, and a worktree runner (“Heats”) that isolates parallel runs in separate git worktrees and moves finished worktrees to a recoverable trash folder instead of deleting them.

1 to 16 panes): Real PTY terminals (@lydell/node-pty + @xterm/xterm) with a layout picker, a Fleet sidebar that sorts panes by urgency (Needs you, Working, Failed, Ready), and a cross-project Inbox..regatta-trash): Instead of running rm -rf on finished worktrees, Regatta saves unmerged commits under refs/regatta/discarded/*, checks lsof so it never moves or empties a directory with an open process, and keeps trashed worktrees in Settings > Storage until you explicitly empty them.-c core.hooksPath=/dev/null) so background status checks never trigger unexpected hooks or contact remotes.src/shared/session-export.ts): Exports your active panes, branches, and worktree check results as a Markdown table or TSV log.
You need macOS (Apple Silicon), Node.js 20+, and git.
git clone https://github.com/draarivpatel-ui/regatta.git
cd regatta
npm ci
npm run dev
Other scripts in package.json:
npm test # run unit tests with Vitest
npm run check # run TypeScript typecheck + unit tests
npm run e2e # build and run the Playwright Electron end-to-end test suite
npm run dist # package dist/Regatta-0.1.0-arm64.dmg and .zip via electron-builder
src/main/ - Electron main process: PTY manager, git worktree engine (heats/), checkpoint journal, storage & trash safety checks, local MCP server, and IPC handlers.src/preload/ - Context-isolated preload bridge exposing typed IPC methods to the renderer.src/renderer/ - React 19 + Tailwind CSS + Zustand UI (pane grid, Fleet sidebar, Heats view, Git diff viewer, Settings).src/shared/ - Shared TypeScript types, theme contrast calculations, and session Markdown/TSV export helpers.scripts/e2e/ - Playwright end-to-end tests that launch the built Electron app in an isolated temp home folder.docs/ - Design notes on the repository safety rules (docs/design/safety.md) and packaging (docs/PACKAGING.md).MIT License. See LICENSE.