feat: Supabase for Platforms launch (#41056)

* DRAFT: creating some draft docs for PaaS

* adds a link in the sidebar

* fix images

* refactor all images

* add changes for functions

* more updates

* Adds more docs

* cleaning up the project launch section

* add PaaS project transfer instructions

* Apply suggestions from code review

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* updates

* add docs on named restore points

* remove note about enabling physical backups on v2

* update project claim flow with latest api endpoint

* update docs

* Update apps/docs/content/guides/integrations/platform-as-a-service.mdx

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update apps/docs/content/guides/integrations/platform-as-a-service.mdx

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* updates

* updates

* updates

* updates

* updates

* fix mgmt api links

* remove "new" from api keys

* updates

* updates

* add hyperlink ai builder solutions page

* feat: Supabase for Platforms launch post

# Conflicts:
#	apps/www/public/rss.xml

# Conflicts:
#	apps/www/public/rss.xml

* add blog assets

* update marketing copy on ai builder solutions page

* docs updates

* fix scroll in partnership section hyperlink

* format

* updates

* add words to spelling allowlist

* updates

* updates

---------

Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
Wen Bo Xie
2025-12-05 19:42:55 +08:00
committed by GitHub
parent 3852c43ec0
commit b6b9b786df
21 changed files with 733 additions and 73 deletions

View File

@@ -2951,22 +2951,25 @@ export const integrations: NavMenuConstant = {
},
{
name: 'Build Your Own',
url: undefined,
items: [
{
name: 'Build a Supabase integration',
url: '/guides/integrations/build-a-supabase-integration',
name: 'Supabase OAuth Integration',
url: '/guides/integrations/build-a-supabase-oauth-integration',
items: [
{
name: 'Overview',
url: '/guides/integrations/build-a-supabase-integration' as `/${string}`,
url: '/guides/integrations/build-a-supabase-oauth-integration',
},
{
name: 'OAuth scopes',
url: '/guides/integrations/build-a-supabase-integration/oauth-scopes' as `/${string}`,
url: '/guides/integrations/build-a-supabase-oauth-integration/oauth-scopes',
},
],
},
{
name: 'Supabase for Platforms',
url: '/guides/integrations/supabase-for-platforms',
},
],
},
{ name: 'Integrations', url: undefined, items: [] },

View File

@@ -1,5 +1,5 @@
---
id: 'build-a-supabase-integration'
id: 'build-a-supabase-oauth-integration'
title: 'Build a Supabase Integration'
subtitle: "This guide steps through building a Supabase Integration using OAuth2 and the management API, allowing you to manage users' organizations and projects on their behalf."
description: 'Build a Supabase Integration using OAuth2 and the Management API.'

View File

@@ -0,0 +1,446 @@
---
id: 'supabase-for-platform'
title: 'Supabase for Platforms'
description: 'Use Supabase as a platform for your own business and tools.'
subtitle: 'Use Supabase as a platform for your own business and tools.'
---
Supabase is a [Platform as a Service](https://en.wikipedia.org/wiki/Platform_as_a_service) (PaaS) that can be managed programmatically. You can use it to offer the key primitives to your own users, such as [Database](/docs/guides/database/overview), [Auth](/docs/guides/auth), [Edge Functions](/docs/guides/functions), [Storage](/docs/guides/storage), and [Realtime](/docs/guides/realtime). Supabase is commonly used as a platform by AI Builders and frameworks needing a backend.
This document will guide you on best practices when using Supabase for your own platform and assumes that Supabase projects are in a Supabase organization that you own. If you want to instead interact with projects that your users own, navigate to [OAuth integration](/docs/guides/integrations/build-a-supabase-oauth-integration) for more details.
![Platform as a Service](/docs/img/integrations/paas-intro.png)
## Overview
All features of Supabase can be managed through the [Management API](/docs/reference/api/introduction) or the [remote MCP Server](/docs/guides/getting-started/mcp).
## Launching projects
Management API endpoints:
- Create project: [`POST /v1/projects`](https://api.supabase.com/api/v1#tag/projects/post/v1/projects)
- Get smart region selection codes: [`GET /v1/projects/available-regions`](https://api.supabase.com/api/v1#tag/projects/get/v1/projects/available-regions)
- Check service health: [`GET /v1/projects/{ref}/health`](https://api.supabase.com/api/v1#tag/projects/get/v1/projects/{ref}/health)
We recommend:
- **a _very_ secure password for each database**. Do not reuse the same password across databases.
- **storing the encrypted version of the password**. Once you set the password during project creation, there is no way to programmatically change the password but you can do so manually in the Supabase Dashboard.
- **using smart region selection to ensure there's enough capacity**. The available smart region codes are `americas`, `emea`, and `apac` and you can make a request to [`GET /v1/projects/available-regions`](https://api.supabase.com/api/v1#tag/projects/get/v1/projects/available-regions) for region details.
- **make sure that the services are `ACTIVE_HEALTHY` after project creation**. After creating project, confirm the service that you want to make a request to has a status of `ACTIVE_HEALTHY` by polling [`GET /v1/projects/{ref}/health`](https://api.supabase.com/api/v1#tag/projects/get/v1/projects/{ref}/health). For example, before making a request to set an Auth configuration confirm that the Auth service has a status of `ACTIVE_HEALTHY`.
```sh
curl https://api.supabase.com/v1/projects \
--request POST \
--header "Content-Type: application/json" \
--header "Authorization: Bearer YOUR_SECRET_TOKEN" \
--data '{
"name": "Todo App",
"organization_slug": "aaaabbbbccccddddeeee",
"db_pass": "SUPER_SECURE_PASSWORD",
"region_selection": {
"type": "smartGroup",
"code": "americas"
},
"desired_instance_size": "micro"
}'
```
### Pico compute instance
<Admonition type='note' title='Contact us for access to Pico instances'>
Only select customers have access to Pico instances. Submit this [form](/solutions/ai-builders#talk-to-partnerships-team) to get access.
</Admonition>
Pico instance is our newest compute instance and the only one that scales to zero when not used.
### Recommended API keys
Management API endpoints:
- Get the API keys: [`GET /v1/projects/{ref}/api-keys`](https://api.supabase.com/api/v1#tag/secrets/get/v1/projects/{ref}/api-keys)
- Enable the API keys: [`POST /v1/projects/{ref}/api-keys`](https://api.supabase.com/api/v1#tag/secrets/post/v1/projects/{ref}/api-keys)
<Admonition type='note'>
We are in the process of migrating away from our legacy API keys `anon` and `service_role` and towards API keys `publishable` and `secret`.
You can learn more by navigating to [Upcoming changes to Supabase API Keys #29260](https://github.com/orgs/supabase/discussions/29260).
</Admonition>
Get the API keys by making a [`GET /v1/projects/{ref}/api-keys`](https://api.supabase.com/api/v1#tag/secrets/get/v1/projects/{ref}/api-keys) request.
```sh
curl 'https://api.supabase.com/v1/projects/{ref}/api-keys?reveal=true' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN'
```
If the response includes `"publishable"` and `"secret"` keys then you're all set and you should only use those from now on.
Otherwise, enable the API keys by making two [`POST /v1/projects/{ref}/api-keys`](https://api.supabase.com/api/v1#tag/secrets/post/v1/projects/{ref}/api-keys) requests, one for `publishable` and another for `secret`.
```sh
curl 'https://api.supabase.com/v1/projects/{ref}/api-keys' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"type": "publishable",
"name": "default"
}'
```
```sh
curl 'https://api.supabase.com/v1/projects/{ref}/api-keys?reveal=true' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"type": "secret",
"name": "default",
"secret_jwt_template": {
"role": "service_role"
}
}'
```
## Changing compute sizes
Management API endpoint: [`PATCH /v1/projects/{ref}/billing/addons`](https://api.supabase.com/api/v1#tag/billing/patch/v1/projects/{ref}/billing/addons)
<Admonition type='note'>
Once you have access to [Pico instances](#pico-compute-instance), you will no longer be able to upgrade or downgrade to Nano instances.
</Admonition>
You can upgrade and downgrade compute sizes by making requests to [`PATCH /v1/projects/{ref}/billing/addons`](https://api.supabase.com/api/v1#tag/billing/patch/v1/projects/{ref}/billing/addons).
```sh
curl 'https://api.supabase.com/v1/projects/{ref}/billing/addons' \
--request PATCH \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"addon_type": "compute_instance",
"addon_variant": "ci_small"
}'
```
## Configuration changes
Management API endpoints:
- Auth: [`PATCH /v1/projects/{ref}/config/auth`](https://api.supabase.com/api/v1#tag/auth/patch/v1/projects/{ref}/config/auth)
- Data API (PostgREST): [`PATCH /v1/projects/{ref}/postgrest`](https://api.supabase.com/api/v1#tag/rest/patch/v1/projects/{ref}/postgrest)
- Edge Functions:
- [`PATCH /v1/projects/{ref}/functions/{function_slug}`](https://api.supabase.com/api/v1#tag/edge-functions/patch/v1/projects/{ref}/functions/{function_slug})
- [`PUT /v1/projects/{ref}/functions`](https://api.supabase.com/api/v1#tag/edge-functions/put/v1/projects/{ref}/functions)
- Storage: [`PATCH /v1/projects/{ref}/config/storage`](https://api.supabase.com/api/v1#tag/storage/patch/v1/projects/{ref}/config/storage)
- Realtime: [`PATCH /v1/projects/{ref}/config/realtime`](https://api.supabase.com/api/v1#tag/realtime-config/patch/v1/projects/{ref}/config/realtime)
You can manage the configuration of all services using the Management API.
## Development workflow
Supabase is a _stateful_ service: we store data. If anything breaks in production, you can't "roll back" to a point in time because doing so might cause your users to lose any data that their production environment received since the last checkpoint.
Because of this, it's important that you adopt a development workflow on behalf of your users:
![Change flow](/docs/img/integrations/change-flow.png)
### Creating a `DEV` branch
Management API endpoint: [`POST /v1/projects/{ref}/branches`](https://api.supabase.com/api/v1#tag/environments/post/v1/projects/{ref}/branches)
After launching a project, it's important that all changes happen on a development branch. Branches can be treated like ephemeral servers: if anything goes wrong you can either revert the changes or destroy the branch and create a new one based off of production.
```sh
curl 'https://api.supabase.com/v1/projects/{ref}/branches' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data '{
"branch_name": "DEV",
"secrets": {
"STRIPE_SECRET_KEY":"sk_test_123..."
"STRIPE_PUBLISHABLE_KEY":"pk_test_123..."
}
}'
```
### Make database changes
Management API endpoint: [`POST /v1/projects/{ref}/database/migrations`](https://api.supabase.com/api/v1#tag/database/post/v1/projects/{ref}/database/migrations)
<Admonition type='note' title='Contact us for access to migrations endpoint'>
Only select customers have access to database migrations endpoint. Submit this [form](/solutions/ai-builders#talk-to-partnerships-team) to get access.
</Admonition>
For this example we will create a todos table using the [`POST /v1/projects/{ref}/database/migrations`](https://api.supabase.com/api/v1#tag/database/post/v1/projects/{ref}/database/migrations) endpoint.
```sql
create table public.todos (
id serial primary key,
task text not null
);
alter table public.todos
enable row level security;
```
This endpoint will automatically create a migration inside the `supabase_migrations` schema and run the migration. If the schema migration fails, the changes will be rolled back.
```sh
curl https://api.supabase.com/v1/projects/{ref}/database/migrations \
--request POST \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"query": "create table public.todos (id serial primary key, task text not null); alter table public.todos enable row level security;",
"name": "Create a todos table"
}'
```
### Create a restore point
<Admonition type="note" title="Contact us for access to restore points">
Only select customers have access to restore points. Submit this [form](/solutions/ai-builders#talk-to-partnerships-team) to get access.
</Admonition>
After every change you make to the database, it's a good idea to create a restore point. This will allow you to roll back the database if you decide to go in a different direction.
Beware that only database changes are captured when creating a restore point.
```sh
curl https://api.supabase.com/v1/projects/{ref}/database/backups/restore-point \
--request POST \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"name": "abcdefg"
}'
```
### Reverting changes
![Revert](/docs/img/integrations/revert.png)
<Admonition type="note" title="Contact us for access to restore points">
Only select customers have access to restore points. Submit this [form](/solutions/ai-builders#talk-to-partnerships-team) to get access.
</Admonition>
After creating restore points, you are able to revert back to any restore point that you want.
```sh
curl https://api.supabase.com/v1/projects/{ref}/database/backups/undo \
--request POST \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"name": "abcdefg"
}'
```
When you revert changes, you are undo-ing all database changes since the specified restore point, including:
- Schema changes
- Any seed data that you inserted
- Any test users who have signed up (and auth tokens for sign ins)
- Pointers to files in Supabase Storage.
It will not affect:
- Configuration changes
- Any secrets that have been added
- Storage objects themselves
- Any deployed Edge Functions
### Add seed data
<Admonition type="caution" title="Do not use production data in branches!">
It's important that the data in development branches is NOT production data, especially for non-developers who don't understand the implications of working with data. Security and side-effects (e.g. emailing all production users) are two reasons why this is important.
</Admonition>
It's common in `DEV` branches to "seed" data. This is basically test data for users. Let's insert the following seed to our new todos table:
```sql
insert into todos (task)
values
('Task 1'),
('Task 2'),
('Task 3');
```
You can use the `POST /database/query` endpoint to add data:
```sh
curl https://api.supabase.com/v1/projects/{branch_ref}/database/query \
--request POST \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @- <<EOF
{
"query": "insert into todos (task) values ('Task 1'), ('Task 2'), ('Task 3');"
}
EOF
```
### Deploying Edge Functions
You can create and deploy Edge Functions on a branch and then merge them into Production.
![Deploy Edge Functions](/docs/img/integrations/change-functions.png)
```sh
curl https://api.supabase.com/v1/projects/functions/deploy \
--request POST \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: multipart/form-data' \
--form 'file=@path/to/function.zip' \
--form 'metadata={
"name": "my-function",
"entrypoint_path": "index.ts",
"import_map_path": "import_map.json",
"static_patterns": ["assets/*", "public/*"],
"verify_jwt": true
}'
```
### Merge all changes
Management API endpoint: [`POST /v1/branches/{branch_id_or_ref}/merge`](https://api.supabase.com/api/v1#tag/environments/post/v1/branches/{branch_id_or_ref}/merge)
Once the changes have been made, you can merge the changes into the production project:
```sh
curl https://api.supabase.com/v1/branches/{ref}/merge \
--request POST \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Content-Type: application/json' \
--data '{}'
```
Merging changes will automatically merge only the following:
- Database changes
- Deployed Edge Functions
## Security checks for production
Management API endpoint: [`GET /v1/projects/{ref}/advisors/security`](https://api.supabase.com/api/v1#tag/advisors/get/v1/projects/{ref}/advisors/security)
Prior to deploying to production we strongly recommend running the security advisor on the project to make sure the latest changes are secure.
```sh
curl https://api.supabase.com/v1/projects/{ref}/advisors/security \
--request GET \
--header 'Authorization: Bearer {PAT_OR_USER_TOKEN}' \
--header 'Content-Type: application/json'
```
## Disaster recovery for production
Management API endpoint: [`POST /v1/projects/{ref}/database/backups/restore-pitr`](https://api.supabase.com/api/v1#tag/database/post/v1/projects/{ref}/database/backups/restore-pitr)
![Rollback](/docs/img/integrations/rollback.png)
- Rollbacks can cause data loss. Only use it in `PROD` when absolutely necessary.
- Only available in prod when a project has already explicitly enabled PITR prior to rolling back.
```sh
curl https://api.supabase.com/v1/projects/database/backups/restore-pitr \
--request POST \
--header 'Authorization: Bearer {PAT_OR_USER_TOKEN}' \
--header 'Content-Type: application/json' \
--data '{
"recovery_time_target_unix": 1
}'
```
## Claim flow
Management API endpoint: [`GET /v1/oauth/authorize/project-claim`](https://api.supabase.com/api/v1#tag/oauth/get/v1/oauth/authorize/project-claim)
<Admonition type="note" title="Contact us for access to claim flow">
Only select customers have access to claim flow. Submit this [form](/solutions/ai-builders#talk-to-partnerships-team) to get access.
</Admonition>
Your users may want to claim the project that currently lives in your org so that they can have more control over it.
We've enabled transferring the project from your org to your user's org while you continue to retain access to interact with the project through an [OAuth integration](/docs/guides/integrations/build-a-supabase-oauth-integration).
```sh
curl -L "https://api.supabase.com/v1/oauth/authorize/project-claim?project_ref={ref}&client_id={oauth_client_id}&response_type=code&redirect_uri={redirect_uri}" \
--request GET \
--header 'Authorization: Bearer {PERSONAL_ACCESS_TOKEN}'
```
The user is redirected to a Supabase UI:
1. Create a new Supabase account or sign in to an existing one
2. Create a new Supabase Organization or select an existing one
3. Review your OAuth integration's permission scopes
4. Review the Project transfer details
5. Confirm the OAuth integration and the Project transfer for the selected Organization
<Admonition type="caution" title="Remove custom configuration before transferring project">
Before transferring the project to your user's org, make sure to remove any custom configuration that you do not want your user's project to retain.
</Admonition>
## Platform kit
Docs: https://supabase.com/ui/docs/platform/platform-kit
<div className="video-container mb-8">
<iframe
className="w-full"
src="https://xguihxuzqibwxjnimxev.supabase.co/storage/v1/object/public/videos/marketing/blog/platform-kit/platform-kit.mp4"
title="Supabase UI: Platform Kit"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
allowfullscreen
autoplay
muted
loop
playsInline
/>
</div>
We've created Platform Kit, a collection of UI components that interact with Management API, as a lightweight version of Supabase Dashboard that you can embed directly in your app so your users never have to leave in order to interact with the project.
## Debugging projects
Management API endpoint: [`GET /v1/projects/{ref}/analytics/endpoints/logs.all`](https://api.supabase.com/api/v1#tag/analytics/get/v1/projects/{ref}/analytics/endpoints/logs.all)
When you need to debug a project, you can query the project's logs to see if there are any errors and address them accordingly.
```sh
curl 'https://api.supabase.com/v1/projects/{ref}/analytics/endpoints/logs.all' \
--get \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--data-urlencode 'sql=SELECT datetime(timestamp), status_code, path, event_message
FROM edge_logs
CROSS JOIN UNNEST(metadata) AS metadata
CROSS JOIN UNNEST(response) AS response
WHERE status_code >= 400
ORDER BY timestamp DESC
LIMIT 100' \
--data-urlencode 'iso_timestamp_start=2025-03-23T00:00:00Z' \
--data-urlencode 'iso_timestamp_end=2025-03-23T01:00:00Z'
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -95,7 +95,7 @@ Display all the data in your database:
The library is 100% shadcn/ui compatible by leveraging the [component registry](https://x.com/shadcn/status/1829646556318089509) feature. Components are styled with shadcn/ui and Tailwind CSS and are completely customizable. Read the [original launch post](https://supabase.com/blog/supabase-ui-library) for more details, or check out the docs: [ui.supabase.com](https://supabase.com/ui)
## Supabase as a Service
## Supabase for Platforms
While we started Supabase as Service directly for developers, more and more companies are building on top of Supabase to provide critical infrastructure for their own users. Today, [30% of Supabase sign ups](https://x.com/kiwicopple/status/1894251335224320000) can be attributed to some sort of AI Builder:

View File

@@ -0,0 +1,174 @@
---
title: 'Introducing Supabase for Platforms'
description: Use Supabase as a platform for your own business and tools
author: wenbo
image: 2025-12-05-introducing-supabase-for-platforms/og.png
thumb: 2025-12-05-introducing-supabase-for-platforms/thumb.png
categories:
- product
- launch-week
date: '2025-12-05'
toc_depth: 2
---
Today, we're launching **Supabase for Platforms**—a white-label offering that lets platforms provision and manage fully managed backends on behalf of their users.
AI builders and agentic coding have fundamentally changed how software gets built in 2025. Supabase has become the default backend for this shift, with [Lovable](https://lovable.dev), [Bolt.new](https://bolt.new), Vercel's [v0](https://v0.app), [Figma Make](https://www.figma.com/make), and many others building on top of Supabase projects owned by their users to develop full-stack applications. The growth has been staggering:
- Lovable has nearly 8 million users. The company hit $100 million in ARR just eight months after launch, then doubled to $200 million four months later. Users create more than 100,000 new apps on the platform every day.
- Bolt.new has about 5 million users. The company reached $4 million in ARR just 30 days after launch, $20 million in two months, and $40 million in five months.
But as these platforms scaled, we heard consistent feedback: they wanted a more seamless flow so their users don't have to think at all about provisioning and configuring their backends. That's when **Supabase for Platforms** was born.
Leading AI builders like Lovable, Bolt.new, and Baidu's [MeDo](https://medo.dev) have already started using **Supabase for Platforms** to create millions of Supabase projects in the last few months alone, making full-stack development more accessible and easier than ever.
And while AI builders are leading the way, **Supabase for Platforms** is built for any platform or tool that wants to offer managed backends.
# What is Supabase for Platforms?
**Supabase for Platforms** lets you white-label Supabase and provision backends for your users—all managed through our [Management API](/docs/reference/api/introduction) or [remote MCP Server](/docs/guides/getting-started/mcp).
Your users get the full Supabase stack:
- Database (Postgres)
- Auth
- Edge Functions
- Storage
- Realtime
You control the entire experience. Your users get the full power of Supabase.
With **Supabase for Platforms**, you can:
- Offer a complete white-label backend to your users entirely powered by Supabase
- Pay only for compute hours consumed with our newest Pico instances that scale to zero
- Access features purpose-built for managing backends on behalf of your users
- Embed a lightweight Supabase Dashboard directly in your app through Platform Kit, so your users never leave your tooling
- Let your users "claim" (transfer) their projects to their own Supabase orgs whenever they're ready, while you maintain access to those projects through OAuth integration
**Supabase for Platforms** and the full feature set is available to select AI Builders. [Contact us](/solutions/ai-builders#talk-to-partnerships-team) if you'd like to get started.
# How does it work?
Some AI builders want to manage infrastructure on behalf of their users. With a central organization, you create and own projects in your Supabase org. Users can claim those projects into their own Supabase org later if they want full control.
This model works well when your users don't know or care about infrastructure. You handle the complexity—they focus on features.
<Admonition title='Want users to bring their own Supabase accounts instead?'>
With [OAuth integrations](/docs/guides/integrations/build-a-supabase-integration), users connect their existing Supabase org to your tool. They own and manage their projects directly, and you get API access to help them build.
This model works well when your users are developers who already use Supabase or want more control from the start.
</Admonition>
[Contact us](/solutions/ai-builders#talk-to-partnerships-team) to enable central organization management.
# Features available today
These features are available through the [Management API](/docs/reference/api/introduction) or [remote MCP Server](/docs/guides/getting-started/mcp) right now.
## Launch projects
Create projects programmatically. We highly recommend using smart region selection to ensure capacity.
[Docs](/docs/guides/integrations/supabase-for-platforms#launching-projects)
## Manage configuration
Update settings for Auth, Data API (PostgREST), Edge Functions, Storage, and Realtime through the Management API. Every setting in the Supabase Dashboard is available for configuration programmatically.
[Docs](/docs/guides/integrations/supabase-for-platforms#configuration-changes)
## Deploy Edge Functions
Deploy functions directly through the API. No CLI required.
[Docs](/docs/guides/integrations/supabase-for-platforms#deploying-edge-functions)
## Change compute sizes
Upgrade or downgrade compute as your users' needs change.
[Docs](docs/guides/integrations/supabase-for-platforms#changing-compute-sizes)
## Run security checks
Use the security advisor API to check projects before deploying to production. Catch issues before your users, and their users, do.
[Docs](/docs/guides/integrations/supabase-for-platforms#security-checks-for-production)
## API keys
Get and manage API keys for each project. We recommend using the `publishable` and `secret` API keys instead of the legacy `anon` and `service_role` keys.
For more information, read the announcement [here](https://github.com/orgs/supabase/discussions/29260).
[Docs](/docs/guides/integrations/supabase-for-platforms#recommended-api-keys)
## Development Environments
Create ephemeral development environments for each project using branching. Your users can make changes safely on a branch, then merge to production. If something goes wrong, destroy the branch and start fresh based off production.
[Docs](/docs/guides/integrations/supabase-for-platforms#creating-a-dev-branch)
## Platform Kit
<div className="video-container mb-8">
<iframe
className="w-full"
src="https://xguihxuzqibwxjnimxev.supabase.co/storage/v1/object/public/videos/marketing/blog/platform-kit/platform-kit.mp4"
title="Supabase UI: Platform Kit"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
allowfullscreen
autoplay
muted
loop
playsInline
/>
</div>
We built [Platform Kit](/ui/docs/platform/platform-kit), a collection of UI components for the Management API. Embed a lightweight version of the Supabase Dashboard directly in your app. Your users can manage their backend without leaving your product.
[Docs](/ui/docs/platform/platform-kit)
# Features available to select AI Builders
These features are available to a subset of our AI Builder customers. [Contact us](/solutions/ai-builders#talk-to-partnerships-team) to get access.
## Compute that scales to zero
We offer Pico instances that scale to zero when not in use. This is ideal for platforms with many projects that have variable usage. You only pay for what your users actually use.
[Docs](/docs/guides/integrations/supabase-for-platforms#pico-compute-instance)
## Restore points
Once you have development environments, create restore points after every backend change. Roll back if something goes wrong. This gives your users confidence as theyre developing.
[Docs](/docs/guides/integrations/supabase-for-platforms#create-a-restore-point)
## Database migrations
Run schema migrations through the API. Changes are tracked automatically. If a migration fails, it rolls back.
[Docs](/docs/guides/integrations/supabase-for-platforms#make-database-changes)
## Claim flow
Let users transfer projects from your organization to their own. You retain API access to continue helping them build. They get full ownership and control.
This is useful when users want to eventually manage their own infrastructure and billing.
[Docs](/docs/guides/integrations/supabase-for-platforms#claim-flow)
# Recommended development flow
Supabase stores data. You cannot simply roll back production changes without risking data loss. Check out the [docs](/docs/guides/integrations/supabase-for-platforms#development-workflow) for our recommended dev/production workflow.
[Docs](/docs/guides/integrations/supabase-for-platforms#development-workflow)
## Get started
- [Read the documentation](/docs/guides/platform/supabase-for-platforms)
- [Contact us](/solutions/ai-builders#talk-to-partnerships-team) if you're building an AI platform or coding tool

View File

@@ -7,30 +7,45 @@ interface Props {}
const UseCases: FC<Props> = () => {
return (
<SectionContainer className="text grid gap-8 lg:gap-12 md:grid-cols-2 xl:pt-20">
<SectionContainer
id="talk-to-partnerships-team"
className="text grid gap-8 lg:gap-12 md:grid-cols-2 xl:pt-20 scroll-mt-20"
>
<div className="md:h-full w-full flex flex-col justify-between gap-4 lg:gap-8">
<div className="flex flex-col gap-2 md:max-w-md">
<h1 className="h1 !m-0">
Talk to our
<br className="hidden md:block" /> partnership team
<br className="hidden md:block" /> Partnerships team
</h1>
<p className="md:text-lg text-foreground-lighter">
Explore custom pricing and infrastructure options.
</p>
</div>
<ConnectCallout className="hidden md:flex" />
<PlatformConnectCallout className="hidden md:flex" />
<OAuthConnectCallout className="hidden md:flex" />
</div>
<PlatformConnectCallout className="md:hidden" />
<OAuthConnectCallout className="md:hidden" />
<TalkToPartnershipTeamForm />
<ConnectCallout className="md:hidden" />
</SectionContainer>
)
}
const ConnectCallout: FC<{ className?: string }> = ({ className }) => (
const PlatformConnectCallout: FC<{ className?: string }> = ({ className }) => (
<div className={cn('border rounded-lg p-4 md:p-6 bg-surface-75 flex flex-col gap-2', className)}>
<h5>Connect your app to Supabase now</h5>
<h5>Supabase for Platforms</h5>
<p className="text-foreground-lighter">
Set up a Supabase OAuth app so your users can start interacting with their Supabase Project.
White label Supabase backends for your platform or tools.
</p>
<TextLink url="/docs/guides/integrations/supabase-for-platforms" label="View docs" />
</div>
)
const OAuthConnectCallout: FC<{ className?: string }> = ({ className }) => (
<div className={cn('border rounded-lg p-4 md:p-6 bg-surface-75 flex flex-col gap-2', className)}>
<h5>Connect your app to your user's Supabase org now</h5>
<p className="text-foreground-lighter">
Set up a Supabase OAuth app so you can start interacting with your user's Supabase project.
</p>
<TextLink
url="https://supabase.com/docs/guides/integrations/build-a-supabase-integration"

View File

@@ -6,12 +6,11 @@ import SectionContainer from '../Layouts/SectionContainer'
export default function FeaturesGrid(props: any) {
const hasExtendedCards = props.features.some(
(f: any) =>
f.id === 'project-claim-flow' || f.id === 'platform-kit' || f.id === 'pico-instances'
(f: any) => f.id === 'claim-flow' || f.id === 'platform-kit' || f.id === 'pico-instances'
)
return (
<SectionContainer className="flex flex-col gap-4 xl:pt-20">
<SectionContainer id={props.id} className="flex flex-col gap-4 xl:pt-20 scroll-mt-20">
<div className="flex flex-col gap-2 max-w-xl">
<h2 className="h2 text-foreground-lighter !m-0">{props.heading}</h2>
<p className="p !text-foreground-lighter max-w-md">{props.subheading}</p>
@@ -40,7 +39,7 @@ export default function FeaturesGrid(props: any) {
[&_.next-image--dynamic-fill]:rounded-none"
/>
<Content card={props.features.find((f: any) => f.id === 'branching')} />
<Content card={props.features.find((f: any) => f.id === 'project-claim-flow')} />
<Content card={props.features.find((f: any) => f.id === 'claim-flow')} />
<Content card={props.features.find((f: any) => f.id === 'platform-kit')} />
<Content
card={props.features.find((f: any) => f.id === 'pico-instances')}

View File

@@ -16,7 +16,7 @@
grid-template-areas:
'postgres mgmt-api'
'pricing branching'
'project-claim-flow platform-kit'
'claim-flow platform-kit'
'pico-instances pico-instances';
}
@@ -24,7 +24,7 @@
.features-grid-extended {
grid-template-areas:
'postgres mgmt-api mgmt-api'
'pricing branching project-claim-flow'
'pricing branching claim-flow'
'platform-kit pico-instances pico-instances';
}
}

View File

@@ -43,8 +43,8 @@ const data: {
type: 'primary' as any,
},
{
label: 'Connect your app',
href: 'https://supabase.com/docs/guides/integrations/build-a-supabase-integration',
label: 'Build your integration',
href: '/solutions/ai-builders#talk-to-partnerships-team',
type: 'default' as any,
},
],
@@ -181,8 +181,8 @@ const data: {
],
},
features: {
id: 'features',
heading: <span className="text-foreground">Supabase as a Service</span>,
id: 'supabase-for-platforms',
heading: <span className="text-foreground">Supabase for Platforms</span>,
subheading:
'Build a delightful next-generation tools experience for your customers, backed by a powerful white-label Supabase backend.',
features: [
@@ -491,17 +491,6 @@ const data: {
backend.
</>
),
img: (
<Image
src={{
dark: '/images/solutions/ai-builders/mgmt-api-permissions-dark.png',
light: '/images/solutions/ai-builders/mgmt-api-permissions-light.png',
}}
alt="Management Api Permissions panel"
width={900}
height={900}
/>
),
},
{
id: 'branching',
@@ -549,14 +538,14 @@ const data: {
),
subheading: (
<>
<span className="text-foreground">Offer production and development branches.</span>{' '}
Enable your customers to deploy and test changes without affecting their main production
<span className="text-foreground">Offer development branches.</span> Enable your
customers to deploy and test changes without affecting their main production
applications.
</>
),
},
{
id: 'project-claim-flow',
id: 'claim-flow',
icon: Timer,
heading: (
<>
@@ -582,7 +571,7 @@ const data: {
strokeLinejoin="round"
/>
</svg>
Project claim flow
Claim flow
</>
),
subheading: (
@@ -636,7 +625,7 @@ const data: {
<span className="text-foreground">
UI components for the Management API that you can embed directly in your app
</span>{' '}
so they never have to leave it to interact with their project.
so your users never have to leave it to interact with their projects.
</>
),
},
@@ -681,7 +670,7 @@ const data: {
strokeLinejoin="round"
/>
</svg>
Compute instance on shared architecture
Pico instances
</>
),
subheading: (

View File

@@ -2434,6 +2434,11 @@ module.exports = [
source: '/docs/guides/platform/oauth-apps/authorize-an-oauth-app',
destination: '/docs/guides/platform/oauth-apps/build-a-supabase-integration',
},
{
permanent: true,
source: '/docs/guides/platform/oauth-apps/build-a-supabase-integration',
destination: '/docs/guides/platform/oauth-apps/build-a-supabase-oauth-integration',
},
{ permanent: true, source: '/docs/reference/cli/config', destination: '/docs/guides/cli/config' },
{
permanent: true,

View File

@@ -1,6 +1,8 @@
import { NextPage } from 'next'
import dynamic from 'next/dynamic'
import { NextSeo } from 'next-seo'
import { useRouter } from 'next/router'
import { useEffect } from 'react'
import Layout from 'components/Layouts/Default'
import ProductHeader from 'components/Sections/ProductHeader2'
@@ -16,38 +18,54 @@ const FeaturesGrid = dynamic(() => import('components/Solutions/FeaturesGrid'))
const VideosSection = dynamic(() => import('components/Solutions/Videos'))
const CTAForm = dynamic(() => import('components/Solutions/CTAForm'))
const Enterprise: NextPage = () => (
<>
<NextSeo
title={content.metadata.metaTitle}
description={content.metadata.metaDescription}
openGraph={{
title: content.metadata.metaTitle,
description: content.metadata.metaDescription,
url: `https://supabase.com/solutions/ai-builders`,
images: [
{
url: `/images/solutions/ai-builders/ai-builders-og.png`,
},
],
}}
/>
<Layout className="overflow-visible">
<SolutionsStickyNav activeItem={Solutions.aiBuilders} type="skill-based" />
<ProductHeader
{...content.heroSection}
className="[&_h1]:2xl:!text-5xl bg-default border-0 lg:pb-8 [&_.ph-footer]:mt-0 [&_.ph-footer]:lg:mt-16 [&_.ph-footer]:xl:mt-32"
sectionContainerClassName="lg:gap-4"
footer={<AIBuildersLogos className="mt-16 md:mt-0" />}
footerPosition="left"
const Enterprise: NextPage = () => {
const { asPath } = useRouter()
useEffect(() => {
const hash = asPath.split('#')[1]
if (!hash) return
setTimeout(() => {
const element = document.getElementById(hash)
if (element) {
element.scrollIntoView({ behavior: 'smooth' })
}
}, 100)
}, [asPath])
return (
<>
<NextSeo
title={content.metadata.metaTitle}
description={content.metadata.metaDescription}
openGraph={{
title: content.metadata.metaTitle,
description: content.metadata.metaDescription,
url: `https://supabase.com/solutions/ai-builders`,
images: [
{
url: `/images/solutions/ai-builders/ai-builders-og.png`,
},
],
}}
/>
<Quotes {...content.quotes} />
<WhySupabase {...content.why} />
<FeaturesGrid {...content.features} />
<VideosSection {...content.testimonials} />
<CTAForm />
</Layout>
</>
)
<Layout className="overflow-visible">
<SolutionsStickyNav activeItem={Solutions.aiBuilders} type="skill-based" />
<ProductHeader
{...content.heroSection}
className="[&_h1]:2xl:!text-5xl bg-default border-0 lg:pb-8 [&_.ph-footer]:mt-0 [&_.ph-footer]:lg:mt-16 [&_.ph-footer]:xl:mt-32"
sectionContainerClassName="lg:gap-4"
footer={<AIBuildersLogos className="mt-16 md:mt-0" />}
footerPosition="left"
/>
<Quotes {...content.quotes} />
<WhySupabase {...content.why} />
<FeaturesGrid {...content.features} />
<VideosSection {...content.testimonials} />
<CTAForm />
</Layout>
</>
)
}
export default Enterprise

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

View File

@@ -7,6 +7,13 @@
<lastBuildDate>Thu, 04 Dec 2025 00:00:00 -0700</lastBuildDate>
<atom:link href="https://supabase.com/rss.xml" rel="self" type="application/rss+xml"/>
<item>
<guid>https://supabase.com/blog/introducing-supabase-for-platforms</guid>
<title>Introducing Supabase for Platforms</title>
<link>https://supabase.com/blog/introducing-supabase-for-platforms</link>
<description>White-label Supabase backends for your platform or tools</description>
<pubDate>Thu, 05 Dec 2025 00:00:00 -0700</pubDate>
</item>
<item>
<guid>https://supabase.com/blog/adding-async-streaming-to-pg-fdw</guid>
<title>Adding Async Streaming to Postgres Foreign Data Wrappers</title>
<link>https://supabase.com/blog/adding-async-streaming-to-pg-fdw</link>

View File

@@ -263,11 +263,13 @@ allow_list = [
"OrbStack",
"OrioleDB",
"OpenTelemetry",
"PaaS",
"PagerDuty",
"PGAudit",
"PGroonga",
"PgBouncer",
"PHI",
"Pico",
"PingIdentity",
"Paulo",
# For historical purposes
@@ -358,6 +360,8 @@ allow_list = [
"https?:\\/\\/\\S+",
"i.e.",
"imgproxy",
"undo-ing",
"sign ins",
"iOS",
"localStorage",
"localhost",