From 81523d5d8cf5fac24933dfd8d2d15649030ba9eb Mon Sep 17 00:00:00 2001 From: Miranda Limonczenko Date: Fri, 31 Jul 2026 10:47:14 -0700 Subject: [PATCH 1/5] fix(docs): fix heading-order skips in guide and troubleshooting content (#48459) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes DOCS-1260 _See WAVE plugin no longer flags a jump in header hierarchy. Preview on left._ Screenshot 2026-07-29 at 2 30 11 PM ## Problem Beyond the 4 shared components fixed in [#48456](https://github.com/supabase/supabase/pull/48456), the [header hierarchy report](https://app.notion.com/p/supabase/Playwright-E2E-Triage-Reports-3ab5004b775f81e3bc60d058fa5a02c1) found plain content headings that skip a level. For example, you may see a `##` followed directly by an `####`. Jumps in headers breaks page navigation for screen reader users, who jump between headings expecting each level to nest one at a time. ## Solution Adjusted heading levels across the affected guide and troubleshooting pages so every section nests correctly, with no skipped levels. **Staging previews:** | Page | Preview | | --- | --- | | `/guides/api/rest/postgrest-error-codes` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/api/rest/postgrest-error-codes) | | `/guides/auth/oauth-server/getting-started` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/auth/oauth-server/getting-started) | | `/guides/database/custom-postgres-config` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/custom-postgres-config) | | `/guides/database/drizzle` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/drizzle) | | `/guides/database/extensions` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/extensions) | | `/guides/database/extensions/pgaudit` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/extensions/pgaudit) | | `/guides/database/postgres-js` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/postgres-js) | | `/guides/database/replication/manual-replication-monitoring` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/replication/manual-replication-monitoring) | | `/guides/database/replication/manual-replication-setup` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/replication/manual-replication-setup) | | `/guides/database/replication/pipelines-monitoring` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/database/replication/pipelines-monitoring) | | `/guides/functions/debugging-tools` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/debugging-tools) | | `/guides/functions/development-tips` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/development-tips) | | `/guides/functions/examples/auth-send-email-hook-react-email-resend` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/examples/auth-send-email-hook-react-email-resend) | | `/guides/functions/examples/image-manipulation` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/examples/image-manipulation) | | `/guides/functions/examples/semantic-search` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/examples/semantic-search) | | `/guides/functions/examples/send-emails` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/examples/send-emails) | | `/guides/functions/examples/sentry-monitoring` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/examples/sentry-monitoring) | | `/guides/functions/wasm` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/functions/wasm) | | `/guides/getting-started` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/getting-started) | | `/guides/platform/aws-marketplace` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/platform/aws-marketplace) | | `/guides/platform/aws-marketplace/faq` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/platform/aws-marketplace/faq) | | `/guides/platform/billing-faq` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/platform/billing-faq) | | `/guides/platform/ipv4-address` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/platform/ipv4-address) | | `/guides/platform/migrating-within-supabase/backup-restore` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/platform/migrating-within-supabase/backup-restore) | | `/guides/platform/privatelink` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/platform/privatelink) | | `/guides/queues/api` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/queues/api) | | `/guides/resources` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/resources) | | `/guides/security/hipaa-compliance` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/security/hipaa-compliance) | | `/guides/security/security-testing` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/security/security-testing) | | `/guides/security/soc-2-compliance` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/security/soc-2-compliance) | | `/guides/self-hosting` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/self-hosting) | | `/guides/storage/cdn/fundamentals` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/storage/cdn/fundamentals) | | `/guides/storage/debugging/logs` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/storage/debugging/logs) | | `/guides/storage/production/scaling` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/storage/production/scaling) | | `/guides/storage/schema/helper-functions` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/storage/schema/helper-functions) | | `/guides/storage/serving/image-transformations` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/storage/serving/image-transformations) | | `/guides/storage/uploads/resumable-uploads` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/storage/uploads/resumable-uploads) | | `/guides/troubleshooting/an-invalid-response-was-received-from-the-upstream-server-error-when-querying-auth-RI4Vl-` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/an-invalid-response-was-received-from-the-upstream-server-error-when-querying-auth-RI4Vl-) | | `/guides/troubleshooting/are-all-features-available-in-self-hosted-supabase-THPcqw` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/are-all-features-available-in-self-hosted-supabase-THPcqw) | | `/guides/troubleshooting/avoiding-timeouts-in-long-running-queries-6nmbdN` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/avoiding-timeouts-in-long-running-queries-6nmbdN) | | `/guides/troubleshooting/database-api-42501-errors` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/database-api-42501-errors) | | `/guides/troubleshooting/disabling-prepared-statements-qL8lEL` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/disabling-prepared-statements-qL8lEL) | | `/guides/troubleshooting/discovering-and-interpreting-api-errors-in-the-logs-7xREI9` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/discovering-and-interpreting-api-errors-in-the-logs-7xREI9) | | `/guides/troubleshooting/edge-function-504-error-response` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/edge-function-504-error-response) | | `/guides/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process) | | `/guides/troubleshooting/how-postgres-chooses-which-index-to-use-_JHrf4` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/how-postgres-chooses-which-index-to-use-_JHrf4) | | `/guides/troubleshooting/how-to-change-max-database-connections-_BQ8P5` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/how-to-change-max-database-connections-_BQ8P5) | | `/guides/troubleshooting/how-to-interpret-and-explore-the-postgres-logs-OuCIOj` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/how-to-interpret-and-explore-the-postgres-logs-OuCIOj) | | `/guides/troubleshooting/how-to-migrate-from-supabase-auth-helpers-to-ssr-package-5NRunM` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/how-to-migrate-from-supabase-auth-helpers-to-ssr-package-5NRunM) | | `/guides/troubleshooting/http-api-issues` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/http-api-issues) | | `/guides/troubleshooting/increase-vector-lookup-speeds-by-applying-an-hsnw-index-ohLHUM` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/increase-vector-lookup-speeds-by-applying-an-hsnw-index-ohLHUM) | | `/guides/troubleshooting/interpreting-supabase-grafana-cpu-charts-9JSlkC` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/interpreting-supabase-grafana-cpu-charts-9JSlkC) | | `/guides/troubleshooting/interpreting-supabase-grafana-io-charts-MUynDR` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/interpreting-supabase-grafana-io-charts-MUynDR) | | `/guides/troubleshooting/new-branch-doesnt-copy-database` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/new-branch-doesnt-copy-database) | | `/guides/troubleshooting/not-receiving-auth-emails-from-the-supabase-project-OFSNzw` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/not-receiving-auth-emails-from-the-supabase-project-OFSNzw) | | `/guides/troubleshooting/resolving-500-status-authentication-errors-7bU5U8` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/resolving-500-status-authentication-errors-7bU5U8) | | `/guides/troubleshooting/resolving-cannot-execute-update-in-a-read-only-transaction-on-transaction-pooler-connections-ef582c` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/resolving-cannot-execute-update-in-a-read-only-transaction-on-transaction-pooler-connections-ef582c) | | `/guides/troubleshooting/resolving-database-hostname-and-managing-your-ip-address-pVlwE0` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/resolving-database-hostname-and-managing-your-ip-address-pVlwE0) | | `/guides/troubleshooting/rls-simplified-BJTcS8` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/rls-simplified-BJTcS8) | | `/guides/troubleshooting/security-of-anonymous-sign-ins-iOrGCL` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/security-of-anonymous-sign-ins-iOrGCL) | | `/guides/troubleshooting/supabase--your-network-ipv4-and-ipv6-compatibility-cHe3BP` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/supabase--your-network-ipv4-and-ipv6-compatibility-cHe3BP) | | `/guides/troubleshooting/supabase-grafana-memory-charts` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/supabase-grafana-memory-charts) | | `/guides/troubleshooting/supavisor-faq-YyP5tI` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/supavisor-faq-YyP5tI) | | `/guides/troubleshooting/tracking-postgres-role-activity-to-specific-dashboard-users-8d3715` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/tracking-postgres-role-activity-to-specific-dashboard-users-8d3715) | | `/guides/troubleshooting/transferring-from-cloud-to-self-host-in-supabase-2oWNvW` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/transferring-from-cloud-to-self-host-in-supabase-2oWNvW) | | `/guides/troubleshooting/understanding-postgresql-explain-output-Un9dqX` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/understanding-postgresql-explain-output-Un9dqX) | | `/guides/troubleshooting/understanding-postgresql-logging-levels-and-how-they-impact-your-project-KXiJRm` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/understanding-postgresql-logging-levels-and-how-they-impact-your-project-KXiJRm) | | `/guides/troubleshooting/vercel-integration-environment-variables-not-syncing-for-persistent-git-branches-b9191e` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/vercel-integration-environment-variables-not-syncing-for-persistent-git-branches-b9191e) | | `/guides/troubleshooting/why-are-there-gaps-in-my-postgres-id-sequence-Frifus` | [Preview](https://docs-git-docs-heading-hierarchy-supabase.vercel.app/docs/guides/troubleshooting/why-are-there-gaps-in-my-postgres-id-sequence-Frifus) | ## Manual testing 1. See affected pages. Recommend running a browser plugin like WAVE and selecting the **Structure** tab. 2. See the headings do not skip. ## Summary by CodeRabbit ## Release Notes * **Documentation** * Standardized heading hierarchy across many guides and troubleshooting articles to improve readability and navigation. * Updated several documentation link targets to the correct new locations. * Reformatted multiple sections (including replication monitoring, Edge Functions, Storage, authentication, security, and networking) without changing instructions. * Queue Data API docs were restructured via heading-level adjustments (no operational changes). * Billing FAQ received clearer, more detailed payment-failure and tax guidance, plus related link updates. --------- Co-authored-by: Claude Sonnet 5 --- .../guides/api/rest/postgrest-error-codes.mdx | 10 +- .../auth/oauth-server/getting-started.mdx | 2 +- .../database/custom-postgres-config.mdx | 2 +- apps/docs/content/guides/database/drizzle.mdx | 2 +- .../content/guides/database/extensions.mdx | 6 +- .../guides/database/extensions/pgaudit.mdx | 10 +- .../content/guides/database/postgres-js.mdx | 2 +- .../manual-replication-monitoring.mdx | 16 +-- .../replication/manual-replication-setup.mdx | 2 +- .../replication/pipelines-monitoring.mdx | 42 ++++---- .../guides/functions/debugging-tools.mdx | 2 +- .../guides/functions/development-tips.mdx | 16 +-- ...uth-send-email-hook-react-email-resend.mdx | 14 +-- .../functions/examples/image-manipulation.mdx | 10 +- .../functions/examples/semantic-search.mdx | 2 +- .../guides/functions/examples/send-emails.mdx | 10 +- .../functions/examples/sentry-monitoring.mdx | 10 +- apps/docs/content/guides/functions/wasm.mdx | 2 +- apps/docs/content/guides/getting-started.mdx | 8 +- .../guides/platform/aws-marketplace.mdx | 2 +- .../guides/platform/aws-marketplace/faq.mdx | 8 +- .../content/guides/platform/billing-faq.mdx | 98 +++++++++---------- .../content/guides/platform/ipv4-address.mdx | 6 +- .../backup-restore.mdx | 14 +-- .../content/guides/platform/privatelink.mdx | 18 ++-- apps/docs/content/guides/queues/api.mdx | 12 +-- apps/docs/content/guides/resources.mdx | 4 +- .../guides/security/hipaa-compliance.mdx | 4 +- .../guides/security/security-testing.mdx | 4 +- .../guides/security/soc-2-compliance.mdx | 6 +- apps/docs/content/guides/self-hosting.mdx | 6 +- .../guides/storage/cdn/fundamentals.mdx | 4 +- .../content/guides/storage/debugging/logs.mdx | 10 +- .../guides/storage/production/scaling.mdx | 8 +- .../storage/schema/helper-functions.mdx | 10 +- .../storage/serving/image-transformations.mdx | 10 +- .../storage/uploads/resumable-uploads.mdx | 8 +- ...server-error-when-querying-auth-RI4Vl-.mdx | 2 +- ...ailable-in-self-hosted-supabase-THPcqw.mdx | 6 +- ...imeouts-in-long-running-queries-6nmbdN.mdx | 4 +- .../database-api-42501-errors.mdx | 10 +- .../disabling-prepared-statements-qL8lEL.mdx | 2 +- ...rpreting-api-errors-in-the-logs-7xREI9.mdx | 4 +- .../edge-function-504-error-response.mdx | 16 +-- ...peruser-to-terminate-superuser-process.mdx | 8 +- ...gres-chooses-which-index-to-use-_JHrf4.mdx | 16 +-- ...change-max-database-connections-_BQ8P5.mdx | 8 +- ...t-and-explore-the-postgres-logs-OuCIOj.mdx | 20 ++-- ...ase-auth-helpers-to-ssr-package-5NRunM.mdx | 16 +-- .../troubleshooting/http-api-issues.mdx | 2 +- ...peeds-by-applying-an-hsnw-index-ohLHUM.mdx | 2 +- ...ing-supabase-grafana-cpu-charts-9JSlkC.mdx | 4 +- ...ting-supabase-grafana-io-charts-MUynDR.mdx | 2 +- .../new-branch-doesnt-copy-database.mdx | 10 +- ...mails-from-the-supabase-project-OFSNzw.mdx | 4 +- ...00-status-authentication-errors-7bU5U8.mdx | 6 +- ...-transaction-pooler-connections-ef582c.mdx | 18 ++-- ...me-and-managing-your-ip-address-pVlwE0.mdx | 8 +- .../troubleshooting/rls-simplified-BJTcS8.mdx | 2 +- .../security-of-anonymous-sign-ins-iOrGCL.mdx | 4 +- ...ork-ipv4-and-ipv6-compatibility-cHe3BP.mdx | 14 +-- .../supabase-grafana-memory-charts.mdx | 2 +- .../troubleshooting/supavisor-faq-YyP5tI.mdx | 36 +++---- ...ity-to-specific-dashboard-users-8d3715.mdx | 12 +-- ...-cloud-to-self-host-in-supabase-2oWNvW.mdx | 2 +- ...nding-postgresql-explain-output-Un9dqX.mdx | 26 ++--- ...nd-how-they-impact-your-project-KXiJRm.mdx | 12 +-- ...ing-for-persistent-git-branches-b9191e.mdx | 2 +- ...gaps-in-my-postgres-id-sequence-Frifus.mdx | 10 +- 69 files changed, 348 insertions(+), 342 deletions(-) diff --git a/apps/docs/content/guides/api/rest/postgrest-error-codes.mdx b/apps/docs/content/guides/api/rest/postgrest-error-codes.mdx index 635d2837203f2..a4a8897deba9e 100644 --- a/apps/docs/content/guides/api/rest/postgrest-error-codes.mdx +++ b/apps/docs/content/guides/api/rest/postgrest-error-codes.mdx @@ -147,7 +147,7 @@ Data API error unspecified One can filter for API errors in the [log explorer](/dashboard/project/_/logs/explorer). Below are useful queries for filtering and analyzing API errors: -#### Find all API errors that occurred at the database level +### Find all API errors that occurred at the database level ```sql select @@ -171,7 +171,7 @@ order by timestamp desc limit 100; ``` -#### Find specific database error from the data API +### Find specific database error from the data API ```sql select @@ -199,7 +199,7 @@ PostgREST error codes are only captured in the logs for projects running V14+. Y -#### Find specific API error +### Find specific API error ```sql select @@ -219,7 +219,7 @@ where and regexp_contains(proxy_status, '(?i)THE_RELEVANT_STATUS_CODE'); ``` -#### Count errors per path by hour: +### Count errors per path by hour: ```sql select @@ -241,7 +241,7 @@ where status_code >= 300 and regexp_contains(path, '^/rest/v1/') group by hour, proxy_status, path; ``` -#### Find data API request from specific authenticated user +### Find data API request from specific authenticated user ```sql select diff --git a/apps/docs/content/guides/auth/oauth-server/getting-started.mdx b/apps/docs/content/guides/auth/oauth-server/getting-started.mdx index f6ea9dcadcba9..eded448adc3fd 100644 --- a/apps/docs/content/guides/auth/oauth-server/getting-started.mdx +++ b/apps/docs/content/guides/auth/oauth-server/getting-started.mdx @@ -498,7 +498,7 @@ Store the client secret securely. It will only be shown once. If you lose it, yo -#### Token endpoint authentication method +### Token endpoint authentication method When a client exchanges an authorization code or refreshes a token, it must authenticate with the token endpoint. The `token_endpoint_auth_method` controls how this authentication happens: diff --git a/apps/docs/content/guides/database/custom-postgres-config.mdx b/apps/docs/content/guides/database/custom-postgres-config.mdx index 214b1f7989ee5..0fc8f870b953f 100644 --- a/apps/docs/content/guides/database/custom-postgres-config.mdx +++ b/apps/docs/content/guides/database/custom-postgres-config.mdx @@ -12,7 +12,7 @@ Customizing Postgres configurations provides _advanced_ control over your databa -### Viewing settings +## Viewing settings To list all Postgres settings and their descriptions, run: diff --git a/apps/docs/content/guides/database/drizzle.mdx b/apps/docs/content/guides/database/drizzle.mdx index c9a58a1554e43..ebfa2ac913c69 100644 --- a/apps/docs/content/guides/database/drizzle.mdx +++ b/apps/docs/content/guides/database/drizzle.mdx @@ -6,7 +6,7 @@ breadcrumb: 'ORM Quickstarts' hideToc: true --- -### Connecting with Drizzle +## Connecting with Drizzle [Drizzle ORM](https://github.com/drizzle-team/drizzle-orm) is a TypeScript ORM for SQL databases designed with maximum type safety in mind. You can use their ORM to connect to your database. diff --git a/apps/docs/content/guides/database/extensions.mdx b/apps/docs/content/guides/database/extensions.mdx index 0c4dee671b366..a9ed68e173921 100644 --- a/apps/docs/content/guides/database/extensions.mdx +++ b/apps/docs/content/guides/database/extensions.mdx @@ -7,7 +7,7 @@ description: 'Using Postgres extensions.' Extensions are exactly as they sound - they "extend" the database with functionality which isn't part of the Postgres core. Supabase has pre-installed some of the most useful open source extensions. -### Enable and disable extensions +## Enable and disable extensions -### Upgrade extensions +## Upgrade extensions If a new version of an extension becomes available on Supabase, you need to initiate a software upgrade in the [Infrastructure Settings](/dashboard/project/_/settings/infrastructure) to access it. Software upgrades can also be initiated by restarting your server in the [General Settings](/dashboard/project/_/settings/general). -### Full list of extensions +## Full list of extensions Supabase is pre-configured with over 50 extensions and you can install additional extensions through the [database.dev](https://database.dev/) package manager. diff --git a/apps/docs/content/guides/database/extensions/pgaudit.mdx b/apps/docs/content/guides/database/extensions/pgaudit.mdx index 8416bf41c1cfa..3095e9c5c8a42 100644 --- a/apps/docs/content/guides/database/extensions/pgaudit.mdx +++ b/apps/docs/content/guides/database/extensions/pgaudit.mdx @@ -345,15 +345,15 @@ To prevent PGAudit from monitoring the problematic roles, you'll want to change ## FAQ -#### Using PGAudit to debug database functions +### Using PGAudit to debug database functions Technically yes, but it is not the best approach. It is better to check out our [function debugging guide](/docs/guides/database/functions#general-logging) instead. -#### Downloading database logs +### Downloading database logs In the [Logs Dashboard](/dashboard/project/_/logs/postgres-logs) you can download logs as CSVs. -#### Logging observed table rows +### Logging observed table rows By default, PGAudit records queries, but not the returned rows. You can modify this behavior with the `pgaudit.log_rows` variable: @@ -367,13 +367,13 @@ alter role "postgres" set pgaudit.log_rows to 'off'; You should not do this unless you are _absolutely_ certain it is necessary for your use case. It can expose sensitive values to your logs that ideally should not be preserved. Furthermore, if done in excess, it can noticeably reduce database performance. -#### Logging function parameters +### Logging function parameters We don't currently support configuring `pgaudit.log_parameter` because it may log secrets in encrypted columns if you are using [pgsodium](/docs/guides/database/extensions/pgsodium) or[Vault](/docs/guides/database/vault). You can upvote this [feature request](https://github.com/orgs/supabase/discussions/20183) with your use-case if you'd like this restriction lifted. -#### Does PGAudit support system wide configurations? +### Does PGAudit support system wide configurations? PGAudit allows settings to be applied to 3 different database scopes: diff --git a/apps/docs/content/guides/database/postgres-js.mdx b/apps/docs/content/guides/database/postgres-js.mdx index 780f1acf58803..0c4e42b7e8cf2 100644 --- a/apps/docs/content/guides/database/postgres-js.mdx +++ b/apps/docs/content/guides/database/postgres-js.mdx @@ -6,7 +6,7 @@ breadcrumb: 'ORM Quickstarts' hideToc: true --- -### Connecting with Postgres.js +## Connecting with Postgres.js [Postgres.js](https://github.com/porsager/postgres) is a full-featured Postgres client for Node.js and Deno. diff --git a/apps/docs/content/guides/database/replication/manual-replication-monitoring.mdx b/apps/docs/content/guides/database/replication/manual-replication-monitoring.mdx index 8edf982a0c41f..0eaf48c40ee7b 100644 --- a/apps/docs/content/guides/database/replication/manual-replication-monitoring.mdx +++ b/apps/docs/content/guides/database/replication/manual-replication-monitoring.mdx @@ -18,9 +18,9 @@ Monitoring replication lag is important and there are 3 ways to do this: - pg_stat_replication_replay_lag - lag to replay WAL files from the source DB on the target DB (throttled by disk or high activity) - pg_stat_replication_send_lag - lag in sending WAL files from the source DB (a high lag means that the publisher is not being asked to send new WAL files OR network issues) -### Primary +## Primary -#### Replication status and lag +### Replication status and lag The `pg_stat_replication` table shows the status of any replicas connected to the primary database. @@ -29,7 +29,7 @@ select pid, application_name, state, sent_lsn, write_lsn, flush_lsn, replay_lsn, from pg_stat_replication; ``` -#### Replication slot status +### Replication slot status A replication slot can be in one of three states: @@ -43,7 +43,7 @@ The state can be checked using the `pg_replication_slots` table: select slot_name, active, state from pg_replication_slots; ``` -#### WAL size +### WAL size The WAL size can be checked using the `pg_ls_waldir()` function: @@ -51,15 +51,15 @@ The WAL size can be checked using the `pg_ls_waldir()` function: select * from pg_ls_waldir(); ``` -#### Check the LSN +### Check the LSN ```sql select pg_current_wal_lsn(); ``` -### Subscriber +## Subscriber -#### Subscription status +### Subscription status The `pg_subscription` table shows the status of any subscriptions on a replica and the `pg_subscription_rel` table shows the status of each table within a subscription. @@ -91,7 +91,7 @@ ORDER BY table_name; ``` -#### Check the LSN +### Check the LSN ```sql select pg_last_wal_replay_lsn(); diff --git a/apps/docs/content/guides/database/replication/manual-replication-setup.mdx b/apps/docs/content/guides/database/replication/manual-replication-setup.mdx index 2fae0d1cd7a5a..194d5756ea890 100644 --- a/apps/docs/content/guides/database/replication/manual-replication-setup.mdx +++ b/apps/docs/content/guides/database/replication/manual-replication-setup.mdx @@ -14,7 +14,7 @@ This guide is for replicating data to destination systems using your own tools. -### Prerequisites +## Prerequisites To set up replication, the following is recommended: diff --git a/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx b/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx index 1c7c132aa3697..ded898ea66411 100644 --- a/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx +++ b/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx @@ -10,14 +10,14 @@ sidebar_label: 'Monitoring' After setting up Supabase Pipelines, you can monitor the status and health of your pipelines directly from the Dashboard. A pipeline first performs an initial sync of existing rows, then uses ongoing replication (CDC) to send subsequent database changes to your destination. -### Viewing pipeline status +## Viewing pipeline status To monitor your pipelines: 1. Navigate to the [**Database > Replication**](/dashboard/project/_/database/replication) section of the Dashboard 2. You'll see a list of all your destinations with their pipeline status -#### Pipeline states +### Pipeline states Each destination shows its pipeline in one of these states: @@ -31,7 +31,7 @@ Each destination shows its pipeline in one of these states: | **Failed** | Pipeline has encountered an error (hover over the status to view error details) | | **Unknown** | The Dashboard can't currently determine the pipeline status | -### Viewing detailed pipeline metrics +## Viewing detailed pipeline metrics For detailed information about a specific pipeline, click **View pipeline** on the destination. This opens the pipeline status page where you can monitor replication performance and table states. @@ -44,7 +44,7 @@ For detailed information about a specific pipeline, click **View pipeline** on t zoomable /> -#### Replication lag metrics +### Replication lag metrics The status page shows replication lag metrics that help you determine how far the pipeline is behind Postgres. These metrics are loaded directly from Postgres replication slot state. @@ -64,7 +64,7 @@ Pipelines uses one main pipeline replication slot for ongoing replication. Durin Temporary table-sync slots show the same kind of lag and slot health metrics while they are active. After a table finishes its initial sync and catches up, its temporary slot is removed and ongoing replication continues through the main pipeline slot. For overall replication health, focus first on the main pipeline slot. -#### Slot statuses +### Slot statuses Replication slot status tells you whether Postgres is still retaining the WAL that the pipeline needs to continue from its current position. @@ -76,7 +76,7 @@ Replication slot status tells you whether Postgres is still retaining the WAL th | **Lost** | Broken. Some WAL files this pipeline's replication slot needs have already been removed. The pipeline can no longer continue from this slot. Recreate the pipeline, or set **Invalidated slot behavior** to **Recreate** in the pipeline's advanced settings and restart it. | | **Unknown** | Postgres reported an unknown or unavailable state for this pipeline's replication slot. | -#### Table states +### Table states The pipeline status page also shows the state of individual tables being replicated. Each table can be in one of these states: @@ -91,7 +91,7 @@ The pipeline status page also shows the state of individual tables being replica | **Not Available** | Table state is temporarily unavailable while the pipeline changes state | | **Unknown** | The Dashboard received a table state it doesn't recognize | -### Dealing with replication lag +## Dealing with replication lag Replication lag means the pipeline is behind the source database. Some lag is expected during the initial sync, after a burst of writes, or after restarting a stopped pipeline. Lag becomes a problem when it keeps increasing, when **WAL retention remaining** is running low, or when the slot status moves to **Unreserved** or **Lost**. @@ -104,7 +104,7 @@ Lag can come from several places: - **Stopped or disconnected pipeline**: When a pipeline is stopped, disconnected, or failed, Postgres keeps WAL for the slot until the retention limit is reached. - **Slow initial sync**: A temporary table-sync slot can fall behind if existing rows are copied more slowly than new changes are written to that table. -#### Initial sync and table-sync slots +### Initial sync and table-sync slots A common initial sync issue happens when a large or busy table is still in **Copying** while new rows keep being inserted or updated. The temporary table-sync slot retains changes that happen during the initial sync. If copying is too slow compared to the table's write rate, the slot can move to **Unreserved** and then **Lost** if Postgres removes changes the sync still needs. @@ -116,7 +116,7 @@ When a table-sync slot is lost, the affected table needs to run its initial sync After the affected table finishes copying and catches up, the temporary slot is deleted. The table then continues through the main pipeline replication slot. -#### Investigate the lag +### Investigate the lag 1. Open [**Database > Replication**](/dashboard/project/_/database/replication) and check the destination's lag column. 2. Click **View pipeline** and check **Waiting to sync**, **WAL retention remaining**, **Last check-in**, **Connected**, and **Slot status**. @@ -124,7 +124,7 @@ After the affected table finishes copying and catches up, the temporary slot is 4. Open [**Logs > Replication**](/dashboard/project/_/logs/replication-logs) and look for destination errors, retries, rate limits, schema errors, or repeated restarts. 5. Compare the lag trend with recent database activity, such as imports, migrations, bulk updates, or long transactions. -#### Respond based on the slot status +### Respond based on the slot status | Slot status | What to do | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -134,7 +134,7 @@ After the affected table finishes copying and catches up, the temporary slot is | **Lost** | The pipeline cannot continue from the existing slot because required WAL has been removed. Recreate the pipeline, or set **Invalidated slot behavior** to **Recreate** in the pipeline's advanced settings and restart the pipeline. This creates a new slot and starts replication from scratch for all tables. | | **Unknown** | Check replication logs for errors or missing slot details. If the status remains unknown while the pipeline should be running, contact support with the pipeline ID and recent log details. | -#### Reduce future lag risk +### Reduce future lag risk - Keep publications focused on the tables and operations you need at the destination. - Avoid leaving pipelines stopped for long periods while the source database is still receiving writes. @@ -142,11 +142,11 @@ After the affected table finishes copying and catches up, the temporary slot is - For BigQuery, verify that service account permissions, table requirements, and replica identity settings match the [BigQuery destination guide](/docs/guides/database/replication/bigquery). - If the initial sync is the bottleneck, review **Table sync workers** and **Copy connections per table** in the pipeline's advanced settings. Increasing either can use more source database connections; increasing table sync workers can also use more temporary replication slots. -### Handling errors +## Handling errors Errors can occur at two levels: per table or per pipeline. -#### Table errors +### Table errors Table errors occur during the initial sync and affect individual tables. These errors can be retried without stopping the entire pipeline. @@ -160,7 +160,7 @@ Table errors occur during the initial sync and affect individual tables. These e When a table encounters an error during the initial sync, you can reset the table state. This restarts that table's initial sync from the beginning. -#### Pipeline errors +### Pipeline errors Pipeline errors can occur during startup or ongoing replication and affect the entire pipeline. If a non-retryable pipeline-level error occurs, the entire pipeline stops and enters a **Failed** state instead of silently skipping the failure. @@ -178,7 +178,7 @@ To recover from a pipeline error, you'll need to: 2. Fix the underlying issue (e.g., destination connectivity, schema compatibility) 3. Restart the pipeline from the destinations list -### Viewing logs +## Viewing logs To see detailed logs for all your pipelines: @@ -192,16 +192,16 @@ Logs contain diagnostic information that may be too technical for most users. If -### Common monitoring scenarios +## Common monitoring scenarios -#### Checking if replication is healthy +### Checking if replication is healthy 1. Navigate to the [**Database > Replication**](/dashboard/project/_/database/replication) section of the Dashboard 2. Verify your destination shows a "Running" status 3. Click **View pipeline** to check replication lag and table states 4. Ensure all tables show a "Live" state -#### Investigating errors +### Investigating errors If you see a **Failed** status: @@ -211,7 +211,7 @@ If you see a **Failed** status: 4. Navigate to the [**Logs > Replication**](/dashboard/project/_/logs/replication-logs) section of the Dashboard for full error details 5. For table errors, attempt to reset the affected tables -#### Monitoring performance +### Monitoring performance To ensure optimal performance: @@ -220,7 +220,7 @@ To ensure optimal performance: 3. Review logs for warnings or performance issues 4. If lag is consistently high, review your publication and destination configuration -### Troubleshooting +## Troubleshooting If you notice issues with your replication: @@ -232,7 +232,7 @@ If you notice issues with your replication: For more troubleshooting tips, see the [Pipelines FAQ](/docs/guides/database/replication/pipelines-faq). -### Next steps +## Next steps - [Set up Pipelines](/docs/guides/database/replication/pipelines) - [View the Pipelines FAQ](/docs/guides/database/replication/pipelines-faq) diff --git a/apps/docs/content/guides/functions/debugging-tools.mdx b/apps/docs/content/guides/functions/debugging-tools.mdx index b98ee692f3efd..013e0e9e381ab 100644 --- a/apps/docs/content/guides/functions/debugging-tools.mdx +++ b/apps/docs/content/guides/functions/debugging-tools.mdx @@ -8,7 +8,7 @@ tocVideo: 'sOrtcoKg5zQ' Since [v1.171.0](https://github.com/supabase/cli/releases/tag/v1.171.0) the Supabase CLI supports debugging Edge Functions via the v8 inspector protocol, allowing for debugging via [Chrome DevTools](https://developer.chrome.com/docs/devtools/) and other Chromium-based browsers. -### Inspect with Chrome Developer Tools +## Inspect with Chrome Developer Tools 1. Serve your functions in inspect mode. This will set a breakpoint at the first line to pause script execution before any code runs. ```bash diff --git a/apps/docs/content/guides/functions/development-tips.mdx b/apps/docs/content/guides/functions/development-tips.mdx index 73ef57183b178..812c5bacc9ea4 100644 --- a/apps/docs/content/guides/functions/development-tips.mdx +++ b/apps/docs/content/guides/functions/development-tips.mdx @@ -7,7 +7,7 @@ subtitle: 'Tips for getting started with Edge Functions.' Here are a few recommendations when you first start developing Edge Functions. -### Using HTTP methods +## Using HTTP methods Edge Functions support `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, and `OPTIONS`. A Function can be designed to perform different actions based on a request's HTTP method. See the [example on building a RESTful service](https://github.com/supabase/supabase/tree/master/examples/edge-functions/supabase/functions/restful-tasks) to learn how to handle different HTTP methods in your Function. @@ -17,11 +17,11 @@ HTML content is not supported. `GET` requests that return `text/html` will be re -### Naming Edge Functions +## Naming Edge Functions We recommend using hyphens to name functions because hyphens are the most URL-friendly of all the naming conventions (snake_case, camelCase, PascalCase). -### Organizing your Edge Functions +## Organizing your Edge Functions We recommend developing "fat functions". This means that you should develop few large functions, rather than many small functions. One common pattern when developing Functions is that you need to share code between two or more Functions. To do this, you can store any shared code in a folder prefixed with an underscore (`_`). We also recommend a separate folder for [Unit Tests](/docs/guides/functions/unit-test) including the name of the function followed by a `-test` suffix. We recommend this folder structure: @@ -45,7 +45,7 @@ We recommend this folder structure: └── config.toml ``` -### Using config.toml +## Using config.toml Individual function configuration like [JWT verification](/docs/guides/local-development/cli/config#functions.function_name.verify_jwt) and [import map location](/docs/guides/local-development/cli/config#functions.function_name.import_map) can be set via the `config.toml` file. @@ -55,7 +55,7 @@ verify_jwt = false import_map = './import_map.json' ``` -### Not using TypeScript +## Not using TypeScript When you create a new Edge Function, it will use TypeScript by default. However, it is possible to write and deploy Edge Functions using pure JavaScript. @@ -75,12 +75,12 @@ entrypoint = './functions/hello-world/index.js' # path must be relative to confi You can use any `.ts`, `.js`, `.tsx`, `.jsx` or `.mjs` file as the `entrypoint` for a Function. -### Error handling +## Error handling The `supabase-js` library provides several error types that you can use to handle errors that might occur when invoking Edge Functions: ```js -import { FunctionsHttpError, FunctionsRelayError, FunctionsFetchError } from '@supabase/supabase-js' +import { FunctionsFetchError, FunctionsHttpError, FunctionsRelayError } from '@supabase/supabase-js' const { data, error } = await supabase.functions.invoke('hello', { headers: { 'my-custom-header': 'my-custom-header-value' }, @@ -97,7 +97,7 @@ if (error instanceof FunctionsHttpError) { } ``` -### Database Functions vs Edge Functions +## Database Functions vs Edge Functions For data-intensive operations we recommend using [Database Functions](/docs/guides/database/functions), which are executed within your database and can be called remotely using the [REST and GraphQL API](/docs/guides/api). diff --git a/apps/docs/content/guides/functions/examples/auth-send-email-hook-react-email-resend.mdx b/apps/docs/content/guides/functions/examples/auth-send-email-hook-react-email-resend.mdx index 07f5f62f357c1..e1779fee964ce 100644 --- a/apps/docs/content/guides/functions/examples/auth-send-email-hook-react-email-resend.mdx +++ b/apps/docs/content/guides/functions/examples/auth-send-email-hook-react-email-resend.mdx @@ -12,7 +12,7 @@ Prefer to jump straight to the code? [Check out the example on GitHub](https://g -### Prerequisites +## Prerequisites To get the most out of this guide, you’ll need to: @@ -21,7 +21,7 @@ To get the most out of this guide, you’ll need to: Make sure you have the latest version of the [Supabase CLI](/docs/guides/local-development/cli/getting-started#installing-the-supabase-cli) installed. -### 1. Create Supabase function +## 1. Create Supabase function Create a new function locally: @@ -29,16 +29,16 @@ Create a new function locally: supabase functions new send-email ``` -### 2. Edit the handler function +## 2. Edit the handler function Paste the following code into the `index.ts` file: ```tsx supabase/functions/send-email/index.ts -import { Webhook } from 'npm:standardwebhooks@^1' import { renderAsync } from 'npm:@react-email/components@^1' import { withSupabase } from 'npm:@supabase/server@^1' import React from 'npm:react@^19' import { Resend } from 'npm:resend@^6' +import { Webhook } from 'npm:standardwebhooks@^1' import { MagicLinkEmail } from './_templates/magic-link.tsx' @@ -110,7 +110,7 @@ export default { } ``` -### 3. Create React Email templates +## 3. Create React Email templates Create a new `_templates` folder following the [recommended project structure](/docs/guides/functions/development-environment#recommended-project-structure) and add a new `magic-link.tsx` file with the following code: @@ -253,7 +253,7 @@ You can find a selection of React Email templates in the [React Email Examples]( -### 4. Deploy the Function +## 4. Deploy the Function Deploy function to Supabase: @@ -263,7 +263,7 @@ supabase functions deploy send-email --no-verify-jwt Note down the function URL, you will need it in the next step! -### 5. Configure the Send Email Hook +## 5. Configure the Send Email Hook - Go to the [Auth Hooks](/dashboard/project/_/auth/hooks) section of the Supabase dashboard and create a new "Send Email hook". - Select HTTPS as the hook type. diff --git a/apps/docs/content/guides/functions/examples/image-manipulation.mdx b/apps/docs/content/guides/functions/examples/image-manipulation.mdx index 4294054085bee..507622189a98c 100644 --- a/apps/docs/content/guides/functions/examples/image-manipulation.mdx +++ b/apps/docs/content/guides/functions/examples/image-manipulation.mdx @@ -14,11 +14,11 @@ Edge Functions currently doesn't support image processing libraries such as `Sha -### Prerequisites +## Prerequisites Make sure you have the latest version of the [Supabase CLI](/docs/guides/local-development/cli/getting-started#installing-the-supabase-cli) installed. -### Create the Edge Function +## Create the Edge Function Create a new function locally: @@ -27,7 +27,7 @@ supabase functions new image-blur ``` -### Write the function +## Write the function In this example, we are implementing a function allowing users to upload an image and get a blurred thumbnail. @@ -38,7 +38,7 @@ path="edge-functions/supabase/functions/image-manipulation/index.ts" lines={[[1, -1]]} /> -### Test it locally +## Test it locally You can test the function locally by running: @@ -59,7 +59,7 @@ curl --location '' \\ If you open the `output.png` file you will find a transformed version of your original image. -### Deploy to your hosted project +## Deploy to your hosted project Deploy the function to your Supabase project. diff --git a/apps/docs/content/guides/functions/examples/semantic-search.mdx b/apps/docs/content/guides/functions/examples/semantic-search.mdx index e2a29dfa47013..4aba67c18a8e3 100644 --- a/apps/docs/content/guides/functions/examples/semantic-search.mdx +++ b/apps/docs/content/guides/functions/examples/semantic-search.mdx @@ -18,7 +18,7 @@ In this tutorial you're implementing three parts: You can find the complete example code on [GitHub](https://github.com/supabase/supabase/tree/master/examples/ai/edge-functions) -### Create the database table and webhook +## Create the database table and webhook Given the [following table definition](https://github.com/supabase/supabase/blob/master/examples/ai/edge-functions/supabase/migrations/20240408072601_embeddings.sql): diff --git a/apps/docs/content/guides/functions/examples/send-emails.mdx b/apps/docs/content/guides/functions/examples/send-emails.mdx index 54a4a1b639691..63d38c03a707f 100644 --- a/apps/docs/content/guides/functions/examples/send-emails.mdx +++ b/apps/docs/content/guides/functions/examples/send-emails.mdx @@ -6,7 +6,7 @@ tocVideo: 'Qf7XvL1fjvo' Sending emails from Edge Functions using the [Resend API](https://resend.com/). -### Prerequisites +## Prerequisites To get the most out of this guide, you’ll need to: @@ -15,7 +15,7 @@ To get the most out of this guide, you’ll need to: Make sure you have the latest version of the [Supabase CLI](/docs/guides/local-development/cli/getting-started#installing-the-supabase-cli) installed. -### 1. Create Supabase function +## 1. Create Supabase function Create a new function locally: @@ -25,7 +25,7 @@ supabase functions new resend Store the `RESEND_API_KEY` in your `.env` file. -### 2. Edit the handler function +## 2. Edit the handler function Paste the following code into the `index.ts` file: @@ -57,7 +57,7 @@ const handler = async (_request: Request): Promise => { export default { fetch: withSupabase({ auth: ['user', 'secret'] }, handler) } ``` -### 3. Deploy and send email +## 3. Deploy and send email Run function locally: @@ -85,6 +85,6 @@ When you deploy to Supabase, make sure that your `RESEND_API_KEY` is set in [Edg -### 4. Try it yourself +## 4. Try it yourself Find the complete example on [GitHub](https://github.com/resendlabs/resend-supabase-edge-functions-example). diff --git a/apps/docs/content/guides/functions/examples/sentry-monitoring.mdx b/apps/docs/content/guides/functions/examples/sentry-monitoring.mdx index 065a6cfe8ac65..f35ce0d64ca08 100644 --- a/apps/docs/content/guides/functions/examples/sentry-monitoring.mdx +++ b/apps/docs/content/guides/functions/examples/sentry-monitoring.mdx @@ -5,12 +5,12 @@ description: 'Monitor Edge Functions with the Sentry Deno SDK.' Add the [Sentry Deno SDK](https://docs.sentry.io/platforms/javascript/guides/deno/) to your Supabase Edge Functions to track exceptions and get notified of errors or performance issues. -### Prerequisites +## Prerequisites - [Create a Sentry account](https://sentry.io/signup/). - Make sure you have the latest version of the [Supabase CLI](/docs/guides/local-development/cli/getting-started#installing-the-supabase-cli) installed. -### 1. Create Supabase function +## 1. Create Supabase function Create a new function locally: @@ -18,7 +18,7 @@ Create a new function locally: supabase functions new sentryfied ``` -### 2. Add the Sentry Deno SDK +## 2. Add the Sentry Deno SDK Handle exceptions within your function and send them to Sentry. @@ -61,7 +61,7 @@ export default { } ``` -### 3. Deploy and test +## 3. Deploy and test Run function locally: @@ -78,7 +78,7 @@ Deploy function to Supabase: supabase functions deploy sentryfied --no-verify-jwt ``` -### 4. Try it yourself +## 4. Try it yourself Find the complete example on [GitHub](https://github.com/supabase/supabase/tree/master/examples/edge-functions/supabase/functions/sentryfied/index.ts). diff --git a/apps/docs/content/guides/functions/wasm.mdx b/apps/docs/content/guides/functions/wasm.mdx index fe7e5f61ece21..cbd4183f64367 100644 --- a/apps/docs/content/guides/functions/wasm.mdx +++ b/apps/docs/content/guides/functions/wasm.mdx @@ -18,7 +18,7 @@ For example, libraries like [magick-wasm](/docs/guides/functions/examples/image- --- -### Writing a Wasm module +## Writing a Wasm module You can use different languages and SDKs to write Wasm modules. For this tutorial, we will write a basic Wasm module in Rust that adds two numbers. diff --git a/apps/docs/content/guides/getting-started.mdx b/apps/docs/content/guides/getting-started.mdx index 317ce47a169f6..9ec3e750fd906 100644 --- a/apps/docs/content/guides/getting-started.mdx +++ b/apps/docs/content/guides/getting-started.mdx @@ -39,7 +39,7 @@ hideToc: true -### Use cases +## Use cases
@@ -71,7 +71,7 @@ hideToc: true
-### Framework quickstarts +## Framework quickstarts <$Show if="docs:framework_quickstarts"> @@ -224,7 +224,7 @@ hideToc: true <$Show if="docs:web_apps"> -### Web app demos +## Web app demos
@@ -305,7 +305,7 @@ hideToc: true <$Show if="docs:mobile_tutorials"> -### Mobile tutorials +## Mobile tutorials
<$Show if="sdk:dart"> diff --git a/apps/docs/content/guides/platform/aws-marketplace.mdx b/apps/docs/content/guides/platform/aws-marketplace.mdx index 0d9c1b3ab7661..b3f559a58a9fd 100644 --- a/apps/docs/content/guides/platform/aws-marketplace.mdx +++ b/apps/docs/content/guides/platform/aws-marketplace.mdx @@ -7,7 +7,7 @@ You can purchase Supabase through the AWS Marketplace. Buying through AWS Market When you make a purchase on AWS Marketplace, AWS will calculate sales taxes, VAT, GST, service tax, etc. (“Indirect Taxes”), if applicable, based on the location of your AWS account. You can find more details in the [AWS tax help guide](https://aws.amazon.com/tax-help/marketplace-buyers/). -### Plans available through the AWS Marketplace +## Plans available through the AWS Marketplace - Free Plan: not available - Pro Plan: available, self-serve diff --git a/apps/docs/content/guides/platform/aws-marketplace/faq.mdx b/apps/docs/content/guides/platform/aws-marketplace/faq.mdx index 14e25ae8c49fb..d1875ac9e022d 100644 --- a/apps/docs/content/guides/platform/aws-marketplace/faq.mdx +++ b/apps/docs/content/guides/platform/aws-marketplace/faq.mdx @@ -3,19 +3,19 @@ id: 'aws-marketplace-faq' title: 'AWS Marketplace FAQ' --- -#### The payment for completing the subscription on the AWS Marketplace fails. +## The payment for completing the subscription on the AWS Marketplace fails. For more information on payment errors, refer to the [AWS documentation](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-paying-for-products.html#payment-methods). -#### How can the Spend Cap for an organization managed through the AWS Marketplace be enabled? +## How can the Spend Cap for an organization managed through the AWS Marketplace be enabled? For organizations on the Pro Plan that are managed through the AWS Marketplace, the Spend Cap is not available. In your AWS account, you can set up a budget for marketplace purchases (or for a specific marketplace product) and receive notifications once the budget is exceeded. -#### How to cancel your AWS Marketplace subscription +## How to cancel your AWS Marketplace subscription You can cancel your marketplace subscription within 48 hours of purchase. To do so, open a support ticket via the Supabase dashboard. After the 48-hour period, cancellation is no longer possible. If you cancel within the first 48 hours, the upfront charge for the fixed subscription fee will be refunded. Any usage costs incurred up to that point will not be refunded. -#### Does purchasing Supabase through the AWS Marketplace count toward your AWS spend commitment? +## Does purchasing Supabase through the AWS Marketplace count toward your AWS spend commitment? Yes, marketplace purchases do count toward the spend commitment. diff --git a/apps/docs/content/guides/platform/billing-faq.mdx b/apps/docs/content/guides/platform/billing-faq.mdx index c4c7567395ddd..4ea5fdb68c7de 100644 --- a/apps/docs/content/guides/platform/billing-faq.mdx +++ b/apps/docs/content/guides/platform/billing-faq.mdx @@ -9,26 +9,26 @@ subtitle: 'This documentation covers frequently asked questions around subscript ## Organizations and projects -#### What are organizations and projects? +### What are organizations and projects? The Supabase Platform has "organizations" and "projects". An organization may contain multiple projects. Each project is a dedicated Supabase instance with all of its sub-services including Storage, Auth, Functions and Realtime. Each organization only has a single subscription with a single plan (Free, Pro, Team or Enterprise). Project add-ons such as [Compute](/docs/guides/platform/compute-and-disk), [IPv4](/docs/guides/platform/ipv4-address), [Log Drains](/docs/guides/telemetry/log-drains), [Advanced MFA](/docs/guides/auth/auth-mfa/phone), [Custom Domains](/docs/guides/platform/custom-domains) and [PITR](/docs/guides/platform/backups#point-in-time-recovery) are configured per project and are added to your organization subscription. Read more on [About billing on Supabase](/docs/guides/platform/billing-on-supabase#organization-based-billing). -#### How many free projects can I have? +### How many free projects can I have? You are entitled to two active free projects. Paused projects do not count towards your quota. Note that within an organization, we count the free project limits from all members that are either Owner or Admin. If you’ve got another organization member with the Admin or Owner role that has already exhausted their free project quota, you won’t be able to launch another free project in that organization. You can create another Free Plan organization or change the role of the affected member in your [organization’s team settings](/dashboard/org/_/team). -#### Can I mix free and paid projects in a single organization? +### Can I mix free and paid projects in a single organization? The subscription plan is set on the organization level and it is not possible to mix paid and non-paid projects inside a single organization. However, you can have a paid and a free organization and make use of the [self-serve project transfers](/docs/guides/platform/project-transfer) to organize your projects. All projects in an organization benefit from the subscription plan. If your organization is on the Pro Plan, all projects within the organization benefit from no project pausing, automated backups and so on. -#### Can I transfer my projects to another organization? +### Can I transfer my projects to another organization? Yes, you can transfer your projects to another organization. You can find instructions on how to transfer your projects [here](/docs/guides/platform/project-transfer). -#### Can I transfer my credits to another organization? +### Can I transfer my credits to another organization? Yes, you can transfer the credits to another organization. Submit a [support ticket](https://supabase.help). @@ -36,11 +36,11 @@ Yes, you can transfer the credits to another organization. Submit a [support tic See the [Pricing page](/pricing) for details. -#### Are there any charges for paused projects? +### Are there any charges for paused projects? No, we do not charge for paused projects. Compute hours are only counted for active instances. Paused projects do not incur any compute usage charges. -#### How are multiple projects billed under a paid organization? +### How are multiple projects billed under a paid organization? We provide a dedicated server for every Supabase project. Each paid organization comes with in Compute Credits to cover one project on the default compute size. Additional projects start at ~ a month (billed hourly). @@ -52,7 +52,7 @@ Running 3 projects in a Pro Plan organization on the default Micro instance: Refer to our [Compute](/docs/guides/platform/manage-your-usage/compute#billing-examples) docs for more examples and insights. -#### How does compute billing work? +### How does compute billing work? Each Supabase project is a dedicated VM and Postgres database. By default, your instance runs on the Micro compute instance. You have the option to upgrade your compute size in your [Project settings](/dashboard/project/_/settings/addons). See [Compute Add-ons](/docs/guides/platform/compute-and-disk) for available options. @@ -64,7 +64,7 @@ If you upgrade your project to a larger instance for 10 hours and then downgrade Read more about [Compute usage](/docs/guides/platform/manage-your-usage/compute). -#### What is egress and how is it billed? +### What is egress and how is it billed? Egress refers to the total bandwidth (network traffic) quota available to each organization. This quota can be used for various purposes such as Storage, Realtime, Auth, Functions, Supavisor, Log Drains and Database. Each plan includes a specific egress quota, and any additional usage beyond that quota is billed accordingly. @@ -74,41 +74,41 @@ Read more about [Egress usage](/docs/guides/platform/manage-your-usage/egress). ## Plans and subscriptions -#### How do I change my subscription plan? +### How do I change my subscription plan? Change your subscription plan in your [organization's billing settings](/dashboard/org/_/billing). To upgrade to an Enterprise Plan, complete the [Enterprise request form](https://forms.supabase.com/enterprise). -#### What happens if I cancel my subscription? +### What happens if I cancel my subscription? The organization is given [credits](/docs/guides/platform/credits) for unused time on the subscription plan. The credits will not expire and can be used again in the future. You may see an additional charge for unbilled excessive usage charges from your previous billing cycle. Read more about [downgrades](/docs/guides/platform/manage-your-subscription#downgrade). -#### I mistakenly upgraded the wrong organization and then downgraded it. Could you issue a refund? +### I mistakenly upgraded the wrong organization and then downgraded it. Could you issue a refund? We can transfer the amount as [credits](/docs/guides/platform/credits) to another organization of your choice. You can use these credits to upgrade the organization, or if you have already upgraded, the credits will be used to pay the next month's invoice. Please create a [support ticket](https://supabase.help) for this case. -#### How do I get an annual subscription? +### How do I get an annual subscription? We currently do not support annual plans officially. However, you can do a [credit top-up](/docs/guides/platform/credits#credit-top-ups) to avoid monthly payments. ## Quotas and spend caps -#### What will happen when I exceed the Free Plan quota? +### What will happen when I exceed the Free Plan quota? You will be notified when you exceed the Free Plan quota. It is important to take action at this point. If you continue to exceed the limits, service restrictions will apply. To avoid service restrictions, you can [manage your usage](/docs/guides/platform/manage-your-usage) or upgrade to a paid plan. Learn more about restrictions in the [Fair Use Policy](#fair-use-policy) section. -#### What will happen when I exceed the Pro Plan quota and have the spend cap on? +### What will happen when I exceed the Pro Plan quota and have the spend cap on? You will be notified when you exceed your Pro Plan quota. To unblock yourself, you can toggle off your spend cap in your [organization's billing settings](/dashboard/org/_/billing) to pay for over-usage beyond the Pro plans limits. If you continue to exceed the limits without managing your usage or turning off the spend cap, restrictions will apply. Learn more about restrictions in the [Fair Use Policy](#fair-use-policy) section. -#### How do I scale beyond the limits of my Pro Plan? +### How do I scale beyond the limits of my Pro Plan? The Pro Plan has a Spend Cap enabled by default to keep costs under control. If you want to scale beyond the plan's included quota, switch off the Spend Cap to pay for additional usage beyond the plans included limits. You can toggle the Spend Cap in the [organization's billing settings](/dashboard/org/_/billing). Read more about the [Spend Cap](/docs/guides/platform/cost-control#spend-cap). ## Fair Use Policy -#### What is the Fair Use Policy? +### What is the Fair Use Policy? Our Fair Use Policy gives developers the freedom to build and experiment with Supabase, while protecting our infrastructure. Under the Fair Use policy, service restrictions may apply to your organization if: @@ -119,13 +119,13 @@ Our Fair Use Policy gives developers the freedom to build and experiment with Su You will receive a notification before Fair Use Policy restrictions are applied. However, in some cases, like suspected abuse of our services, restrictions may be applied without prior notice. -#### What is a grace period and does it reset after usage drops? +### What is a grace period and does it reset after usage drops? When your organization exceeds plan limits, you receive a grace period before fair use policy applies. After this grace period ends, the dashboard will continue to show a notice indicating that your grace period is over, even if you have dropped back under plan limits. This is a warning that serves as an indicator that your organization previously exceeded usage limits. This persistent warning means that if you exceed your plan limits again, you will not receive another grace period and your project will be restricted. The notice and indicator will automatically clear if you continue to stay under plan limits for multiple billing cycles. -#### How is the Fair Use Policy applied? +### How is the Fair Use Policy applied? The Fair Use Policy is applied through service restrictions. This could mean: @@ -136,7 +136,7 @@ The Fair Use Policy is applied through service restrictions. This could mean: The Fair Use Policy is generally applied to all projects of the restricted organization. -#### How can I remove restrictions applied from the Fair Use Policy? +### How can I remove restrictions applied from the Fair Use Policy? To remove restrictions, you will need to address the issue that caused the restriction. This could be reducing your usage, paying overdue invoices, updating your payment method, or any other issue that caused the restriction. Once the issue is resolved, the restriction will be lifted. @@ -150,69 +150,69 @@ Pausing or deleting a project stops new usage from accumulating, but does not re ## Reports and invoices -#### Where do I find my invoices? +### Where do I find my invoices? You can find all invoices from your organization on your [organization’s invoices page](/dashboard/org/_/billing#invoices). -#### Where can I see a breakdown of usage? +### Where can I see a breakdown of usage? You can find the breakdown of your usage on your [organization’s usage page](/dashboard/org/_/usage). -#### Where can I check my credit balance? +### Where can I check my credit balance? You can check your Credit balance on the [organization’s billing page](/dashboard/org/_/billing). Credits will be used on future invoices before charging your payment method. If you have enough credits to cover an invoice, there is no charge at all. -#### Can I change the details of an existing invoice? +### Can I change the details of an existing invoice? Any changes made to your billing details will only be reflected in your upcoming invoices. Our payment provider cannot regenerate previous invoices. Therefore, make sure to update the billing details before the upcoming invoices are finalized. ## Payments and billing cycle -#### What payment methods are available? +### What payment methods are available? We accept credit card payments only. If you cannot pay via credit card, we do offer alternatives for larger upfront payments. Create a [support ticket](https://supabase.help) in case you’re interested. -#### What credit card brands are supported? +### What credit card brands are supported? Visa, Mastercard, American Express, Japan Credit Bureau (JCB), China UnionPay (CUP), Cartes Bancaires -#### What currency can I pay in? +### What currency can I pay in? All our invoices are issued in USD, but you can pay in any currency so long as the credit card provider allows charging in USD after conversion. -#### Can I change the payment method? +### Can I change the payment method? Yes, you will have to add the new payment method before being allowed to remove the old one. This can be done from your dashboard on the [organization’s billing page](/dashboard/org/_/billing). Read more on [Manage your payment methods](/docs/guides/platform/manage-your-subscription#manage-your-payment-methods). -#### Can I pay upfront for multiple months? +### Can I pay upfront for multiple months? You can top up your credit balance to cover multiple months through your [organization’s billing page](/dashboard/org/_/billing). Read more on [Credit top-ups](/docs/guides/platform/credits#credit-top-ups). -#### When are payments taken? +### When are payments taken? Payments are taken at the beginning of each billing cycle. You will be charged once a month. You can see the current billing cycle and upcoming invoice in your [organization's billing settings](/dashboard/org/_/billing). The subscription plan fee is charged upfront, whereas usage-charges, including compute, are charged in arrears based on your usage. Read more on [Your monthly invoice](/docs/guides/platform/your-monthly-invoice). -#### Where can I change my billing details? +### Where can I change my billing details? You can update your billing details on the [organization’s billing page](/dashboard/org/_/billing). Note that any changes made to your billing details will only be reflected in your upcoming invoices. Our payment provider cannot regenerate previous invoices. -#### What happens if I am unable to make the payment? +### What happens if I am unable to make the payment? When an invoice becomes overdue, we will pause your projects and downgrade your organization to the Free Plan. You will be able to restore your projects once you have paid all outstanding invoices. -#### Can I use a credit top-up to pay an outstanding invoice? +### Can I use a credit top-up to pay an outstanding invoice? Credit top-ups apply only to future invoices. They cannot be used to pay or adjust outstanding invoices. -#### Why am I overdue? +### Why am I overdue? We were unable to charge your payment method. This likely means that the payment was not successfully processed with the credit card on your account profile. You can be overdue when @@ -227,39 +227,39 @@ If you are still facing issues, raise a [support ticket](https://supabase.help). Payments are always in USD and may show up as coming from Singapore, given our payment entity is in Singapore. Make sure you allow payments from Singapore and in USD -#### Can I delay my payment? +### Can I delay my payment? No, you cannot delay your payment. -#### Can I get a refund of my unused credits? +### Can I get a refund of my unused credits? No, we do not provide refunds. Please refer to our [Terms of Service](/terms#1-fees). -#### What do I do if my bill looks wrong? +### What do I do if my bill looks wrong? Take a moment to review our [Your monthly invoice](/docs/guides/platform/your-monthly-invoice) page, which may help clarify any questions about your invoice. If it still looks wrong, submit a [support ticket](https://supabase.help) through the dashboard. Select the affected organization and provide the invoice number for us to look at your case. ## Taxes -#### Does Supabase charge sales tax, VAT or GST? +### Does Supabase charge sales tax, VAT or GST? Supabase is rolling out sales tax in applicable US states, and VAT, GST, and other indirect taxes for customers where required by law. The tax amount applied to your invoice depends on your billing address and the tax regulations in your jurisdiction. -#### Why is Supabase collecting tax now? +### Why is Supabase collecting tax now? As a cloud services provider operating globally, Supabase is required to collect and remit indirect taxes in an increasing number of jurisdictions. We’re updating our billing practices to meet these obligations and ensure compliance with local tax regulations. -#### Will every customer be charged tax? +### Will every customer be charged tax? No. Tax is only applied in jurisdictions where Supabase is registered to collect it. If your billing address is in one of those jurisdictions, you’ll see tax applied on your invoice. If it is not, your invoices will not include tax. -#### When will customers start seeing tax on their invoices? +### When will customers start seeing tax on their invoices? We are progressively rolling out tax collection across international jurisdictions. The roll out begins on May 1, 2026 and completes by June 30, 2026. You will receive an email notification in advance of any changes to your invoicing. -#### Do I need to do anything? +### Do I need to do anything? For most customers, nothing changes on your end. Supabase automatically calculates the applicable tax based on the billing address associated with your organization. @@ -268,11 +268,11 @@ There are two cases where action may be needed: - If your organization is VAT- or GST-registered, make sure you have entered a valid Tax ID in your [organization’s billing page](/dashboard/org/_/billing#address). This allows us to apply the correct tax treatment, such as reverse charge for eligible B2B transactions. - If your organization is tax-exempt, submit your exemption certificate to [tax-documents@supabase.io](mailto:tax-documents@supabase.io) so we can verify and apply the exemption to your organization. -#### What if my billing address is missing or incorrect? +### What if my billing address is missing or incorrect? A valid billing address is required for us to calculate the correct tax and comply with tax regulations. Make sure your billing address is up to date in your [organization’s billing page](/dashboard/org/_/billing#address) to avoid any disruption. -#### Where do I add my tax ID? +### Where do I add my tax ID? You can add or update your Tax ID directly in the Supabase Dashboard under your [organization’s billing page](/dashboard/org/_/billing#address). @@ -280,24 +280,24 @@ Providing a valid Tax ID ensures we apply the correct tax treatment for your reg If you do not see an option for your country’s Tax ID format, please open a [support ticket](https://supabase.help) and we’ll make sure it is recorded on your account. -#### What if my organization is tax-exempt? +### What if my organization is tax-exempt? If your organization qualifies for a tax exemption, email your exemption certificate to [tax-documents@supabase.io](mailto:tax-documents@supabase.io). Our team will verify the certificate and update your account accordingly. Once approved, tax will no longer be applied to your invoices. -#### How does tax appear on my invoices? +### How does tax appear on my invoices? Tax is shown separately at the bottom of your invoice, clearly broken out from the cost of the products and services you’re subscribed to. This makes it easy to distinguish between your subscription costs and any applicable tax. -#### How is tax handled on prepaid credit top ups or packages? +### How is tax handled on prepaid credit top ups or packages? If you purchase a prepaid top up or credit package, tax is assessed at the time of purchase, not when the credits are later consumed against usage or subscription invoices. This ensures the correct tax rate is applied based on your billing address at the time of purchase. -#### Are marketplace purchases affected? +### Are marketplace purchases affected? If you use Supabase through a cloud marketplace such as AWS Marketplace or Vercel Marketplace, the marketplace provider handles tax collection and remittance. In those cases, Supabase does not separately charge tax on marketplace-billed invoices. -#### Who should I contact with questions about tax? +### Who should I contact with questions about tax? For questions about tax collection, exemptions, or your Tax ID, please open a [support ticket](https://supabase.help). diff --git a/apps/docs/content/guides/platform/ipv4-address.mdx b/apps/docs/content/guides/platform/ipv4-address.mdx index f17be34c3cda7..6c9666211d28c 100644 --- a/apps/docs/content/guides/platform/ipv4-address.mdx +++ b/apps/docs/content/guides/platform/ipv4-address.mdx @@ -100,7 +100,7 @@ nslookup db..supabase.co The pooler and direct connection strings can be found in the [project connect page](/dashboard/project/_?showConnect=true): -#### Direct connection +### Direct connection IPv6 unless IPv4 Add-On is enabled @@ -109,7 +109,7 @@ IPv6 unless IPv4 Add-On is enabled postgresql://postgres:[YOUR-PASSWORD]@db.ajrbwkcuthywfihaarmflo.supabase.co:5432/postgres ``` -#### Supavisor in transaction mode (port 6543) +### Supavisor in transaction mode (port 6543) Always uses an IPv4 address @@ -118,7 +118,7 @@ Always uses an IPv4 address postgresql://postgres.ajrbwkcuthywddfihrmflo:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:6543/postgres ``` -#### Supavisor in session mode (port 5432) +### Supavisor in session mode (port 5432) Always uses an IPv4 address diff --git a/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx b/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx index 444fb1e514d34..5a38ace3123ef 100644 --- a/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx +++ b/apps/docs/content/guides/platform/migrating-within-supabase/backup-restore.mdx @@ -213,7 +213,7 @@ These steps cover a manual logical restore (`pg_dump` / `psql`) into a project y ### Special considerations -##### Preserving migration history +#### Preserving migration history If you were using Supabase CLI for managing migrations on your old database and would like to preserve the migration history in your newly restored project, you need to insert the migration records separately using the following commands. @@ -228,7 +228,7 @@ psql \ --dbname "$NEW_DB_URL" ``` -##### Schema changes to `auth` and `storage` +#### Schema changes to `auth` and `storage` If you have modified the `auth` and `storage` schemas in your old project, such as adding triggers or Row Level Security(RLS) policies, you have to restore them separately. The Supabase CLI can help you diff the changes to these schemas using the following commands. @@ -239,11 +239,11 @@ supabase db diff --linked --schema auth,storage > changes.sql ### Troubleshooting notes -##### Disabling triggers during restore: +#### Disabling triggers during restore: Setting `session_replication_role` to `replica` disables triggers during the migration, preventing columns from being double encrypted. -##### Custom roles require passwords +#### Custom roles require passwords If you created any [custom roles](/dashboard/project/_/database/roles) with the `LOGIN` attribute, you must manually set their passwords in the new project. This can be done with the SQL command: @@ -251,7 +251,7 @@ If you created any [custom roles](/dashboard/project/_/database/roles) with the alter user "YOUR_USER" with password 'SOME_NEW_PASSWORD'; ``` -##### `supabase_admin` permission errors +#### `supabase_admin` permission errors If you encounter permission errors related to `supabase_admin` during restore: @@ -262,7 +262,7 @@ If you encounter permission errors related to `supabase_admin` during restore: ALTER ... OWNER TO "supabase_admin" ``` -##### `cli_login_postgres` role grant error +#### `cli_login_postgres` role grant error If you encounter the error: @@ -278,7 +278,7 @@ DETAIL: Only roles with the ADMIN option on role "postgres" may grant this role GRANT "postgres" TO "cli_login_postgres" WITH INHERIT FALSE GRANTED BY "supabase_admin"; ``` -##### `cli_login_postgres` role issues after cloning +#### `cli_login_postgres` role issues after cloning The `cli_login_role` must be created by the `supabase_admin` role. If the migration process cloned over the role before the CLI could generate its own version, it may encounter the error: diff --git a/apps/docs/content/guides/platform/privatelink.mdx b/apps/docs/content/guides/platform/privatelink.mdx index d3417eb68a508..2ccb08fc65f4e 100644 --- a/apps/docs/content/guides/platform/privatelink.mdx +++ b/apps/docs/content/guides/platform/privatelink.mdx @@ -38,7 +38,7 @@ To use PrivateLink with your Supabase project: ## Getting started -#### Step 1: Add AWS account +### Step 1: Add AWS account Navigate to your project's Integrations section to set up PrivateLink: @@ -52,7 +52,7 @@ Navigate to your project's Integrations section to set up PrivateLink: After submission, Supabase creates a VPC Lattice Resource Configuration for your project and sends an AWS Resource Share to the specified AWS Account ID. This process may take a few moments. Once complete, the account will show a "Ready" status, indicating that the resource share has been sent to your AWS account and is ready to be accepted. -#### Step 2: Accept resource share +### Step 2: Accept resource share Supabase will send you an AWS Resource Share containing the VPC Lattice Resource Configurations for your projects. To accept this share: @@ -69,7 +69,7 @@ Supabase will send you an AWS Resource Share containing the VPC Lattice Resource {/* supa-mdx-lint-disable-next-line Rule004ExcludeWords */} After accepting, you'll see the resource configurations appear in your [Shared with me > Shared resources](https://console.aws.amazon.com/ram/home#SharedResources) section of the RAM console and the [PrivateLink and Lattice > Resource configurations](https://console.aws.amazon.com/vpcconsole/home#ResourceConfigs) section of the VPC console. -#### Step 3: Configure security groups +### Step 3: Configure security groups Ensure your security groups allow traffic on the appropriate ports: @@ -81,11 +81,11 @@ Ensure your security groups allow traffic on the appropriate ports: - Destination that is appropriate for your network. i.e. the subnet of your VPC or security group of your application instances 5. Finish creating the security group by clicking **Create security group** -#### Step 4: Create connection +### Step 4: Create connection In your AWS account, you have two options to establish connectivity: -##### Option A: Create a PrivateLink endpoint +#### Option A: Create a PrivateLink endpoint 1. Navigate to the VPC console in your AWS account 2. Go to [Endpoints](https://console.aws.amazon.com/vpcconsole/home#Endpoints:) in the left sidebar @@ -106,7 +106,7 @@ In your AWS account, you have two options to establish connectivity: - The IP addresses of the endpoint will be listed in the **Subnets** section of the endpoint details - The DNS record will be in the **Associations** section of the endpoint details in the **DNS Name** field if you enabled it in step 8 -##### Option B: Attach resource configuration to an existing VPC lattice service network +#### Option B: Attach resource configuration to an existing VPC lattice service network 1. **This method is only recommended if you have an existing VPC Lattice Service Network** 2. Navigate to the VPC Lattice console in your AWS account @@ -118,7 +118,7 @@ In your AWS account, you have two options to establish connectivity: 8. After creation, you will see the resource configuration in the Resource configurations section of your service network with the status "Active" 9. For connectivity, click on the association details and the domain name will be listed in the **DNS entries** section -#### Step 5: Test connectivity +### Step 5: Test connectivity Verify the private connection is working correctly from your VPC: @@ -132,7 +132,7 @@ psql "postgresql://[username]:[password]@[private-endpoint]:5432/postgres" You should see a successful connection without any public internet traffic. -#### Step 6: Update applications +### Step 6: Update applications Configure your applications to use the private connection details: @@ -151,7 +151,7 @@ postgresql://user:pass@db.[project-ref].supabase.co:5432/postgres postgresql://user:pass@your-private-endpoint.vpce.amazonaws.com:5432/postgres ``` -#### Step 7: Disable public connectivity (optional) +### Step 7: Disable public connectivity (optional) For maximum security, you can disable public internet access for your database: diff --git a/apps/docs/content/guides/queues/api.mdx b/apps/docs/content/guides/queues/api.mdx index 178c65272454f..22c5784d3c148 100644 --- a/apps/docs/content/guides/queues/api.mdx +++ b/apps/docs/content/guides/queues/api.mdx @@ -7,7 +7,7 @@ When you create a Queue in Supabase, you can choose to create helper database fu Database functions in `pgmq_public` can be exposed via Supabase Data API so consumers client-side can call them. Visit the [Quickstart](/docs/guides/queues/quickstart) for an example. -### `pgmq_public.pop(queue_name)` +## `pgmq_public.pop(queue_name)` Retrieves the next available message and deletes it from the specified Queue. @@ -15,7 +15,7 @@ Retrieves the next available message and deletes it from the specified Queue. --- -### `pgmq_public.send(queue_name, message, sleep_seconds)` +## `pgmq_public.send(queue_name, message, sleep_seconds)` Adds a Message to the specified Queue, optionally delaying its visibility to all consumers by a number of seconds. @@ -25,7 +25,7 @@ Adds a Message to the specified Queue, optionally delaying its visibility to all --- -### `pgmq_public.send_batch(queue_name, messages, sleep_seconds)` +## `pgmq_public.send_batch(queue_name, messages, sleep_seconds)` Adds a batch of Messages to the specified Queue, optionally delaying their availability to all consumers by a number of seconds. @@ -35,7 +35,7 @@ Adds a batch of Messages to the specified Queue, optionally delaying their avail --- -### `pgmq_public.archive(queue_name, message_id)` +## `pgmq_public.archive(queue_name, message_id)` Archives a Message by moving it from the Queue table to the Queue's archive table. @@ -44,7 +44,7 @@ Archives a Message by moving it from the Queue table to the Queue's archive tabl --- -### `pgmq_public.delete(queue_name, message_id)` +## `pgmq_public.delete(queue_name, message_id)` Permanently deletes a Message from the specified Queue. @@ -53,7 +53,7 @@ Permanently deletes a Message from the specified Queue. --- -### `pgmq_public.read(queue_name, sleep_seconds, n)` +## `pgmq_public.read(queue_name, sleep_seconds, n)` Reads up to "n" Messages from the specified Queue with an optional "sleep_seconds" (visibility timeout). diff --git a/apps/docs/content/guides/resources.mdx b/apps/docs/content/guides/resources.mdx index 6e29ac25665ac..5268fbf5927c0 100644 --- a/apps/docs/content/guides/resources.mdx +++ b/apps/docs/content/guides/resources.mdx @@ -32,7 +32,7 @@ hideToc: true
-### Migrate to Supabase +## Migrate to Supabase
@@ -134,7 +134,7 @@ hideToc: true
-### Postgres resources +## Postgres resources
diff --git a/apps/docs/content/guides/security/hipaa-compliance.mdx b/apps/docs/content/guides/security/hipaa-compliance.mdx index c387b5c694781..f56ed670b18de 100644 --- a/apps/docs/content/guides/security/hipaa-compliance.mdx +++ b/apps/docs/content/guides/security/hipaa-compliance.mdx @@ -14,7 +14,7 @@ The hosted Supabase platform has the necessary controls to meet HIPAA requiremen -### Customer responsibilities +## Customer responsibilities Covered entities (the customer) are organizations that directly handle PHI, such as health plans, healthcare clearinghouses, and healthcare providers that conduct certain electronic transactions. @@ -22,7 +22,7 @@ Covered entities (the customer) are organizations that directly handle PHI, such 2. **Business Associate Agreements (BAAs)**: Customers must sign a BAA with Supabase. When the covered entity engages a business associate to help carry out its healthcare activities, it must have a written BAA. This agreement outlines the business associate's responsibilities and requires them to comply with HIPAA Rules. 3. **Internal Compliance Programs**: Customers must [configure their HIPAA projects](/docs/guides/platform/hipaa-projects) and follow the guidance given by the security advisor. Covered entities are responsible for implementing internal processes and compliance programs to ensure they meet HIPAA requirements. -### Supabase responsibilities +## Supabase responsibilities Supabase as the business associate, and the vendors used by Supabase, are the entities that perform functions or activities on behalf of the customer. diff --git a/apps/docs/content/guides/security/security-testing.mdx b/apps/docs/content/guides/security/security-testing.mdx index b130d20037244..63b6eab82bfc8 100644 --- a/apps/docs/content/guides/security/security-testing.mdx +++ b/apps/docs/content/guides/security/security-testing.mdx @@ -12,7 +12,7 @@ It is the customer’s responsibility to ensure that testing activities are alig Furthermore, Supabase runs a [Vulnerability Disclosure Program](https://hackerone.com/ca63b563-9661-4ac3-8d23-7581582ef451/embedded_submissions/new) (VDP) with HackerOne, and external security researchers may report any bugs found within the scope of the aforementioned program. Customer penetration testing does not form part of this VDP. -### Permitted services +## Permitted services - Authentication - Database @@ -22,7 +22,7 @@ Furthermore, Supabase runs a [Vulnerability Disclosure Program](https://hackeron - `https://.supabase.co/*` - `https://db..supabase.co/*` -### Prohibited testing and activities +## Prohibited testing and activities - Any activity contrary to what is listed in the AUP. - Denial of Service (DoS) and Distributed Denial of Service (DDoS) testing. diff --git a/apps/docs/content/guides/security/soc-2-compliance.mdx b/apps/docs/content/guides/security/soc-2-compliance.mdx index 7e202e4d2a4ea..efeb650bd81a9 100644 --- a/apps/docs/content/guides/security/soc-2-compliance.mdx +++ b/apps/docs/content/guides/security/soc-2-compliance.mdx @@ -25,14 +25,14 @@ Our [HIPAA documentation](/docs/guides/security/hipaa-compliance) provides more SOC 2 compliance is a critical aspect of data security for Supabase and our customers. Being fully SOC 2 compliant is a shared responsibility and here’s a breakdown of the responsibilities for both parties: -#### Supabase responsibilities +### Supabase responsibilities 1. **Security Measures**: Supabase implements robust security controls to protect customer data. These includes measures to prevent data breaches and ensure the confidentiality and integrity of the information managed and stored by the platform. Supabase is obliged to be vigilant about security risks and must demonstrate that our security measures meet industry standards through regular audits. 2. **Compliance Audits**: Supabase undergoes SOC 2 audits yearly to verify that our data management practices comply with the Trust Services Criteria (TSC), which include security, availability, processing integrity, confidentiality, and privacy. These audits are conducted by an independent third party. 3. **Incident Response**: Supabase has an incident response plan in place to handle data breaches efficiently. This plan outlines how the organization detects issues, responds to incidents, and manages system vulnerabilities. 4. **Reporting**: Upon a successful audit, Supabase receive a SOC 2 report that details our compliance status. This report is available to customers as a SOC 2 Type 2 report, and allows customers and stakeholders to assure that Supabase has implemented adequate and the requisite safeguards to protect sensitive information. -#### Customer responsibilities +### Customer responsibilities 1. **Compliance Requirements**: Understand your own compliance requirements. While SOC 2 compliance is not a legal requirement, many enterprise customers require their providers to have a SOC 2 report. This is because it provides assurance that the provider has implemented robust controls to protect customer data. 2. **Due Diligence**: Customers must perform due diligence when selecting Supabase as a provider. This includes reviewing the SOC 2 Type 2 report to ensure that Supabase meets the expected security standards. Customers should also understand the division of responsibilities between themselves and Supabase to avoid duplication of effort. @@ -40,7 +40,7 @@ SOC 2 compliance is a critical aspect of data security for Supabase and our cust 4. **Control Compliance**: If a customer needs to be SOC 2 compliant, they should themselves implement the requisite controls and undergo a SOC 2 audit. 5. **Audit logging**: Supabase sets [Postgres connection logging](/docs/guides/platform/postgres-connection-logging) to off by default for new projects. If your SOC 2 program requires connection audit evidence, enable connection logging and define how you retain and review those logs. -#### Shared responsibilities +### Shared responsibilities 1. **Data Security**: Both customers and Supabase share the responsibility of ensuring data security. While the Supabase, as the provider, implements the security controls, the customer must ensure that their use of the Supabase platform does not compromise these controls. 2. **Control Compliance**: Supabase asserts through our SOC 2 that all requisite security controls are met. Customers wishing to also be SOC 2 compliant need to go through their own SOC 2 audit, verifying that security controls are met on the customer's side. diff --git a/apps/docs/content/guides/self-hosting.mdx b/apps/docs/content/guides/self-hosting.mdx index 7858060697cf2..9345b7b846f76 100644 --- a/apps/docs/content/guides/self-hosting.mdx +++ b/apps/docs/content/guides/self-hosting.mdx @@ -7,7 +7,7 @@ hideToc: true Self-hosting is a good fit if you need full control over your data, have compliance requirements that prevent you from using managed services, or want to run Supabase in an isolated environment. -### How self-hosted Supabase differs +## How self-hosted Supabase differs Self-hosted Supabase is different from: @@ -16,7 +16,7 @@ Self-hosted Supabase is different from: Self-hosted Supabase mimics a single project. Studio doesn't support multiple organizations or projects. Platform-only [features](/features) such as branching, advanced metrics beyond logs, managed backups and PITR, analytics and vector buckets, ETL, and the platform management API are **unavailable** in self-hosted configuration. Most settings are configured through [environment variables](https://github.com/supabase/supabase/blob/master/docker/.env.example). -### Your responsibilities when self-hosting +## Your responsibilities when self-hosting When you self-host, **you are responsible for**: @@ -28,7 +28,7 @@ When you self-host, **you are responsible for**: - Backups and disaster recovery - Monitoring and uptime -### Telemetry +## Telemetry Self-hosted Supabase (run via Docker Compose) **does not phone home or collect any telemetry**. diff --git a/apps/docs/content/guides/storage/cdn/fundamentals.mdx b/apps/docs/content/guides/storage/cdn/fundamentals.mdx index 825fd0dc8bd9c..30646fc883077 100644 --- a/apps/docs/content/guides/storage/cdn/fundamentals.mdx +++ b/apps/docs/content/guides/storage/cdn/fundamentals.mdx @@ -7,7 +7,7 @@ sidebar_label: 'CDN' All assets uploaded to Supabase Storage are cached on a Content Delivery Network (CDN) to improve the latency for users all around the world. CDNs are a geographically distributed set of servers or **nodes** which cache content from an **origin server**. For Supabase Storage, the origin is the storage server running in the [same region as your project](/dashboard/project/_/settings/general). Aside from performance, CDNs also help with security and availability by mitigating Distributed Denial of Service (DDoS) and other application attacks. -### Example +## Example The following example shows how a CDN helps with performance. @@ -27,7 +27,7 @@ Note that CDNs might still evict your object from their cache if it has not been The cache status of a particular request is sent in the `cf-cache-status` header. A cache status of `MISS` indicates that the CDN node did not have the object in its cache and had to ping the origin to get it. A cache status of `HIT` indicates that the object was sent directly from the CDN. -### Public vs private buckets +## Public vs private buckets Objects in public buckets do not require any authorization to access objects. This leads to a better cache hit rate compared to private buckets. diff --git a/apps/docs/content/guides/storage/debugging/logs.mdx b/apps/docs/content/guides/storage/debugging/logs.mdx index 9470a55b25e58..27848a61b9a85 100644 --- a/apps/docs/content/guides/storage/debugging/logs.mdx +++ b/apps/docs/content/guides/storage/debugging/logs.mdx @@ -15,9 +15,9 @@ For more details on filtering the log tables, see [Advanced Log Filtering](/docs -### Example Storage queries for the Logs Explorer +## Example Storage queries for the Logs Explorer -#### Filter by status 5XX error +### Filter by status 5XX error ```sql select @@ -37,7 +37,7 @@ order by timestamp desc limit 100; ``` -#### Filter by status 4XX error +### Filter by status 4XX error ```sql select @@ -57,7 +57,7 @@ order by timestamp desc limit 100; ``` -#### Filter by method +### Filter by method ```sql select id, storage_logs.timestamp, event_message, r.method @@ -70,7 +70,7 @@ order by timestamp desc limit 100; ``` -#### Filter by IP address +### Filter by IP address ```sql select id, storage_logs.timestamp, event_message, r.remoteAddress diff --git a/apps/docs/content/guides/storage/production/scaling.mdx b/apps/docs/content/guides/storage/production/scaling.mdx index 031ae6a62f97b..898589512c754 100644 --- a/apps/docs/content/guides/storage/production/scaling.mdx +++ b/apps/docs/content/guides/storage/production/scaling.mdx @@ -12,19 +12,19 @@ Here are some optimizations that you can consider to improve performance and red If your project has high egress, these optimizations can help reducing it. -#### Resize images +### Resize images Images typically make up most of your egress. By keeping them as small as possible, you can cut down on egress and boost your application's performance. You can take advantage of our [Image Transformation](/docs/guides/storage/serving/image-transformations) service to optimize any image on the fly. -#### Set a high cache-control value +### Set a high cache-control value Using the browser cache can effectively lower your egress since the asset remains stored in the user's browser after the initial download. Setting a high `cache-control` value ensures the asset stays in the user's browser for an extended period, decreasing the need to download it from the server repeatedly. Read more [here](/docs/guides/storage/cdn/smart-cdn#cache-duration) -#### Limit the upload size +### Limit the upload size You have the option to set a maximum upload size for your bucket. Doing this can prevent users from uploading and then downloading excessively large files. You can control the maximum file size by configuring this option at the [bucket level](/docs/guides/storage/buckets/creating-buckets). -#### Smart CDN +### Smart CDN By leveraging our [Smart CDN](/docs/guides/storage/cdn/smart-cdn), you can achieve a higher cache hit rate and therefore lower your egress cached, as we charge less for cached egress (see [egress pricing](/docs/guides/platform/manage-your-usage/egress#pricing)). diff --git a/apps/docs/content/guides/storage/schema/helper-functions.mdx b/apps/docs/content/guides/storage/schema/helper-functions.mdx index afdc2ba8d06ce..295639a22c4a9 100644 --- a/apps/docs/content/guides/storage/schema/helper-functions.mdx +++ b/apps/docs/content/guides/storage/schema/helper-functions.mdx @@ -8,7 +8,7 @@ sidebar_label: 'Schema' Supabase Storage provides SQL helper functions which you can use to write RLS policies. -### `storage.filename()` +## `storage.filename()` Returns the name of a file. For example, if your file is stored in `public/subfolder/avatar.png` it would return: `'avatar.png'` @@ -26,7 +26,7 @@ using ( ); ``` -### `storage.foldername()` +## `storage.foldername()` Returns an array path, with all of the subfolders that a file belongs to. For example, if your file is stored in `public/subfolder/avatar.png` it would return: `[ 'public', 'subfolder' ]` @@ -44,7 +44,7 @@ with check ( ); ``` -### `storage.extension()` +## `storage.extension()` Returns the extension of a file. For example, if your file is stored in `public/subfolder/avatar.png` it would return: `'png'` @@ -62,7 +62,7 @@ with check ( ); ``` -### `storage.allow_only_operation()` +## `storage.allow_only_operation()` Returns `true` when the current Storage API operation exactly matches the provided operation name. @@ -92,7 +92,7 @@ using ( ); ``` -### `storage.allow_any_operation()` +## `storage.allow_any_operation()` Returns `true` when the current Storage API operation exactly matches any operation in the provided array. diff --git a/apps/docs/content/guides/storage/serving/image-transformations.mdx b/apps/docs/content/guides/storage/serving/image-transformations.mdx index 734e2fa391f1a..549a9e663eb3c 100644 --- a/apps/docs/content/guides/storage/serving/image-transformations.mdx +++ b/apps/docs/content/guides/storage/serving/image-transformations.mdx @@ -40,6 +40,7 @@ Our client libraries methods like `getPublicUrl` and `createSignedUrl` support t ```ts import { createClient } from '@supabase/supabase-js' + const supabase = createClient('your_project_url', 'your_supabase_api_key') // ---cut--- @@ -131,6 +132,7 @@ To share a transformed image in a private bucket for a fixed amount of time, pro ```ts import { createClient } from '@supabase/supabase-js' + const supabase = createClient('your_project_url', 'your_supabase_api_key') // ---cut--- @@ -206,6 +208,7 @@ To download a transformed image, pass the `transform` option to the `download` f ```ts import { createClient } from '@supabase/supabase-js' + const supabase = createClient('your_project_url', 'your_supabase_api_key') // ---cut--- @@ -314,6 +317,7 @@ In case you'd like to return the original format of the image and **opt-out** fr ```ts import { createClient } from '@supabase/supabase-js' + const supabase = createClient('your_project_url', 'your_supabase_api_key') // ---cut--- @@ -459,6 +463,7 @@ Example: ```ts import { createClient } from '@supabase/supabase-js' + const supabase = createClient('your_project_url', 'your_supabase_api_key') // ---cut--- @@ -567,6 +572,7 @@ Example: ```ts import { createClient } from '@supabase/supabase-js' + const supabase = createClient('your_project_url', 'your_supabase_api_key') // ---cut--- @@ -691,7 +697,7 @@ If you run the official self-hosted stack from the [`supabase/supabase`](https:/ -#### imgproxy configuration: +### imgproxy configuration: Deploy an imgproxy container with the following configuration: @@ -705,7 +711,7 @@ imgproxy: Note: make sure that this service can only be reachable within an internal network and not exposed to the public internet -#### Storage API configuration: +### Storage API configuration: Once [imgproxy](https://imgproxy.net/) is deployed we need to configure a couple of environment variables in your self-hosted [`storage-api`](https://github.com/supabase/storage-api) service as follows: diff --git a/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx b/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx index 753e8b6bea940..1cb5ba06123c3 100644 --- a/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx +++ b/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx @@ -283,13 +283,13 @@ Instead of `https://project-id.supabase.co` use `https://project-id.storage.supa -### Upload URL +## Upload URL When uploading using the resumable upload endpoint, the storage server creates a unique URL for each upload, even for multiple uploads to the same path. All chunks will be uploaded to this URL using the `PATCH` method. This unique upload URL will be valid for **up to 24 hours**. If the upload is not completed within 24 hours, the URL will expire and you'll need to start the upload again. TUS client libraries typically create a new URL if the previous one expires. -### Concurrency +## Concurrency When two or more clients upload to the same upload URL only one of them will succeed. The other clients will receive a `409 Conflict` error. Only 1 client can upload to the same upload URL at a time which prevents data corruption. @@ -297,7 +297,7 @@ When two or more clients upload a file to the same path using different upload U If you provide the `x-upsert` header the last client to complete the upload will succeed instead. -### Uppy example +## Uppy example You can check a [full example using Uppy](https://github.com/supabase/supabase/tree/master/examples/storage/resumable-upload-uppy). @@ -308,7 +308,7 @@ Uppy has integrations with different frameworks: - [Vue](https://uppy.io/docs/vue/) - [Angular](https://uppy.io/docs/angular/) -### Presigned uploads +## Presigned uploads Resumable uploads also supports using signed upload tokens to created time-limited URLs that you can share to your users by invoking the `createSignedUploadUrl` method on the SDK and including the returned token in the `x-signature` header of the resumable upload. diff --git a/apps/docs/content/troubleshooting/an-invalid-response-was-received-from-the-upstream-server-error-when-querying-auth-RI4Vl-.mdx b/apps/docs/content/troubleshooting/an-invalid-response-was-received-from-the-upstream-server-error-when-querying-auth-RI4Vl-.mdx index 4d03e6e93bd89..56ff90e90514b 100644 --- a/apps/docs/content/troubleshooting/an-invalid-response-was-received-from-the-upstream-server-error-when-querying-auth-RI4Vl-.mdx +++ b/apps/docs/content/troubleshooting/an-invalid-response-was-received-from-the-upstream-server-error-when-querying-auth-RI4Vl-.mdx @@ -23,7 +23,7 @@ We're currently investigating an issue where the tables responsible for keeping We've documented some of the migrations that run into this issue and their corresponding fix here: -### Auth: `operator does not exist: uuid = text` +## Auth: `operator does not exist: uuid = text` Temporary fix: Run `insert into auth.schema_migrations values ('20221208132122');` via the [SQL editor](/dashboard/project/_/sql/new) to fix the issue. diff --git a/apps/docs/content/troubleshooting/are-all-features-available-in-self-hosted-supabase-THPcqw.mdx b/apps/docs/content/troubleshooting/are-all-features-available-in-self-hosted-supabase-THPcqw.mdx index 57d163952f625..80f71ba1ba6b0 100644 --- a/apps/docs/content/troubleshooting/are-all-features-available-in-self-hosted-supabase-THPcqw.mdx +++ b/apps/docs/content/troubleshooting/are-all-features-available-in-self-hosted-supabase-THPcqw.mdx @@ -6,16 +6,16 @@ topics = [ "self-hosting" ] database_id = "03854567-8838-4f12-8a6c-095fc1671d9f" --- -### Overview +## Overview The self-hosted version is pretty similar to the hosted one. It might not always have the latest features right away, but it includes everything you need to get your application up and running. -### Feature availability +## Feature availability To know what features are available in the self-hosted version, refer to the comprehensive list here: [Supabase Features](/features) -### Self-hosting documentation +## Self-hosting documentation For detailed steps and guidance on how to set up and manage your self-hosted Supabase instance, follow the documentation provided: [Self-Hosting Guide](/docs/guides/self-hosting) diff --git a/apps/docs/content/troubleshooting/avoiding-timeouts-in-long-running-queries-6nmbdN.mdx b/apps/docs/content/troubleshooting/avoiding-timeouts-in-long-running-queries-6nmbdN.mdx index f69691f74910e..d827aaa9ff48c 100644 --- a/apps/docs/content/troubleshooting/avoiding-timeouts-in-long-running-queries-6nmbdN.mdx +++ b/apps/docs/content/troubleshooting/avoiding-timeouts-in-long-running-queries-6nmbdN.mdx @@ -17,7 +17,7 @@ Certain queries, like indexing a table or changing a column's data type, are inh To execute long-running queries, follow the below steps. -### Install an external SQL client +## Install an external SQL client The guide focuses on [psql](/docs/guides/database/psql) but you can use any Postgres client. @@ -41,7 +41,7 @@ If you are working in an [IPv6 environment](https://github.com/orgs/supabase/dis -### Increase the query timeout +## Increase the query timeout Then you can increase the query timeout solely for your session: diff --git a/apps/docs/content/troubleshooting/database-api-42501-errors.mdx b/apps/docs/content/troubleshooting/database-api-42501-errors.mdx index d128a896b5a11..fe0db64c9a859 100644 --- a/apps/docs/content/troubleshooting/database-api-42501-errors.mdx +++ b/apps/docs/content/troubleshooting/database-api-42501-errors.mdx @@ -37,15 +37,15 @@ limit 100; They tend to be caused by one of the following factors. -### Attempted to access a forbidden schema +## Attempted to access a forbidden schema API roles cannot access certain schemas, most notably `auth` and `vault`. This restriction extends to Foreign Data Wrappers relying on `vault`. While you can bypass it using a [security definer function](/docs/guides/database/functions?queryGroups=language&language=sql&queryGroups=example-view&example-view=sql#security-definer-vs-invoker), these schemas are intentionally restricted for security reasons. -### Attempted to access a custom schema +## Attempted to access a custom schema If you created a custom schema, you will have to give the Database API permission to query it. Follow our [Using Custom Schemas guide](/docs/guides/api/using-custom-schemas) for more directions. -### Missing table-level privileges +## Missing table-level privileges If you see an error like `permission denied for table your_table`, the querying role may not have the required privilege for the operation. @@ -79,10 +79,10 @@ For more information, see [Securing your API](/docs/guides/api/securing-your-api -### Configured column-level restrictions +## Configured column-level restrictions If you've set column-based access in the [Dashboard](/dashboard/project/_/database/column-privileges) or via SQL, queries will fail with a `42501` error when accessing restricted columns. This includes using `select *`, as it expands to include forbidden columns. -### RLS: +## RLS: If the anon or authenticated roles attempt to UPDATE or INSERT values without the necessary RLS permissions, Postgres will return a 42501 error. diff --git a/apps/docs/content/troubleshooting/disabling-prepared-statements-qL8lEL.mdx b/apps/docs/content/troubleshooting/disabling-prepared-statements-qL8lEL.mdx index c9741c78913b2..7d0c3ab413d4b 100644 --- a/apps/docs/content/troubleshooting/disabling-prepared-statements-qL8lEL.mdx +++ b/apps/docs/content/troubleshooting/disabling-prepared-statements-qL8lEL.mdx @@ -7,7 +7,7 @@ keywords = [ "prepared", "statements", "transaction", "mode", "disable" ] database_id = "04801b69-e7eb-4f40-8d41-81110397bbc2" --- -### It is important to note that although the direct connections and Supavisor in session mode support prepared statements, Supavisor in transaction mode does not. +## It is important to note that although the direct connections and Supavisor in session mode support prepared statements, Supavisor in transaction mode does not. ## How to disable prepared statements for Supavisor in transaction mode diff --git a/apps/docs/content/troubleshooting/discovering-and-interpreting-api-errors-in-the-logs-7xREI9.mdx b/apps/docs/content/troubleshooting/discovering-and-interpreting-api-errors-in-the-logs-7xREI9.mdx index 252b274381a42..69b09ddfba4a2 100644 --- a/apps/docs/content/troubleshooting/discovering-and-interpreting-api-errors-in-the-logs-7xREI9.mdx +++ b/apps/docs/content/troubleshooting/discovering-and-interpreting-api-errors-in-the-logs-7xREI9.mdx @@ -164,7 +164,7 @@ from ## Finding errors -#### API level errors +### API level errors The `metadata.request.url` contains PostgREST formatted queries. @@ -213,7 +213,7 @@ where PostgREST has an [error reference table](https://postgrest.org/en/v12/references/errors.html) that you can use to interpret status codes. -#### Database-level errors +### Database-level errors However, some errors that are reported through the Database API occur at the Postgres level. If it is not clear which error occurred you should reference the timestamp of the error and try to see if you can find it in the Postgres logs. diff --git a/apps/docs/content/troubleshooting/edge-function-504-error-response.mdx b/apps/docs/content/troubleshooting/edge-function-504-error-response.mdx index 86e2d5e939430..0d940386d119a 100644 --- a/apps/docs/content/troubleshooting/edge-function-504-error-response.mdx +++ b/apps/docs/content/troubleshooting/edge-function-504-error-response.mdx @@ -11,7 +11,7 @@ An internal 504 from an Edge Function means the function failed to initiate a re As of now, this limit cannot be increased. If your function always needs more time than allowed, skip to [When optimization isn't enough](#when-optimization-is-not-enough) section. Otherwise, follow the steps below to speed up response times. -### Step 1: Identifying slow Functions +## Step 1: Identifying slow Functions You can filter for 504 events in the Log Explorer with the below [query](/dashboard/project/_/logs/explorer?q=select%0A++cast%28timestamp+as+datetime%29+as+timestamp%2C%0A++req.pathname%2C%0A++res.status_code%2C%0A++metadata.execution_time_ms%0Afrom%0A++function_edge_logs%0A++cross+join+UNNEST%28metadata%29+as+metadata%0A++cross+join+UNNEST%28metadata.request%29+as+req%0A++cross+join+UNNEST%28metadata.response%29+as+res%0Awhere+res.status_code+%3D+504%0Alimit+20%3B): @@ -53,7 +53,7 @@ limit 20; Once candidate functions are identified, you can investigate more thoroughly. -### Step 2: Investigating slow Functions +## Step 2: Investigating slow Functions Add `console.time` labels around suspicious sections to pinpoint where time is being spent: @@ -76,11 +76,11 @@ Common culprits: - External APIs that are throttling or rate-limiting you - Loops without a clear escape condition -### Step 3: Optimize +## Step 3: Optimize The below suggestions are some strategies you can pursue to reduce execution times. -#### Parallelizing requests +### Parallelizing requests If requests are independent of one another, rather than calling them sequentially, you can speed up operations by calling them in parallel with [Promise.all](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all): @@ -96,15 +96,15 @@ const [resultA, resultB] = await Promise.all([ ]) ``` -#### Splitting up logic +### Splitting up logic The Edge Function may be doing more than it needs to. It may be better to split up it's logic into multiple parts that can be called individually and run for shorter periods. -#### Use background tasks [utilize-background-tasks] +### Use background tasks [utilize-background-tasks] You can initiate functions in a background task to be handled independently of the request/response handler. The process is outlined in the [Background Task docs](/docs/guides/functions/background-tasks) -#### Offload work to the client or an external service +### Offload work to the client or an external service Instead of managing all operations within the function itself, there may be an external API that can execute jobs faster and then send back results. Alternatively, you may be able to offload some processing to the requester rather than doing everything within the function itself. @@ -143,7 +143,7 @@ group by req.pathname, res.status_code limit 10; ``` -### When optimization is not enough +## When optimization is not enough Edge Functions have a hard runtime ceiling that cannot be raised. If your use case genuinely requires more, consider: diff --git a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx index 22d1be7e136f9..4f7fbee362a6c 100644 --- a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx +++ b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx @@ -7,7 +7,7 @@ database_id = "23668386-7a72-44ff-a412-4cd8a005fa18" When facing high CPU utilization, slow query performance, and an `ERROR: must be a superuser to terminate superuser process` message regarding an autovacuum, it indicates that a critical, non-terminable autovacuum operation is running on your Postgres database. This guide explains why this happens and what steps you can take. -### **Core Postgres concepts** +## Core Postgres concepts To understand this issue, it's essential to grasp a few core Postgres concepts: @@ -25,7 +25,7 @@ Every transaction in Postgres is assigned a unique Transaction ID (XID). These X To prevent this critical issue, Postgres initiates a special autovacuum operation: the **"wraparound prevention vacuum."** -### **Understanding the problem: A critical autovacuum** +## Understanding the problem: A critical autovacuum When you encounter the `ERROR: must be a superuser to terminate superuser process` associated with an autovacuum marked "to prevent wraparound," it signifies that this mandatory, system-critical operation is underway. @@ -38,7 +38,7 @@ When you encounter the `ERROR: must be a superuser to terminate superuser proces **Why is it running?** This situation often arises in large, high-write tables (e.g., `your_table`, which might be hundreds of GBs in size and contain hundreds of millions of rows) that accumulate dead tuples rapidly. When the transaction ID age of the table approaches a critical threshold, Postgres automatically triggers this emergency autovacuum. For instance, if a table has millions of rows and over a million dead rows, exceeding its configured `autovacuum_vacuum_scale_factor` (e.g., 0.2), a regular autovacuum might initiate. However, if the XID age continues to increase, the system prioritizes the wraparound prevention vacuum to safeguard data integrity. -### **Mitigating performance impact during a critical autovacuum** +## Mitigating performance impact during a critical autovacuum Since the wraparound prevention autovacuum cannot be stopped, the best approach is to provide the database with sufficient resources to complete the operation as efficiently as possible. @@ -52,7 +52,7 @@ Since the wraparound prevention autovacuum cannot be stopped, the best approach - **Why it helps:** Autovacuum is an I/O-intensive operation, involving a lot of reading and writing. Higher disk performance can significantly speed up the process. - **Considerations:** Cloud providers may limit the number of disk modifications (e.g., up to four in a rolling 24-hour window). You can start a new modification immediately after the previous one finishes, provided you have not exceeded this rolling 24-hour quota. -### **Monitoring progress and future prevention** +## Monitoring progress and future prevention **Monitoring the Current Autovacuum:** You can monitor the progress of the active autovacuum processes using the `pg_stat_progress_vacuum` view: diff --git a/apps/docs/content/troubleshooting/how-postgres-chooses-which-index-to-use-_JHrf4.mdx b/apps/docs/content/troubleshooting/how-postgres-chooses-which-index-to-use-_JHrf4.mdx index ac3880bae9844..c7825cc9c51a3 100644 --- a/apps/docs/content/troubleshooting/how-postgres-chooses-which-index-to-use-_JHrf4.mdx +++ b/apps/docs/content/troubleshooting/how-postgres-chooses-which-index-to-use-_JHrf4.mdx @@ -9,9 +9,9 @@ database_id = "e7671f20-2639-442e-9df9-4f6fa3766598" > For the curious: [here is a list of all built-in indexes in Postgres](https://www.postgresql.org/docs/current/indexes-types.html) -### Postgres internals +## Postgres internals -#### How an index is chosen +### How an index is chosen Postgres, internally, contains a few components that manage query execution: @@ -98,11 +98,11 @@ To reset statistics within the database, you can use the following query: select pg_stat_reset(); ``` -### Complex or composite indexes +## Complex or composite indexes > For a more complete rundown, check the [Postgres Official Docs](https://www.postgresql.org/docs/current/indexes-multicolumn.html) -#### Multi-column indexes +### Multi-column indexes If you make independent indexes on multiple columns, Postgres will likely use each of them independently to find the relevant rows and then combine the results together. @@ -118,7 +118,7 @@ from test2 where major = constant and minor = constant; ``` -#### Ordered indexes +### Ordered indexes If you're using an ORDER BY clause, [indexes can also be pre-sorted by DESC/ASC](https://www.postgresql.org/docs/current/indexes-ordering.html) for better performance. @@ -127,7 +127,7 @@ If you're using an ORDER BY clause, [indexes can also be pre-sorted by DESC/ASC] CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST); ``` -#### Functional indexes +### Functional indexes Although not as common, indexes can also be leveraged against modified values, such as when using a LOWER function: @@ -139,7 +139,7 @@ create index test1_lower_col1_idx on test1 (lower(col1)); select * from test1 where lower(col1) = 'value'; ``` -#### Covering indexes +### Covering indexes Indexes contain pointers to a specific row, but you could instruct an index to hold a copy of a column's value for even faster retrieval. These are known as `covering` indexes. Because maintaining a copy is storage intensive, you should avoid using it for values with large data footprints.[ FULL VIDEO ON TOPIC](https://www.youtube.com/watch?v=bBu_V8CfWgM) @@ -147,7 +147,7 @@ Indexes contain pointers to a specific row, but you could instruct an index to h CREATE INDEX a_b_idx ON x (a,b) INCLUDE (c); ``` -#### Indexes on JSONB +### Indexes on JSONB Although a GIN/GIST index can be used to index entire JSONB bodies, you can also target only specific Key-values with standard BTREE indexes: diff --git a/apps/docs/content/troubleshooting/how-to-change-max-database-connections-_BQ8P5.mdx b/apps/docs/content/troubleshooting/how-to-change-max-database-connections-_BQ8P5.mdx index 34b4650368bd6..4b80798da3fec 100644 --- a/apps/docs/content/troubleshooting/how-to-change-max-database-connections-_BQ8P5.mdx +++ b/apps/docs/content/troubleshooting/how-to-change-max-database-connections-_BQ8P5.mdx @@ -54,17 +54,17 @@ SHOW max_connections; **Three** factors must be taken into consideration when adjusting the direct connection limit: -#### Process schedulers and Postgres internals +### Process schedulers and Postgres internals Allowing too many direct connections in your database can overburden Postgres schedulers and other internal modules. This will result in a noticeable decrease in query throughput, despite having more connections available. EnterpriseDB wrote a wonderful [article](https://www.enterprisedb.com/postgres-tutorials/why-you-should-use-connection-pooling-when-setting-maxconnections-postgres) that outlines some of the considerations. The default connection values are set based on a solid understanding of Postgres architecture, and straying too far from them is _likely_ to hinder performance. However, with some experimentation, you might discover a value better suited to your specific needs. Still, unless there's a compelling reason to adjust the setting, it's generally advisable to stick with the defaults or change the values judiciously.' -#### Memory +### Memory > If you do not know how to monitor memory and CPU with Supabase Grafana, [check here](https://github.com/orgs/supabase/discussions/27141). -##### Each direct connection is a running process that will consume active memory +#### Each direct connection is a running process that will consume active memory This is a Grafana Chart of unhealthy memory usage: @@ -92,7 +92,7 @@ select ) || ' * ' || current_setting('maintenance_work_mem') || ')) / ' || current_setting('work_mem'); ``` -#### CPU +### CPU The below chart is an example of what can occur to the CPU if 100s of connections are inappropriately opened/closed every second or many CPU intensive queries are run in parallel diff --git a/apps/docs/content/troubleshooting/how-to-interpret-and-explore-the-postgres-logs-OuCIOj.mdx b/apps/docs/content/troubleshooting/how-to-interpret-and-explore-the-postgres-logs-OuCIOj.mdx index a05664e26540b..5ed6eea10b049 100644 --- a/apps/docs/content/troubleshooting/how-to-interpret-and-explore-the-postgres-logs-OuCIOj.mdx +++ b/apps/docs/content/troubleshooting/how-to-interpret-and-explore-the-postgres-logs-OuCIOj.mdx @@ -191,7 +191,7 @@ Queries can use complex syntax, so it is often helpful to isolate by referenced All failed queries, including those from PostgREST, Auth, and external libraries (e.g., Prisma) are logged with helpful error messages for debugging. -##### Server/Role mapping +#### Server/Role mapping API servers have assigned database roles for connecting to the database: @@ -257,7 +257,7 @@ limit 100; ## Logging for compliance and security -#### Customized object and role activity logging +### Customized object and role activity logging > ⚠️ NOTE: This is specifically designated for those using the `postgres` role or [custom roles](/docs/guides/database/postgres/roles) to interact with their database. Those using the Database REST API should reference the [Database API Logging Guide](https://github.com/orgs/supabase/discussions/22849) instead. @@ -279,7 +279,7 @@ where parsed.user_name = 'API_role' ``` -#### Filtering by IP +### Filtering by IP > If you are connecting from a known, limited range of IP addresses, you should enable [network restrictions](/docs/guides/platform/network-restrictions). @@ -341,7 +341,7 @@ where > WARNING: lenient settings can lead to over-logging, impacting database performance while creating noise in the logs. -##### Severity levels +#### Severity levels The `log_min_messages` variable determines what is severe enough to log. Here are the severity thresholds from the [Postgres docs](https://www.postgresql.org/docs/current/runtime-config-logging.html). @@ -365,7 +365,7 @@ alter role postgres set log_min_messages = ''; show log_min_messages; -- default WARNING ``` -##### Configuring queries logged +#### Configuring queries logged By default, only failed queries are logged. The [PGAudit extension](/docs/guides/database/extensions/pgaudit) extends Postgres's built-in logging abilities. It can be used to selectively track all queries in your database by: @@ -374,25 +374,25 @@ By default, only failed queries are logged. The [PGAudit extension](/docs/guides - database object - entire database -##### Logging within database functions +#### Logging within database functions To track or debug functions, logging can be configured by following the [function debugging guide](/docs/guides/database/functions#general-logging) ## Frequently Asked Questions -##### How to join different log tables +### How to join different log tables No, log tables are independent from each other and do not share any primary/foreign key relations for joining. -##### How to download logs +### How to download logs At the moment, the way to download logs is through the Log Dashboard as a CSV -##### What is logged? +### What is logged? To see the default types of events that are logged, you can check this [guide](https://gist.github.com/TheOtherBrian1/991d32c2b00dbc75d29b80d4cdf41aa7). -#### Other resources: +### Other resources: - [Regex for filtering logs](https://github.com/orgs/supabase/discussions/22640) - [Debugging with the DB API logs](https://github.com/orgs/supabase/discussions/22849) diff --git a/apps/docs/content/troubleshooting/how-to-migrate-from-supabase-auth-helpers-to-ssr-package-5NRunM.mdx b/apps/docs/content/troubleshooting/how-to-migrate-from-supabase-auth-helpers-to-ssr-package-5NRunM.mdx index d35d2376ae2c8..52f2f3f15e5aa 100644 --- a/apps/docs/content/troubleshooting/how-to-migrate-from-supabase-auth-helpers-to-ssr-package-5NRunM.mdx +++ b/apps/docs/content/troubleshooting/how-to-migrate-from-supabase-auth-helpers-to-ssr-package-5NRunM.mdx @@ -13,7 +13,7 @@ Here are the steps for you to migrate your application from the `auth-helpers` p Depending on your implementation, you may ignore some parts of this documentation and use your own implementation (i.e. using API routes vs. Server Actions). What's important is you replace the clients provided by `auth-helpers` with the utility functions created using clients provided by `@supabase/ssr`. -### 1. Uninstall Supabase Auth helpers and install the Supabase SSR package +## 1. Uninstall Supabase Auth helpers and install the Supabase SSR package It's important that you don't use both `auth-helpers-nextjs` and `@supabase/ssr` packages in the same application to avoid running into authentication issues. @@ -22,7 +22,7 @@ npm uninstall @supabase/auth-helpers-nextjs @supabase/supabase-js npm install @supabase/ssr @supabase/supabase-js ``` -### 2. Create the library functions to create Supabase clients +## 2. Create the library functions to create Supabase clients ``` // lib/supabase/client.ts @@ -136,7 +136,7 @@ export async function updateSession(request: NextRequest) { } ``` -### 3. Replace your proxy.ts file +## 3. Replace your proxy.ts file ``` // proxy.ts @@ -162,7 +162,7 @@ export const config = { } ``` -### 4. Create your server actions to handle login and sign up +## 4. Create your server actions to handle login and sign up ``` // app/login/actions.ts @@ -215,7 +215,7 @@ export async function signup(formData: FormData) { } ``` -### 5. Use the server actions in your login page UI +## 5. Use the server actions in your login page UI ``` // app/login/page.tsx @@ -236,7 +236,7 @@ export default function LoginPage() { } ``` -### 6. Client components +## 6. Client components ``` 'use client'; @@ -258,7 +258,7 @@ export default async function Page() { } ``` -### 7. Server components +## 7. Server components ``` // replace @@ -282,7 +282,7 @@ export default async function Page() { } ``` -### 8. Route handlers +## 8. Route handlers ``` // replace diff --git a/apps/docs/content/troubleshooting/http-api-issues.mdx b/apps/docs/content/troubleshooting/http-api-issues.mdx index 936ec4d58c522..de8836ef69d07 100644 --- a/apps/docs/content/troubleshooting/http-api-issues.mdx +++ b/apps/docs/content/troubleshooting/http-api-issues.mdx @@ -17,7 +17,7 @@ Symptoms of HTTP API issues include: - 5xx response codes - High response times -### Under-provisioned resources +## Under-provisioned resources The most common class of issues that causes HTTP timeouts and 5xx response codes is the under-provisioning of resources for your project. This can cause your project to be unable to service the traffic it is receiving. diff --git a/apps/docs/content/troubleshooting/increase-vector-lookup-speeds-by-applying-an-hsnw-index-ohLHUM.mdx b/apps/docs/content/troubleshooting/increase-vector-lookup-speeds-by-applying-an-hsnw-index-ohLHUM.mdx index a35f30c5325ec..9312406008910 100644 --- a/apps/docs/content/troubleshooting/increase-vector-lookup-speeds-by-applying-an-hsnw-index-ohLHUM.mdx +++ b/apps/docs/content/troubleshooting/increase-vector-lookup-speeds-by-applying-an-hsnw-index-ohLHUM.mdx @@ -11,7 +11,7 @@ database_id = "7d755701-747f-4c3a-b8be-236c5518e4eb" > Building an index without the `CONCURRENTLY` modifier will lock the table, but it will also increase build times. For general advice about indexes, check out this [guide](https://github.com/orgs/supabase/discussions/22449). -### **To speed up queries, it is ideal to create an HSNW index on your embedded column** +## **To speed up queries, it is ideal to create an HSNW index on your embedded column** The general structure for creating an HNSW index follows this pattern: diff --git a/apps/docs/content/troubleshooting/interpreting-supabase-grafana-cpu-charts-9JSlkC.mdx b/apps/docs/content/troubleshooting/interpreting-supabase-grafana-cpu-charts-9JSlkC.mdx index eba2626d04573..a5828b5c87372 100644 --- a/apps/docs/content/troubleshooting/interpreting-supabase-grafana-cpu-charts-9JSlkC.mdx +++ b/apps/docs/content/troubleshooting/interpreting-supabase-grafana-cpu-charts-9JSlkC.mdx @@ -25,13 +25,13 @@ The CPU chart shows 4 distinct metrics of interest: As the CPU peaks towards 100%, queries and database tasks will begin to throttle, as they won't have enough time or access to the CPU. -#### Other useful Supabase Grafana guides: +### Other useful Supabase Grafana guides: - [Connections](https://github.com/orgs/supabase/discussions/27141) - [Disk](https://github.com/orgs/supabase/discussions/27003) - [Memory](https://github.com/orgs/supabase/discussions/27021) -#### Optimizing +### Optimizing 1. [Optimize your queries](/docs/guides/database/query-optimization). 2. [Add indexes](https://github.com/orgs/supabase/discussions/22449) if possible. diff --git a/apps/docs/content/troubleshooting/interpreting-supabase-grafana-io-charts-MUynDR.mdx b/apps/docs/content/troubleshooting/interpreting-supabase-grafana-io-charts-MUynDR.mdx index 430f998536714..394a440fddb76 100644 --- a/apps/docs/content/troubleshooting/interpreting-supabase-grafana-io-charts-MUynDR.mdx +++ b/apps/docs/content/troubleshooting/interpreting-supabase-grafana-io-charts-MUynDR.mdx @@ -61,7 +61,7 @@ Other useful Supabase Grafana guides: - [Memory](https://github.com/orgs/supabase/discussions/27021) - [CPU](https://github.com/orgs/supabase/discussions/27022) -### Esoteric factors +## Esoteric factors **Webhooks**: Supabase webhooks use the pg_net extension to handle requests. The `net.http_request_queue` table isn't indexed to keep write costs low. However, if you upload millions of rows to a webhook-enabled table in rapid succession, it can significantly increase the read costs for the extension. diff --git a/apps/docs/content/troubleshooting/new-branch-doesnt-copy-database.mdx b/apps/docs/content/troubleshooting/new-branch-doesnt-copy-database.mdx index 5449693bd7224..f601bb17c7a6c 100644 --- a/apps/docs/content/troubleshooting/new-branch-doesnt-copy-database.mdx +++ b/apps/docs/content/troubleshooting/new-branch-doesnt-copy-database.mdx @@ -7,7 +7,7 @@ database_id = "c5dae428-8dd0-4879-b312-df7f7da25986" Branching in Supabase (Branching 2.0) relies on the current migration files in your project—**not** a schema dump—when creating environments from `main`. This means if your `main` branch lacks migration history, branching will not fully capture your schema. This is a known limitation highlighted in the [Branching 2.0 documentation](/blog/branching-2-0#current-limitations). Follow the steps below to generate, synchronize, and repair your migration history for smooth branching. -#### 1. Prerequisites: Prepare local Supabase environment +## 1. Prerequisites: Prepare local Supabase environment - If you do not have a local environment set up already, follow the Supabase local development getting started guide: - [Running Supabase Locally](/docs/guides/local-development/cli/getting-started). @@ -21,7 +21,7 @@ supabase start --- -#### 2. Pull remote schema into migrations +## 2. Pull remote schema into migrations With your project linked, run: @@ -33,7 +33,7 @@ This command generates a migration file in your `supabase/migrations` folder whi --- -#### 3. Sync remote migration history +## 3. Sync remote migration history Upon running the above command, the Supabase CLI will typically prompt with: @@ -54,12 +54,12 @@ Run the exact repair command provided, replacing the timestamp as instructed (ex --- -#### 4. Proceed with Branching +## 4. Proceed with Branching Once your migration history is up to date, continue to use branching features as normal. Each new branch will now inherit the correct migrations from your `main` branch. --- -#### Additional tips +## Additional tips If further issues arise (such as schema drift or migration mismatches), review the [troubleshooting documentation](/docs/guides/deployment/branching/troubleshooting#migration-issues), and consider manual repair with [`supabase migration repair`](/docs/reference/cli/supabase-migration-repair). diff --git a/apps/docs/content/troubleshooting/not-receiving-auth-emails-from-the-supabase-project-OFSNzw.mdx b/apps/docs/content/troubleshooting/not-receiving-auth-emails-from-the-supabase-project-OFSNzw.mdx index 710d10e270c3f..9f6258ae9d1f8 100644 --- a/apps/docs/content/troubleshooting/not-receiving-auth-emails-from-the-supabase-project-OFSNzw.mdx +++ b/apps/docs/content/troubleshooting/not-receiving-auth-emails-from-the-supabase-project-OFSNzw.mdx @@ -15,11 +15,11 @@ As the initial step in debugging not-delivered emails, check your project's [Aut Once handed over to the email provider, Supabase has no control over email delivery. There can be multiple reasons why emails do not reach the user's inbox. -#### 1. Issues with the email provider. +## 1. Issues with the email provider. The email provider's logs are the next place to look for email delivery issues. There are cases where the email provider blocks the delivery due to past bounced-back emails. Some email providers maintain a suppression list for not sending emails due to several reasons. You can read more about it here - https://sendgrid.com/en-us/blog/what-is-a-suppression-list -#### 2. Issues with the user's email server +## 2. Issues with the user's email server Many email firewalls maintain a denylist of IPs and domain names for security reasons and as spam filters. Sometimes, they block incoming emails from unknown addresses with certain keywords such as password reset, verification link, etc. In these cases, ask the user to check with their email server admin to see if they are blocking your email domain or quarantining the incoming emails. If you use the default provider, the email domain is `supabase.io`. Some information on email firewalls are available here - https://mailchimp.com/help/about-email-firewalls/. diff --git a/apps/docs/content/troubleshooting/resolving-500-status-authentication-errors-7bU5U8.mdx b/apps/docs/content/troubleshooting/resolving-500-status-authentication-errors-7bU5U8.mdx index 344f13d04ab52..c3dd78fd39e05 100644 --- a/apps/docs/content/troubleshooting/resolving-500-status-authentication-errors-7bU5U8.mdx +++ b/apps/docs/content/troubleshooting/resolving-500-status-authentication-errors-7bU5U8.mdx @@ -14,15 +14,15 @@ http_status_code = 500 A 500 error in Auth typically indicates an issue with an external dependency, such as your database or SMTP provider, rather than with Auth itself. This guide will help you explore the Auth logs to identify the underlying cause. -#### Prerequisites +### Prerequisites -##### Open the log explorer +#### Open the log explorer Ensure you have access to the [Dashboard's Log Explorer](/dashboard/project/_/logs/explorer) and set the time range appropriately: ![image](/docs/img/troubleshooting/152d65ad-f0ed-47cf-8dcb-1e31c6221e71.png) -##### Improving log readability +#### Improving log readability Logs are displayed in a table format, which can be challenging to read. Double-clicking on a row will expand it for easier viewing: diff --git a/apps/docs/content/troubleshooting/resolving-cannot-execute-update-in-a-read-only-transaction-on-transaction-pooler-connections-ef582c.mdx b/apps/docs/content/troubleshooting/resolving-cannot-execute-update-in-a-read-only-transaction-on-transaction-pooler-connections-ef582c.mdx index 30c9a12ca6d91..53f7457ce7799 100644 --- a/apps/docs/content/troubleshooting/resolving-cannot-execute-update-in-a-read-only-transaction-on-transaction-pooler-connections-ef582c.mdx +++ b/apps/docs/content/troubleshooting/resolving-cannot-execute-update-in-a-read-only-transaction-on-transaction-pooler-connections-ef582c.mdx @@ -4,7 +4,7 @@ topics = [ "database", "supavisor" ] keywords = [] --- -### Key technical terms +## Key technical terms **Transaction Pooling** A connection management method used by tools like Supavisor or PgBouncer. Instead of giving every client a dedicated, permanent connection to the database, the pooler maintains a small set of "backend connections." It lends one of these connections to a client for the duration of a single transaction, then immediately takes it back to give to another client. @@ -17,29 +17,29 @@ That backend connection has _state_. Postgres connections carry settings like ti --- -### Understanding the problem: The "sticky" state +## Understanding the problem: The "sticky" state When you encounter the error `cannot execute UPDATE in a read-only transaction` while using a transaction pooler (typically on port 6543), even when you have verified that the connection is made to the primary database and the database itself is not in read-only mode (check with `SHOW default_transaction_read_only;` or `SELECT pg_is_in_recovery();` using a direct connection on port 5432), it signifies that a backend connection has been unintentionally locked into a read-only state. **Note:** If your database is in read-only mode (for example, due to exceeding disk space limits), you can review this guide: [Database Size and Read-Only Mode](/docs/guides/platform/database-size#read-only-mode). The remainder of this guide addresses a different issue specific to transaction pooling. -#### The cause: Connection contamination +### The cause: Connection contamination In transaction pooling mode, reset behavior is intentionally limited for performance, so session state can persist unless explicitly reset. If a client, script, or automated task changes a session-level setting, that setting "sticks" to the backend connection. When that backend connection is returned to the pool, the next client to use it inherits that exact state. If a previous script set the connection to "read-only" for safety and failed to reset it, any subsequent application attempt to perform an `UPDATE` or `INSERT` using that same backend will fail. -#### Why is the error sporadic? +### Why is the error sporadic? The error appears intermittent because it only occurs when your application is randomly assigned a "contaminated" backend connection from the pool. Other connections in the same pool may still be in the default read-write state, leading to a confusing mix of successful and failed requests. --- -### Step-by-step resolution +## Step-by-step resolution To resolve this issue, you must identify and remove any commands that modify the session state globally rather than locally. -#### 1. Audit application and scripts +### 1. Audit application and scripts Search your application code, migration scripts, and maintenance tasks for the following session-level commands: @@ -48,7 +48,7 @@ Search your application code, migration scripts, and maintenance tasks for the f Even if these commands are used in secondary scripts (like data exports or safety-first maintenance tasks) and not the main application, they can still contaminate the pool used by the main application. -#### 2. Implement "safe" settings +### 2. Implement "safe" settings If you need to execute a read-only transaction for safety, use transaction-level commands that only affect the current transaction and do not persist on the backend connection. @@ -60,7 +60,7 @@ If you have existing scripts that use session-level settings and cannot be immed - **Temporary workaround:** Ensure they explicitly reset the state before closing the connection with `SET default_transaction_read_only = off;` - **Best approach:** Connect directly to port 5432 (bypassing the pooler) for scripts requiring special session states -#### 3. Connection string verification +### 3. Connection string verification Ensure your application is using the intended pooler. @@ -69,6 +69,6 @@ Ensure your application is using the intended pooler. --- -### Best practices for transaction pooling +## Best practices for transaction pooling - **Use Dedicated Connections for Maintenance:** If a script requires a specific session state (like a long-running read-only export), connect directly to the database (port 5432) rather than using the transaction pooler (port 6543). This prevents maintenance settings from leaking into the application's connection pool.% diff --git a/apps/docs/content/troubleshooting/resolving-database-hostname-and-managing-your-ip-address-pVlwE0.mdx b/apps/docs/content/troubleshooting/resolving-database-hostname-and-managing-your-ip-address-pVlwE0.mdx index f6ef566822605..1881d1f9ac5e8 100644 --- a/apps/docs/content/troubleshooting/resolving-database-hostname-and-managing-your-ip-address-pVlwE0.mdx +++ b/apps/docs/content/troubleshooting/resolving-database-hostname-and-managing-your-ip-address-pVlwE0.mdx @@ -7,7 +7,7 @@ keywords = [ "hostname", "ip", "ipv4", "ipv6" ] database_id = "c89147f8-a66a-4c04-a1a7-45442fd7f2ee" --- -### Finding your database hostname +## Finding your database hostname Your database's hostname is crucial for establishing a direct connection. It resolves to the underlying IP address of your database. @@ -17,7 +17,7 @@ Example Hostname: `db.zcjtzmeifsoteyjytnbc.supabase.co` ![Screenshot 2024-04-02 at 11 38 28 AM](/docs/img/troubleshooting/565c96e0-cbb9-4e7a-b0aa-5b423afc0ada.png) -### Managing your IP address +## Managing your IP address To determine your current IP address, you can use an [IP address lookup](https://whatismyipaddress.com/hostname-ip) website or the terminal command: @@ -26,14 +26,14 @@ To determine your current IP address, you can use an [IP address lookup](https:/ Example IPv6 Address: `2a05:d014:1c06:5f0c:d7a9:8616:bee2:30df` -### IPv6 address +## IPv6 address Upon project creation, a static IPv6 address is assigned. However, it's essential to understand that this IPv6 address can change due to specific actions: - When a project is paused or resumed. - During database version upgrades. -### IPv4 address +## IPv4 address Opting for the static [IPv4 add-on](/docs/guides/platform/ipv4-address) provides a more stable connection address. The IPv4 address remains constant unless: diff --git a/apps/docs/content/troubleshooting/rls-simplified-BJTcS8.mdx b/apps/docs/content/troubleshooting/rls-simplified-BJTcS8.mdx index e2cbb853fde23..fe7a641b2cb0e 100644 --- a/apps/docs/content/troubleshooting/rls-simplified-BJTcS8.mdx +++ b/apps/docs/content/troubleshooting/rls-simplified-BJTcS8.mdx @@ -7,7 +7,7 @@ keywords = [ "rls", "sql", "policy" ] database_id = "5b8a5115-f81a-4a1f-bcc3-fdc2a2672e80" --- -### Basic summary +## Basic summary Row-Level Security (RLS) Policy: A `WHERE` or `CHECK` condition applied automatically to database queries diff --git a/apps/docs/content/troubleshooting/security-of-anonymous-sign-ins-iOrGCL.mdx b/apps/docs/content/troubleshooting/security-of-anonymous-sign-ins-iOrGCL.mdx index ba1a957e5184f..bb9ab7e9cbd1e 100644 --- a/apps/docs/content/troubleshooting/security-of-anonymous-sign-ins-iOrGCL.mdx +++ b/apps/docs/content/troubleshooting/security-of-anonymous-sign-ins-iOrGCL.mdx @@ -9,7 +9,7 @@ database_id = "46bab0a2-9780-4e4f-99f5-fcc9fa51c496" We want to clarify and provide reassurance on this topic. -### Security overview: +## Security overview: Enabling anonymous sign-ins on your project does not reduce its security. Here's why: @@ -17,7 +17,7 @@ Enabling anonymous sign-ins on your project does not reduce its security. Here's - Security Policies: All role-based security policies (RLS) applicable to regular users also apply to anonymous users. - Identity Verification Measures: Even though anonymous users do not initially provide an email or phone number, the security of your project remains robust. But to prevent misuse, we recommend implementing additional security measure such as [CAPTCHA](/docs/guides/auth/auth-captcha): to ensure that interactions are genuinely human. -### Practical use cases: +## Practical use cases: - Demo Mode: You can enable users to try out your product in a demo mode without full account creation. - Feature Restrictions: You can limit certain actions (like posting public content) to users who sign up with more identifiable information (e.g., Google or Apple sign-ins), while still allowing anonymous users to explore your app. diff --git a/apps/docs/content/troubleshooting/supabase--your-network-ipv4-and-ipv6-compatibility-cHe3BP.mdx b/apps/docs/content/troubleshooting/supabase--your-network-ipv4-and-ipv6-compatibility-cHe3BP.mdx index 35751edb9fc51..f7e2ba5f59372 100644 --- a/apps/docs/content/troubleshooting/supabase--your-network-ipv4-and-ipv6-compatibility-cHe3BP.mdx +++ b/apps/docs/content/troubleshooting/supabase--your-network-ipv4-and-ipv6-compatibility-cHe3BP.mdx @@ -14,11 +14,11 @@ The internet uses a system called the Internet Protocol (IP) to route communicat - **IPv4**: Introduced in 1980, it's the original version. - **IPv6**: Launched in 1999, it offers a much larger address space and is the preferred future-proof option. -#### Supabase and IPv6 +### Supabase and IPv6 All Supabase databases provide a direct connection string that maps to an IPv6 address. -#### Working with IPv6 incompatible hosts +### Working with IPv6 incompatible hosts Here are your options if your server platform doesn't support IPv6: @@ -28,7 +28,7 @@ Here are your options if your server platform doesn't support IPv6: > Note: the IPv4 Add-On costs an hour, which equates to ~ if left on for a full month (~720 hours) -#### Checking IPv6 support +### Checking IPv6 support The majority of services are IPv6 compatible. However, there are a few prominent ones that only accept IPv4 connections: @@ -45,7 +45,7 @@ curl -6 https://ifconfig.co/ip If the command returns an IPv6 address, the network is IPv6 compatible. -#### Finding your database's IP address +### Finding your database's IP address To determine your current IP address, you can use an IP address [lookup website](https://whatismyipaddress.com/hostname-ip) or the terminal command: @@ -57,7 +57,7 @@ This command queries the domain name servers to find the IP address of the given Example IPv6 Address: `2a05:d014:1c06:5f0c:d7a9:8616:bee2:30df` -#### Identifying your connections +### Identifying your connections The pooler and direct connection strings can be found on the dashboard by clicking [Connect](/dashboard/project/_?showConnect=true). @@ -68,14 +68,14 @@ The pooler and direct connection strings can be found on the dashboard by clicki postgresql://postgres:[YOUR-PASSWORD]@db.ajrbwkcuthywfihaarmflo.supabase.co:5432/postgres ``` -##### Supavisor in transaction mode (port 6543) +#### Supavisor in transaction mode (port 6543) ```sh # Example transaction string postgresql://postgres.ajrbwkcuthywddfihrmflo:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:6543/postgres ``` -##### Supavisor in session mode (port 5432) +#### Supavisor in session mode (port 5432) ```sh # Example session string diff --git a/apps/docs/content/troubleshooting/supabase-grafana-memory-charts.mdx b/apps/docs/content/troubleshooting/supabase-grafana-memory-charts.mdx index de577915a8da5..3c636edfa58ee 100644 --- a/apps/docs/content/troubleshooting/supabase-grafana-memory-charts.mdx +++ b/apps/docs/content/troubleshooting/supabase-grafana-memory-charts.mdx @@ -50,7 +50,7 @@ Optimizing: 5. [Remove bloat](/docs/reference/cli/supabase-inspect-db): Bloat can fragment data across pages, causing redundant data to be pulled from disk. 6. Table refactoring: Split tables to isolate columns that are less frequently accessed, so they are not redundantly pulled into memory while accessing hotter data -### Other useful Supabase Grafana guides: +## Other useful Supabase Grafana guides: - [Connections](https://github.com/orgs/supabase/discussions/27141) - [Disk](https://github.com/orgs/supabase/discussions/27003) diff --git a/apps/docs/content/troubleshooting/supavisor-faq-YyP5tI.mdx b/apps/docs/content/troubleshooting/supavisor-faq-YyP5tI.mdx index 1b1ed37893bf5..96218a1a82e05 100644 --- a/apps/docs/content/troubleshooting/supavisor-faq-YyP5tI.mdx +++ b/apps/docs/content/troubleshooting/supavisor-faq-YyP5tI.mdx @@ -7,7 +7,7 @@ keywords = [ "pooler", "connections", "supavisor", "database" ] database_id = "f252ba39-e540-462b-868f-42eb31a5d40c" --- -### What problems do poolers solve? +## What problems do poolers solve? Postgres stands out from other databases by opting to create a new process, not a new thread, for each direct connection. While this design choice brings [numerous benefits](https://www.postgresql.org/message-id/1098894087.31930.62.camel@localhost.localdomain), it introduces a startup penalty for new connections. Moreover, connections are more memory-intensive and can strain Postgres's internal schedulers, limiting the sustainable number that can be formed. Resultingly, developers must be mindful of how they allocate the resource. @@ -15,11 +15,11 @@ When a client (backend server) connects to Postgres, the connection is stateful Postgres's shortcomings are particularly evident when handling transient servers, like edge functions. They not only hoard connections for brief queries but also aggressively open and close connections, straining the database. -### How do poolers solve the problem? +## How do poolers solve the problem? A pooler is ultimately a load balancer for database connections. It maintains several hot connections that it triages to clients. This reduces the startup cost of creating a new process on Postgres. The pooler can also more efficiently manage a database's finite connections by only allowing clients to access them when they need to execute a query (A.K.A. transaction mode). -### Are poolers necessary? +## Are poolers necessary? All database connection libraries, such as Prisma, SQLAlchemy, and Postgres.js have built-in poolers. These are known as application-side poolers and they are fundamental for sustainable connection management. Most libraries have default pool sizes that may need to be changed for specific workloads. As an example, most edge/serverless functions are called to service a single user's request. They usually require significantly fewer connections (often 1 is optimal) than a dedicated application server. @@ -31,7 +31,7 @@ When connecting to your application from serverless/edge functions, horizontally They sit between the database and your client servers. They are solely optimized for sustaining high numbers of client connections and queuing and triaging queries to the database. Although they add network complexity, they are necessary when managing auto-scaling servers that can hypothetically form an infinite amount of connections. -### Where are the connection strings +## Where are the connection strings Supabase provides 3 database connection strings that can be used simultaneously if necessary. You can find them on the dashboard by clicking [Connect](/dashboard/project/_?showConnect=true). @@ -41,7 +41,7 @@ Supabase provides 3 database connection strings that can be used simultaneously src="https://github.com/supabase/supabase/assets/91111415/1d653203-84d9-406a-a7c9-1f7d097f5a29" /> -#### Direct connections: +### Direct connections: > "Note uses an IPv6 address by default. [Check here to see if your network is IPv6 compatible](https://github.com/orgs/supabase/discussions/27034)" @@ -50,21 +50,21 @@ Supabase provides 3 database connection strings that can be used simultaneously postgresql://postgres:[YOUR-PASSWORD]@db.ajrbwkcuthywfihaarmflo.supabase.co:5432/postgres ``` -#### Supavisor in transaction mode (port 6543) +### Supavisor in transaction mode (port 6543) ```sh # Example transaction string postgresql://postgres.ajrbwkcuthywddfihrmflo:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:6543/postgres ``` -#### Supavisor in session mode (port 5432) +### Supavisor in session mode (port 5432) ```sh # Example session string postgresql://postgres.ajrbwkcuthywfddihrmflo:[YOUR-PASSWORD]@aws-0-us-east-1.pooler.supabase.com:5432/postgres ``` -### Supavisor: Transaction mode vs. Session mode? +## Supavisor: Transaction mode vs. Session mode? When a client forms a direct connection with Postgres, it usually makes a few queries but may not use the connection the entire time. In transaction mode, a client is allowed to make a single query before being sent back to the figurative "waiting room". This prevents greedy or sedentary clients from hoarding connections. In most cases, this increases query throughput and is optimal. @@ -74,11 +74,11 @@ This behavior mirrors a direct connection, allowing greedy clients to monopolize Depending on your application's configurations, having the pooler manage a queue of patient clients is preferable to the alternative of constantly polling the database to check for an available connection. Session mode can queue clients for up to a minute. If this isn't particularly relevant to your application design, then the primary benefit is that it is [IPv4 compatible](https://github.com/orgs/supabase/discussions/27034). Also, unlike transaction mode, it supports prepared statements. -### What happens when a client library, such as Prisma, connects through Supavisor? +## What happens when a client library, such as Prisma, connects through Supavisor? When clients connect to either Postgres or Supavisor, they do so with the Postgres Wire Protocol. Because of this, clients treat connections with pooler as if they were directly connected to Postgres. The pooler then smoothly acts as a messenger between the database and the client. -### What are "client connections"? +## What are "client connections"? In summary, they have nothing to do with front-end clients. They are the amount of backend-server connections that can connect to a serverside pooler. Imagine a chess tournament with 60 boards. Each board represents a connection in a database. When a player sits down at a board, it's like a client connecting to the database. They can take their time with their moves or sit there, not making any. @@ -87,11 +87,11 @@ But when the tournament fills up and all the boards are taken, new players are t Now, imagine the tournament organizers decide to expand the venue to house 200 people without adding more tables. Even when all boards are occupied, players don't have to leave. They can wait in the wings, and the moment a board opens up, someone from the waiting area can take their place. Likewise, if someone ends their game, but wants to play again, they can go back to the waiting area. The waiting area represents the "Max Client Connections". Ultimately, the additional capacity provided by the pooler ensures fewer people are turned away from the "tournament". -### In the context of Supavisor, what does "pool size" mean? +## In the context of Supavisor, what does "pool size" mean? "Pool size" refers to the maximum number of direct connections the pooler can maintain per unique user, database, and mode combination. You can adjust it in the [project connect page](/dashboard/project/_/database/settings) to strike a balance between efficient resource utilization and accommodating peak traffic. -### What is the "user+db+mode" combination? +## What is the "user+db+mode" combination? Postgres is not a database. It is a Relational Database Management System (RDMS). Within it, you can spawn Postgres databases. In Supabase, it is a common pattern to use the default database called `postgres`, but you could create more: @@ -117,7 +117,7 @@ postgres://[USER].shfmmplnqscentnakbkl:[password]@aws-0-ca-central-1.pooler.supa When a distinct combination connects to your database, a new direct connection pool will be created. That means if you have two combinations connecting and the "Pool Size" is set to 120, each combination will have permission to form 120 connections. This can become problematic if collectively they exhaust all available direct connections. -### **Does Supavisor immediately establish the max pool size?** +## **Does Supavisor immediately establish the max pool size?** No, it doesn't. See why: @@ -127,7 +127,7 @@ No, it doesn't. See why: - In transaction mode, once a direct connection is established, the pooler will keep it available for reuse for another client. However, if the connection remains unused for 5 minutes, the pooler will close it to free up database resources. In session mode, the connection will be immediately closed. - If a client is connected to the pooler, then at least 1 hot connection will be sustained, even if no client needs it. -### **How to change pool size** +## **How to change pool size** In the [Dashboard's Database Settings](/dashboard/project/_/database/settings), you can configure Supavisor's "Pool Size": @@ -139,13 +139,13 @@ In the [Dashboard's Database Settings](/dashboard/project/_/database/settings), You can also change the pool size for PostgREST's (DB API) internal pooler at the bottom of the [application settings](/dashboard/project/_/settings/api). -### Do all services on Supabase use Supavisor? +## Do all services on Supabase use Supavisor? Supabase Storage uses Supavisor internally. The other servers that communicate with Postgres (PostgREST, Realtime, and Auth) all rely on internal application poolers. Supavisor is primarily intended for users who do not want to rely on the Supabase Client libraries and instead prefer to work with external ORMs, such as Prisma, Drizzle, and Psycopg. -### **Whether to change Supavisor's pool size?** +## **Whether to change Supavisor's pool size?** In an ideal scenario, Postgres would support an unlimited number of direct connections, but there's a limit to how many it can handle. If Supavisor uses most of the available connections, you risk depriving other servers, such as Auth, from accessing your database. Still, as much as possible, you want to give your pooler freedom to grow its pool as needed to service demand. @@ -153,7 +153,7 @@ It's important to note that the Storage server also uses Supavisor as a unique " As a rule of thumb, if you're using the DB REST API or multiple app-based "user+db+mode" combinations, try to keep the pooler's usage under 40% of available connections. Otherwise, you can cautiously increase usage to around 80%. These percentages are flexible and depend on your application's usage and setup. Monitor connection usage to determine the optimal allocation without depriving other servers of necessary connections. -### **How to monitor connections** +## **How to monitor connections** > EDIT: a more in-depth [troubleshooting guide](https://github.com/orgs/supabase/discussions/27141) for connection monitoring was published @@ -161,7 +161,7 @@ Connection usage can be monitored with a Supabase Grafana Dashboard. It provides You can check our [GitHub repo](https://github.com/supabase/supabase-grafana) for setup instructions for local deployments or free cloud deployments on [Fly.io](http://fly.io/). Refer to Supabase [documentation](/docs/guides/monitoring-and-debugging/metrics) to learn more about the metrics endpoint. -### **Can Supavisor really support a million connections?** +## **Can Supavisor really support a million connections?** It depends. diff --git a/apps/docs/content/troubleshooting/tracking-postgres-role-activity-to-specific-dashboard-users-8d3715.mdx b/apps/docs/content/troubleshooting/tracking-postgres-role-activity-to-specific-dashboard-users-8d3715.mdx index f679efeeaab0d..9a5618bfeb89b 100644 --- a/apps/docs/content/troubleshooting/tracking-postgres-role-activity-to-specific-dashboard-users-8d3715.mdx +++ b/apps/docs/content/troubleshooting/tracking-postgres-role-activity-to-specific-dashboard-users-8d3715.mdx @@ -6,7 +6,7 @@ keywords = [] When team members run SQL queries from the Dashboard SQL Editor, and if that query is logged in the Postgres Logs, it's not immediately clear who executed which query. This guide shows you how to track queries back to the specific team member who ran them. -### **Understanding Dashboard query execution** +## **Understanding Dashboard query execution** First, it helps to understand how Dashboard queries are executed. When someone runs a query from the SQL editor, it's routed through the `postgres` role at the database level. The Supabase Dashboard automatically appends metadata comments to queries, specifically `-- user: [UUID]`, `-- source: dashboard`, and `-- date`. @@ -14,7 +14,7 @@ By default, that role has `log_statement` set to `ddl`, which means Postgres log So, if someone truncates a table, and you're relying on the default logging, you won't see it. -### **Enabling data modification logging** +## **Enabling data modification logging** To make those operations visible, you can increase the logging level for the `postgres` role: @@ -42,7 +42,7 @@ Notice that the log includes: That UUID corresponds to the team member who logged in via the Supabase Dashboard and executed queries in the [SQL Editor](/dashboard/project/_/sql/new). But at this point, it's only an ID - not yet a name or email. -### **Mapping UUIDs to team members** +## **Mapping UUIDs to team members** To map the UUID, you'll need to query the Management API. The process looks like this: @@ -72,7 +72,7 @@ The response will include entries like: Now you can directly match `user_id` values from the Postgres logs to the corresponding team members. -### **Querying logs for specific operations** +## **Querying logs for specific operations** Navigate to the [Logs Explorer](/dashboard/project/_/logs/explorer) and query `postgres_logs`. Here's an example query that searches for data-modifying operations and maps user IDs to team members: @@ -118,11 +118,11 @@ This query: You can further refine your search by filtering for specific commands like `TRUNCATE` or `DELETE` where `parsed.user_name = 'postgres'`. -### **Tracking external tools** +## **Tracking external tools** For external tools like n8n or other applications connecting to your database, you can identify the source of database changes by appending `?application_name=example_app_name` to your connection string. This ensures the source is clearly identified in the logs, making it easier to distinguish between Dashboard operations and external tool operations. -### **Additional logging levels** +## **Additional logging levels** Postgres supports these `log_statement` values: diff --git a/apps/docs/content/troubleshooting/transferring-from-cloud-to-self-host-in-supabase-2oWNvW.mdx b/apps/docs/content/troubleshooting/transferring-from-cloud-to-self-host-in-supabase-2oWNvW.mdx index 3ee20895f7f29..0f945b1ce1cd1 100644 --- a/apps/docs/content/troubleshooting/transferring-from-cloud-to-self-host-in-supabase-2oWNvW.mdx +++ b/apps/docs/content/troubleshooting/transferring-from-cloud-to-self-host-in-supabase-2oWNvW.mdx @@ -9,7 +9,7 @@ database_id = "c6b6ae3c-1b5b-4ba8-a40f-5f2ca1f007e2" For a detailed, step-by-step guide on restoring your database from the Supabase platform to a [self-hosted Supabase](/docs/guides/self-hosting) instance, see [Restore a Platform Project to Self-Hosted](/docs/guides/self-hosting/restore-from-platform). -### Quick reference +## Quick reference Back up your cloud database: diff --git a/apps/docs/content/troubleshooting/understanding-postgresql-explain-output-Un9dqX.mdx b/apps/docs/content/troubleshooting/understanding-postgresql-explain-output-Un9dqX.mdx index 97cbe55b88e50..f10c66b88b13a 100644 --- a/apps/docs/content/troubleshooting/understanding-postgresql-explain-output-Un9dqX.mdx +++ b/apps/docs/content/troubleshooting/understanding-postgresql-explain-output-Un9dqX.mdx @@ -10,15 +10,15 @@ database_id = "0ce5b1e4-bd0a-439e-9fb1-8e27bad2ef10" sdk = [ "explain" ] --- -### Introduction +## Introduction This guide is designed to help you understand how to use the Postgres [EXPLAIN and EXPLAIN ANALYZE](https://www.postgresql.org/docs/current/sql-explain.html) commands to optimize and debug SQL queries. Understanding the output of these commands can help you improve the performance of your applications by optimizing database interactions. -### What is explain? +## What is explain? The Postgres EXPLAIN command shows the execution plan of a SQL query. This plan describes how the Postgres database will execute the query, including how tables will be scanned—by using sequential scans, index scans, etc.—and how rows will be joined. -### How to use explain in Supabase +## How to use explain in Supabase **Using EXPLAIN through the SQL Editor** @@ -39,7 +39,7 @@ const { data, error } = await supabase .explain({analyze:true,verbose:true}) ``` -### Detailed breakdown of explain output components +## Detailed breakdown of explain output components ### 1. Plan type @@ -74,7 +74,7 @@ const { data, error } = await supabase ![image](/docs/img/troubleshooting/10950be3-264b-4a41-bc71-3d431c2756b2.png) -### Detailed components in explain analyze +## Detailed components in explain analyze When running EXPLAIN ANALYZE, additional information is provided, including: @@ -99,7 +99,7 @@ Planning Time: 0.135 ms - **Planning Time: 0.135 ms:** Planning Time refers to the amount of time the Postgres query planner takes to analyze the query and create an execution plan. This time is measured in milliseconds. -### You might be asking yourself now, why there is two different sets of metrics : `(cost=0.42..2.64 rows=1 width=164) (actual time=0.020..0.021 rows=1 loops=1)`? +## You might be asking yourself now, why there is two different sets of metrics : `(cost=0.42..2.64 rows=1 width=164) (actual time=0.020..0.021 rows=1 loops=1)`? To answer you, one is for the estimated cost and performance, and another for the actual performance of the query as explained above. @@ -109,7 +109,7 @@ To answer you, one is for the estimated cost and performance, and another for th **Identifying Bottlenecks**: If the actual time is significantly higher than expected, or if loops are more frequent than anticipated, these could be indicators of performance bottlenecks in the query. -### How to read a complex explain output +## How to read a complex explain output First, you have to understand that a Postgres execution plan is a tree structure consisting of several nodes. The top node (the Aggregate above) is at the top, and lower nodes are indented and start with an arrow (->). Nodes with the same indentation are on the same level (for example, the two relations combined with a join). @@ -133,7 +133,7 @@ Postgres executes a plan top down, that is, it starts with producing the first r On top of that, you have to multiply the cost and the time with the number of “loops” to get the total time spent in a node. -### Common nodes in Postgres explain output +## Common nodes in Postgres explain output | Node Type | Description | | --------------------- | ------------------------------------------------------------------------------ | @@ -155,7 +155,7 @@ On top of that, you have to multiply the cost and the time with the number of | **Foreign Scan** | Fetches data from foreign data sources outside the local database. | | **Function Scan** | Retrieves results from a set-returning function. | -### What to focus on in explain analyze output +## What to focus on in explain analyze output - Find the nodes where most of the execution time was spent. `Hash Join (cost=100.00..200.00 rows=1000 width=50) (actual time=50.012..150.023 rows=1000 loops=1)` @@ -176,7 +176,7 @@ Seq Scan on products (cost=0.00..100.00 rows=300 width=50) (actual time=50.000. Explanation: This sequential scan took 50 to 100 milliseconds and filtered out 2997 of 3000 rows, indicating that only a few rows met the condition. This scenario is ideal for an index on the price column to optimize the performance by reducing the need for a full table scan. -### Understanding the significance of milliseconds in Query Performance +## Understanding the significance of milliseconds in Query Performance Determining whether 100 milliseconds for e.g is noteworthy in the context of identifying performance bottlenecks depends on various factors: @@ -190,12 +190,12 @@ For complex queries that involve multiple joins, subqueries, or aggregation func So, the acceptable performance threshold can vary by application. For real-time systems or high-frequency trading platforms, even a few milliseconds can be critical, whereas for batch processing or data warehousing, longer execution times might be acceptable. -### Tools to interpret explain analyze output +## Tools to interpret explain analyze output Since reading a longer execution plan is quite cumbersome, you can use the website https://explain.depesz.com/ to better visualize the query. If you paste the execution plan in the text area and hit “Submit”, you will get output like this: ![image](/docs/img/troubleshooting/830b81aa-ae52-44a4-aa49-32c2a6296af7.png) -### Tips for optimizing queries +## Tips for optimizing queries - **Add Indexes:** Improve performance by adding indexes on columns that are frequently used in WHERE clauses or JOIN conditions. @@ -203,7 +203,7 @@ Since reading a longer execution plan is quite cumbersome, you can use the websi - **Update Statistics:** Ensure that statistics are up to date to help the optimizer make better choices. -### Conclusion +## Conclusion Understanding EXPLAIN and EXPLAIN ANALYZE output can significantly enhance your ability to write efficient SQL queries. Regularly analyze query performance and make adjustments as your dataset grows and changes. diff --git a/apps/docs/content/troubleshooting/understanding-postgresql-logging-levels-and-how-they-impact-your-project-KXiJRm.mdx b/apps/docs/content/troubleshooting/understanding-postgresql-logging-levels-and-how-they-impact-your-project-KXiJRm.mdx index a88e2e726b27e..8315967977464 100644 --- a/apps/docs/content/troubleshooting/understanding-postgresql-logging-levels-and-how-they-impact-your-project-KXiJRm.mdx +++ b/apps/docs/content/troubleshooting/understanding-postgresql-logging-levels-and-how-they-impact-your-project-KXiJRm.mdx @@ -9,7 +9,7 @@ database_id = "10186830-8cce-4f10-8cb9-7cbf39310763" Since each Supabase project uses Postgres as its underlying database engine, it’s common to adjust logging settings for various reasons—whether for debugging issues, monitoring database performance, or auditing actions. However, modifying logging levels improperly can lead to an excessive amount of log data being generated, which can fill up your disk space and cause significant performance degradation or even system failure. -### 1. Overview of Postgres logging levels +## 1. Overview of Postgres logging levels Postgres provides multiple logging levels that allow you to control how much information gets logged. These include: @@ -39,7 +39,7 @@ PANIC: database system shutdown requested The default log level is set to **WARNING** through the log_min_messages setting, and we recommend keeping it that way. -### 2. How high log levels can affect your database +## 2. How high log levels can affect your database When users alter a high level of log settings, the database can start generating an overwhelming number of log entries. This can escalate to issues such as: @@ -49,7 +49,7 @@ When users alter a high level of log settings, the database can start generating - Database Lockups: In extreme cases, if the disk is filled to capacity with logs, your database could lock up, leading to downtime or severe performance degradation. -### 3. Common scenarios that cause log overload +## 3. Common scenarios that cause log overload Here are a few common scenarios where excessive logging can become a problem: @@ -59,7 +59,7 @@ Here are a few common scenarios where excessive logging can become a problem: - Frequent Write Operations: If your database processes a lot of write operations (such as inserts, updates, or deletes), even low-level logs (like NOTICE or INFO) can lead to significant log accumulation. -### 4. How to manage Postgres log levels effectively +## 4. How to manage Postgres log levels effectively **a. Choose the Right Log Level** For most users, setting Postgres logs to WARNING or ERROR is sufficient for regular operations. Here’s a general guideline: @@ -97,11 +97,11 @@ ALTER ROLE postgres SET log_min_messages TO 'ERROR'; ALTER ROLE postgres RESET log_min_messages; ``` -### 5. Conclusion +## 5. Conclusion Postgres logs provide a powerful way to gain valuable insights into your database activity and performance when properly configured, but the key lies in finding the right balance. When set up properly, they can be incredibly useful. -### 6. Other resources +## 6. Other resources **a. What Events Are Logged in Postgres** For a detailed explanation of the types of events logged in your database (such as connection events, checkpoint events, long-running queries, cron jobs, and severity-based logging), you can refer to the official documentation here: diff --git a/apps/docs/content/troubleshooting/vercel-integration-environment-variables-not-syncing-for-persistent-git-branches-b9191e.mdx b/apps/docs/content/troubleshooting/vercel-integration-environment-variables-not-syncing-for-persistent-git-branches-b9191e.mdx index 59b4aa67c1501..8d7a48c63c59b 100644 --- a/apps/docs/content/troubleshooting/vercel-integration-environment-variables-not-syncing-for-persistent-git-branches-b9191e.mdx +++ b/apps/docs/content/troubleshooting/vercel-integration-environment-variables-not-syncing-for-persistent-git-branches-b9191e.mdx @@ -10,7 +10,7 @@ Vercel has three environments, which map to different stages of the deployment l - **Preview** is used for all other Git branches, including pull requests, feature branches, and persistent branches like staging. If you deploy a staging branch, it still runs under the Preview environment unless you explicitly create a separate environment in Vercel and map that branch to it. - **Development** is only used for local development via the Vercel CLI (`vercel dev`). It allows your local environment to pull env vars from Vercel, but it does not apply to Git branches or deployments on the platform. -### Creating a staging environment +## Creating a staging environment On the Hobby plan, staging is implemented by scoping Preview environment variables to a branch. On the Pro plan, staging can be configured as a dedicated environment with its own settings. diff --git a/apps/docs/content/troubleshooting/why-are-there-gaps-in-my-postgres-id-sequence-Frifus.mdx b/apps/docs/content/troubleshooting/why-are-there-gaps-in-my-postgres-id-sequence-Frifus.mdx index 8503bf7943a65..0023513f7cc28 100644 --- a/apps/docs/content/troubleshooting/why-are-there-gaps-in-my-postgres-id-sequence-Frifus.mdx +++ b/apps/docs/content/troubleshooting/why-are-there-gaps-in-my-postgres-id-sequence-Frifus.mdx @@ -16,11 +16,11 @@ You might be surprised to know that gaps in sequence IDs are a normal aspect of It's also important to understand the distinction that sequences guarantee **uniqueness**, but not **consecutiveness**, and this should not imply any issues relating to data integrity with your database. -### How to check the name of your sequence +## How to check the name of your sequence If you don't know the name of your sequence, it's often formed based on a standard naming convention: table_name_id_seq, where table_name is the name of your table and id is the name of your serial column. -### Common reasons for gaps in sequences +## Common reasons for gaps in sequences 1. Rollbacks One of the most common reasons for a gap is the rollback of a transaction. If you initiate a transaction that includes an insert operation, the sequence responsible for generating the ID for the new row increments. If, for any reason, the transaction doesn't complete successfully—perhaps due to a constraint violation or a deliberate decision to rollback—the insert operation is undone, but the sequence value used is not returned or reused. The documentation explains that as well: @@ -36,7 +36,7 @@ If you don't know the name of your sequence, it's often formed based on a standa 4. Upserts When an upsert is executed, it can still increase the sequence even if it is set to do nothing on conflicts -### Checking for gaps +## Checking for gaps To check for gaps in the sequence of IDs in a Postgres table, you can use a SQL query that compares the sequence of IDs to a generated series of numbers that spans the same range: @@ -52,7 +52,7 @@ WHERE This query should help you pinpoint where gaps exist. -### Encountering errors and adjusting sequences +## Encountering errors and adjusting sequences In operations involving sequences, you might encounter an error message such as: @@ -74,6 +74,6 @@ And reset the sequence value to match the highest ID plus one: Or, alternatively, adjust the sequence to a specific new value: `ALTER SEQUENCE '{table}_{column}_seq' RESTART WITH new_value;` -### Implementing a gapless ID sequence +## Implementing a gapless ID sequence If your application requires contiguous IDs and you decide to build a gapless sequence. Think twice about this, as it will serialize all transactions that use that “sequence” which will then deteriorate your data modification performance considerably. However, if your application truly requires gapless IDs, then you can use a Trigger: After a successful insert, use a database trigger to assign an ID based on a custom logic that finds the next available gapless ID. From 320111b06b9ae256ade4a44be090daae79c5b62d Mon Sep 17 00:00:00 2001 From: Miranda Limonczenko Date: Fri, 31 Jul 2026 11:25:23 -0700 Subject: [PATCH 2/5] fix(docs): replace hardcoded heading tags in 4 shared components (#48456) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes DOCS-1261 _WAVE plugin shows headers creating jumps in hierarchy. Preview on the left:_ Screenshot 2026-07-29 at 2 42 07 PM Screenshot 2026-07-29 at 2 44 33 PM ## Problem Four shared components in `apps/docs` render a hardcoded heading tag no matter where they're used: - `NamedCodeBlock` renders a code block's filename as an `
` - `ProjectConfigVariables` renders a variable label as an `
` - `StepHikeCompact.Details` renders a step title as an `

` - `IconPanel` renders its title as an `

` Since these are fixed, they often land in the wrong spot in a page's heading order (like an h6 right after an h2), which breaks navigation for screen reader users. This showed up in the [header hierarchy triage report](https://app.notion.com/p/supabase/Playwright-E2E-Triage-Reports-3ab5004b775f81e3bc60d058fa5a02c1) — fixing these 4 components alone resolves 72 of the 159 heading-order violations found. ## Solution Swapped the heading tag in each component for a `` with the same classes. None of these are really "headings" for the content that follows, so they shouldn't be in the tag tree at all. The one wrinkle: this codebase applies heading font weight/family through a global CSS rule keyed off the tag name (h1-h6), not something the tag gives you for free. So each span now sets that styling explicitly, plus a margin to match what was there before. Nothing else changed — same classes, same layout. ## Manual testing Staging preview: https://docs-git-ui-header-hierarchy-supabase.vercel.app Check that each one still looks right: - [NamedCodeBlock](https://docs-git-ui-header-hierarchy-supabase.vercel.app/docs/guides/self-hosting/docker) — filenames above the code blocks - [ProjectConfigVariables](https://docs-git-ui-header-hierarchy-supabase.vercel.app/docs/guides/auth/quickstarts/react-native) — the "Project URL" / "Publishable key" labels (this page also has a `NamedCodeBlock` inside the numbered steps) - [StepHikeCompact](https://docs-git-ui-header-hierarchy-supabase.vercel.app/docs/guides/database/beekeeper-studio) — the step titles ("Create a new connection", etc.) - [IconPanel](https://docs-git-ui-header-hierarchy-supabase.vercel.app/docs/guides/resources) — the "Auth0" / "Firebase Auth" panel titles under "Migrate to Supabase" I also ran typecheck, lint, and the docs test suite locally — all green. ## Summary by CodeRabbit * **Style** * Updated headings and labels across documentation and UI components for more consistent typography. * Improved spacing, font weight, and block-level layout for project variables, step details, code tabs, and icon panels. * Preserved existing text content and conditional display behavior. Co-authored-by: Claude Sonnet 5 --- .../ProjectConfigVariables/ProjectConfigVariables.tsx | 4 +++- apps/docs/components/StepHikeCompact/index.tsx | 6 +++++- apps/docs/features/directives/CodeTabs.components.tsx | 7 +++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/docs/components/ProjectConfigVariables/ProjectConfigVariables.tsx b/apps/docs/components/ProjectConfigVariables/ProjectConfigVariables.tsx index 82f8104810514..29c0734eba3fd 100644 --- a/apps/docs/components/ProjectConfigVariables/ProjectConfigVariables.tsx +++ b/apps/docs/components/ProjectConfigVariables/ProjectConfigVariables.tsx @@ -474,7 +474,9 @@ function ProjectConfigVariablesInternal({ variable }: { variable: Variable }) { return (
-
{prettyFormatVariable[variable]}
+ + {prettyFormatVariable[variable]} +
diff --git a/apps/docs/components/StepHikeCompact/index.tsx b/apps/docs/components/StepHikeCompact/index.tsx index ef1a7f08af71e..7d86f47884adb 100644 --- a/apps/docs/components/StepHikeCompact/index.tsx +++ b/apps/docs/components/StepHikeCompact/index.tsx @@ -97,7 +97,11 @@ const Details: FC> = ({ children, title, fullWidth = fullWidth && 'w-full' )} > - {title &&

{title}

} + {title && ( + + {title} + + )} {children}
) diff --git a/apps/docs/features/directives/CodeTabs.components.tsx b/apps/docs/features/directives/CodeTabs.components.tsx index c18c76aa31b5d..126974e17347b 100644 --- a/apps/docs/features/directives/CodeTabs.components.tsx +++ b/apps/docs/features/directives/CodeTabs.components.tsx @@ -1,20 +1,19 @@ import { type PropsWithChildren } from 'react' - import { cn } from 'ui' export function NamedCodeBlock({ name, children }: PropsWithChildren<{ name: string }>) { return (
-
{name} -
+ {children}
) From d47747477d6d2ef221f846e706ea6d6519dcf31c Mon Sep 17 00:00:00 2001 From: Ana <30495040+ana1337x@users.noreply.github.com> Date: Fri, 31 Jul 2026 14:55:33 -0400 Subject: [PATCH 3/5] docs(blog): add Introducing Supabase Evals launch post (#48505) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? - Adds a new blog post announcing the open-source `supabase/evals` benchmark, published at `/blog/introducing-supabase-evals` (date 2026-07-31) - Adds the post's images (`og.png`, `thumb.png`, and an inline benchmark-results chart) under `apps/www/public/images/blog/introducing-supabase-evals/` ## What is the current behavior? N/A. No existing post for this launch. ## What is the new behavior? - New MDX post `apps/www/_blog/2026-07-31-introducing-supabase-evals.mdx`, author `matt_rossman`, category `product` - Post covers what Supabase Evals is, why we built it, how the benchmark and regression suites work, key findings, and where agents struggle ## Additional context - Opened as a draft. Content is still under review in Notion, so this is not ready to merge yet. - Part of the Introducing Supabase Evals launch (Tier 2, target 2026-07-31). - Images are placeholders pending final assets from Brand Design if needed. ## Summary by CodeRabbit * **Documentation** * Added a new blog post introducing Supabase Evals, an open-source benchmark for evaluating AI coding agents on real Supabase tasks. * Described how evaluations run, how scoring works, retry behavior, update cadence, and common failure areas. * Included links to explore results and shared plans for expanding scenarios, improving scoring rigor, and adding feedback capabilities. --------- Co-authored-by: Ana Co-authored-by: Matt Rossman <22670878+mattrossman@users.noreply.github.com> --- .../2026-07-31-introducing-supabase-evals.mdx | 79 ++++++++++++++++++ .../benchmark-results.png | Bin 0 -> 262907 bytes .../blog/introducing-supabase-evals/og.png | Bin 0 -> 52503 bytes .../blog/introducing-supabase-evals/thumb.png | Bin 0 -> 39964 bytes 4 files changed, 79 insertions(+) create mode 100644 apps/www/_blog/2026-07-31-introducing-supabase-evals.mdx create mode 100644 apps/www/public/images/blog/introducing-supabase-evals/benchmark-results.png create mode 100644 apps/www/public/images/blog/introducing-supabase-evals/og.png create mode 100644 apps/www/public/images/blog/introducing-supabase-evals/thumb.png diff --git a/apps/www/_blog/2026-07-31-introducing-supabase-evals.mdx b/apps/www/_blog/2026-07-31-introducing-supabase-evals.mdx new file mode 100644 index 0000000000000..9c7bb6a5a916a --- /dev/null +++ b/apps/www/_blog/2026-07-31-introducing-supabase-evals.mdx @@ -0,0 +1,79 @@ +--- +title: 'Introducing Supabase Evals' +description: 'Our open-source benchmark for how well AI coding agents build with Supabase.' +author: matt_rossman +date: '2026-07-31' +categories: + - product +tags: + - ai + - evals + - developer-tools +imgSocial: 'introducing-supabase-evals/og.png' +imgThumb: 'introducing-supabase-evals/thumb.png' +toc_depth: 2 +--- + +Today we're open sourcing [`supabase/evals`](https://github.com/supabase/evals), our benchmark and framework for testing how well AI agents build using Supabase. It runs coding agents including Claude Code, Codex, and OpenCode against real Supabase tasks, for example, building a schema, debugging a failed Edge Function, or fixing a broken RLS policy, and then scores how well they performed. It powers both our [published benchmark](https://supabase.com/evals) and an internal regression suite we monitor daily. As more people ship Supabase projects through an agent instead of by hand, we wanted a way to measure that experience instead of guessing. + +![Supabase Evals benchmark results](/images/blog/introducing-supabase-evals/benchmark-results.png) + +> The results cited here reflect a snapshot at the time of writing. AI tooling changes rapidly, so check the [live page](https://supabase.com/evals) for current results. + +## Why we built this + +Agents are becoming a primary way people build with Supabase, interacting through our CLI, MCP server, agent skills, and docs. We needed a way to understand how agents perform across all of these Supabase surfaces, not just one tool in isolation. By tracking where agents stumble, we can make intentional fixes and verify they hold instead of regressing, and test new features confidently before shipping. + +## How we approached it + +We started by defining the dimensions we wanted to cover, including: + +- **Product** areas like Database and Auth +- **Topics** agents need to handle well across any product, like the SDK and observability +- **Stages** of a Supabase builder's journey, such as building an app or resolving issues + +Then we picked the smallest set of scenarios that touched each dimension at least once, grounded in real problems like support tickets, bug reports, or GitHub issues. + +We split scenarios into two suites, benchmark and regression: + +**Benchmark scenarios** aim for breadth, acting as a small but diverse set of scenarios that cover the real Supabase user journey. We run these against several harness configurations, including a mixture of more capable and smaller models, and [publish results on our site](https://supabase.com/evals). + +**Regression scenarios** aim for depth, covering specific known failure modes that we monitor more frequently without influencing benchmark scores. This gives us a space to triage bug reports or experiment with new features without skewing our published results. + +Every scenario runs against a real Supabase environment to measure what an agent would actually do in the wild. We built a framework that spins up both a hosted-like Supabase stack and a local CLI project in containers, so agents invoke our actual MCP server and CLI. We score their behavior with a combination of deterministic checks (whether a user can access certain data, or an Edge Function returns an expected result) and LLM-as-a-judge for anything that needs semantic judgment. To reduce false negatives while keeping runs sustainable, we let agents retry once after a failure before grading them. We run benchmark scenarios when assessing new changes or harnesses, and refresh regression results daily. + +Benchmark results are visualized in a web app, so anyone can browse and filter the scores or see details of each run. + +## What we've found so far + +Below are some areas we saw agents tripping up during benchmark development, and how we're addressing them: + +### Key findings + +#### Skills vs no-skills isn't as big a delta as we expected, and that's a good sign + +Across our benchmark, agents already pass most scenarios with no skill loaded at all. In the Build stage, for example, Opus 5 and Kimi K3 both scored 100% with no skill loaded. Skills closed the gap for the rest: Sonnet 5 went from 78% to 100%, GPT-5.6 Sol from 89% to 100%, and GPT-5.4 mini from 78% to 89%. That means agents are reasonably capable at broad Supabase tasks out of the box. The biggest impact we saw is that agents with our skills loaded checked Supabase docs more consistently and thoroughly, which helped skills earn their keep in the edge cases where models need to unlearn outdated pre-training knowledge. We still recommend using our skill to ensure your agents have the most up-to-date information on Supabase best practices and breaking changes, examples of which follow below. + +### Where agents struggle + +#### Agents don't reach for declarative schema workflows + +[Declarative schemas](https://supabase.com/docs/guides/local-development/declarative-database-schemas) are a developer-friendly way of describing the shape of your database in one place instead of reasoning across several migration files. We expect agents to prefer managing schemas from that single source of truth instead of piecing it together from a chain of migrations. But even in a project that already uses declarative schemas, we noticed agents try to hand-write migrations instead. As a result, we [updated our skill guidance](https://github.com/supabase/agent-skills/pull/120) to make it clearer when to pick each workflow and [verified the behavior correction](https://github.com/supabase/evals/pull/80) with our evals. + +#### Our newer libraries aren't sufficiently discoverable + +We [recently released](https://supabase.com/blog/introducing-supabase-server) `@supabase/server` to simplify boilerplate of writing secure Edge Functions. When tasked with writing edge functions though, agents still choose to verify auth by hand with `supabase-js`. We've since published a ["Which package to choose"](https://supabase.com/docs/guides/auth/choosing-a-server-package) guide to clarify when to use each package, as a reference for agents. + +#### Skill activation is uneven + +We track which skills agents loaded during a session compared to what was available. Our main `supabase` skill loads in every scenario where it's available. Our earlier skill, covering [Postgres best practices](https://supabase.com/blog/postgres-best-practices-for-ai-agents), originally loaded in only about one in ten of those same sessions. We rewrote our description of that skill to lead with clearer triggers, increasing activation to 60% across our benchmarks, though we still find OpenAI models more reliable at activating the skill. + +#### Docs usage is inconsistent across harnesses + +During runs we track when agents read our docs, either via the Supabase MCP `search_docs` tool or their native web tools. Codex-based agents check docs more than Claude Code agents do. The more capable OpenAI model checks docs most consistently, and Codex / GPT-5.6 reads the most pages, around 8 per scenario versus about 2 for Claude Code. Claude Code checks our docs in under 40% of scenarios even with skills loaded. We're working to make sure agents are checking docs in the situations they need to, and that they find all the information they need to make good decisions. + +## Check it out + +Browse the benchmark results at [supabase.com/evals](https://supabase.com/evals) and group by product, stage, or agent to see where agents are strong and where they're not. Or see the [GitHub repo](https://github.com/supabase/evals) for details on the benchmark and regression scenarios. + +This is a starting point. We'll expand coverage of edge cases within this problem space, and add new scenarios as agents and our product change. We're also working to make our scoring more rigorous and stable. As we build confidence in specific regression scenarios, we may graduate them into the published benchmark. Lastly, we're working on a new CLI command and MCP tool that will allow agents to submit feedback when they struggle, which will help us prioritize what's next. diff --git a/apps/www/public/images/blog/introducing-supabase-evals/benchmark-results.png b/apps/www/public/images/blog/introducing-supabase-evals/benchmark-results.png new file mode 100644 index 0000000000000000000000000000000000000000..ab39e6d2ab0f2dc2a1708d4fc9bc41268b102ad4 GIT binary patch literal 262907 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 z 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 @4G(zv# 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 literal 0 HcmV?d00001 diff --git a/apps/www/public/images/blog/introducing-supabase-evals/og.png b/apps/www/public/images/blog/introducing-supabase-evals/og.png new file mode 100644 index 0000000000000000000000000000000000000000..55690426490e7840f5ec0bf510170486e272dfea GIT binary patch literal 52503 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 literal 0 HcmV?d00001 diff --git a/apps/www/public/images/blog/introducing-supabase-evals/thumb.png b/apps/www/public/images/blog/introducing-supabase-evals/thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..4929a91860bf08762817697110a53a2b57fd71aa GIT binary patch literal 39964 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 psj9_-hEr~?? Date: Fri, 31 Jul 2026 15:26:37 -0400 Subject: [PATCH 4/5] perf(pg-meta): scope column privileges query to a single table (#48553) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Performance improvement ## What is the current behavior? The column privileges page in Studio only ever renders one table, but the underlying query still `aclexplode`s every column in the whole schema and filters the result client-side. ## What is the new behavior? Adds a scoped SQL path that prunes `pg_class`/`pg_namespace` to the requested schema+table before exploding ACLs, gated behind the `pgMetaScopedIntrospection` flag, with a plan-guard test asserting `pg_class`/`pg_attribute` stay index-driven. Studio's query hook and cache keys now thread the selected table through so column-privilege invalidation and cold-load races are scoped correctly, and the page fetches per-table instead of per-schema. ## Additional context ## Summary by CodeRabbit * **Improvements** * Column privileges are now scoped to the selected schema and table for more accurate results. * Changing schemas automatically updates the table selection and refreshes the displayed privileges. * Privilege updates now refresh only the relevant schema, table, and column data. * Loading states are handled more accurately when no table is selected. * **Bug Fixes** * Improved consistency between scoped and unscoped column privilege results, including table-, column-, and grant-option privileges. --- .../Database/Privileges/Privileges.utils.ts | 20 ++- .../privileges/column-privileges-query.ts | 37 +++-- apps/studio/data/privileges/keys.ts | 11 +- .../[ref]/database/column-privileges.tsx | 63 ++++---- .../pg-meta/src/pg-meta-column-privileges.ts | 47 +++++- packages/pg-meta/src/sql/column-privileges.ts | 150 +++++++++++++++++- .../pg-meta/test/column-privileges.test.ts | 77 +++++++++ .../sql/studio/catalog-plan-guard.test.ts | 57 +++++++ 8 files changed, 410 insertions(+), 52 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts b/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts index 7bb3f0fe04a76..0b98f97fbd241 100644 --- a/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts +++ b/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts @@ -265,7 +265,15 @@ export function usePrivilegesState({ } } -export function useApplyPrivilegeOperations(callback?: () => void) { +export function useApplyPrivilegeOperations({ + schema, + table, + onSuccess, +}: { + schema: string + table?: string + onSuccess?: () => void +}) { const { data: project } = useSelectedProjectQuery() const queryClient = useQueryClient() @@ -343,17 +351,19 @@ export function useApplyPrivilegeOperations(callback?: () => void) { } await Promise.all([ - queryClient.invalidateQueries({ queryKey: privilegeKeys.tablePrivilegesList(project.ref) }), queryClient.invalidateQueries({ - queryKey: privilegeKeys.columnPrivilegesList(project.ref), + queryKey: privilegeKeys.tablePrivilegesList(project.ref, [schema]), + }), + queryClient.invalidateQueries({ + queryKey: privilegeKeys.columnPrivilegesList(project.ref, schema, table), }), ]) setIsLoading(false) - callback?.() + onSuccess?.() }, - [callback, project, queryClient] + [onSuccess, project, queryClient, schema, table] ) return { apply, isLoading } diff --git a/apps/studio/data/privileges/column-privileges-query.ts b/apps/studio/data/privileges/column-privileges-query.ts index c5ef827d74422..716cf8a0ad89a 100644 --- a/apps/studio/data/privileges/column-privileges-query.ts +++ b/apps/studio/data/privileges/column-privileges-query.ts @@ -5,19 +5,24 @@ import { z } from 'zod' import { executeSql } from '../sql/execute-sql-mutation' import { privilegeKeys } from './keys' import type { components } from '@/data/api' +import { isScopedIntrospection, scopedIntrospectionReady } from '@/data/scoped-introspection' import type { ResponseError, UseCustomQueryOptions } from '@/types' export type ColumnPrivilegesVariables = { projectRef?: string connectionString?: string | null /** - * [Joshen] Specifically requiring schema to prevent a heavy query on the DB - * The only UI using this is the column privileges UI atm, so opting to be strict here - * Ideally we'd be able to also filter based on table to be even more prudent, but - * leaving out for now as it needs update to pg-meta + might not be worth the over-optimization - * given this UI isn't a primary tool + * Required to keep this off the whole-catalog path: without it the query + * aclexplodes every relation in the database across every one of its columns. */ schema: string + /** + * Restricts to a single relation. The UI only ever renders one table at a + * time, so this keeps the query scoped to what's on screen -- without it the + * whole schema's columns are fetched and all but one table discarded. The + * query stays disabled until a table is selected. + */ + table?: string } export type ColumnPrivilege = components['schemas']['PostgresColumnPrivileges'] @@ -26,13 +31,19 @@ const pgMetaColumnPrivilegesList = pgMeta.columnPrivileges.list() type ColumnPrivilegesData = z.infer export async function getColumnPrivileges( - { projectRef, connectionString, schema }: ColumnPrivilegesVariables, + { projectRef, connectionString, schema, table }: ColumnPrivilegesVariables, signal?: AbortSignal ) { if (!projectRef) throw new Error('projectRef is required') - const sql = pgMeta.columnPrivileges.list({ includedSchemas: [schema] }).sql - const queryKey = ['column-privileges', schema] + // Cold-load race guard -- see the module comment on scoped-introspection.ts. + await scopedIntrospectionReady() + const sql = pgMeta.columnPrivileges.list({ + includedSchemas: [schema], + relationName: table, + scoped: isScopedIntrospection(), + }).sql + const queryKey = ['column-privileges', schema, table] const { result } = await executeSql({ projectRef, connectionString, sql, queryKey }, signal) return result as ColumnPrivilegesData } @@ -46,11 +57,15 @@ export const useColumnPrivilegesQuery = ( ...options }: UseCustomQueryOptions = {} ) => { - const { projectRef, schema } = vars + const { projectRef, schema, table } = vars return useQuery({ - queryKey: privilegeKeys.columnPrivilegesList(projectRef, schema), + queryKey: privilegeKeys.columnPrivilegesList(projectRef, schema, table), queryFn: ({ signal }) => getColumnPrivileges(vars, signal), - enabled: enabled && typeof projectRef !== 'undefined' && typeof schema !== 'undefined', + enabled: + enabled && + typeof projectRef !== 'undefined' && + typeof schema !== 'undefined' && + typeof table !== 'undefined', ...options, }) } diff --git a/apps/studio/data/privileges/keys.ts b/apps/studio/data/privileges/keys.ts index 006f7a3e7a410..6e8bf5776c616 100644 --- a/apps/studio/data/privileges/keys.ts +++ b/apps/studio/data/privileges/keys.ts @@ -1,8 +1,15 @@ export const privilegeKeys = { tablePrivilegesList: (projectRef: string | undefined, includedSchemas?: string[]) => ['projects', projectRef, 'database', 'table-privileges', includedSchemas].filter(Boolean), - columnPrivilegesList: (projectRef: string | undefined, schema?: string | undefined) => - ['projects', projectRef, 'database', 'column-privileges', schema].filter(Boolean), + columnPrivilegesList: ( + projectRef: string | undefined, + schema?: string | undefined, + table?: string | undefined + ) => { + const base = ['projects', projectRef, 'database', 'column-privileges'].filter(Boolean) + if (table === undefined) return schema === undefined ? base : [...base, schema] + return [...base, schema ?? null, table] + }, exposedTablesInfinite: (projectRef: string | undefined, search?: string) => [ 'projects', diff --git a/apps/studio/pages/project/[ref]/database/column-privileges.tsx b/apps/studio/pages/project/[ref]/database/column-privileges.tsx index 841c79d275aeb..52c19b1c47551 100644 --- a/apps/studio/pages/project/[ref]/database/column-privileges.tsx +++ b/apps/studio/pages/project/[ref]/database/column-privileges.tsx @@ -55,26 +55,26 @@ const PrivilegesPage: NextPageWithLayout = () => { } = useTablesQuery({ projectRef: project?.ref, connectionString: project?.connectionString, + schema: selectedSchema, }) + // Default to (or fall back to) the first table of the selected schema. The + // fallback matters because the schema can also change via the URL, which + // leaves `selectedTable` pointing at a table from the previous schema. useEffect(() => { if (!isSuccessTables) return - const tables = tableList - .filter((table) => table.schema === selectedSchema) - .map((table) => table.name) - if (tables[0] && selectedTable === undefined) { - setSelectedTable(tables[0]) + const tableNames = tableList.map((table) => table.name) + if (selectedTable === undefined || !tableNames.includes(selectedTable)) { + setSelectedTable(tableNames[0]) } - }, [isSuccessTables, tableList, selectedSchema, selectedTable]) + }, [isSuccessTables, tableList, selectedTable]) const { data: allRoles, isPending: isLoadingRoles } = useDatabaseRolesQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) - const tables = tableList - ?.filter((table) => table.schema === selectedSchema) - .map((table) => table.name) + const tables = tableList?.map((table) => table.name) const { data: allTablePrivileges, @@ -104,38 +104,34 @@ const PrivilegesPage: NextPageWithLayout = () => { const { data: allColumnPrivileges, - isPending: isLoadingColumnPrivileges, + isPending: isPendingColumnPrivileges, isError: isErrorColumnPrivileges, error: errorColumnPrivileges, } = useColumnPrivilegesQuery({ projectRef: project?.ref, connectionString: project?.connectionString, schema: selectedSchema, + table: selectedTable, }) + // The query is disabled until a table is selected, and a disabled query stays + // `isPending` forever -- so don't report it as loading in that state, or a + // schema with no tables never gets past the skeleton. + const isLoadingColumnPrivileges = selectedTable !== undefined && isPendingColumnPrivileges + const columnPrivileges = useMemo( () => - allColumnPrivileges - ?.filter( - (privilege) => - privilege.relation_schema === selectedSchema && - privilege.relation_name === selectedTable - ) - .map((privilege) => ({ - ...privilege, - privileges: privilege.privileges.filter( - (privilege) => privilege.grantee === selectedRole - ), - })) ?? [], - [allColumnPrivileges, selectedRole, selectedSchema, selectedTable] + allColumnPrivileges?.map((privilege) => ({ + ...privilege, + privileges: privilege.privileges.filter((privilege) => privilege.grantee === selectedRole), + })) ?? [], + [allColumnPrivileges, selectedRole] ) const rolesList = allRoles?.filter((role: PgRole) => EDITABLE_ROLES.includes(role.name)) ?? [] const roles = rolesList.map((role: PgRole) => role.name) - const table = tableList?.find( - (table) => table.schema === selectedSchema && table.name === selectedTable - ) + const table = tableList?.find((table) => table.name === selectedTable) const { isSchemaLocked } = useIsProtectedSchema({ schema: selectedSchema }) const { @@ -170,9 +166,10 @@ const PrivilegesPage: NextPageWithLayout = () => { } } - const newTable = tableList?.find((table) => table.schema === schema)?.name setSelectedSchema(schema) - setSelectedTable(newTable) + // The table list is scoped to the schema, so the incoming schema's tables + // aren't loaded yet -- the effect above picks the first one once they are. + setSelectedTable(undefined) } const handleChangeTable = (table: string) => { @@ -192,15 +189,17 @@ const PrivilegesPage: NextPageWithLayout = () => { } const { apply: applyColumnPrivileges, isLoading: isApplyingChanges } = - useApplyPrivilegeOperations( - useCallback(() => { + useApplyPrivilegeOperations({ + schema: selectedSchema, + table: selectedTable, + onSuccess: useCallback(() => { toast.success( `Successfully updated privileges on ${selectedSchema}.${selectedTable} for ${selectedRole}`, { duration: 6000 } ) resetOperations() - }, [resetOperations, selectedRole, selectedSchema, selectedTable]) - ) + }, [resetOperations, selectedRole, selectedSchema, selectedTable]), + }) function applyChanges() { applyColumnPrivileges(operations) diff --git a/packages/pg-meta/src/pg-meta-column-privileges.ts b/packages/pg-meta/src/pg-meta-column-privileges.ts index ffddcc87f349e..0e9a2f473224f 100644 --- a/packages/pg-meta/src/pg-meta-column-privileges.ts +++ b/packages/pg-meta/src/pg-meta-column-privileges.ts @@ -10,7 +10,7 @@ import { safeSql, type SafeSqlFragment, } from './pg-format' -import { COLUMN_PRIVILEGES_SQL } from './sql/column-privileges' +import { COLUMN_PRIVILEGES_SQL, getScopedColumnPrivilegesSql } from './sql/column-privileges' const pgColumnPrivilegeGrant = z.object({ grantor: z.string(), @@ -50,19 +50,60 @@ function list({ includedSchemas, excludedSchemas, columnIds, + relationName, limit, offset, + scoped = false, }: { includeSystemSchemas?: boolean includedSchemas?: string[] excludedSchemas?: string[] columnIds?: string[] + /** Restricts to a single relation by name. Pair with `includedSchemas`. */ + relationName?: string limit?: number offset?: number + scoped?: boolean } = {}): { sql: SafeSqlFragment zod: typeof pgColumnPrivilegesArrayZod } { + // Scoped path: the base query prunes pg_class to the requested relations + // before exploding ACLs across their columns, instead of exploding the whole + // catalog and filtering the aggregate. + if (scoped) { + const base = getScopedColumnPrivilegesSql({ + includeSystemSchemas, + includedSchemas, + excludedSchemas, + relationName, + // `columnIds` are "." pairs. Their relation half narrows + // the base scan; the exact attnum half stays an outer predicate below. + relationIds: columnIds?.length + ? [...new Set(columnIds.map((columnId) => columnId.split('.')[0]))] + : undefined, + }) + + let sql = safeSql` + with column_privileges as (${base}) + select * + from column_privileges + ` + if (columnIds?.length) { + sql = safeSql`${sql} where column_id in (${joinSqlFragments(columnIds.map(literal), ',')})` + } + if (limit) { + sql = safeSql`${sql} limit ${literal(limit)}` + } + if (offset) { + sql = safeSql`${sql} offset ${literal(offset)}` + } + return { + sql, + zod: pgColumnPrivilegesArrayZod, + } + } + let sql = safeSql` with column_privileges as (${COLUMN_PRIVILEGES_SQL}) select * @@ -80,6 +121,10 @@ function list({ conditions.push(safeSql`relation_schema ${filter}`) } + if (relationName) { + conditions.push(safeSql`relation_name = ${literal(relationName)}`) + } + if (columnIds?.length) { conditions.push(safeSql`column_id in (${joinSqlFragments(columnIds.map(literal), ',')})`) } diff --git a/packages/pg-meta/src/sql/column-privileges.ts b/packages/pg-meta/src/sql/column-privileges.ts index def165c2675d2..fd6b3e2813d2e 100644 --- a/packages/pg-meta/src/sql/column-privileges.ts +++ b/packages/pg-meta/src/sql/column-privileges.ts @@ -1,6 +1,12 @@ -import { safeSql } from '../pg-format' +import { DEFAULT_SYSTEM_SCHEMAS } from '../constants' +import { filterByList } from '../helpers' +import { joinSqlFragments, literal, safeSql, type SafeSqlFragment } from '../pg-format' export const COLUMN_PRIVILEGES_SQL = /* SQL */ safeSql` +-- FROZEN legacy path: served while the pgMetaScopedIntrospection flag is off. +-- Do not edit -- it must keep matching production behavior until the flag +-- cleanup deletes it. getScopedColumnPrivilegesSql is the replacement. +-- -- Lists each column's privileges in the form of: -- -- [ @@ -147,3 +153,145 @@ group by column_id, x.relname, x.attname ` + +export type ColumnPrivilegesScope = { + /** Defaults to false, which excludes {@link DEFAULT_SYSTEM_SCHEMAS}. */ + includeSystemSchemas?: boolean + includedSchemas?: Array + excludedSchemas?: Array + /** Restricts to a single relation by name. Pair with `includedSchemas`. */ + relationName?: string + /** Restricts to specific relations by oid. */ + relationIds?: Array +} + +/** + * Scoped variant of {@link COLUMN_PRIVILEGES_SQL}: prunes pg_class/pg_namespace + * FIRST (in the `rel` CTE) so the scope predicate can drive an index scan, + * instead of aclexploding the whole catalog and filtering the aggregated result. + */ +export const getScopedColumnPrivilegesSql = ({ + includeSystemSchemas = false, + includedSchemas, + excludedSchemas, + relationName, + relationIds, +}: ColumnPrivilegesScope = {}): SafeSqlFragment => { + const conditions: Array = [] + + const schemaFilter = filterByList( + includedSchemas, + excludedSchemas, + !includeSystemSchemas ? DEFAULT_SYSTEM_SCHEMAS : undefined + ) + if (schemaFilter) { + conditions.push(safeSql`and nc.nspname ${schemaFilter}`) + } + if (relationName) { + conditions.push(safeSql`and c.relname = ${literal(relationName)}`) + } + if (relationIds?.length) { + conditions.push(safeSql`and c.oid in (${joinSqlFragments(relationIds.map(literal), ',')})`) + } + const scopeFilter = joinSqlFragments(conditions, '\n') + + return safeSql` +with rel as ( + select + c.oid, + c.relname, + c.relowner, + c.relacl, + nc.nspname + from pg_class c + join pg_namespace nc + on nc.oid = c.relnamespace + where c.relkind = any (array['r', 'v', 'm', 'f', 'p']) + ${scopeFilter} +), +roles as ( + select + r.oid, + r.rolname, + pg_has_role(r.oid, 'USAGE') as is_member + from pg_authid r +), +grantees as ( + select oid, rolname, is_member, false as is_public from roles + union all + select (0)::oid as oid, 'PUBLIC', false, true +), +priv as ( + -- Table-level ACLs apply to every live column of the relation. + select + a.attrelid, + a.attnum, + a.attname, + r.relname, + r.nspname, + p.grantor, + p.grantee, + p.privilege_type as prtype, + p.is_grantable as grantable + from rel r + cross join lateral aclexplode(coalesce(r.relacl, acldefault('r', r.relowner))) p + join pg_attribute a + on a.attrelid = r.oid + and a.attnum > 0 + and not a.attisdropped + where p.privilege_type = any (array['INSERT', 'SELECT', 'UPDATE', 'REFERENCES']) + + union + + -- Column-level ACLs. + select + a.attrelid, + a.attnum, + a.attname, + r.relname, + r.nspname, + p.grantor, + p.grantee, + p.privilege_type, + p.is_grantable + from rel r + join pg_attribute a + on a.attrelid = r.oid + and a.attnum > 0 + and not a.attisdropped + cross join lateral aclexplode(coalesce(a.attacl, acldefault('c', r.relowner))) p + where a.attacl is not null + and p.privilege_type = any (array['INSERT', 'SELECT', 'UPDATE', 'REFERENCES']) +) +select + (p.attrelid || '.' || p.attnum) as column_id, + p.nspname as relation_schema, + p.relname as relation_name, + p.attname as column_name, + coalesce( + jsonb_agg( + jsonb_build_object( + 'grantor', grantor.rolname, + 'grantee', grantee.rolname, + 'privilege_type', p.prtype, + 'is_grantable', p.grantable + ) + ), + '[]' + ) as privileges +from priv p +join roles grantor + on grantor.oid = p.grantor +join grantees grantee + on grantee.oid = p.grantee +where grantor.is_member + or grantee.is_member + or grantee.is_public +group by + p.attrelid, + p.attnum, + p.nspname, + p.relname, + p.attname +` +} diff --git a/packages/pg-meta/test/column-privileges.test.ts b/packages/pg-meta/test/column-privileges.test.ts index 9eb5ef2c93e5a..bf8ca0db94128 100644 --- a/packages/pg-meta/test/column-privileges.test.ts +++ b/packages/pg-meta/test/column-privileges.test.ts @@ -355,3 +355,80 @@ withTestDatabase( ) } ) + +withTestDatabase('scoped list matches the legacy path row-for-row', async ({ executeQuery }) => { + await executeQuery(` + drop role if exists col_grantee_a; + drop role if exists col_grantee_b; + create role col_grantee_a; + create role col_grantee_b; + create table public.col_priv_demo (id int primary key, data text, extra text); + grant select, insert on public.col_priv_demo to col_grantee_a; + grant update (data) on public.col_priv_demo to col_grantee_b with grant option; + grant references (extra) on public.col_priv_demo to col_grantee_a; + grant select on public.col_priv_demo to public; + create view public.col_priv_view as select id, data from public.col_priv_demo; + grant select (id) on public.col_priv_view to col_grantee_b; + `) + + // Neither path orders rows or the privileges array (see the note on the first + // test in this file), and the two plans emit them in different orders, so + // compare on normalized copies. + const normalize = }>(rows: Array) => + rows + .map((row) => ({ + ...row, + privileges: [...row.privileges].sort((a, b) => + JSON.stringify(a).localeCompare(JSON.stringify(b)) + ), + })) + .sort((a, b) => a.column_id.localeCompare(b.column_id)) + + for (const options of [ + {}, + { includedSchemas: ['public'] }, + { excludedSchemas: ['public'] }, + { includedSchemas: ['public'], relationName: 'col_priv_demo' }, + { includedSchemas: ['public'], relationName: 'col_priv_view' }, + { includedSchemas: ['public'], relationName: 'does_not_exist' }, + { includeSystemSchemas: true, includedSchemas: ['public'] }, + ]) { + const legacy = pgMeta.columnPrivileges.list(options) + const scoped = pgMeta.columnPrivileges.list({ ...options, scoped: true }) + const legacyRes = legacy.zod.parse(await executeQuery(legacy.sql)) + const scopedRes = scoped.zod.parse(await executeQuery(scoped.sql)) + expect(normalize(scopedRes), `list options: ${JSON.stringify(options)}`).toEqual( + normalize(legacyRes) + ) + // Row counts must match exactly, independent of the normalization above. + expect(scopedRes.length, `row count for options: ${JSON.stringify(options)}`).toBe( + legacyRes.length + ) + } + + // The scoped path must surface the PUBLIC grantee, and the column-level grants + // that only the second UNION arm can produce. + const { sql, zod } = pgMeta.columnPrivileges.list({ + includedSchemas: ['public'], + relationName: 'col_priv_demo', + scoped: true, + }) + const rows = zod.parse(await executeQuery(sql)) + const dataColumn = rows.find((r) => r.column_name === 'data')! + expect(rows.map((r) => r.column_name).sort()).toEqual(['data', 'extra', 'id']) + expect(dataColumn.privileges.some((p) => p.grantee === 'PUBLIC')).toBe(true) + expect( + dataColumn.privileges.some( + (p) => p.grantee === 'col_grantee_b' && p.privilege_type === 'UPDATE' && p.is_grantable + ) + ).toBe(true) + + // columnIds: the scoped path prunes pg_class by relation oid and keeps the + // exact attnum predicate outside, so it must still match legacy exactly. + const columnIds = rows.map((r) => r.column_id).slice(0, 2) + const legacyByIds = pgMeta.columnPrivileges.list({ columnIds }) + const scopedByIds = pgMeta.columnPrivileges.list({ columnIds, scoped: true }) + expect(normalize(scopedByIds.zod.parse(await executeQuery(scopedByIds.sql)))).toEqual( + normalize(legacyByIds.zod.parse(await executeQuery(legacyByIds.sql))) + ) +}) diff --git a/packages/pg-meta/test/sql/studio/catalog-plan-guard.test.ts b/packages/pg-meta/test/sql/studio/catalog-plan-guard.test.ts index dab67cf19fad1..beeb163d76bf4 100644 --- a/packages/pg-meta/test/sql/studio/catalog-plan-guard.test.ts +++ b/packages/pg-meta/test/sql/studio/catalog-plan-guard.test.ts @@ -13,6 +13,7 @@ import { getTablesPaginatedSql, getViewDefinitionSql, } from '../../../src' +import columnPrivileges from '../../../src/pg-meta-column-privileges' import tablePrivileges from '../../../src/pg-meta-table-privileges' import * as tables from '../../../src/pg-meta-tables' import * as types from '../../../src/pg-meta-types' @@ -374,6 +375,62 @@ test('tablePrivileges.retrieve: scoped plan stays scoped for a single relation', assertPlanWithinBudget(result, TABLE_PRIVILEGES_BUDGET) }, 60_000) +// ── columnPrivileges.list (sql/column-privileges.ts) — per-table ───────────── +// The Studio hot path: the column-level privileges page renders exactly one +// table, so the query is scoped to schema+relname. Scoped prunes pg_class in the +// `rel` CTE before the aclexplode laterals / UNION / GROUP BY, so pg_class is +// reached via its (relname, relnamespace) index and pg_attribute via +// pg_attribute_relid_attnum_index. +// +// Only pg_authid is seq-scanned, once: the `roles` CTE is referenced by both the +// grantor join and the `grantees` UNION, so it materializes and pg_has_role() is +// evaluated once per role instead of twice per privilege row. (Table privileges +// needs two scans here because it joins the pg_roles view twice.) +const COLUMN_PRIVILEGES_TABLE_SCOPED_BUDGET = { + allowedSeqScans: { + pg_authid: { + max: 1, + reason: + 'the `roles` CTE materializes once and feeds both the grantor join and the grantee-with-PUBLIC union; pg_authid scales with role count, not schema size', + }, + }, +} + +test('columnPrivileges.list: scoped plan stays scoped for a single table', async () => { + const result = await explainAnalyze( + db, + columnPrivileges.list({ + includedSchemas: ['stress'], + relationName: 't_1000', + scoped: true, + }).sql + ) + assertPlanWithinBudget(result, COLUMN_PRIVILEGES_TABLE_SCOPED_BUDGET) +}, 60_000) + +// ── columnPrivileges.list (sql/column-privileges.ts) — per-schema listing ──── +// Studio always passes a relation (above); a schema-wide call is still supported +// for pg-meta consumers. Here one filtered pg_class seq scan is the right plan +// rather than a regression: the whole `stress` schema is most of the catalog. +const COLUMN_PRIVILEGES_SCHEMA_SCOPED_BUDGET = { + allowedSeqScans: { + ...COLUMN_PRIVILEGES_TABLE_SCOPED_BUDGET.allowedSeqScans, + pg_class: { + max: 1, + reason: + 'schema-wide listing selects nearly every relation in the schema, so one filtered pg_class scan beats per-relation index lookups; pg_attribute stays index-driven', + }, + }, +} + +test('columnPrivileges.list: scoped plan stays scoped for a schema', async () => { + const result = await explainAnalyze( + db, + columnPrivileges.list({ includedSchemas: ['stress'], scoped: true }).sql + ) + assertPlanWithinBudget(result, COLUMN_PRIVILEGES_SCHEMA_SCOPED_BUDGET) +}, 60_000) + // ── tables.retrieve (pg-meta-tables.ts / sql/tables.ts) — single table ─────── // Scoped pushes the target OID (a literal, or an initplan scalar subquery // resolved via pg_class's (relname, relnamespace) index) into the base scan and From 8dda0c3910cca10a9a4d39ffbf49c34a2ad4faa2 Mon Sep 17 00:00:00 2001 From: Miranda Limonczenko Date: Fri, 31 Jul 2026 12:31:39 -0700 Subject: [PATCH 5/5] Add heading-hierarchy a11y check to docs E2E tests (#48422) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes DOCS-1232 ## Problem We do not have any tests to verify that we are following a proper heading hierarchy. For a documentation site that deals in mostly static content, this test is important. Single h1 + logical heading hierarchy (h1→h2→h3, no skips) matters because screen reader users navigate by jumping between headings — broken structure breaks that navigation. Relevant: WCAG 1.3.1 Info and Relationships (Level A) — https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships.html ## Solution Add Playwright axe-core, which we plan to expand later, to test only the h1 and header-hierarchy rule. This is added to our current suite that dynamically checks only pages that are edited. ## Manual testing 1. Find a docs guide and intentionally break the header hierarchy. 2. Run `pnpm e2e:docs:a11y` and see your errors. 3. Resolve the issue and run again to see errors resolved. Ensure there is at least a line changed to see the page tested. ## Summary by CodeRabbit * **Tests** * Added automated accessibility checks for documentation pages. * Verified heading order and the presence of a level-one heading on each page. * Added a dedicated command to run documentation accessibility tests. Co-authored-by: Claude Sonnet 5 --- e2e/docs/features/docs-pages.spec.ts | 23 +++++++++++++++++++---- e2e/docs/package.json | 2 ++ pnpm-lock.yaml | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/e2e/docs/features/docs-pages.spec.ts b/e2e/docs/features/docs-pages.spec.ts index 773ca40c9800b..3881a0b54d680 100644 --- a/e2e/docs/features/docs-pages.spec.ts +++ b/e2e/docs/features/docs-pages.spec.ts @@ -1,3 +1,4 @@ +import { AxeBuilder } from '@axe-core/playwright' import { expect, test } from '@playwright/test' import { @@ -39,10 +40,6 @@ test.describe('Docs owned pages', () => { const article = page.locator(articleSelector) await expect(article, 'Page article should be present').toBeVisible() - await expect( - article.getByRole('heading', { level: 1 }), - 'Page article should include an h1' - ).toBeVisible() const links = await collectDocsOwnedLinks(page, baseURL!, articleSelector) const userAgent = await browserLikeUserAgent(page) @@ -64,4 +61,22 @@ test.describe('Docs owned pages', () => { } }) } + + for (const pagePath of pagePaths) { + test(`${pagePath} has a valid heading hierarchy @a11y`, async ({ page }) => { + const articleSelector = articleSelectorForPagePath(pagePath) + const response = await page.goto(pagePath) + expect(response?.ok(), `Expected a successful response for ${pagePath}`).toBeTruthy() + + const axeResults = await new AxeBuilder({ page }) + .include(articleSelector) + .withRules(['heading-order', 'page-has-heading-one']) + .analyze() + + expect( + axeResults.violations, + `Heading hierarchy issues in ${articleSelector}:\n${JSON.stringify(axeResults.violations, null, 2)}` + ).toEqual([]) + }) + } }) diff --git a/e2e/docs/package.json b/e2e/docs/package.json index e54703326c02a..b1e0371f232cf 100644 --- a/e2e/docs/package.json +++ b/e2e/docs/package.json @@ -6,6 +6,7 @@ "scripts": { "e2e:docs": "node --experimental-strip-types scripts/run-e2e-docs.ts", "e2e:docs:all": "node --experimental-strip-types scripts/run-e2e-docs.ts --all", + "e2e:docs:a11y": "node --experimental-strip-types scripts/run-e2e-docs.ts --grep @a11y", "e2e:ui": "node --experimental-strip-types scripts/run-e2e-docs.ts --ui", "e2e:docs:local-smoke": "playwright test --config=playwright.local-smoke.config.ts", "resolve-docs-scope": "node --experimental-strip-types scripts/resolve-docs-scope.ts" @@ -14,6 +15,7 @@ "@playwright/test": "^1.59.1" }, "devDependencies": { + "@axe-core/playwright": "^4.12.1", "@types/node": "catalog:" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99d33c593762a..55dcc827d8724 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2021,6 +2021,9 @@ importers: specifier: ^1.59.1 version: 1.59.1 devDependencies: + '@axe-core/playwright': + specifier: ^4.12.1 + version: 4.12.1(playwright-core@1.59.1) '@types/node': specifier: 'catalog:' version: 22.13.14 @@ -3133,6 +3136,11 @@ packages: resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} engines: {node: '>=18.0.0'} + '@axe-core/playwright@4.12.1': + resolution: {integrity: sha512-rMd7xriptqKpP+w5265i4Hdkv2X5kbu6uiBi/B2I7uf3hieRBM3qDCfaKPtxfiYb2mKXfF+yLODJwIx+Jv1GDw==} + peerDependencies: + playwright-core: '>= 1.0.0' + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -9549,6 +9557,10 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + axe-core@4.12.1: + resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} + engines: {node: '>=4'} + axios@1.18.1: resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} @@ -18498,6 +18510,11 @@ snapshots: '@aws/lambda-invoke-store@0.2.4': {} + '@axe-core/playwright@4.12.1(playwright-core@1.59.1)': + dependencies: + axe-core: 4.12.1 + playwright-core: 1.59.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -25765,6 +25782,8 @@ snapshots: axe-core@4.10.3: {} + axe-core@4.12.1: {} + axios@1.18.1(supports-color@8.1.1): dependencies: follow-redirects: 1.16.0