Supabase CLI v3.0.0 is the next major version of the Supabase CLI. npm, Homebrew, Scoop, the Linux packages, and supabase/setup-cli now install it by default. It changes which project a command runs against, when a command asks for confirmation, and where configuration values come from. Most pipelines that deploy with the CLI need a small change before they upgrade.
What changed#
- Database commands target your local stack by default.
db push,db pull,db dump,migration list,gen types, and thestoragecommands run against the local stack unless you pass--remote. One--remoteflag replaces--linked,--project-ref, and--db-url, which still work but are deprecated. - Every command that changes a hosted project asks for confirmation first, and the default answer is No. When the CLI can't ask, as in CI, the command fails unless you pass
--yes. Pipingyinto a command no longer confirms it. - Flags and environment variables override
config.toml, including[remotes.<name>]blocks. Every value resolves in the same order: flag, shell environment, project env files, config file, then default. - pg-delta is the default schema diff engine, so the SQL that
db diffanddb pullgenerate can change. - Deprecated commands, flags, config keys, and environment variables are removed. A removed command or flag exits with code 1 and prints its replacement. This includes the
[inbucket]config section, which is now[local_smtp]. - The CLI ships as a single
supabaseexecutable. The separatesupabase-goexecutable is no longer installed.
Two smaller changes can affect a production project. config push now applies [auth.sms] enable_confirmations as written. secrets unset defaults to No and needs --all to remove every secret.
Why we made this change#
In v2, some database commands defaulted to the linked project and others to the local stack, and four different flags chose a target. A command run without a flag could reach a production database. Many hosted changes ran without a confirmation, or with one that defaulted to Yes. Configuration had the same problem: config.toml beat environment variables for some settings and not for others.
v3 gives every command the same rules. Commands run locally unless you say otherwise, ask before any hosted change, and read every setting in one order. Defaults like these can only change in a major version, so v3 changes them together.
Who is affected#
- Anyone who runs the CLI in CI, in deploy scripts, or through an AI coding agent. Hosted changes that run unattended now need
--yes, and database commands need--remoteto reach your hosted project. - Projects created with
supabase initbefore v2.108.0. Theirsupabase/config.tomlhas an[inbucket]section, sosupabase start,stop,status, and thedbcommands fail until you rename it. - Projects that deploy with
[remotes.<name>]blocks and also setSUPABASE_*environment variables. The variables now take precedence over the block, andconfig pushpushes them. - Projects that edit
supabase/schemasand then rundb diff. Under pg-delta, usesupabase db schema declarative syncinstead. - Scripts that call removed commands or flags, or call
supabase-godirectly.
v3 changes the CLI only. Hosted projects, their data, and self-hosted Supabase are not affected.
What happens if you take no action#
Nothing changes until you install v3. A pipeline that installs the latest CLI without pinning a version already runs v3. The most common failures are:
supabase startfails with[inbucket] in supabase/config.toml is no longer supported.functions deploy,secrets set,config push, anddb pushfail in CI withHostedMutationConsentRequiredError.db pushwithout--remotetargets the local stack. It fails when no local stack is running. If your job started one, it succeeds there and never reaches your hosted project.
Migration steps#
- Update to the latest v2 release and run your usual workflows, including CI. v2.122.0 and later warn about removed commands, flags, and config keys, and about commands whose default target changes in v3. Fix each warning.
- Rename
[inbucket]to[local_smtp]insupabase/config.toml, along with any[remotes.<name>.inbucket]block. The keys inside don't change. v2.108.0 and later already read[local_smtp], so you can do this before you upgrade. - Add
--remoteto every command that should reach your hosted project, and--yesto every hosted change that runs unattended. The quick reference for CI maps common v2 commands to their v3 form. - If you use
[remotes.<name>]blocks, check theSUPABASE_*variables in CI and in your env files. Runsupabase config diffbefore your firstconfig pushon v3. - If
supabase/config.tomlhas noproject_id, runsupabase stopbefore you upgrade. Local container and volume names can change in v3. - Install v3 and work through the rest of the migration guide.
To upgrade later, pin v2 with npm install supabase@v2.stable --save-dev, brew install supabase/tap/supabase@2, scoop install supabase-v2-stable, or version: v2.stable on supabase/setup-cli@v3.
Rollout timeline#
| Date | Milestone | User action |
|---|---|---|
| 2026-11-02 | v3.0.0 released. npm, Scoop, the Linux packages, and supabase/setup-cli install v3 by default. v2.122.1 adds the v2.stable channels. | Follow the migration steps, or pin v2 |
| 2026-11-03 | brew install supabase installs v3 | Same as above |
| Ongoing | v2 receives security fixes and fixes for broken behavior, but no new features | Upgrade to v3 to get new features |
If v3 breaks a workflow the migration guide doesn't cover, run supabase issue bug or open an issue.