A drop-in upgrade to Supabase Studio that lets you spin up, manage, and monitor multiple isolated Supabase and PocketBase projects — all from a single self-hosted UI. No Supabase Cloud account. No per-project dashboards.
The official self-hosted Supabase stack is built for a single project. Want a staging environment, a client project, or a separate database? You're stuck spinning up a whole new Docker stack manually and juggling multiple dashboards — or paying Supabase Cloud $25+ per project per month.
Multi-Head Studio fixes this. It replaces the standard Studio container with one that can create and manage additional Supabase stacks on demand, straight from the UI you already know.
Create and switch between isolated Supabase projects without leaving the dashboard.
Uses the host Docker socket to launch sibling containers. Clean and production-safe.
Each project gets its own Postgres password, JWT secret, anon key, and service key — generated fresh.
Already running Supabase self-hosted? One command replaces only the Studio container. Your data stays untouched.
Register existing Supabase deployments on other hosts and browse them from one place.
Dump your Supabase Cloud database and restore it into any self-hosted project — directly from the UI or CLI. No manual pg_dump wrangling.
Schedule daily or weekly pg_dump backups per project. Download, restore, or delete any backup from the UI or CLI — no extra tooling needed.
Enable only what you need. Realtime, Storage, Edge Functions, and the connection pooler are all opt-in via Docker Compose profiles — no YAML editing required.
Create a new Postgres database inside an existing project's instance — no extra containers, minimal overhead.
Spin up a PocketBase backend (SQLite, REST API, auth, realtime, file storage) as a Docker Compose stack or plain docker run container.
Bi-directional data migration between PocketBase and Supabase. Move collections to tables or tables to collections — from the UI or CLI.
Optional two-factor authentication and single sign-on in front of Studio via Authelia — one overlay file, no code changes.
Provision warm standbys and trigger failover with one click. WAL streaming replication included.
One writable master with read replicas. Auto-promotes the highest-priority healthy replica on failure.
Each new project gets a port block automatically offset by +10. Studio writes a project registry to disk and launches a full Supabase stack as a sibling Docker Compose project. No YAML editing, no port hunting.
| Service | Default project | 2nd project | 3rd project |
|---|---|---|---|
| Kong (HTTP) | 8000 | 8010 | 8020 |
| Postgres | 5432 | 5442 | 5452 |
| Pooler | 6543 | 6553 | 6563 |
The docker-compose.minimal.yml overlay converts every optional service to opt-in.
Start lean and add components back with a single --profile flag — no config file editing.
| Profile | Enables | Skip when… |
|---|---|---|
realtime | Realtime WebSocket subscriptions | Your app doesn't use supabase-js subscriptions |
storage | Storage API + imgproxy | Your app doesn't store files |
edge-functions | Edge Functions (Deno runtime) | You don't use Edge Functions |
pooler | Supavisor (ports 5432 / 6543) | You connect directly to Postgres |
analytics | Logflare + Vector log pipeline | You don't need the Studio Logs tab |
# Core only — minimal footprint docker compose \ -f docker-compose.yml \ -f docker-compose.minimal.yml \ up -d # Core + storage + realtime (typical app stack) docker compose \ -f docker-compose.yml \ -f docker-compose.minimal.yml \ --profile storage \ --profile realtime \ up -d # Print the right command for your selection smh overlay storage realtime # Add Nginx + Authelia 2FA (replaces plain nginx) smh proxy nginx-authelia
Every project gets its own backup schedule. Multi-Head Studio runs pg_dump
inside the project's Postgres container on your chosen interval and stores the compressed
dump file on the host. No cron jobs to write, no extra tools to install.
Each project has its own backup page. Set the schedule to Daily or Weekly, or trigger a backup on demand with Run backup now.
All backups are listed with size and timestamp. Download any backup as a .pgdump file for off-site archiving.
Pick any backup and click Restore. The dump is piped back through pg_restore inside the container. A confirmation dialog guards against accidental overwrites.
Or use the CLI:
# List backups and current schedule for a project smh backup list <ref> # Trigger a backup now smh backup run <ref> # Set a daily automatic schedule smh backup schedule <ref> daily # Restore from a specific backup (--confirm required) smh backup restore <ref> <filename> --confirm # Download a backup to disk smh backup download <ref> <filename> --out ./my-backup.pgdump
Multi-Head Studio can dump any Supabase Cloud database and restore it into a
self-hosted project in a single operation. It runs pg_dump inside the
target project's Postgres container — no extra tools to install, no intermediate files.
A new tab in the Projects page. Paste your cloud database's direct connection string (find it under Project Settings → Database → Connection string → URI).
Select which self-hosted project to restore into. Default is the public schema; you can include auth to also migrate user accounts.
A real-time log streams pg_dump and psql output as the migration runs. Done in seconds for small databases, minutes for large ones.
Or use the CLI:
# Migrate schema + data (public schema) smh migrate <ref> \ --source "postgresql://postgres:[password]@db.[ref].supabase.co:5432/postgres" # Schema only — no row data smh migrate <ref> --source "postgresql://..." --schema-only # Include auth users as well smh migrate <ref> --source "postgresql://..." --schemas public,auth
⚠ Use the direct connection URL (db.<ref>.supabase.co:5432), not the pooler URL.
The target project must be running before migrating. Existing objects in the selected schemas will be dropped and recreated.
PocketBase is a self-contained backend — SQLite database, REST API, auth, realtime, and file storage — that runs as a single binary. Multi-Head Studio manages PocketBase projects the same way it manages Supabase projects: spin up, monitor, migrate, and delete from one UI.
| Mode | How it runs | Best for |
|---|---|---|
pocketbase |
Docker Compose stack | Full isolation; own port, own container, own volume |
pocketbase-embedded |
Plain docker run |
Lighter footprint; no Compose project overhead |
pocketbase-embedded --target <ref> |
Collection namespace inside an existing PocketBase | Zero containers; logical sub-project sharing one PB instance |
Create PocketBase projects via the UI or CLI:
# Full PocketBase stack (Docker Compose) smh create "my-pb" --mode pocketbase # Lightweight PocketBase (plain docker run) smh create "my-pb" --mode pocketbase-embedded # Collection namespace inside an existing PocketBase project smh create "my-ns" --mode pocketbase-embedded --target <ref>
Move data between PocketBase and Supabase in either direction. Collections map to Postgres tables; types are converted automatically. Run a live migration from Project Settings → PocketBase → Migrate or the CLI.
# PocketBase → Supabase (collections → tables) smh pb-migrate <ref> \ --direction pb-to-supa \ --pb-url http://localhost:8090 \ --pb-email admin@example.com \ --pb-password mypassword # Supabase → PocketBase (tables → collections) smh pb-migrate <ref> \ --direction supa-to-pb \ --pb-url http://localhost:8090 \ --pb-email admin@example.com \ --pb-password mypassword # Poll a running migration job smh pb-migrate status <ref> --job <job-id>
Prerequisites: Docker Engine ≥ 24 with the Compose plugin.
Sparse checkout — no full monorepo clone needed.
bash start.shAuto-generates secrets, detects your OS and Docker bridge IP, starts all services.
http://localhost:8000Your multi-head Studio is live. Hit "New project" to spin up a second Supabase stack.
# Fresh install — no existing Supabase needed
git clone --filter=blob:none --sparse \
https://github.com/flamingrubberduck/supabase-studio-multi-head.git
cd supabase-studio-multi-head
git sparse-checkout set multihead
cd multihead && bash start.sh
Already self-hosting Supabase? See the upgrade guide →
| Feature | Supabase Cloud | Standard self-host | Multi-Head Studio |
|---|---|---|---|
| Multiple projects | ✓ $25+/project | Manual only | ✓ from UI |
| Self-hosted | ✗ | ✓ | ✓ |
| Single dashboard | ✓ | One per stack | ✓ |
| Standby / failover | ✓ Pro plan | ✗ | ✓ Business+ |
| Read replica cluster | ✓ Pro plan | ✗ | ✓ Enterprise |
| Database backups (UI + CLI) | ✓ managed | Manual | ✓ built-in |
| Migrate from Cloud (UI + CLI) | ✗ manual only | ✗ manual only | ✓ built-in |
| Embedded projects (shared Postgres) | ✗ | ✗ | ✓ built-in |
| PocketBase projects (UI + CLI) | ✗ | ✗ | ✓ built-in |
| PocketBase ↔ Supabase migration | ✗ | ✗ | ✓ built-in |
| Data ownership | Vendor hosted | ✓ | ✓ |
| 2FA / SSO (Authelia) | ✗ | ✗ manual setup | ✓ overlay |
| Monthly cost | $25+ per project | Your server only | Your server only |
For individuals and teams under $2M ARR.
For growing teams that need high availability.
For teams that need full cluster orchestration and dedicated support.