Ports
Five manager-level ports plus a reserved block of eleven for every project. What each one is for and how to change it.
The five kinds of port
The manager uses five distinct port roles. The manager port serves the API and WebSocket. The development frontend port serves Vite. The front door is the path-routed entry point. The subdomain proxy is the host-routed entry point. The shared pooler is one PgBouncer for all projects. On top of those, each managed project owns a block of eleven service ports.
Manager-level ports
| Role | Setting | Default | Bind address |
|---|---|---|---|
| Manager API and WebSocket | PORT | 24084 in the example file; 24085 in code | 127.0.0.1 |
| Development frontend | Vite | 5173 | 127.0.0.1 |
| Path-routed front door | FRONT_DOOR_PORT | 6000 | 127.0.0.1 |
| Subdomain proxy | PROXY_PORT | 9000 | 127.0.0.1 |
| Shared PgBouncer pooler | PGBOUNCER_PORT | 6432 | 127.0.0.1 |
All manager-level ports bind to loopback by default.
Per-project ports
A managed project owns eleven ports, computed as 60000 + slot × 11 + offset. The offsets are api 0, db 1, shadow 2, studio 3, inbucket 4, smtp 5, pop3 6, analytics 7, pooler 8, edge_runtime 9 and edge_inspector 10. Slot zero therefore owns 60000 through 60010, slot one owns 60011 through 60021, and so on. The values are written into the project's supabase/config.toml before a managed start.
Changing a port
The manager and proxy ports are read at startup; the front-door and pooler ports can also be changed at runtime from Admin Settings. A runtime change rebinds the listening socket, but it does not rewrite clients, project configurations or bookmarks. After a change, update the clients that depend on the old value and confirm the proxy health panel.
PORT_BAND_BASE and PORT_BLOCK_SIZE look configurable but are not: the allocator uses the constants 60000 and 11. Changing the environment values has no effect on allocation.
If a port is in use
The launcher frees orphaned processes on PORT and PROXY_PORT before a start. It does not free the front-door port or the pooler port, because those are not managed by the launcher's orphan cleanup. If one of them is held, stop the process that holds it. On Windows, scripts/ports.ps1 lists the listeners on the known ports with their owning process. On Linux and macOS, lsof -i tcp:<port> does the same.