This skill should be used when the user asks to "start supabase locally", "set up local supabase", "run supabase dev", "initialize supabase project", "configure local database", "start local...
Supabase Local Development provides a complete local Postgres database with all Supabase services (Auth, Storage, Edge Functions, Realtime) running in Docker containers. This enables offline development, faster iteration, and safe database migrations before deploying to production.
Key benefits:
Official Documentation:
Supabase local development requires a Docker-compatible container runtime:
Verify Docker is running:
docker info
Install via npm (recommended for Next.js projects):
npm install -g supabase
Or via Homebrew (macOS):
brew install supabase/tap/supabase
Verify installation:
supabase --version
supabase init
This creates a supabase/ directory with:
config.toml - Local configurationseed.sql - Optional seed datamigrations/ - Database migrationssupabase start
First run downloads Docker images (~2GB). Subsequent starts are faster.
Services started:
| Service | Local URL | Purpose |
|---|---|---|
| API | http://127.0.0.1:54321 | REST/GraphQL API |
| Studio | http://127.0.0.1:54323 | Database UI |
| Inbucket | http://127.0.0.1:54324 | Email testing |
| Database | postgresql://127.0.0.1:54322 | Direct Postgres |
supabase status -o env
Output:
SUPABASE_URL=http://127.0.0.1:54321
SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
SUPABASE_DB_URL=postgresql://postgres:postgres@127.0.0.1:54322/postgres
Add to .env.local:
# Supabase Local Development
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
Note: NEXT_PUBLIC_ prefix exposes variables to the browser.
supabase gen types typescript --local > lib/supabase/database.types.ts
Regenerate after schema changes.
Prefix with NEXT_PUBLIC_:
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
No prefix required:
SUPABASE_SERVICE_ROLE_KEY=eyJ...
SUPABASE_DB_URL=postgresql://...
| Framework | File | Priority |
|---|---|---|
| Next.js | .env.local |
1st |
| Next.js | .env.development.local |
2nd |
| Generic | .env |
3rd |
| Cloudflare Workers | dev.vars |
Special |
supabase db diff -f migration_name
supabase db reset
supabase db push
supabase link --project-ref YOUR_PROJECT_REF
supabase gen types typescript --local > lib/supabase/database.types.ts
supabase gen types typescript --project-id YOUR_PROJECT_ID > lib/supabase/database.types.ts
import { createClient } from "@supabase/supabase-js";
import type { Database } from "@/lib/supabase/database.types";
const supabase = createClient<Database>(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
);
| Command | Purpose |
|---|---|
supabase init |
Initialize new project |
supabase start |
Start local services |
supabase stop |
Stop local services |
supabase status |
Show service status |
supabase status -o env |
Output as environment variables |
supabase db reset |
Reset database and apply migrations |
supabase db diff -f name |
Create migration from changes |
supabase db push |
Push migrations to remote |
supabase gen types typescript --local |
Generate types from local |
supabase link --project-ref REF |
Link to remote project |
# macOS - Start Docker Desktop
open -a Docker
# Linux - Start Docker daemon
sudo systemctl start docker
If ports are in use:
supabase stop --no-backup
supabase start
Or configure different ports in supabase/config.toml.
supabase stop --no-backup
supabase start
supabase db reset
DO:
supabase db diff for migrations.env.local for local credentials (gitignored)DON'T: