Skip to content

Updated

Supabase CLI

Develop locally, deploy to the Supabase Platform, and set up CI/CD workflows

The Supabase CLI runs the entire Supabase stack on your own machine or in a CI environment, so you can build and test locally, then connect your project to a hosted one when you're ready to deploy.

  • Quickstart is the two-command version, if you already have the CLI and a container runtime.
  • Set up a local project installs the CLI and brings the stack up on your machine. Start here if you haven't run it before.
  • Connect to a hosted project links your local directory to a project on the Supabase Platform.
  • Change your CLI version updates the CLI and switches between stable and pre-release builds.
  • Telemetry covers what the CLI collects and how to opt out.

Quickstart

With two commands, you can set up and start a new local project:

  1. Run supabase init to create a new local project.
  2. Run supabase start to launch the Supabase services.

Set up a local project

Install the CLI, bring the Supabase stack up on your machine, and stop it when you're done.

Install the Supabase CLI

  1. Install the CLI as a project dev dependency. This command adds the CLI to a single project rather than installing a global command:

    npm install supabase --save-dev
    # or: pnpm add -D supabase / yarn add -D supabase / bun add -D supabase
  2. Pin the version in package.json so your whole team uses the same CLI version.

  3. Run the CLI through your package runner:

    npx supabase --help
    # or: pnpm supabase / yarn supabase / bunx supabase

Install the CLI with Homebrew:

brew install supabase/tap/supabase

Install the CLI with Scoop:

scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
scoop install supabase

The CLI is available via Homebrew and Linux packages.

Homebrew

brew install supabase/tap/supabase

Linux packages

Linux packages are provided in Releases.

  1. Download the .apk, .deb, or .rpm file for your package manager.
  2. Install the package:
    • sudo apk add --allow-untrusted <...>.apk
    • sudo dpkg -i <...>.deb
    • sudo rpm -i <...>.rpm

Run a local Supabase project

The most common thing you do with the CLI is run the full Supabase stack (Postgres, Auth, Storage, and the rest) on your own machine. That stack runs in Docker containers, so you need a container runtime installed first. On Windows and Linux, follow the official guide to install and configure Docker Desktop. In a coding agent sandbox or on a CI runner with no container engine, the experimental native runtime runs each service as a process instead. It supports Linux and macOS on Apple silicon. For platform requirements and setup, see Docker and native runtimes.

On macOS, we recommend OrbStack instead of Docker Desktop. It's a drop-in replacement that handles extended file attributes (xattrs) on mounted volumes and container networking more reliably than Docker Desktop. It also starts faster and uses less CPU, memory, and disk, which makes a noticeable difference when running the full Supabase stack.

Alternatively, you can use a different container tool that offers Docker-compatible APIs:

ToolPlatforms
Rancher DesktopmacOS, Windows, Linux
PodmanmacOS, Windows, Linux
colimamacOS

To bring the stack up:

  1. Start your container runtime.

  2. Open a terminal in the directory where you want to create your project.

  3. Initialize the project:

    supabase init

    The command creates a supabase directory, which is safe to commit to version control. init creates local files only: it doesn't sign you in or connect the directory to a project on the Supabase Platform. To connect one, see Connect to a hosted project.

  4. Start the Supabase services from the same directory:

    supabase start

The first run takes time while the CLI downloads the Docker images. It pulls the entire Supabase stack, plus a few extra images useful for local development, such as a local SMTP server and a database diff tool.

Access your project's services

After all the Supabase services are running, the CLI prints your local credentials. The output looks like this, with the URLs and keys you use in your local project:

Started supabase local development setup.
╭──────────────────────────────────────╮
│ 🔧 Development Tools │
├─────────┬────────────────────────────┤
│ Studio │ http://127.0.0.1:54323 │
│ Mailpit │ http://127.0.0.1:54324 │
│ MCP │ http://127.0.0.1:54321/mcp │
╰─────────┴────────────────────────────╯
╭──────────────────────────────────────────────────────╮
│ 🌐 APIs │
├────────────────┬─────────────────────────────────────┤
│ Project URL │ http://127.0.0.1:54321 │
│ REST │ http://127.0.0.1:54321/rest/v1 │
│ GraphQL │ http://127.0.0.1:54321/graphql/v1 │
│ Edge Functions │ http://127.0.0.1:54321/functions/v1 │
╰────────────────┴─────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────╮
│ ⛁ Database │
├─────┬─────────────────────────────────────────────────────────┤
│ URL │ postgresql://postgres:postgres@127.0.0.1:54322/postgres │
╰─────┴─────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────────╮
│ 🔑 Authentication Keys │
├─────────────┬────────────────────────────────────────────────┤
│ Publishable │ sb_publishable_... │
│ Secret │ sb_secret_... │
╰─────────────┴────────────────────────────────────────────────╯
# Default URL:
http://localhost:54323

The local development environment includes Supabase Studio, a graphical interface for querying and editing your database.

Local Supabase Studio showing the Default Project home page, with a sidebar of section icons, a Client libraries row for JavaScript, Python, and Flutter, and a grid of example project cards.

# Default URL:
postgresql://postgres:postgres@localhost:54322/postgres

Access the local Postgres instance with psql or any other Postgres client, such as pgAdmin. For example:

psql 'postgresql://postgres:postgres@localhost:54322/postgres'
# Default URL:
http://localhost:54321

If you are accessing these services without the client libraries, you might need to pass the client keys as an Authorization header. Learn more about JWT headers.

curl 'http://localhost:54321/rest/v1/' \
-H "apikey: sb_publishable_..."
http://localhost:54321/rest/v1/ # REST (PostgREST)
http://localhost:54321/realtime/v1/ # Realtime
http://localhost:54321/storage/v1/ # Storage
http://localhost:54321/auth/v1/ # Auth (GoTrue)

Local logs rely on the Supabase Analytics Server, which reads the Docker logging driver. On Linux and macOS, mount the /var/run/docker.sock domain socket. On Windows, expose the tcp://localhost:2375 daemon socket. Configure the socket manually after installing the CLI.

All logs are stored in the local database under the _analytics schema.

Stop local services

When you finish working, stop the stack. Stopping doesn't reset your local database:

supabase stop

With the default ports, supabase start runs one local project per machine, because every project's config.toml uses the same ports. To run several local projects or git worktrees at the same time, see Running multiple local projects.

Connect to a hosted project

The stack you started in Run a local Supabase project runs only on your machine. Nothing reaches a hosted project until you sign in to the CLI and link your local directory to one.

For the steps, see Pushing to a remote project. To run deployments from CI, see Configure GitHub Actions.

Change your CLI version

These sections cover the CLI itself rather than your local project.

Use the beta channel

Pre-release CLI builds ship from the development branch and are versioned X.Y.Z-beta.N. Use the npm beta dist-tag, or install supabase-beta with Homebrew or Scoop. supabase-beta is a separate package from supabase.

Install as a dev dependency:

npm install supabase@beta --save-dev

Or run without installing:

npx supabase@beta --help
brew install supabase/tap/supabase-beta
brew link --overwrite supabase-beta
scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
scoop install supabase-beta

Homebrew

brew install supabase/tap/supabase-beta
brew link --overwrite supabase-beta

Linux packages

Beta builds are attached to GitHub pre-releases. Download the .apk, .deb, or .rpm for your platform and install with the same commands as Linux packages.

Update the Supabase CLI

Update the CLI with the same package manager you installed it with. See the CLI releases page for available versions.

Update the CLI with npm:

npm update supabase --save-dev

Update to the current beta release, or switch a stable install to the beta channel:

npm install supabase@beta --save-dev
brew upgrade supabase

Beta channel:

brew upgrade supabase-beta
scoop update supabase

Beta channel:

scoop update supabase-beta

Homebrew

brew upgrade supabase

Beta channel:

brew upgrade supabase-beta

Linux packages

  1. Download the package from the Supabase CLI releases page
  2. Install the package using the same commands as the initial installation:
    • sudo apk add --allow-untrusted <...>.apk
    • sudo dpkg -i <...>.deb
    • sudo rpm -i <...>.rpm

If you have any Supabase containers running locally, stop them and delete their data volumes before upgrading. Deleting the volumes lets Supabase managed services apply new migrations on a clean local database.

  1. Save local schema changes as a migration:

    supabase db diff -f my_schema
  2. Dump local data to your seed file:

    supabase db dump --data-only > supabase/seed.sql
  3. Stop the containers and delete their data volumes:

    supabase stop --no-backup

Telemetry

The Supabase CLI collects telemetry data about general usage. Participating in this program is optional, and you can opt out at any time.

How to opt out

  1. Disable telemetry:

    supabase telemetry disable
  2. Confirm the current setting:

    supabase telemetry status

To enable telemetry again, run supabase telemetry enable.

You can also opt out using the SUPABASE_TELEMETRY_DISABLED=1 environment variable. The broader DO_NOT_TRACK=1 convention is also respected.

Learn more