Skip to content

Every branch gets
its own running stack.

Pomelo is a native macOS app that gives each branch its own worktree, services and databases, with the editor, terminals and your AI agent right next to them.

Available for macOS 14+ on Apple Silicon

myproject
feat-login
dev23%5h74%wk
WORKSPACES
main
Login page2
feat-loginChecks pending2 running
Checkout flow1
PROJ-101In ReviewCI failed3
Search filters
PROJ-104In Progress
Servicesfeat-login
Filter by name
All5
Running2
Failed2
Stopped1
feat-loginPROJ-1012 of 5 running
2 running2 need attention1 stopped
Start allStop allRestart failed
NEEDS ATTENTION2
api > jobscrashed2m ago
KeyError: key not found: "REDIS_URL"
Stopped with exit 1.
View logsFix with Claude
web > storybookcannot bind :6006
port 6006 is already in use by node (pid 4812)
Use a new portView logsFix with Claude
THIS WORKSPACE
api1/3
serverdev:4101
jobsdevcrashed
mailer
web1/2
vitedev:5173
storybook:6006 in use
SHARED - ALL WORKSPACES3/4
postgres:26678api
redis:28476api
files:29416api
mail:27686not used here
sessions_controller.rb
user.rb
routes.rb
1class SessionsController < ApplicationController
2 MAX_ATTEMPTS = 5
3
4 def create
5 user = User.find_by(email: params[:email])
6
7 if throttled?(params[:email])
8 return render json: { error: "too many attempts" }, status: :too_many_requests
9 end
10
11 if user&.authenticate(params[:password])
12 session[:user_id] = user.id
13 redirect_to dashboard_path
14 else
15 render :new, status: :unprocessable_entity
16 end
17 end
18
19 private
20
21 def throttled?(email)
22 Rails.cache.increment("login:#{email}", 1, expires_in: 1.minute) > MAX_ATTEMPTS
23 end
24end
api - zsh
api % bin/rails test test/controllers/sessions_controller_test.rb
Running 6 tests in a single process
......
Finished in 0.412s, 14.56 runs/s
6 runs, 11 assertions, 0 failures, 0 errors, 0 skips
api %
8:54
Ruby
$17.25 today

One branch, one running stack

Every branch is its own git worktree with its own services, conflict-free ports and databases. Ten branches run side by side and never collide.

Native and fast

Written in Rust with a GPU-rendered UI. Services run natively on PTY holders that survive a restart; Docker is only for shared data like Postgres and Redis.

Agent-ready

Claude Code, or any AI CLI, runs in a terminal inside the workspace with pom's MCP tools, and each workspace keeps its own agent state.

See it in 74 seconds.

Three agents, three branches, one laptop. The same night, with and without Pomelo.

Dev environment

Pomelo runs the whole project.

Point it at your repos once. Every branch after that comes up with its own worktrees, ports, databases and running services.

Explore Dev environment
Dark mode
Running setup commands (parallel)
Validating config and hosts
Provisioning workspace
Starting shared services and databases
Creating git worktrees (parallel)
Configuring repos (parallel)
Running setup commands (parallel)
web: setup
Seeding databases (parallel)

Workspaces per branch

Create one from a branch or a ticket. Worktrees, shared services, env, setup and seeds, each stage shown as it runs.

Servicesfeat-login
Filter by name
All5
Running2
Failed2
Stopped1
feat-loginPROJ-1012 of 5 running
2 running2 need attention1 stopped
Start allStop allRestart failed
NEEDS ATTENTION2
api > jobscrashed2m ago
KeyError: key not found: "REDIS_URL"
Stopped with exit 1.
View logsFix with Claude
web > storybookcannot bind :6006
port 6006 is already in use by node (pid 4812)
Use a new portView logsFix with Claude
THIS WORKSPACE
api1/3
serverdev:4101
jobsdevcrashed
mailer
web1/2
vitedev:5173
storybook:6006 in use
SHARED - ALL WORKSPACES3/4
postgres:26678api
redis:28476api
files:29416api
mail:27686not used here

Services at a glance

What runs, what crashed and why, with a new port, the logs or a fix one click away.

Databasefeat-login
Filter tables and columns
CONSOLES
query 1main
DATABASES
api
myproject_feat_login
articles128
sessions42
users8
idbigint
emailtext
nametext
roletext
created_attimestamptz
redisshared
filesshared

Databases per branch

Tables, Redis keyspaces and buckets in one tree, data grids and SQL consoles, with nothing to wire up.

Workspaceweb, through the dev proxydatabaseapi port
mainhttp://vite.web.main.localhost:8767myproject_main:4100
Login pagehttp://vite.web.feat-login.localhost:8767myproject_feat_login:4101
Checkout flowhttp://vite.web.proj-101.localhost:8767myproject_proj-101-checkout:4102

One origin per workspace

Every workspace gets its own URLs through the dev proxy, so cookies and CORS behave like production.

Agents

Agents that see the real stack.

A main agent per workspace, side agents for questions, reviews and fixes, and the plan limits in view. Your AI CLI runs in a real terminal with Pomelo's tools.

Explore Agents
New side agent in feat-login
AskWhy, how or where - about the code or the plan
read-only
ReviewRead the branch diff and report bugs
read-only
Second opinionSame question to codex
read-only
FixFix a bug or a failing check
can edit
Starts withmain: 9.3k tokens
Auto~9.3kMain is 9.3k: fork the whole session.
Fork~9.3kA copy of main's whole session. Most detail; reuses main's prompt cache.
Compacted~3.4kFork, then /compact inside the fork. Main itself is never compacted.
Fresh~2.1kNo history. Pomelo writes a packet: branch, ticket, recent commits, changes.
Double-click a type to startStart Ask - ~9.3k tokens
New agent in a new workspaceFor parallel code changes: its own branch, ports and database

Side agents

Ask, review, get a second opinion or fix, starting from a fork, a compacted fork or a fresh packet.

WORKSPACES
main
Login page
feat-login2 running
Checkout flow
PROJ-101In Review3
Search filters
PROJ-104In Progress1
Invoice export
PROJ-97Done

Status on every workspace

Thinking, using tools, compacting or waiting for you, with a notification when it changes.

devdev@example.comTeam
5 hours23%in 2h 31m
Week74%Sat 17:00
Open Agent UsageU
Refresh Now
Updated 12s ago - from the agents' status line

Usage and plan limits

The 5-hour and weekly limits in the title bar, and cost by day from the agents' own transcripts.

Setting up myproject3 repositories - 1m 12s so far
Hide agent CLIPauseCancel
50%
Clone repositories4s
apilinked
weblinked
workercloned
Scan0 tokens1s
apiRailspostgresredis3 env
webVite1 env
workerNoderedisminio0 env
Configure with Claude Code52s
api: services web (bundle exec puma), jobs (bundle exec sidekiq)
api: setup bundle install - migrate bin/rails db:migrate
api: DATABASE_URL -> postgresql://{{shared.postgres.url}}/{{db.main}}
web: services dev (pnpm vite --port $PORT)
Hide agent CLIOpen pom.ymlSkip the agent - finish manually
4
Verify

Project setup

An agent CLI writes pom.yml from what Pomelo detected; Pomelo checks every service boots.

Editor

The editor you need, next to it all.

Language servers, split panes, diffs, real terminals and a Git panel that works across every repo of the branch.

Explore Editor
Changes (5)Remote (1)History
View Diff+61 -58Stage All
apion feat-login
Staged2
sessions_controller.rbapp/controllers+12 -1
sessions_controller_test.rbtest/controllers+38
Not staged1
development.rbconfig/environments+2
webon feat-login
Not staged2
Login.tsxsrc/pages+9 -3
LegacyForm.tsxsrc/components -54
feat-loginin 2 of 21 to push
Throttle repeated sign-in attempts
1 commit in api (2 files)Commit

Git across every repo

Stage in any repo, then one message makes one commit per repo. Push, pull and checks on the Remote tab.

app/controllers/sessions_controller.rb+12 -2
1class SessionsController < ApplicationController1class SessionsController < ApplicationController
2 MAX_ATTEMPTS = 5
23
3 def create4 def create
4 user = User.find_by(email: params[:email])5 user = User.find_by(email: params[:email])
6
7 if throttled?(params[:email])
8 return render json: { error: "too many attempts" }, status: :too_many_requests
9 end
510
6 if user && user.authenticate(params[:password])11 if user&.authenticate(params[:password])
7 session[:user_id] = user.id12 session[:user_id] = user.id
8 remember(user)
9 end13 end

Unified or split diffs

The whole branch diff with every hunk open, side by side when there is room.

web % pnpm test
x src/pages/Login.test.tsx > shows the throttle message
AssertionError: expected "Too many attempts"
Test Files 1 failed | 11 passed
web %
CopyC
PasteV
Add Selection to Agent
Ask Agent about Selection

Terminals that hand off

Shells that survive a restart, and a right-click that sends the selection to the agent.

WORKSPACES
main
Login page1
feat-loginChecks pending2 running
Checkout flow1
PROJ-101In ReviewCI failed
Invoice export1
PROJ-97Done

Pull requests and Jira

Each workspace shows its pull request's checks and its ticket's status; both open in tabs.

Built with care.

The small things you reach for every day.

  • Tabs and splitsdrag a tab to split the center into panes
  • Tree-sitter highlightingwith folding and an outline (cmd-shift-o)
  • Language serversrust-analyzer, gopls, clangd, TypeScript, Python
  • Project searchcmd-shift-f in the workspace, cmd-p for files
  • Markdown previewside by side with the editor
  • Inline git blame and diff hunksright in the editor
  • Same-origin dev proxyone origin per workspace, so no CORS fights
  • Webhook fan-outeach webhook reaches every workspace running the service
  • Config bundlesshare pom.yml, optionally sealed with secrets
  • Encrypted secretsper project, referenced by name in pom.yml
  • Command paletteevery command, with its key
  • Verified self-updateseach update's signature is checked first

Daily drive Pomelo.

Free and open source. No account, nothing to sign up for.

Available for macOS 14+ on Apple Silicon