Changelog
New updates and product improvements
Copy as Markdown
Breaking Change: Tables not exposed to Data and GraphQL API automatically
Apr 28, 2026
database GraphQL breaking-change
New tables in the public schema will no longer be exposed to the Data API automatically.
When this change takes effect #
- Starting today (April 28, 2026), you can create new Supabase projects where tables in the
publicschema are not exposed to the Data API and GraphQL API by default. You can enable this setting at project creation. - On May 18, 2026, pg_graphql will not be enabled by default. More details here.
- On May 30, 2026 this setting becomes the default for all new projects.
- On October 30, 2026 the setting will be applied it to all existing projects.
Once the change is rolled out to your project, new tables you create in public schema require an explicit opt-in (via a Postgres grant ) before the Data API can see them. Existing tables are not affected in your project, they keep their current grants and stay reachable. This change applies to projects that use the Data API, Supabase's auto-generated REST and GraphQL layer, which is what supabase-js and our other client libraries call. If your app reads and writes Postgres over a direct connection (via psql, ORM or an app server with a connection string), this change will not affect you.
What's changing #
Previously, when you create a Supabase project with default settings, select, insert, update, and delete are granted to every table in the public schema to the anon, authenticated and service_role roles. Every table you create becomes reachable via the Data API on creation.
From today, the project creation screen includes a setting to opt out of those default grants. When the “Automatically expose new tables” checkbox is unchecked, you opt-in to the new behavior and tables aren’t exposed to the Data API by default. On May 30, 2026 the opt-out becomes the default for all new projects.
RLS behavior remains unchanged. Grants are a separate layer: they control whether a role can access a table at all, while RLS controls which rows that role can see.
If a grant is missing, PostgREST returns a clear error rather than a silent failure:
`{
"code": "42501",
"message": "permission denied for table your_table",
"hint": "Grant the required privileges to the current role with: GRANT SELECT ON public.your_table TO anon;"
}
`
The hint shows you which role is missing which privilege, along with the GRANT needed to fix it.
Before → After #
| Step | Before | After |
|---|---|---|
Create table in public |
Table is reachable via Data API on creation | Table exists but is not reachable via Data API |
grant to anon / authenticated / service_role |
Implicit, via default privileges | Required, explicit grant statement |
alter table ... enable row level security |
Remains the same | Remains the same |
create policy ... |
Remains the same | Remains the same |
Why #
When Supabase launched, a human reviewed each schema change and enabled RLS on new tables as they went. The default grants made this convenient: create a table, and it showed up in your client.
That model doesn’t scale, and it’s easy to accidentally expose new tables before you’ve secured them.Today, agents, CLI scripts, and AI platforms create tables too, and many of those operations do not have a human reviewing the diff.
Explicit grants make access a deliberate, code-level decision. The PostgREST error response above includes a precise hint, so an agent can self-correct when a grant is missing instead of producing a broken request.
Without a grant, the API cannot see the table, regardless of how you created it (SQL editor, migrations, Management API, MCP, CLI, or an AI coding tool). Postgres enforces this at the role layer, so the guarantee holds regardless of the creation path.
We’re moving the platform toward declarative code. Explicit Postgres grants are reviewable, diffable, and greppable. They also give you per-role control: anon and authenticated need different privileges in most schemas, and an explicit grant makes that difference visible in your migrations. This was always possible, now it's the default.
Currently, the default grants expose every table in public over the Data API on creation, including tables a developer forgot to protect.
This is the next step in a series of platform default changes we have shipped over the past quarter:
- a Data API exposure badge in the Dashboard
- granular per-table grants
- an RLS-on-by-default toggle
- the schema enumeration restriction in March
Who is affected #
You are unaffected if you only talk to your database over a direct Postgres connection--you can stop reading.
You need to act if any of the following is true:
- Your app reads or writes tables in the
publicschema via the Data API (PostgREST, GraphQL,supabase-js, any of the client libraries, or direct HTTP to/rest/v1/or/graphql/v1) - Your migrations or provisioning flow create tables in
publicwithout explicitGRANTstatements. - Your AI coding tool, CLI script, or Management API call creates tables and expects them to be reachable over the Data API on creation.
The change reaches you on one of three dates:
- From Today, if you opt out of the "Automatically expose new tables and functions" setting during project creation.
- May 30, 2026, when the new behavior becomes the default for all new projects.
- October 30, 2026, when the new behavior is enforced on all existing projects.
Between now and then, Security Advisor will flag affected tables, and we’ll email active projects so you can review access, add grants, and verify your app.
What to do #
For new tables you want to expose via the Data API, make explicit grants part of your table-creation flow. Without an explicit GRANT , a role will not have access to the created table.
Treat these three steps as a unit. If the grant is missing, Postgres rejects the query before RLS comes into play.
`-- 1. Grant the privileges the role needs
grant select on public.your_table to anon;
grant select, insert, update, delete on public.your_table to authenticated;
grant select, insert, update, delete on public.your_table to service_role;
-- 2. Enable RLS
alter table public.your_table enable row level security;
-- 3. Add the policies you need
create policy "users can read their own rows"
on public.your_table
for select
to authenticated
using (auth.uid() = user_id);
`
If you use an AI coding tool to create tables, update its system prompt or adopt the Supabase agent skill, which includes the grants step, and which we keep updated as the platform changes. Skills are easy to install, and handle grants correctly by default. Agents can self-correct from the PostgREST error hint returned as well.
If you run your own migration framework, or a platform that provisions Supabase projects for your own customers, bundle the GRANT statements alongside your ENABLE ROW LEVEL SECURITY and policy statements in the same migration.
Opting in on existing projects #
You do not have to wait for October 30. To adopt the new behavior on an existing project today, run the same revoke statements the dashboard runs at project creation.
Open the SQL Editor for your project and run:
`-- Stop Postgres from granting default privileges on future objects in public
alter default privileges for role postgres in schema public
revoke select, insert, update, delete on tables from anon, authenticated, service_role;
alter default privileges for role postgres in schema public
revoke usage, select on sequences from anon, authenticated, service_role;
`
These four statements change the defaults for future tables and sequences that the postgres role creates in the public schema.
Existing objects keep their current grants, so your running app stays reachable.
From this point on, new tables you create in the public schema need explicit GRANT statements before the Data API can see them.
If you also want to tighten grants on existing tables you do not want reachable via the Data API, revoke them per table:
`revoke all on table public.your_table from anon, authenticated, service_role;
`
The Data API exposure badge in the Table Editor and the Security Advisor list the tables worth reviewing.
FAQ #
Does this affect tables in the storage, auth, realtime, or custom schemas?
No. The change touches default privileges in the public schema. Tables in storage, auth, realtime, and any custom schemas you expose via the Data API keep their current grants and their current defaults.
I opted in on an existing project, created new tables, and my app is broken. How do I roll back?
Open the SQL Editor and run two blocks.
1) Restore defaults for future tables
Future tables will now behave as they did before the revoke:
`alter default privileges for role postgres in schema public
grant select, insert, update, delete on tables to anon, authenticated, service_role;
alter default privileges for role postgres in schema public
grant usage, select on sequences to anon, authenticated, service_role;
`
2) Fix existing tables
alter default privileges only affects future objects, so tables you created since the revoke stay without grants. Grant them in bulk:
`grant select, insert, update, delete on all tables in schema public to anon, authenticated, service_role;
grant usage, select on all sequences in schema public to anon, authenticated, service_role;
`
After running both blocks, your project matches the pre-revoke state. If you added tables you want to keep private, revoke those individually after the bulk grant:
`revoke all on table public.your_private_table from anon, authenticated, service_role;
`
Rollout timeline #
| Date | Milestone | User action |
|---|---|---|
| 2026-04-28 | Changelog published; opt-in toggle available at project creation; docs updated | Try it on a test project; adapt your provisioning flow |
| 2026-05-30 | New behavior becomes the default for all new projects | New-project workflows must include explicit GRANT statements |
| 2026-10-30 | New behavior enforced on all existing projects | Migration must be complete; tables without explicit grants stop being reachable via the Data API |
Communications timeline #
We email owners and admins of every active project, including projects with no Security-Advisor-flagged tables today.
After October 30, any new table created in public without an explicit grant stops being reachable via the Data API, so a project with no flagged tables today still breaks the first time someone adds a new one.
From today through October 30, the Security Advisor flags affected tables per project and shows the remediation SQL, so you do not have to hunt for them yourself.
| Date | Channel | Audience |
|---|---|---|
| 2026-04-28 | This changelog post | Public |
| 2026-05-07 | April monthly newsletter | All subscribers |
| 2026-05-13 | Email: first notice of the May 30 change for new projects | Owners and admins of all active projects |
| 2026-05-27 | Email: final reminder before the May 30 change for new projects | Owners and admins of all active projects |
| 2026-09-23 | Email: five-week notice before the October 30 change for existing projects | Owners and admins of all active projects |
| 2026-10-23 | Email: final notice, one week before change for existing projects | Owners and admins of all active projects |
If you have a question, create a support ticket here.
Apr 24, 2026
Verify the correctness of your RLS policies with the RLS tester #
Verifying the correctness of your RLS policies set up has always been a gap, as highlighted by a number of GitHub discussions like here and here. As such, we're piloting a dedicated UI for RLS testing (using role impersonation as the base), in which you'll be able to
- Run a SQL query as a user (not logged in / logged in - this is the role impersonation part)
- See which RLS policies are being evaluated as part of the query
- And hopefully be able to debug which policies are not set up correctly
- (Side note) We also added partial support for testing client library code instead of just SQL
- This is powered by the AI Assistant which will then infer the code into SQL
- e.g
const { data } = await client.from('colors').select('*') - Given that this is by AI, as always do verify the output!
Note: Only SELECT queries are supported for now to simplify things. Testing mutation queries (INSERT, UPDATE, DELETE) could trigger side effects such as triggering a database trigger, especially if it involves an external request such as an edge function or HTTP call - we're keeping them out of this preview while we work out a safe way to support them.
Changes are currently set as a feature preview which you can access by clicking on your Profile picture in the top navigation bar . We'll iterate as we get feedback from everyone so please do let us know what you think! 🙂🙏
Related PR: https://github.com/supabase/supabase/pull/45121
What we'd like to know from you #
- Any bugs or issues that you might have run into while using the RLS tester
- Any ideas or suggestions that you reckon will improve the DX based on how you currently verify the correctness of your RLS policies
- Feel free to leave any feedback in this thread too! (Both good and bad!) 🙂🙏
Automatic PostgREST retries for transient errors
Apr 20, 2026
supabase-py supabase-js supabase-flutter supabase-swift
All official Supabase client libraries now automatically retry failed database queries when they encounter transient network errors — no code changes required.
What changed #
When a GET or HEAD request to PostgREST fails with a transient error (HTTP 520, HTTP 503, or a network-level failure), the client transparently retries the request up to 3 times with exponential backoff (1s → 2s → 4s, capped at 30s). Each retry includes an X-Retry-Count header so server-side logs can observe retry behavior.
Only idempotent methods (GET and HEAD) are retried. POST, PATCH, PUT, and DELETE requests are never retried automatically.
Versions #
| Library | Version |
|---|---|
| supabase-js | v2.102.0 |
| supabase-swift | v2.43.0 |
| supabase-flutter (postgrest_dart) | v2.7.0 (supabase_flutter v2.12.2+) |
| supabase-py | v2.29.0 |
Configuration #
Retries are enabled by default. You can opt out globally or per-request:
JavaScript
`// Disable globally
const supabase = createClient(url, key, {
db: { retryEnabled: false }
})
// Disable per request
const { data } = await supabase.from('table').select().retry(false)
`
Swift
`// Disable globally
let client = PostgrestClient(url: url, headers: headers, retryEnabled: false)
// Disable per request
let data = try await client.from("table").select().retry(enabled: false).execute()
`
Flutter/Dart
`// Disable globally
final client = PostgrestClient(url, retryEnabled: false);
// Disable per request
final data = await supabase.from('table').select().retry(enabled: false);
`
Python
`# Disable per request
data = supabase.table("table").select("*").retry(False).execute()
`
Upcoming: Tax Collection on Supabase Invoices
Apr 17
[Public Alpha] Declarative Schema Management with pg-delta
Apr 16
Apr 9
docs dashboard branching multigres
Edge Functions rate limits on recursive/nested Edge Functions calls
Mar 11
Mar 5
docs edge functions storage analytics multigres
Breaking Change: Removing access to OpenAPI spec via the anon key
Feb 17
Developer Update - February 2026
Feb 5
Queue table Inserts, edits and deletes on the table editor
Feb 4
Breaking Change: pg_graphql no longer enabled automatically (within approx 3 weeks from today)
Jan 26
SQL snippets can now be saved in local Studio
Jan 21
Developer Update - January 2026
Jan 8
docs security dashboard supabase-py ai
Data API upgrade to PostgREST v14
Dec 11
Developer Update - December 2025
Dec 10
edge functions auth ai analytics infra etl
[Public Alpha] Manage Vector Buckets from the dashboard
Nov 26
Dashboard Updates (101125 - 251125)
Nov 24
Notify users about security-sensitive actions on their accounts
Nov 11
[Public Alpha] Manage Analytics Buckets from the dashboard
Nov 3
Dashboard Updates (201025 - 031125)
Nov 3
Enhanced Type Inference for Embedded Functions (Computed Relationships)
Oct 22
Dashboard Updates (061025 - 201025)
Oct 21
Oct 10
Oct 8
Dashboard Updates (220925 - 061025)
Oct 6
Supabase JS Client Libs: Migration to Monorepo
Oct 2
Dashboard Updates (080925 - 220925)
Sep 24
Changes to Custom JWT and Signing Keys issue resolution
Sep 16
Dashboard Updates (180825 - 010925)
Sep 1
Personal Access Tokens: Expiration & Usage Tracking
Aug 27
3x cheaper egress for cache hits
Aug 22
OAuth 2.1 Server Capabilities for Supabase Auth
Aug 19
All regions now run Deno 2.1 compatible release
Aug 15
Change in `realtime-js` affecting Node.js < 22
Aug 12
Deprecation Notice: Dropping support for python's gotrue and supafunc
Aug 8
Dashboard Navigation Updates: Project Settings
Aug 4
supabase v17.4.1.062 was withdrawn
Jul 23
Coming Soon: Combined View for Logs
Jul 17
Deprecation Notice: Dropping Support for Node.js 18
Jul 16
Jul 11
Update to Edge Functions Regional Invocations
Jul 2
Deno 2.1 Preview - Hosted Environment
Jul 1
Forthcoming Postgres 17 Release Notes
May 22
Feature Preview: Tabs for Table and SQL Editor
May 13
May 7
Dashboard Updates [210425 - 050525]
May 6
Project scoped roles now available in Team plans
Apr 21
Dashboard Updates [070425 - 210425]
Apr 21
Apr 8
Dashboard Updates [240225 - 070425]
Apr 7
Supabase Management API `GET` Logs Restrictions
Apr 1
Upcoming Change: Improved Experimental Routing for Read Replica Load Balancers
Mar 27
Dedicated Pooler with PgBouncer
Mar 25
Restricting Access on Auth, Storage, and Realtime Schemas on April 21, 2025
Mar 18
Developer Update - February 2025
Mar 7
dashboard edge functions ai billing postgres
Deno 2.1 Preview **local only**
Mar 7
Greatly increased Third-Party Auth MAU quota for Free and Paid Plans
Mar 3
Dashboard Updates [10/02/25 - 24/02/25]
Feb 25
Deploy and update Edge Functions using the Management API
Feb 19
Feature Preview: Inline Editor
Feb 18
Upcoming breaking change to Dashboard Navigation
Feb 17
Deploy Edge Functions from CLI without needing Docker + import files outside of supabase directory
Feb 14
Dashboard Updates [27/01/25 - 10/02/25]
Feb 11
Developer Update - January 2025
Feb 7
Deprecation of Fly.io Postgres Managed by Supabase on April 11, 2025
Feb 7
Dashboard Updates [13/01/25 - 27/01/25]
Jan 28
Relaxing Database Size limit on Free Plan - 0.5 GB Database Size per project
Jan 27
Developer Update - December 2024
Jan 23
Enhanced Type Inference for JSON Fields in supabase-js
Jan 20
Add static files to Edge Functions
Jan 15
Supabase Connection Pooler Deprecating Session Mode on Port 6543 on February 28, 2025
Jan 13
Dashboard Updates [30/12/24 - 13/01/25]
Jan 13
Jan 13
Type validation for query filter values in supabase-js
Jan 9
Use a custom NPM registry for Edge Function dependencies
Jan 7
Dashboard Updates [09/12/24 - 23/12/24]
Dec 23
Dashboard Updates [18/11/24 - 09/12/24]
Dec 10
Slack V1 OAuth Provider Deprecated in favour of Slack (OIDC)
Dec 1
Removal of app.settings.jwt_secret from the database
Nov 22
Dashboard Updates [04/11/24 - 18/11/24]
Nov 18
Nov 6
Write Edge Functions in pure JavaScript instead of using TypeScript
Nov 5
Use `deno.json` configuration file in Edge Functions
Nov 5
Dashboard Updates [21/10/24 - 04/11/24]
Nov 4
Import NPM packages from private registries in Edge Functions
Oct 29
Dashboard Updates [07/10/24 - 21/10/24]
Oct 21
Developer Update - September 2024
Oct 10
Improved docs information architecture
Oct 9
Dashboard Updates [23/09/24 - 07/10/24]
Oct 7
XHTML responses are only allowed with a Custom Domain enabled
Oct 1
Supabase Platform Access Control: Project Permissions Breaking Changes on October 15, 2024
Sep 24
Dashboard Weekly Updates [16/09/24 - 23/09/24]
Sep 23
Projects on XL and larger compute add-ons can now create up to 5 Read Replicas.
Sep 22
Supabase Auth: Changes to default email provider
Sep 18
Developer Update - August 2024
Sep 16
postgREST auth realtime supabase-py ai wrappers analytics
Supabase Auth: Asymmetric Keys support in 2025
Sep 13
Upcoming changes to Supabase API Keys
Sep 12
breaking-change persist-in-search
Dashboard Weekly Updates [02/09/24 - 09/09/24]
Sep 12
Edge Functions are now Deno 1.45 compatible
Sep 10
Dashboard Weekly Updates [26/08/24 - 02/09/24]
Sep 2
Dashboard Weekly Updates [26/08/24 - 30/08/24]
Aug 30
Moving to hourly usage-based billing for databases, based on disk consumption
Aug 23
Threshold for transitioning projects to physical backups lowered to 15GB
Aug 19
Aug 9
Let's Encrypt cross-signed chain will no longer be used for Custom Domains after September 9, 2024
Aug 8
Improved invoices and more timely usage data
Aug 8
Moving to hourly usage-based billing for IPv4, Custom Domain and Point-in-time recovery
Aug 7
Moving to hourly billing for Storage Size
Aug 2
Wrappers Wasm FDW is on Public Alpha
Jul 30
Jul 23
docs dashboard edge functions billing analytics
DigiCert no longer being used as the CA for Supabase HTTP APIs
Jul 22
Edge Functions: Deploy More Functions at No Extra Cost
Jul 18
Supabase Platform Access Control: Organization Permissions Breaking Changes on July 26, 2024
Jul 15
Dashboard Weekly Updates [08/07/24 - 15/07/24]
Jul 15
Postgres 13 Deprecation Notice
Jul 12
Dashboard Weekly Updates [01/07/24 - 08/07/24]
Jul 9
Dashboard Weekly Updates [17/06/24 - 24/06/24]
Jun 24
Paused Free Plan projects are restorable for 90 days
Jun 24
Edge Functions are now Deno 1.43 compatible
Jun 18
Jun 17
dashboard edge functions auth realtime ai
Dashboard Weekly Updates [03/06/24 - 10/06/24]
Jun 11
@supabase/ssr updates and roadmap towards v1.0.0
Jun 5
May 22
Updated deployment instructions for supabase-grafana monitoring application
May 16
Dashboard Weekly Updates [06/05/24 - 13/05/24]
May 15
Developer Updates - April 2024
May 7
security auth storage ai infra
JSR modules are supported in Edge Functions & Edge Runtime
May 7
Dashboard Weekly Updates [22/04/24 - 29/04/24]
Apr 30
Dashboard Weekly Updates [15/04/24 - 22/04/24]
Apr 22
security dashboard auth storage wrappers
Apr 5
Realtime Broadcast and Presence Authorization
Apr 4
Increased Supavisor Client Connection Limits Across Paid Plans
Apr 3
Dashboard Weekly Updates [18/03/24 - 25/03/24]
Mar 25
Migration to v2 platform architecture
Mar 20
Dashboard Weekly Updates [04/03/24 - 11/03/24]
Mar 12
Platform Updates: February 2024
Mar 6
Dashboard Weekly Updates [26/02/24 - 04/03/24]
Mar 4
Dashboard Weekly Updates [19/02/24 - 26/02/24]
Feb 26
Paid organizations can now launch projects on bigger compute immediately
Feb 20
Dashboard Weekly Updates [12/02/24 - 19/02/24]
Feb 19
Dashboard Weekly Updates [05/02/24 - 12/02/24]
Feb 13
Platform Updates: January 2024
Feb 5
dashboard edge functions storage infra
Dashboard Weekly Updates [22/01/24 - 29/01/24]
Jan 30
Dashboard Weekly Updates [15/01/24 - 22/01/24]
Jan 22
Supavisor starts enforcing Network Restrictions
Jan 17
IPv4 addon for projects available
Jan 17
Dashboard Weekly Updates [08/01/24 - 15/01/24]
Jan 15
Jan 11
Platform Updates December 2023
Jan 11
Jan 10
Dashboard Weekly Updates [01/01/24 - 01/08/24]
Jan 8
Supavisor v1.1.2 - allow_list and client_heartbeat_interval
Jan 5
Threshold for transitioning projects to physical backups lowered to 40GB
Jan 2
Dashboard Weekly Updates [11th Dec - 18th Dec]
Dec 18
Dec 13
Improved usage insights and transparency
Dec 5
Dashboard Weekly Updates [27th - 4th Dec]
Dec 4
Directly updating rows in the `cron.job` table is no longer allowed
Nov 29
Dashboard Weekly Updates [20th Nov - 27th Nov]
Nov 27
LinkedIn OAuth Provider deprecated in favour of LinkedIn (OIDC) Provider
Nov 24
Edge Functions secrets should now get updated upon resetting DB password or JWT secret
Nov 14
Improved Realtime reliability when migrations fail for a project
Nov 9
Column Encryption is SQL-only now
Nov 9
Connections to Postgres directly from an edge function are secured with SSL
Nov 9
Platform updates: October 2023
Nov 6
security dashboard auth storage ai
Large databases now use daily physical backups
Nov 2
Postgres 12 Deprecation Notice
Oct 14
Platform update September 2023
Oct 6
edge functions auth realtime ai wrappers infra
PGBouncer and IPv4 Deprecation
Sep 29
Sep 8
security dashboard ai billing infra
Aug 31
Jul 7
cli auth storage realtime billing postgres
Jun 9
security dashboard edge functions auth storage ai postgres
May 10
dashboard edge functions auth storage GraphQL analytics postgres
Mar 9
dashboard cli edge functions database supabase-js postgres
Feb 8
docs auth storage supabase-py ai postgres
Platform Updates November 2022
Dec 8
Platform updates: October 2022
Nov 2
edge functions auth storage database supabase-js supabase-flutter postgres
Platform Update September 2022
Oct 7
security edge functions auth postgres
Oct 4
Nov 30
postgREST auth storage realtime postgres
Nov 8
dashboard postgREST auth self-hosted supabase-js
Oct 4
auth database supabase-js postgres
Sep 13
dashboard auth realtime supabase-flutter infra
Aug 12
dashboard postgREST auth storage supabase-flutter postgres
Jul 4
auth storage database postgres
May 5