Skip to content
Dev environment

Every branch comes up
with its own running stack.

A workspace is a branch with its own git worktrees, ports and databases, and the services already running. Ten of them run side by side and never collide.

myproject
feat-login
dev23%5h74%wk
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
main
Login page2
feat-login2 running
Checkout flow
PROJ-101In Review3
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
sessions_controller.rb
web/vite
users[main]
api/dev/usersonfeat-login
DataStructureDDL
Details
WHEREid > 10
ORDER BYid
500 rows
idbigintemailvarchar(255)nametextorg_idbigintroletextsettingsjsonb
1101ada@example.comAda1Acmeadmin{"theme":"light","beta":true}
2102alan@example.comAlan2Globexmember{ 6 keys } 7.1 KB
3103grace@example.comGrace3InitechmemberNULL
4104linus@example.comLinus1Acmemember{"theme":"dark","beta":true}
5105margaret@example.comMargaret2Globexadmin{"theme":"light","beta":false}
6106ken@example.comKen3Initechmember{"theme":"dark","beta":false}
7107barbara@example.comBarbara1Acmemember{"theme":"light","beta":true}
8108dennis@example.comDennis2Globexmember{"theme":"dark","beta":false}
9109edsger@example.comEdsger3Initechadmin{"theme":"light","beta":false}
10110frances@example.comFrances1Acmemember{"theme":"dark","beta":true}
1-10 of 1234Export CSV
ValueRow
settingsjsonbrow 102
{ 6 keys }Expand allCollapseOpen in tab
{
"theme": "dark"
"beta": true
"digest": "weekly"
"locale": "en-US"
"notifications": { 2 keys }
"saved_views": [ 180 items ]
}
7.1 KBSet NULLCopy
api - zsh
api % git status --short && git log --oneline -2
M app/controllers/sessions_controller.rb
83ddadb (HEAD -> feat-login) Throttle repeated sign-in attempts
4066b02 (origin/main, main) Initial commit
api %
$17.25 today

Workspaces per branch

Pick a branch or a ticket. Pomelo does the rest in stages you can watch, repo by repo in parallel, and retries from the stage that failed.

[01]

Create one from a branch or a ticket

It checks out a worktree of every repo, starts the shared services, writes each service's env, runs your setup commands and seeds the databases from main.

Workspace lifecycle
Dark mode
Configuring repos (parallel)
Validating config and hosts
Provisioning workspace
Starting shared services and databases
Creating git worktrees (parallel)
Configuring repos (parallel)
Running setup commands (parallel)
Seeding databases (parallel)
[02]

Its own ports, databases and URLs

Ports are handed out so they never clash. Each workspace gets its own databases in the shared Postgres, and one origin per workspace through the dev proxy, so cookies and CORS behave like production.

How the network works
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

Services

What runs, what broke and why, and the fix one click away. Each service runs in a holder that outlives the app, so a restart of Pomelo never restarts your stack.

[01]

See what needs attention

A crash, a port already in use or a failed start shows first, with its last line and what to do: Use a new port, View logs, Fix with Claude or restart. Shared services stay pinned at the bottom. Try the filter above the list.

The Services panel
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
[02]

Open a service as a tab

Its URL, port, mode and command, and its logs live, with a filter, pause, follow and wrap. Type in the filter to try it.

The service tab
web>vitedevStartStopRestartOpen in browser
StatusRunning
PID48123
URLvite.web.feat-login.localhost:8767
Port5173Change
Modedevprod
LOGS live
PauseClearFollowWrap7 lines
15:40:00[vite] hmr update /src/pages/Login.tsx
15:40:07[vite] page reload src/main.tsx
15:40:14Warning: something is deprecated
15:40:21[vite] page reload src/main.tsx
15:40:28Error: could not resolve 'vite-plugin-svgr'
15:40:35[vite] hmr update /src/components/Button.tsx
15:40:41[vite] hmr update /src/pages/Login.tsx

Databases

Pomelo already knows every workspace's connection, so there is nothing to wire up.

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

One tree for the branch's data

Postgres tables and columns, Redis keyspaces and MinIO buckets, with a filter and a menu on every row. Click a table to open it.

api/dev/usersonfeat-login
DataStructureDDL
Details
WHEREid > 10
ORDER BYid
500 rows
idbigintemailvarchar(255)nametextorg_idbigintroletextsettingsjsonb
1101ada@example.comAda1Acmeadmin{"theme":"light","beta":true}
2102alan@example.comAlan2Globexmember{ 6 keys } 7.1 KB
3103grace@example.comGrace3InitechmemberNULL
4104linus@example.comLinus1Acmemember{"theme":"dark","beta":true}
5105margaret@example.comMargaret2Globexadmin{"theme":"light","beta":false}
6106ken@example.comKen3Initechmember{"theme":"dark","beta":false}
7107barbara@example.comBarbara1Acmemember{"theme":"light","beta":true}
8108dennis@example.comDennis2Globexmember{"theme":"dark","beta":false}
9109edsger@example.comEdsger3Initechadmin{"theme":"light","beta":false}
10110frances@example.comFrances1Acmemember{"theme":"dark","beta":true}
1-10 of 1234Export CSV
ValueRow
settingsjsonbrow 102
{ 6 keys }Expand allCollapseOpen in tab
{
"theme": "dark"
"beta": true
"digest": "weekly"
"locale": "en-US"
"notifications": { 2 keys }
"saved_views": [ 180 items ]
}
7.1 KBSet NULLCopy

Tables and SQL consoles

WHERE and ORDER BY, paging, sorting by a column and CSV export. Consoles run a statement with cmd-enter and are saved with the project.

Dev proxy and webhooks

One origin per workspace at http://<service>.<repo>.<workspace>.localhost:8767, a backend retargeted to staging by flipping a profile, and each inbound webhook fanned out to every workspace running the service.

How the network works >