01 What is Supacode?
Supacode is a native macOS application that serves as a command center for AI coding agents. Rather than wrapping web technologies like Electron, it is written entirely in Swift using libGhostty (the GPU-accelerated terminal core from the Ghostty terminal emulator) for rendering and The Composable Architecture (TCA) for state management.
Its core idea is simple: modern AI-assisted development involves running multiple agents simultaneously on different tasks. Supacode solves the "1000 tabs" problem by giving each agent its own isolated git worktree, its own persistent terminal state, and a unified sidebar to manage them all.
Native Performance
No Electron, no web wrappers. Built on libGhostty for GPU-accelerated terminal rendering. Every keystroke responds at native speed.
Worktree Isolation
Each agent gets its own git worktree — a separate branch and directory. Agents work in parallel without stepping on each other's changes.
BYOA Model
Bring Your Own Agent. Any CLI-based coding agent works — Claude Code, Codex, OpenCode, Aider, custom scripts. No proprietary lock-in.
Persistent Sessions
Sessions survive app restarts via a bundled ZMX multiplexer. Quit and relaunch Supacode; your agents keep running and reattach.
GitHub Native
PR status, CI checks, draft/ready toggle, merge actions — all without leaving the terminal or opening a browser.
Open Source
Full source code on GitHub. Read every line, fork it, fix it, contribute. Free to use with no paid tiers.
Supacode is part of the growing libGhostty ecosystem — a collection of apps built on the terminal core that Mitchell Hashimoto split out from the Ghostty terminal. These apps share the same rendering engine, and crucially they all read the same ~/.config/ghostty/config file — so your fonts, keybindings, and color themes carry across all of them automatically.
02 Requirements
Supacode has a strict macOS version floor due to its use of modern SwiftUI APIs and GhosttyKit.
| Requirement | Details |
|---|---|
| macOS version | macOS 26.0 (Tahoe) or newer — strictly required |
| Git | Must be installed and available in your shell PATH |
GitHub CLI (gh) | Only needed for PR and CI features — optional for basic use |
| Coding agent(s) | Claude Code, Codex, OpenCode, Aider, or any CLI agent |
| Xcode (build from source) | Xcode 26.3 specifically (see note below) |
| mise (build from source) | For pinned Zig, swiftlint, swift-format, xcbeautify, xcsift |
Supacode will not run on macOS 15 or earlier. This is not a soft recommendation — the app uses SwiftUI APIs and system frameworks only available in macOS 26 (Tahoe). If you're on an older macOS, you'll need to upgrade before using Supacode.
Checking prerequisites
$ sw_vers # check macOS version $ git --version # verify git is installed $ gh auth status # verify gh is installed and authenticated $ claude --version # if using Claude Code $ codex --version # if using Codex
03 Installation
Option A — Homebrew (recommended)
The fastest way to get Supacode running:
$ brew install supacode
Then launch from Spotlight (⌘Space → "Supacode"), Launchpad, or from the terminal:
$ open -a Supacode
Option B — Download from supacode.sh
Visit supacode.sh to download the latest .dmg. Drag Supacode to your /Applications folder and launch it. macOS Gatekeeper may prompt you the first time — open System Settings → Privacy & Security and click Open Anyway.
Option C — Build from source
For contributors and those who want to run the latest unreleased changes:
$ git clone https://github.com/supabitapp/supacode.git $ cd supacode $ mise install # install pinned Zig, swiftlint, etc. $ make doctor # diagnose prerequisites, prints fixes $ make build-ghostty-xcframework # compile GhosttyKit from Zig source $ make build-app # build the macOS app (Debug) $ make run-app # build and launch
Building from source requires Xcode 26.3 specifically (not 26.4+). The pinned Zig 0.15.2 can't link the macOS 26.4+ SDK due to a known linker issue. Run make doctor first — it checks every prerequisite and prints the exact command to fix anything missing. The build auto-detects a Zig-compatible Xcode and uses it just for that build step; your default Xcode can remain at a newer version.
Development / quality commands
$ make check # run swiftformat + swiftlint $ make test # run the test suite $ make format # run swift-format
Checking for updates
Inside Supacode: press ⌘ U or navigate to the menu. Supacode offers both a stable channel and a tip (latest commits) build channel. Switch between them in Settings.
04 First-Run Setup
Launch Supacode. The sidebar will be empty — no repositories yet.
Add a repository. Click the + button in the sidebar, or press ⌘ ⇧ O. Browse to any local git repository you want to work in. Supacode will discover all its existing worktrees automatically.
Choose your default editor. Supacode can open worktrees in VS Code, Cursor, Xcode, or any editor installed via its bundle ID. Set this in Settings → General. Once set, ⌘ O opens the selected worktree in that editor instantly.
Authenticate GitHub CLI if you want PR and CI features: run
gh auth loginin your terminal, then enable GitHub integration in Supacode's Settings.Configure a repository setup script (optional but recommended). In Repository Settings → Repository Commands, add the command that boots your agent — e.g.
claude --dangerously-skip-permissionsorcodex. This will auto-run whenever you create a new worktree.Create your first worktree with ⌘ N. Supacode creates the git worktree, opens a terminal in it, and optionally runs your setup script.
The minimum viable workflow: install → add a repo → press ⌘ N → type your agent command in the terminal. Everything else is optional enhancement.
05 The Mental Model
Understanding the three-layer hierarchy makes Supacode intuitive:
| Concept | What it is |
|---|---|
| Repository | The top-level container. Corresponds to a local git repo. Can contain many worktrees. |
| Worktree | The unit of parallel work. A real git worktree: its own branch + directory on disk. Each agent works in one worktree. |
| Terminal | Each worktree has its own terminal state: tabs, splits, scroll buffer, and notifications — all preserved when you switch worktrees. |
| Setup Script | A per-repository command that auto-runs when a new worktree is created. Typically starts your agent or installs dependencies. |
| Run Script | A per-repository on-demand command for repeatable tasks like pnpm dev or cargo test. Launch with ⌘ R. |
| Archive Script | A per-repository command that runs before a worktree is archived. Use it to shut down Docker, kill background processes, etc. |
| Sidebar | Lists all repositories and their worktrees. Worktrees with unread notifications are highlighted. Active sessions float to the top. |
Archive hides a worktree from the active list but keeps its directory on disk and its branch intact. Delete removes the worktree directory from disk (and optionally deletes the local branch). When in doubt, archive first — you can always come back to it.
06 Working with Repositories
Adding a repository
Press ⌘ ⇧ O or click the + in the sidebar. Supacode accepts both regular repositories and bare repositories. When you add a repo, it scans for and imports all existing git worktrees automatically.
Repository settings
Each repository has its own settings panel (accessible from the sidebar's context menu or via Settings). Key per-repository options:
| Setting | What it controls |
|---|---|
| Base ref | The default branch new worktrees are created from (e.g. main, develop) |
| Worktree location | Where managed worktrees are created on disk (default: ~/.supacode/repos/<name>/) |
| Default editor | Override the global editor default for this specific repo |
| Merge strategy | Merge / Squash / Rebase — used by the in-app PR merge action |
| Auto-archive on merge | Automatically move worktrees to the archive list when their PR is merged |
| Prompted worktree creation | Prompt for a branch name instead of auto-generating one when pressing ⌘ N |
Where worktrees live on disk
repos/ ← managed worktrees
my-project/
feature-auth/ ← worktree 1
fix-login-bug/ ← worktree 2
refactor-api/ ← worktree 3
settings.json ← global settings
~/my-project/ ← original repo (main branch)
supacode.json ← optional per-repo config
07 Working with Worktrees
Creating a worktree
Press ⌘ N from anywhere in Supacode. Depending on your repository settings:
- Prompted mode: Supacode asks for a branch name and base ref. Use this for named, intentional work.
- Auto mode: Supacode generates a branch name immediately (fast creation for quick agent tasks). You can rename it afterward.
What happens when a worktree is created
Supacode creates a real git worktree under
~/.supacode/repos/<repo>/on a new branch.The worktree appears in the sidebar under its repository, selected automatically.
A dedicated terminal opens for the worktree, starting in its directory.
If a setup script is configured, Supacode runs it immediately in the first terminal tab.
Managing worktrees
| Action | How |
|---|---|
| Select worktree 1–10 | ⌃ 1 through ⌃ 0 |
| Next / previous worktree | ⌃ ⌘ ↓ / ⌃ ⌘ ↑ |
| Open worktree in editor | ⌘ O |
| Rename branch | Click the branch name in the toolbar |
| View archived worktrees | ⌃ ⌘ A |
| Archive a worktree | Right-click in sidebar → Archive |
| Delete a worktree | Right-click in sidebar → Delete (removes directory) |
| Open PR on GitHub | ⌃ ⌘ G |
Renaming branches
Auto-generated branch names can be random or generic. Click the branch name in the toolbar to rename it without leaving the app. You can also teach your agent to rename branches automatically (see the Tips section).
Supacode supports bare repositories. The sidebar shows a git-branch icon for bare repos instead of a folder icon. Note that the copy-ignored and copy-untracked worktree creation flags are disabled for bare repos.
08 The Built-in Terminal
Supacode embeds a full terminal powered by GhosttyKit in the detail pane. Unlike a web-based terminal, this is GPU-accelerated and handles heavy agent output without stuttering.
Tabs and splits
Each worktree's terminal is fully multi-tab and multi-pane. The recommended tab layout when running agents:
| Tab | Purpose |
|---|---|
| Tab 1 | Your coding agent (Claude Code, Codex, etc.) |
| Tab 2 | Dev server (pnpm dev, rails s, etc.) |
| Tab 3 | Test runner (pnpm test --watch) |
| Tab 4 | Git client (lazygit) or general shell |
Within a tab, splits let you keep related commands side by side. Splits support drag-and-drop reorganization and can be resized, equalized, or zoomed via Ghostty split actions.
Per-worktree terminal state
When you switch worktrees in the sidebar, Supacode restores that worktree's complete terminal state: tabs, splits, scroll position, notifications, and focused surface. Switching between worktrees is instant — it's purely a UI switch with no process teardown.
Persistent sessions (ZMX)
Supacode bundles a ZMX multiplexer. Sessions persist through app restarts and updates — if you quit Supacode, any running agents keep running in the background. When you relaunch, all your tabs reattach exactly where you left them.
Tab context menu
- Close Tab
- Close Other Tabs
- Close Tabs to the Right
- Close All Tabs
Terminal search
| Action | Shortcut |
|---|---|
| Find in terminal output | ⌘ F |
| Find next match | ⌘ G |
| Find previous match | ⇧ ⌘ G |
| Hide the Find bar | ⇧ ⌘ F |
| Use selection for Find | ⌘ E |
Terminal-level keybindings (new tab, close tab, split creation, split navigation) are managed by Ghostty — not by Supacode itself. To change them, modify your ~/.config/ghostty/config file. Supacode reads those bindings and shows them in menus and tooltips automatically.
09 Supported Coding Agents
Supacode uses a BYOA (Bring Your Own Agent) model. Any agent that runs in a terminal shell works. The four officially supported harnesses get native integration features (agent-aware notifications, the Supacode CLI, and the bundled skill file):
Anthropic's official CLI agent. Full harness integration with notification hooks.
OpenAI's CLI coding agent. Supported harness with Supacode CLI integration.
Open-source agent built for the terminal. Supported harness.
Inflection AI's agent. Notification integration supported.
Open-source AI pair-programmer with strong git integration.
Any terminal-based agent works. Add it as a setup script and run it in a tab.
Harness integration features
For the four natively-supported harnesses, Supacode provides three extra integration hooks:
- Notifications: macOS toast notifications + in-app alerts when an agent needs attention or finishes a task.
- Supacode CLI: A bundled CLI the agent can invoke to drive the GUI — e.g. "open this directory as a new Supacode project" or "create a worktree for this branch".
- Skill file: A bundled skill definition so the agent understands how to manage Supacode itself (creating worktrees, renaming branches, etc.).
10 Auto-Starting Agents
The most powerful workflow pattern in Supacode is configuring a repository setup script that automatically boots your agent in every new worktree. This means pressing ⌘ N and having an agent ready to work within seconds — no manual startup required.
Setting up a setup script
In Supacode: open a repository → click its settings icon → Repository Commands → Setup Script. Enter your agent command.
Example setup scripts
# Auto-start Claude Code (skipping permission prompts) claude --dangerously-skip-permissions # Auto-start Codex codex # Install dependencies first, then start agent pnpm install && pnpm prisma generate && claude # Start the dev server in the background, then start agent pnpm dev & claude # Multiple steps with a custom script ./scripts/setup-dev.sh && codex
The --dangerously-skip-permissions flag for Claude Code skips confirmation prompts, allowing the agent to write files, run commands, and make changes automatically. Only use this if you understand the implications — review the agent's work via the git diff in your worktree before merging.
supacode.json — per-project agent instructions
Place a supacode.json at the root of your repository to store Supacode configuration in version control, shareable with your team:
{
"runScript": "pnpm dev",
"setupScript": "pnpm install && claude --dangerously-skip-permissions",
"archiveScript": "docker compose down"
}
Teaching agents about Supacode via AGENTS.md
Add instructions to your repository's AGENTS.md (or CLAUDE.md, .cursorrules) so agents understand how to use Supacode's own CLI and manage worktrees:
# Example AGENTS.md additions
Before starting your task, check the current git branch name.
If it's something generic (like a random animal name), rename it
to something descriptive. Do not rename the main branch.
Use the Supacode CLI to create new worktrees for large sub-tasks
rather than doing everything in one worktree.
When finished, run: git add -A && git commit -m "feat: ..."
then push your branch and the PR will appear in Supacode's sidebar.
11 Parallel Agent Workflows
Supacode's core value proposition is running many agents simultaneously. Here's how to structure parallel work effectively:
The isolation guarantee
Each worktree is a completely independent git checkout on its own branch. Agent A working in feature-auth can never touch files in feature-payments — they are separate directories. Git tracks changes independently. There is no locking, no conflicts between concurrent agents.
A practical parallel workflow
# Worktree 1: Agent handles the API layer ⌘N → branch: feat/api-v2-endpoints → Agent: "Implement the new /users/v2 endpoints from spec.md" # Worktree 2: Agent writes tests ⌘N → branch: feat/api-v2-tests → Agent: "Write comprehensive tests for the v2 API surface" # Worktree 3: Agent updates documentation ⌘N → branch: docs/api-v2-reference → Agent: "Update the API reference docs to reflect the v2 changes" # You review all three in parallel in the sidebar # Merge the ones that look good, archive the rest
Navigating between parallel agents
| Action | Shortcut |
|---|---|
| Jump to worktree by number | ⌃ 1 … ⌃ 0 (supports up to 10 at once) |
| Next worktree | ⌃ ⌘ ↓ |
| Previous worktree | ⌃ ⌘ ↑ |
| Refresh all worktrees | ⌘ ⇧ R |
Supacode claims support for 50+ simultaneous agents. In practice the limit is your machine's RAM and the API rate limits of whichever agent service you're using. The GPU-accelerated terminal ensures the UI remains responsive regardless of how many active terminal sessions are open and producing output.
12 Keyboard Shortcuts
Supacode defines a lean set of app-level shortcuts. Terminal shortcuts come from your Ghostty configuration.
Application shortcuts
| Action | Shortcut |
|---|---|
| Navigation | |
| Command Palette | ⌘ P |
| Open Settings | ⌘ , |
| Toggle Left Sidebar | ⌘ [ |
| Worktrees | |
| New Worktree | ⌘ N |
| Open Worktree in Editor | ⌘ O |
| Open (Add) Repository | ⌘ ⇧ O |
| Refresh Worktrees | ⌘ ⇧ R |
| Select Worktree 1–10 | ⌃ 1 through ⌃ 0 |
| Select Next Worktree | ⌃ ⌘ ↓ |
| Select Previous Worktree | ⌃ ⌘ ↑ |
| View Archived Worktrees | ⌃ ⌘ A |
| Scripts | |
| Run Script | ⌘ R |
| Stop Script | ⌘ . |
| GitHub | |
| Open Pull Request on GitHub | ⌃ ⌘ G |
| App | |
| Check for Updates | ⌘ U |
Terminal search shortcuts
| Action | Shortcut |
|---|---|
| Find in terminal output | ⌘ F |
| Find Next | ⌘ G |
| Find Previous | ⇧ ⌘ G |
| Hide Find Bar | ⇧ ⌘ F |
| Use Selection for Find | ⌘ E |
Shortcuts for terminal actions — new tab, close tab, close surface, creating and navigating splits — are managed by Ghostty, not Supacode. Change them in ~/.config/ghostty/config. Supacode reads those settings and reflects them in menus and tooltips automatically.
13 Command Palette
Press ⌘ P to open the Command Palette — a fuzzy-search interface that gives you keyboard access to every action and worktree in Supacode. It's the fastest way to switch context or trigger any action without reaching for the mouse.
What the Command Palette surfaces
- Jump directly to any worktree across all repositories
- Run any repository command (run script, setup script)
- Open a worktree in your editor
- Access repository settings
- Create a new worktree
- Archive or delete a worktree
- GitHub PR actions for the current worktree
Once you have more than 3–4 worktrees active, the Command Palette is faster than clicking in the sidebar. Type a few letters of a branch name or project name to jump directly to it. Combine with ⌃ 1–⌃ 0 for the most-used worktrees.
14 Repository Commands
Repository Commands is where you define the three repeatable command slots that Supacode reuses across a project's lifetime:
Run Script ⌘R
The one command you run over and over in a repository. Supacode launches it in a dedicated RUN SCRIPT tab. If a run-script tab is already active, Supacode closes it before starting a new one.
# Good examples:
pnpm dev
pnpm test --watch
bin/rails server
cargo test
./gradlew run
Archive Script on archive
Runs before a worktree is archived. Use it to shut down infrastructure that shouldn't persist. If the archive script fails, the archive does not proceed.
# Good examples:
docker compose down
pkill -f "rails server"
kill $(cat .server.pid)
Setup Script on create
Runs once after a new worktree is created. This is the key integration point for agents — put your agent launch command here and every new worktree will boot straight into an agent session.
# Start Claude Code immediately claude --dangerously-skip-permissions # Install deps then start Codex pnpm install && codex # Generate local artifacts before agent starts pnpm prisma generate && pnpm run seed:dev && claude
Where these settings are stored
If your repository contains supacode.json at its root, Supacode reads and writes values there — allowing the team to share the configuration via version control. Otherwise, values are stored in ~/.supacode/settings.json under the repositories map.
15 GitHub CLI Integration
Supacode connects to GitHub via the official GitHub CLI (gh). Once enabled, it adds a layer of GitHub awareness to every worktree — PR status, CI results, and merge actions all appear in the sidebar and toolbar.
Setup
# 1. Install the GitHub CLI if you haven't already $ brew install gh # 2. Authenticate $ gh auth login # 3. Verify authentication $ gh auth status # 4. Enable in Supacode Settings → GitHub → GitHub CLI Integration
What GitHub integration provides
| Feature | Details |
|---|---|
| PR state | Open / draft / closed state shown in the sidebar alongside the worktree |
| Draft indicator | Draft vs ready-for-review shown; toggle directly from Supacode |
| CI status summary | Pass / fail / pending summary for the branch's checks |
| Failing check details | Which specific jobs failed, with links and log access |
| Workflow run state | Current branch's workflow run progress shown in toolbar |
16 PR & CI Workflows
With GitHub integration enabled, Supacode attaches pull request data to any worktree whose branch maps to an open PR. The result is a full PR review experience without opening a browser.
PR actions available in Supacode
- Open the PR on GitHub (⌃ ⌘ G)
- Mark a draft PR ready for review
- Merge the PR (using the configured merge strategy)
- Close the PR
- Open failing check details
- Copy the failing job URL
- Copy failing CI logs to clipboard
- Re-run failed CI jobs
Merge strategies
Set your preferred merge strategy per repository in Repository Settings:
- Merge — creates a merge commit
- Squash — squashes all commits into one
- Rebase — rebases commits onto the base branch
Auto-archive after merge
Enable Automatically archive merged worktrees in Repository Settings. When a PR is merged, Supacode runs the archive script (if configured) and moves the worktree out of the active list automatically — keeping your sidebar clean without manual housekeeping.
A complete agent-to-PR workflow
17 Notifications
Running many agents in parallel creates an attention management problem — how do you know which worktree needs your review without constantly checking every terminal? Supacode's notification system solves this.
How notifications work
Notifications are generated from terminal activity and attached to the specific worktree surface that produced them. For supported harnesses (Claude Code, Codex, Pi), the agent itself can signal when it's finished or needs input.
Where notifications appear
- Sidebar: An unread indicator on the worktree row so you see at a glance which sessions need attention
- Toolbar: An aggregated notifications popover showing all pending notifications across all worktrees
- macOS system notifications: Toast notifications so you can be notified even when Supacode is not the focused window
Notification navigation
Selecting a notification in the popover jumps you back to the exact terminal surface (tab and pane) that produced it — not just the worktree, but the precise split.
Worktrees with active, pinned, or notified sessions float to the top of the sidebar and are marked with the supported-harness logo. This means the worktrees that need your attention are always visible without scrolling.
18 Settings & Storage
Where Supacode stores data
settings.json ← global settings (editors, GitHub, update channel)
repos/ ← managed worktree directories
<repo-name>/
<branch-name>/ ← individual worktree checkout
~/<your-repo>/
supacode.json ← optional per-repo config (version-controlled)
Global settings (settings.json)
| Setting | What it controls |
|---|---|
| Default editor | Which app opens when you press ⌘ O (VS Code, Cursor, Xcode, etc.) |
| GitHub integration | Enable/disable the GitHub CLI connection |
| Update channel | Stable or tip (latest commits) build channel |
| Appearance mode | Light / dark / system — controls Supacode's UI chrome |
| Repositories map | Per-repo scripts and settings (if no supacode.json in the repo) |
supacode.json (per-repository)
Place this file at the root of your repository to store per-project configuration in version control, making it shareable with your team:
{
"runScript": "pnpm dev",
"setupScript": "pnpm install && claude --dangerously-skip-permissions",
"archiveScript": "docker compose down"
}
When supacode.json exists in a repository, Supacode reads and writes settings there instead of to ~/.supacode/settings.json.
19 Terminal Theming
Supacode's UI chrome (sidebar, toolbar, backgrounds) respects macOS appearance — Light, Dark, or System. The terminal itself is themed via your Ghostty configuration file.
Ghostty config location
~/.config/ghostty/config
Key terminal appearance settings
# ~/.config/ghostty/config — affects Supacode's terminal # Font font-family = "JetBrains Mono" font-size = 14 # Color scheme (pick a built-in or define custom) theme = "Catppuccin Mocha" # or: theme = "Dracula" # or: theme = "Tokyo Night" # or: theme = "Gruvbox Dark" # Light/dark adaptive theme theme = light:rose-pine-dawn,dark:catppuccin-mocha # Transparency (0 = opaque, 1 = fully transparent) background-opacity = 0.92 # Padding inside the terminal window-padding-x = 12 window-padding-y = 8 # Cursor style: block, bar, underline cursor-style = bar # Bold text rendering bold-is-bright = true
Custom color palettes
# Define a fully custom color scheme in Ghostty config palette = 0=#1e1e2e # black (background) palette = 1=#f38ba8 # red palette = 2=#a6e3a1 # green palette = 3=#f9e2af # yellow palette = 4=#89b4fa # blue palette = 5=#cba6f7 # magenta palette = 6=#89dceb # cyan palette = 7=#cdd6f4 # white background = 1e1e2e foreground = cdd6f4
Because all libGhostty apps share the same config file, any font or theme change you make in ~/.config/ghostty/config applies to Supacode, Ghostty terminal, and any other libGhostty app you use — without any per-app configuration.
20 supacode.json Reference
A supacode.json file at the root of your repository is the cleanest way to configure Supacode per-project and share settings with your team via version control.
// supacode.json — place at repository root { // The command run when pressing ⌘R "runScript": "pnpm dev", // Runs once in a new worktree's terminal after creation "setupScript": "pnpm install && claude --dangerously-skip-permissions", // Runs before a worktree is archived "archiveScript": "docker compose down" }
Integration with CLAUDE.md / AGENTS.md
Pair supacode.json with an instructions file for your agent. The Supacode documentation recommends a section in AGENTS.md (or CLAUDE.md for Claude Code) that teaches the agent how to use Supacode:
# AGENTS.md — agent instructions for this repo
## Supacode Conventions
- Check the current branch name before starting. If it's generic
(animal name, random string), rename it to reflect the task.
Do NOT rename `main`.
- When creating a PR, use a clear conventional commit title.
Format: `feat: <description>` or `fix: <description>`
- After completing changes: `git add -A && git commit -m "<msg>"`
then `git push -u origin HEAD`
- If the task is too large, split it into sub-tasks. Use the
Supacode CLI to create additional worktrees for parallel work.
21 Tips & Best Practices
Name your worktrees meaningfully
Auto-generated branch names are fast but hard to navigate when 10 worktrees are active. Use one of these approaches:
- Enable prompted worktree creation in Repository Settings so you name the branch up front.
- Click the branch name in the toolbar to rename it after creation.
- Add instructions to your
AGENTS.mdto have the agent rename the branch before starting work.
# Add to AGENTS.md to make agents rename generic branches:
Before you start your task, check the current git branch name.
If it is something generic like an animal name, rename the branch
to match your task. Example: git branch -m feat/add-user-auth
Do not rename main, develop, or staging.
Archive aggressively, delete deliberately
If you're not 100% sure a branch's work is fully done or fully merged, archive it. Archiving is reversible — it just removes the worktree from the active list. Deletion removes the directory from disk and cannot be undone without the git branch still existing.
Use the run script for repeated commands
Every time you type the same command in multiple worktrees, that's a signal to put it in the Repository Commands run script. ⌘ R is faster than your shell history across worktrees.
Keep setup scripts idempotent
Your setup script will run in fresh worktrees. Make sure it works cleanly from a blank slate: install dependencies before starting the agent, handle missing .env files gracefully, and don't assume anything from a previous session.
Use lazygit inside worktrees
Open a second tab in any worktree and run lazygit for a visual git interface. This lets you review your agent's changes, stage selective hunks, and manage commits without leaving Supacode.
Pin your most-used worktrees
Pinned sessions float to the top of the sidebar. Use pinning for long-running worktrees (the main dev server, a long-running agent task) to keep them accessible via ⌃ 1/⌃ 2.
Use Ghostty's native keybindings
Since Supacode uses Ghostty under the hood, any Ghostty power-user features work: custom keybindings, quick terminal actions, and vim-mode navigation if configured. Customize in ~/.config/ghostty/config.
22 Archive vs Delete
This is the most important operational distinction in Supacode. Understanding it prevents accidental data loss.
| Archive | Delete | |
|---|---|---|
| What happens | Worktree is hidden from the active list | Worktree directory is removed from disk |
| Worktree directory | Kept on disk, untouched | Permanently deleted |
| Git branch | Kept; still exists locally | Optionally deleted (configurable) |
| Archive script | Runs (if configured); stops archive if it fails | Does not run |
| Reversible? | Yes — restore from archived list at any time | No — data is gone (unless pushed to remote) |
| View archived | ⌃ ⌘ A | — |
| When to use | Work is done or paused; may return later | Work is fully merged; no need to ever revisit |
When in doubt, archive. You can always delete an archived worktree later. You cannot un-delete a deleted one unless you have a remote backup of the branch. The archive keyboard shortcut is right-click → Archive in the sidebar; deletion also requires confirmation.
23 Frequently Asked Questions
Does Supacode work on macOS 15 or earlier?
No. Supacode requires macOS 26.0 (Tahoe) or newer. The requirement is strict — the app uses SwiftUI APIs and system frameworks that only exist in macOS 26+. There is no workaround.
Do I need GitHub CLI to use Supacode?
No. The GitHub CLI (gh) is only required for PR and CI features. Repository management, worktree creation, the built-in terminal, and agent integration all work without gh.
Can I use any AI coding agent?
Yes — any agent that runs in a terminal shell works. Claude Code, Codex, OpenCode, Aider, or custom scripts all work fine. The four natively-supported harnesses (Claude Code, Codex, OpenCode, Pi) get additional notification and CLI integration features.
How do I theme the terminal?
Edit ~/.config/ghostty/config. Supacode uses GhosttyKit for terminal rendering and inherits all of Ghostty's theming system. Changes take effect the next time a terminal opens.
Where are my worktrees stored?
Managed worktrees live under ~/.supacode/repos/<repository-name>/. You can change the location per-repository in Repository Settings.
Can I use bare repositories?
Yes. Supacode supports bare repositories — they show with a git-branch icon instead of a folder icon. Note that the copy-ignored and copy-untracked worktree creation options are disabled for bare repos.
What is the difference between archive and delete?
Archive hides the worktree from the active list but keeps it on disk and keeps the branch. Delete removes the worktree directory from disk. When uncertain, always archive first.
How do I get meaningful branch names?
Three options: (1) enable prompted worktree creation, (2) click the branch name in the toolbar to rename it, or (3) add instructions in AGENTS.md to have your agent rename branches before starting work.
Can I run Supacode alongside Ghostty?
Yes. Both use GhosttyKit and share ~/.config/ghostty/config for theming, so your font and color settings are consistent between them. They're separate apps and can run simultaneously.
Is Supacode free?
Yes — Supacode is free and open source. There is no paid tier. The source code is at github.com/supabitapp/supacode. It uses a custom license (not a standard SPDX open-source license), so review the LICENSE file before using in commercial contexts.
How do I report a bug or request a feature?
Open an issue at github.com/supabitapp/supacode/issues. The maintainer prefers detailed written issues over unreviewed pull requests.
How do sessions persist when I quit Supacode?
Supacode bundles a ZMX multiplexer. When you quit the app, any running processes (agents, dev servers, etc.) keep running in background ZMX sessions. When you relaunch, Supacode reattaches to those sessions and restores your tabs, splits, and scroll state as if you never quit.
Website: supacode.sh · Docs: docs.supacode.sh · GitHub: github.com/supabitapp/supacode · Issues: github.com/supabitapp/supacode/issues