Repository navigation
v3.0.0-beta.14
Pre-release
Pre-release
·
4 commits
to develop
since this release
3.0.0-beta.14 (2026-10-29)
- feat(cli)!: default secrets unset to no and require --all to unset every secret (#7172) (59d4627)
- feat(cli)!: one --remote flag, local target defaults and one hosted-mutation consent rule (#7188) (1fa6164)
- feat(cli)!: remove db remote commit and the low-use inspect db aliases (#7109) (948107b), closes #7108
- feat(cli)!: remove deprecated commands and the supabase-go binary (#6609) (6b3541d)
- feat(cli)!: remove deprecated config keys, env vars and per-function import maps (CLI-2597) (#7176) (2f60e0b), closes #7154
- feat(cli)!: remove deprecated db pull and domains flags (CLI-2596) (#7116) (8913e85), closes #7115
- feat(cli)!: resolve config values as flags > env > config.toml > defaults (#7074) (eaa5c4f)
- fix(cli)!: stop
db advisors --remoteminting a login role (CLI-2829) (#7297) (9e84159), closes #7188 - fix(config)!: honor sms
enable_confirmationson config push (CLI-2624) (#7221) (fdb5914) - refactor(cli)!: remove Go CLI naming and framing from code and docs (#7064) (b903db0)
Features
BREAKING CHANGES
db advisors --remoteno longer connects to the
database first (matchesdb query --remote), so it no longer resolves
database settings, creates a temporary login role or removes network
bans under--yes- Commands that can run locally now default to the local
stack,--remotereplaces the target flags, and every hosted mutation
follows one consent rule.
db push,db pull,migration fetch,db dump,migration list,
migration repair,inspect db *,inspect report,gen typesand
storage ls/cp/mv/rmnow target the local stack when run without a
target flag. Add--remoteto reach the linked project (supabase db push --remote),--remote=<ref>for another project,
--remote=<branch>for a branch of the linked project, or
--remote=<postgres-url>for a database URL.SUPABASE_PROJECT_IDon
its own no longer selects a hosted project for these commands; it only
says which project bare--remotemeans.gen typeswith no target generates from the local database instead
of opening a project picker or failing. In a linked checkout with no
local stack running, it suggests--remote.db schema declarative generateno longer asks which target to use.db schema declarative syncwith no declarative files generates them from the local database
and no longer offers the linked project as the source; runsupabase db schema declarative generate --remotefirst to start from the linked
project.--linked,--project-ref,--db-urlandgen types --project-id
are deprecated: they still work and print a warning on stderr naming the
--remoteform.--localdoes nothing and warns. v4 removes all of
them, along withdb diff'slinked(useremote). They no longer
appear in help.--remote=<value>can't be combined with any of the deprecated flags.
--project-refon a database command no longer needs--linked. An
empty--project-ref=is now an error instead of being ignored.
--passwordonly applies to a hosted target.db diffrejects--remotetogether with--from/--to; use
--from=remoteor--to=remote.db queryrejects SQL passed both as an argument and with--file.- Bare
--remote(and the deprecated--linked) opens the project
picker in an interactive terminal when the checkout isn't linked.
Database and storage commands used to fail. --remote <word>after a command that takes an operand fails with a
"did you mean" error when<word>is, or is close to, a branch name of
the linked project, when it's shaped like a project ref, or when the
branch list can't be fetched. Put the operand before--remote
(supabase db pull add_profiles --remote) or use--remote=<branch>.- Every hosted mutation now asks for confirmation, and fails with
HostedMutationConsentRequiredErrorin non-interactive, JSON,
stream-json, agent or-o json|yaml|toml|envruns unless--yes(or
SUPABASE_YESexported in the shell) is set. Commands that newly need
this for unattended runs: - db push; db pull when it updates the remote migration history; pull,
except with--dry-run- migration up/down/squash/repair against a hosted target
- db reset and test db against a hosted target
- db query against a hosted target (or pass
--read-onlyfor reads) - seed buckets and storage cp/mv/rm against a hosted target
- functions deploy/delete; secrets set/unset; config push
- branches create/delete/disable/pause/unpause/update; backups restore
- encryption update-root-key; network-bans remove; network-restrictions
update; ssl-enforcement update- postgres-config update/delete; sso add/update/remove
- vanity-subdomains activate/delete; domains create/activate/delete
- notebooks push; projects create/delete; orgs create; bootstrap;
feedback delete- compute push/delete
- A
ypiped on stdin no longer confirms a hosted mutation. - The default answer is No for every hosted mutation except projects,
branches, orgs and domains create, and bootstrap. Pressing Enter now
declines db push, deploys, secrets changes and migration history
updates. SUPABASE_YESinsupabase/.env, or in a.env,.env.localor
.env.<NODE_ENV>[.local]file in the working directory, no longer
confirms hosted mutations. When a working-directory file defines it at
all, a shell-exportedSUPABASE_YESdoesn't count either, since the CLI
can't tell the two apart. Use--yes.- db push, db reset against a hosted target (including seeding), config
push and functions deploy --prune each ask one combined question instead
of several. Deploy and prune are confirmed before anything is deployed,
and--prunenow runs even when every function is already up to date.
secrets unset --alllists the secrets before asking. - Declining a hosted mutation fails with
HostedMutationDeclinedError
("context canceled"). The command-specific cancelled error codes are
removed. Decliningdb pullorpullaborts before any file is
written; there's no longer a files-only path. - Removing network bans automatically, while connecting to a hosted
database, now needs--yes. Otherwise the command fails and points to
supabase network-bans remove. migration downandmigration repair --allon the local database no
longer prompt.- Commands that resolve a target print
Target: …once on stderr,
including read-only commands against a hosted project.config pushno
longer prints its own "Pushing config to" line. JSON object results and
error envelopes gain atargetobject;db reset'stargetchanges
from a string to that object, andconfig pushJSON no longer reports
declined_addonsor a skipped status. Arrays and generated artifacts
are unchanged. migration upagainst a hosted target reports "Remote database is up
to date." instead of "Local database is up to date.", andmigration listlabels the history column "Local DB" when the target is local.- Agents never get a confirmation prompt, even with a terminal attached;
they need--yesfor hosted mutations.
[auth.sms] enable_confirmations = false, theinit
default, now turns phone confirmation off on the nextconfig push, set
it totrueto keep the phone code and runconfig diffbefore pushing[inbucket]and[remotes.<name>.inbucket]are
removed; use[local_smtp]. A non-empty[experimental] orioledb_versionis removed; use[db] orioledb_version.
SUPABASE_EXPERIMENTAL_ORIOLEDB_VERSIONis removed; use
SUPABASE_DB_ORIOLEDB_VERSION. Thelinkedinandslackauth
providers are removed; uselinkedin_oidcandslack_oidc.
INBUCKET_URLis removed fromstatusandstack statusoutput and
--override-name inbucket.urlis rejected; useMAILPIT_URLand
mailpit.url. Animport_map.jsoninside a function directory is no
longer picked up byfunctions deploy,functions serveorstart;
rename it todeno.jsonor setfunctions.<slug>.import_map.supabase secrets unsetno longer defaults to yes. The
prompt defaults to No, and a run that can't prompt (non-TTY stdin,
non-interactive stdout, or JSON output) now fails unless--yesor
SUPABASE_YES=1is set, for named secrets and--allalike. Piped
stdin answers are no longer read. Running it with no secret names now
fails instead of unsetting every secret; pass--allto do that. Add
--yesto unattendedsecrets unsetinvocations.db pull --use-pg-deltais removed; use
--declarative.db pullno longer has an--experimental
structured-dump mode: with--experimentalorSUPABASE_EXPERIMENTAL
set and no--declarativeit now exits 1; use--declarative, or
--experimental=falsefor a migration pull.--include-raw-outputis
removed fromdomains create,get,reverify,activateand
delete; use-o json.supabase db remote commitis removed; usesupabase db pull.supabase inspect db total-index-sizeis removed; use
supabase inspect db index-stats.supabase inspect db total-table-sizesandsupabase inspect db table-index-sizesare
removed; usesupabase inspect db table-stats. Each removed command
exits 1 and prints its replacement.- Flags and
SUPABASE_*environment variables now
override config, including a matched[remotes.<name>]block. Every
value resolves in one order: flag > shell environment > project env
files >config.json/config.toml(a matched remote block over the
base) > default. Project env files are.env.<SUPABASE_ENV>.local,
.env.local,.env.<SUPABASE_ENV>and.env, insupabase/and then
the project root;SUPABASE_ENVdefaults todevelopment.
- If you deploy to a project with a
[remotes.*]block, any
SUPABASE_*variable in the job or in those files now beats the block.
The CLI warns for each value it overrides. Checkenv | grep ^SUPABASE_
in CI andgrep -h ^SUPABASE_ supabase/.env* .env*in the repo, and set
SUPABASE_ENVin CI so.env.developmentdoesn't apply. supabase config pushnow pushes those overrides; for example, a
SUPABASE_AUTH_SITE_URLin.env.localreplaces the value in
[remotes.production]. Push labels each env-sourced value, and
supabase config diffshows the same values.- Seeding a project that matches a
[remotes.*]block now asks first,
unless the block itself setsdb.seed.enabled = true.db push --include-seedanddb reset --linkedexit 1 in CI unless you pass
--yes.--include-seedandSUPABASE_DB_SEED_ENABLED=truenow
overrideenabled = falsein the base[db.seed]too.db pushstill
seeds only with--include-seed. --passwordwith--localor--db-urlnow exits 1 ondb push,
db pull,db dump,db schema declarative generate,migration list
andmigration repair.migration squashtargets the local database by
default, somigration squash -pneeds--linked. Put the password in
the URL, or set[db].passwordfor the local database.- In a directory linked to project A,
SUPABASE_DB_PASSWORDis no
longer sent to another project (--project-ref B). Pass--password,
or provide an access token so the CLI can create a temporary login role. - An invalid value in config or in a
SUPABASE_*variable now fails
every command that loads project config, includingdb push,stopand
services(for exampleSUPABASE_STUDIO_PORT=abc). The error names the
variable or file and reportsCliConfigValueError. SUPABASE_EXPERIMENTAL_PGDELTA_ENABLEDoverrides
[experimental.pgdelta].enabled, sofalseselects migra for the run.
Boolean variables, includingSUPABASE_EXPERIMENTAL_STACK, accept1,
t,T,true,True,TRUEor0,f,F,false,False,
FALSEand fail on anything else.supabase db diff --use-pg-delta=falsenow turns pg-delta off even
when config or env turns it on.supabase gen types --localuses[db].password, not
SUPABASE_DB_PASSWORD.SUPABASE_PROJECT_IDnow names local containers even when a remote
block matches. Without aproject_idin config.toml, local containers
and volumes are named after the project folder, not the project ref. Run
supabase stopbefore upgrading, or setproject_id.- Ports with a leading zero (
054322) are rejected. servicesand thefunctionscommands readconfig.jsonbefore
config.toml.- Without
--workdir, the CLI uses the nearest directory with
supabase/config.tomlorsupabase/config.json, so a nested
config.jsonproject now wins over an outerconfig.tomlone. inspect reportneeds[[experimental.inspect.rules]]with string
fields; a single[experimental.inspect.rules]table now fails.supabase link --passwordis deprecated and ignored.- Error codes:
MigrationPasswordFlagsErroris now
DbPasswordFlagsError; invalid values reportCliConfigValueError;
seeding without consent reportsSeedConsentRequiredError.
COBRA_COMPLETION_DESCRIPTIONSis no longer read; set
SUPABASE_COMPLETION_DESCRIPTIONSto control shell completion
descriptions. Error messages that quoted Go library errors are reworded:
invalid boolean flag values (e.g.sso add --skip-url-validation) now
sayexpected a booleaninstead ofstrconv.ParseBool: …; invalid
unsigned values forstorage cp --jobsanddb reset --lastnow say
expected an unsigned integer(orvalue out of range) instead of
strconv.ParseUint: …; oversized migration/seed statements report
scanner: token too longinstead ofbufio.Scanner: token too long;
gen bearer-jwtclaim and JWK parse errors now readinvalid claims: expected a JSON object, got <kind>,invalid claims: number <n> is out of range,failed to parse JWK: expected a JSON object, got <kind>,
andinvalid JWK field <field>: expected <type>, got <kind>instead of
json: cannot unmarshal … into Go value/struct field …. Config type
errors name values by shape:SUPABASE_PROFILEfiles reportexpected a YAML mapping at the top levelandarray/objecttype names,[db]
glob entries report TOML type names (local date,offset date-time,
array,table, …) instead of Go type names, and malformeddb lint/db advisorspayloads reportinvalid <field>: expected <shape>
instead of naming Go types.SUPABASE_PROFILEerrors are reworded
(unknown keys: …,<key> is required,<key> must be an http(s) URL,
unsupported config file type …,no profile config file specified)
and multi-line profile errors no longer pad lines with trailing spaces.
Config decode errors drop thedecoding failed due to the following error(s):header and render entries as<key>: expected a string, got <type>,<key>: unknown keys: …,<key>: must be one of ….failed to unmarshal …messages (postgres-config, bootstrap templates, functions
download) now readfailed to parse …,db lint'sfailed to marshal json:readsfailed to parse lint result:, and TOML output errors drop
thetoml:prefix.- Removed the deprecated commands and flags that still
ran through the bundled Go binary, and thesupabase-gobinary itself.
If your scripts or CI use any of these, switch to the replacement. Each
removed command or flag now exits with code 1 and prints its
replacement.
supabase db remote changes→supabase db diff --linkedsupabase gen keys→supabase projects api-keys --project-ref <ref>supabase db diff --use-pg-schema→ omit the flag to use the default
engine, or pass--use-pg-deltasupabase functions download --legacy-bundle→supabase functions download --use-api. If that also fails and the Function was deployed
with a CLI older than 1.120.0, redeploy it with the current CLI first.supabase db branch create,delete,listandswitch→ removed
with no local replacement. Hosted preview branches are managed with
supabase branches.--create-ticket(global flag) → removed. Report CLI problems with
supabase issue bug.supabase-go→ no longer installed. Callsupabaseinstead.