Commit Graph
39136 Commits
Author SHA1 Message Date
Charis 9ae8432dc7 refactor(studio): migrate create, delete, and run notebook tools to tool contracts (#51754)
## Summary

Migrates the create, delete, and run notebook assistant tools to the
tool contract + server pattern used by `update_notebook`. Each tool now
defines its schema once in a shared contract, with server-only execution
split into a `.server.ts` module. This removes duplicated client-side
schemas and gives the three tools one shared notebook mutation output
schema.

## Changes

- Add `create-notebook`, `delete-notebook`, and `run-notebook` tool
contracts, each with a `.server.ts` implementation.
- Remove the duplicated client-side schemas for these tools from
`notebook-tools.ts` and the registry.
- Add `notebook-mutation-output.ts` as the single output schema shared
by the notebook mutation tools.
- Add `lib/ai/opt-in-level.ts` with the opt-in level helpers, extracted
from the existing module to break an import cycle.
- Add optional `ToolContract.outputOnInvalid` so `run_notebook` history
replay can reuse a stored output when input fails validation.
- Update the AI assistant panel renderers (proposal, run, opt-in modal
and request) and the tool filter, sanitizer, and cache invalidation to
use the new contracts.

## Deviations worth reviewing

- **`outputOnInvalid` on `ToolContract`.** This is a new optional hook.
It exists so `run_notebook` history replay can return a valid output
when stored input no longer passes validation. Reviewers should confirm
this is the right level for the hook rather than handling it inside the
tool.
- **`opt-in-level.ts` extraction.** The helpers were moved into their
own module to break a circular import between the tool modules and the
opt-in components. This adds one file, but no behavior change is
intended.
- **`create-notebook` contract imports the data-layer
`notebook-schema`.** This matches `update-notebook`. It should be moved
behind the contract before the planned ESLint rule step, which restricts
contract modules from importing data-layer code.

## Testing

- `vitest` for `lib/ai`, `components/ui/AIAssistantPanel`, and `state`:
920 tests pass across 71 files.
- `tsc`: one error remains in `packages/ui-patterns`
(`InstructionBlocks.tsx`), which is unrelated to this change. I have not
verified whether it also fails on the base branch.
- ESLint reports no errors on the changed files (9 `no-explicit-any`
warnings in `tool-filter.ts` and its test); Prettier is clean.
- Not run: knip and the lint ratchet.
2026-10-15 11:16:58 -04:00
Lukas Klingsbo dfd1f58838 fix(studio): use publishableKey in the Flutter connect snippet (#51792)
## Problem

The Flutter snippet in the dashboard Connect sheet calls
`Supabase.initialize` with `anonKey`. The current stable
`supabase_flutter` (2.18.3) deprecates `anonKey` in favor of
`publishableKey`, so the copied code shows a deprecation warning right
away.

## Solution

Pass the key as `publishableKey` and change the fallback placeholder to
`your-publishable-key`. The old placeholder told users to prefer the
publishable key over the anon key, which no longer makes sense once the
parameter itself is named `publishableKey`.

## Review instructions

1. Open a project in the dashboard and click Connect.
2. Choose Framework, then Flutter.
3. Check that `lib/main.dart` calls `Supabase.initialize(url: ...,
publishableKey: ...)`.

## Checklist

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
2026-10-15 14:23:59 +00:00
Monica Khoury 97bd456842 fix: consolidate SMTP minimum interval into Rate Limits page (#51784)
## What
Moves the "Minimum interval per user" (SMTP_MAX_FREQUENCY) setting from
the Custom SMTP page to the Rate Limits page. The field is always
visible there now, disabled with a tooltip when Custom SMTP isn't
configured, linking to the SMTP settings page.

## Why
This setting can cause `over_email_send_rate_limit` errors even when all
settings on the Rate Limits page allow more traffic, because it lived
only on the SMTP page. Consolidating it onto Rate Limits makes the
actual rate-limiting behavior visible in one place.

Fixes FE-4627

## Testing
- Verified field is disabled with explanatory tooltip when Custom SMTP
is off
- Verified field becomes editable and saves correctly once Custom SMTP
is configured
- Confirmed field no longer appears on the SMTP settings page
- Ran typecheck, lint, and SmtpForm unit tests locally
2026-10-15 17:03:10 +03:00
Ivan VasilovandJoshen Lim 7e3d8dfe35 fix(studio): load all org projects in UpdateRolesPanel (#51780)
## Summary

Fixes FE-4635: `UpdateRolesPanel` only loaded the first page (96) of org
projects. Instead of fetching every page, the team settings no longer
need the full project list.

```diff
 <UpdateRolesPanel>
   useOrgProjectsInfiniteQuery({ slug })  // only pagination.count is used
-  orgProjects = all loaded projects
-  noAccessProjects = orgProjects - projectsRoleConfiguration
-  toggle off "Apply to all projects" -> select every org project
+  toggle off "Apply to all projects" -> start with no projects selected
-  <Collapsible> listing every project without access
+  <Admonition> "access to N projects out of M total projects"
```

```diff
 MemberRow
-  orgProjects from TeamSettingsDataContext
-  projectNameByRef = Map(orgProjects)
-  projectsApplied = role.projects.map(lookup name).filter(has name)
+  projectsApplied = role.projects  // roles API already returns { name, ref }
   <HoverCardContent>
+    appliesToAllProjects
+      ? "<role> role applies to M projects"   // no project list
+      : "<role> role applies to N projects" + list of projects
```

```diff
 MembersView / TeamSettingsDataContext
-  useOrgProjectsInfiniteQuery
-  orgProjects
```

## Evidence

- **Before:** orgs with more than 96 projects: toggling off "Apply roles
to all projects" assigned only the first 96, and the "no access" list
was capped at 96. API logs showed only `offset=0` requests from the team
page.
**After:** no code path depends on the loaded project list, so the 96
cap no longer applies. The screenshots below show the new UI. No
automated test covers orgs with more than one page of projects.

## Merge Danger

**Door:** two-way

**Blast Radius:** Team settings

- Toggling off "Apply roles to all projects" now starts with nothing
selected instead of every project.
- The member row hover card for org-wide roles shows only the project
count, not the project list.
- The "no access" project list in the panel is replaced by a count.

New UI:

<img width="602" height="381" alt="Screenshot 2026-10-15 at 14 11 17"
src="https://github.com/user-attachments/assets/39d5ef62-5beb-4e14-9c6f-740bd7f113a1"
/>
<img width="593" height="334" alt="Screenshot 2026-10-15 at 14 11 23"
src="https://github.com/user-attachments/assets/ec06bbc4-b2af-458f-b664-894e9567ff23"
/>
<img width="637" height="248" alt="Screenshot 2026-10-15 at 14 11 38"
src="https://github.com/user-attachments/assets/e4ef9774-58eb-415d-aab8-f0497e3fef2a"
/>
<img width="496" height="431" alt="Screenshot 2026-10-15 at 14 11 46"
src="https://github.com/user-attachments/assets/d1618ce3-a03d-41ec-985d-ca5936c754a7"
/>

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-15 15:49:21 +02:00
Raúl Barroso 78348a767a docs(ai): Add Assistant code guide (#51785)
## Problem

A starting point for humans and agents whenever they need to modify the
AI assistant.

Working on an issue for the Supabase Assistant for the first time, I
missed having a starting point so I could guide the LLM / myself on
where to start looking.

A link to share with someone so they know its current architecture.

## Solution

Links from the agents.md so the reference is not lost and a main readme
that includes some diagrams.

<!--
## Preview links

If relevant, include links to changed pages for easy review access.

Copy the preview base URL from the Vercel bot comment on this PR. Use
the following table as an example template.

| Site | Live | Preview | Search for |
| -------------- |
-------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------
| ----------------------------- |
| WWW | [/blog/your-post](https://supabase.com/blog/your-post) |
[/blog/your-post](https://zone-www-dot-com-git-branch-name-supabase.vercel.app/blog/your-post)
| unique phrase from the change |
| Docs |
[/docs/guides/your-page](https://supabase.com/docs/guides/your-page) |
[/docs/guides/your-page](https://docs-git-branch-name-supabase.vercel.app/docs/guides/your-page)
| unique phrase from the change |
| Studio | [/dashboard](https://supabase.com/dashboard) |
[/dashboard](https://studio-git-branch-name-supabase.vercel.app/dashboard)
| unique phrase from the change |
| Design system | [/design-system](https://supabase.com/design-system) |
[/design-system](https://design-system-git-branch-name-supabase.vercel.app/design-system)
| unique phrase from the change |
| UI library | [/library](https://supabase.com/library) |
[/library](https://ui-library-git-branch-name-supabase.vercel.app/library)
| unique phrase from the change |
| Knowledge base |
[/kb/guides/your-page](https://supabase.com/kb/guides/your-page) |
[/kb/guides/your-page](https://kb-git-branch-name-supabase.vercel.app/kb/guides/your-page)
| unique phrase from the change |
-->

<!-- ## Additional context

Optionally add any other context or screenshots.

-->

## Review instructions

Check the references make sense (i.e.: it fits well your existing
workflow and doesn't break any existing one).

Main file lives
[here](https://github.com/supabase/supabase/blob/f87b248056837df5abacb1e581fc70c234fb0037/apps/studio/lib/ai/README.md)

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
2026-10-15 14:59:11 +02:00
barcofourie 3b810b13bd feat(studio): add new assistant evaluation cases for common user issues (#51119)
## Problem

We ran a test using the AI assistant for support and added these eval
cases to improve the AI assistant.


https://linear.app/supabase/issue/TOOLING-1172/create-ai-assistant-supported-tickets-report

## Solution

Added the eval cases based on what the support team had to to do resolve
the user queries.

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
2026-10-15 14:56:35 +02:00
Drew McLellan 1d9808ab8b fix(studio): name the organization in the overdue invoices banner (#51747)
## Problem

The "Outstanding invoices in other organization" banner asks users to
pay invoices to avoid service disruption, but never says which
organization has them. Users with several organizations have to guess
where to go.

The banner also looked at only the first overdue organization. Its link
pointed at that organization's billing page without naming it, and if
the lookup failed, it fell back to the current organization's billing
page.

Linear: FE-4587

## Solution

- `useOrganizationRestrictions` now collects every other organization
with overdue invoices from the organizations list. It dedupes them,
excludes the current one, and orders them by name, which the list
already is. It no longer falls back to the current organization's slug.
- The banner names only the first organization, linked to its billing
page: "Pay invoices for **Acme** to avoid service disruption". When more
organizations are affected it adds a count: "…for **Acme** and 2
others…". Paying the first often clears the rest, and the next one
appears once it's resolved.
- If no affected organization can be resolved, for example the user lost
access, the banner shows "Pay outstanding invoices to avoid service
disruption", linking to `/organizations`.
- The title is now plural: "Outstanding invoices in other
organizations".
- The dev toolbar's "overdue invoices from other org" override now
injects overdue invoices for every real other organization. It
previously used a made-up ID, so the banner could never show a name. I
also replaced a nested ternary there, per Studio's style rules.


For one org:
<img width="1022" height="42" alt="Screenshot 2026-10-14 at 12 01 32"
src="https://github.com/user-attachments/assets/8f34c2ff-d47f-45fc-80a4-c7cdc3df558b"
/>

For multiple orgs:
<img width="1057" height="42" alt="Screenshot 2026-10-14 at 13 39 42"
src="https://github.com/user-attachments/assets/2100b0b5-65a3-4d7c-8521-48d8e71b62ef"
/>

Note: Overdue invoice counts are not shown by design, only that one or
more overdue invoices exist for an org.

## Review instructions

1. Run Studio in platform mode with at least three organizations, and
open a project page.
2. Enable the dev toolbar from the account menu ("Local tools" > "Dev
toolbar").
3. In the Warnings tab when on a Project page, choose "Overdue invoices
from other org".
4. Check that the banner names the first other organization
alphabetically, shows "and N others" when there's more than one, and
that the name links to that organization's billing page.
5. Use "Reset to real data" to clear the override.

Tests: `pnpm --filter studio exec vitest run
components/interfaces/Organization/restriction.constants.test.tsx
hooks/misc/useOrganizationRestrictions.test.tsx`

### Mocking in QA

Mock `/platform/stripe/invoices/overdue` for overdue invoice counts in
different organizations.
Note: The endpoint will not return an org in the result if the overdue
invoice count is zero.

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
(not applicable)
2026-10-15 12:45:30 +01:00
Gildas GarciaandJoshen Lim c829b26bd5 (feat) Allow to filter organization users by role (#51653)
## Problem

It can be hard to verify users roles in organizations with many members

## Solution

Add a filter on the team pages for organization roles.
<img width="1174" height="310" alt="image"
src="https://github.com/user-attachments/assets/dfc2ccdc-b83e-45c5-9a6c-d50417a3ff3e"
/>

## Review instructions

- Open the organization team page
- Select a role and verify only members who have this role are displayed
- Ensure other filters still work

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-15 11:31:46 +02:00
Anthony LioandJoshen Lim c3fd259904 fix(ai): assistant sql row cap (#51608)
## Problem

attempt to [fix this
ticket](https://supabase.frontapp.com/inboxes/teams/folders/27650590/unassigned/116845868830):
when the studio ai assistant runs a query with previously set database
opt-in, `execute_sql` returns every row while the query cell's footer
says "Limit 100 rows" causing in case of large amount of returned rows
browser to freeze

+ the chat fails with "Sorry, I'm having trouble responding right now"
until the user clears it

## Solution

- `execute_sql` now keeps the first 100 rows using the cell's existing
`DEFAULT_CELL_ROW_LIMIT`
- uses in history sanitizer the same `toModelRows` helper
- chats saved before this change have no `totalRows` so the helper falls
back to `rows.length` and cuts them to 100 too

<!--
## Preview links

If relevant, include links to changed pages for easy review access.

Copy the preview base URL from the Vercel bot comment on this PR. Use
the following table as an example template.

| Site | Live | Preview | Search for |
| -------------- |
-------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------
| ----------------------------- |
| WWW | [/blog/your-post](https://supabase.com/blog/your-post) |
[/blog/your-post](https://zone-www-dot-com-git-branch-name-supabase.vercel.app/blog/your-post)
| unique phrase from the change |
| Docs |
[/docs/guides/your-page](https://supabase.com/docs/guides/your-page) |
[/docs/guides/your-page](https://docs-git-branch-name-supabase.vercel.app/docs/guides/your-page)
| unique phrase from the change |
| Studio | [/dashboard](https://supabase.com/dashboard) |
[/dashboard](https://studio-git-branch-name-supabase.vercel.app/dashboard)
| unique phrase from the change |
| Design system | [/design-system](https://supabase.com/design-system) |
[/design-system](https://design-system-git-branch-name-supabase.vercel.app/design-system)
| unique phrase from the change |
| UI library | [/library](https://supabase.com/library) |
[/library](https://ui-library-git-branch-name-supabase.vercel.app/library)
| unique phrase from the change |
| Knowledge base |
[/kb/guides/your-page](https://supabase.com/kb/guides/your-page) |
[/kb/guides/your-page](https://kb-git-branch-name-supabase.vercel.app/kb/guides/your-page)
| unique phrase from the change |
-->

<!-- ## Additional context

Optionally add any other context or screenshots.

-->

## Review instructions

1. In a test project, run this in the SQL editor:
   ```sql
create table "emailSubscriber" (id bigint generated always as identity
primary key, email text);
create table "stripeCustomer" (id bigint generated always as identity
primary key, email text);
insert into "emailSubscriber" (email) select md5(g::text) ||
'@example.com' from generate_series(1, 50000) g;
insert into "stripeCustomer" (email) select md5(g::text) ||
'@example.com' from generate_series(1, 1000) g;
2. on the live dashboard, open the assistant in a new chat and send "i
want all the emails in emailSubscriber where the email is not in the
stripeCustomer table"
3. in the opt in requested settings choose "Schema, Logs & Database
Data"
4. then click run query, the cell should show 100 rows (vs 50000 rows in
prod)

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-15 12:22:16 +03:00
barcofourieandGildas Garcia c8c12a87b4 feat(studio): add support satisfaction survey page (#51648)
## Problem

After a support ticket is resolved, customers receive an email with a
link to a satisfaction survey. That survey page is currently served from
a standalone function outside this repo. We are consolidating it into
the dashboard so it is deployed, monitored and tested with everything
else.

Linear:
[TOOLING-1425](https://linear.app/supabase/issue/TOOLING-1425/build-csat-in-supase-studio)

## Solution

Adds a public page at `/support/csat` that collects the survey answer
and posts it to a new Platform endpoint, `POST /platform/support/csat`,
which records the answer on the support conversation.

Key choices:

- **Pre-auth page**, modelled on `/verify-email`. Customers arrive from
an email and may not have a dashboard session. Hosted platform only;
self-hosted routes to 404.
- **URL shape** `?conversation_id=cnv_…&helpful=yes|no` matches the
links already sent in survey emails, so the email template only needs
its host changed. `helpful` preselects the answer, defaulting to Yes.
- **Copy and behaviour match the existing survey page**: same title,
question, labels, button text, and result messages.
- **Form** uses react-hook-form + zod; Yes/No are toggle buttons, the
comment is optional.
- **States**: missing or malformed ticket reference, already submitted
(409), ticket mismatch (404), and a generic error that keeps the form so
the customer can retry.
- The mutation uses `fetchHandler` directly, like the email-verification
mutation, because the endpoint is not in the generated API types yet.

Screenshot:

<img width="977" height="801" alt="image"
src="https://github.com/user-attachments/assets/2331861e-e8e9-43e1-84fc-3bf5786c145e"
/>


Depends on the Platform endpoint
https://github.com/supabase/platform/pull/40027. Until it is deployed,
submissions fail with the generic error state.

## Review instructions

1. Run Studio against a Platform stack that has the `POST
/platform/support/csat` endpoint.
2. Open `/support/csat?conversation_id=<a support conversation
id>&helpful=yes` while logged out. The page renders without redirecting
to sign in, with Yes preselected.
3. Pick an answer, optionally add a comment, and submit. The success
message appears and the answer is recorded on the conversation.
4. Submit again for the same conversation: the page reports that the
survey has already been submitted.
5. Open the page with no `conversation_id`: the page reports an invalid
ticket.
6. `pnpm --filter studio exec vitest --run
components/interfaces/Support/CsatSurvey` passes (18 tests).

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

---------

Co-authored-by: Gildas Garcia <1122076+djhi@users.noreply.github.com>
2026-10-15 10:03:47 +02:00
Joshen Lim ad37074869 Clean up JWT keys page (#51745)
## Context

Initial feedback was mainly that the "Previously used keys" table was
scrollable while the top table wasn't which was a bit inconsistent UX,
so this PR addresses that but also makes a couple of UI adjustments to
the JWT keys page to tidy things up

### Before
<img width="1142" height="912" alt="image"
src="https://github.com/user-attachments/assets/ca5f8bc6-8b73-4d96-9055-24a39544fc06"
/>

### After
- Removed color indicators + badges on the key's status and ID - reckon
these are unnecessary signals and plain texts work fine. Opted for
`text-foreground-lighter` for keys which status isn't `in_use`, mainly
to highlight the current key which is the most important imo
- Removed icons for status and type, also reckon unnecessary as they
don't really communicate the context much quicker than their texts
- Removed "Legacy" prefix on the type column (e.g for HS256) - reckon
unnecessary, we don't label this as legacy either in the create standby
key dialog, doesn't really communicate any implications
- Standardized widths of status, key id, type, and last used columns -
these values are fixed and won't deviate, so fixing the widths will
allow a more uniform layout across the 3 tables
- Prioritise order of "current" key above "standby" key
- Use ButtonTooltip + default variant for the "More actions" CTA, also
removed the "Actions" header text
- "Last rotated at" column only shows up on `xl` viewport breakpoint
rather than `lg`
- Remove a number of unnecessary class names that were applied on the
`Table` components

<img width="1145" height="909" alt="image"
src="https://github.com/user-attachments/assets/af596931-a126-4883-999b-829a9c9359fc"
/>
2026-10-15 10:44:50 +08:00
Joshen Lim dccad31a39 Virtualize AuditLogsTable component (#51748)
## Context

The audit logs endpoint isn't paginated, so we could be fetching a lot
of rows at once
e.g on the Supabase Dev org, the orgs audit logs were pulling 4k rows
from the endpoint which i noticed a bit of browser slow down - so this
should alleviate the browser performance impact

There shouldn't be any visual difference from the changes here 🙏
2026-10-15 10:02:15 +08:00
Danny White 4215b6ca32 feat(studio): add cost estimates and validation feedback to pipeline review (#51641)
## Problem

The pipeline wizard in #49243 needs estimated costs and validation
feedback in review before creation.

## Solution

Add the megabranch’s inline cost estimate and validation feedback to
preview-enabled creation. Initial-sync costs follow the selected tables;
ongoing pipeline and streaming rates remain visible. Missing estimates
do not block creation. Validation feedback distinguishes critical issues
from warnings.

Preview off and editing keep the existing layout. The Start action,
warning confirmation and final cost dialog stay unchanged; no wizard
routing is added. Stacked on #51635.

## Review instructions

1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-review-costs-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled, enable **Pipeline creation
wizard** in Feature Previews and click **Add pipeline**. Select a
publication and confirm **Estimated costs** follows Data review.
2. Compare **All tables**, **No tables** and selected-table initial
sync. Confirm initial-sync totals follow the selection, while hourly
pipeline and streaming rates stay visible. With **No tables**, initial
sync should cost zero. Check desktop and phone widths.
3. Enter valid-format but incorrect destination credentials and click
**Start pipeline**. Confirm critical validation issues appear inline and
creation stops. Correct the credentials and retry. If warnings are
returned, confirm the review explains they may affect replication and
the existing **Start pipeline anyway** confirmation still applies.
Cancel before final creation.
4. Turn the preview off and reopen **Add pipeline**. Confirm there is no
inline cost review. With the preview on, edit an existing pipeline and
confirm its original layout remains.
2026-10-15 11:31:13 +11:00
Danny White f20277377b feat(studio): add pipeline data and custom settings review (#51635)
## Problem

The pipeline wizard in #49243 needs publication, initial sync and custom
settings reviewed before creation.

## Solution

Extend the preview-enabled review from #51633 with Data, custom
connection settings and configured BigQuery table layouts. Values update
as fields change. Unchanged advanced defaults and unconfigured table
layouts are omitted; an explicit maximum staleness of zero is shown.

Preview off and editing keep their existing layout. Validation and
creation behaviour stay the same; no wizard routing is added. Stacked on
#51633.

| This PR: Simple Case | This PR: Extreme Case | Reference: Final Wizard
|
| --- | --- | --- |
| <img width="1244" height="1994" alt="CleanShot 2026-10-14 at 11 22
16@2x"
src="https://github.com/user-attachments/assets/5c2c9ea4-7b2b-4f0b-8ebe-0cfc2ac27059"
/> | <img width="1226" height="3568" alt="CleanShot 2026-10-14 at 12 02
16@2x"
src="https://github.com/user-attachments/assets/dc556d4a-5130-4b6c-80b5-8644603d9a55"
/> | <img width="1486" height="2364" alt="CleanShot 2026-10-14 at 10 50
30@2x"
src="https://github.com/user-attachments/assets/982b7d23-9449-4841-b002-9e30fbbabfe9"
/> |

## Review instructions

1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-data-review-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled, enable **Pipeline creation
wizard** in Feature Previews and click **Add pipeline**. Confirm
**Data** review follows the destination review.
2. Select a publication. Confirm its name, table count and initial-sync
choice appear as read-only fields. Choose selected tables to include or
exclude and confirm their schema-qualified names appear. Change
publication and confirm old tables are not shown.
3. Under Data’s **Advanced settings**, change batch wait time, table
sync workers or initial sync connections. Confirm only custom values
appear in review. Restore defaults and confirm those rows disappear. For
BigQuery, configure partitioning or clustering and confirm the table
name and wrapping layout summary appear in the main column under **Table
layout**; unconfigured layouts should be omitted.
4. Change BigQuery connection pool size or maximum staleness and confirm
they appear within **Connection**. If available, check DuckLake pool
size and Snowflake role too. Check desktop and phone widths, then cancel
and discard changes; no credentials or creation are needed.
5. Turn the preview off and reopen **Add pipeline**: confirm no review.
With the preview on, edit an existing pipeline and confirm no review
there either.
2026-10-15 11:17:34 +11:00
Danny White 17a7d2a00f feat(studio): add destination review for preview pipeline creation (#51633)
## Problem

The pipeline wizard in #49243 needs a review of destination details
before creation.

## Solution

Add `PipelineDestinationReview` after Data in preview-enabled creation.
It uses the megabranch’s Destination and Connection sections,
destination logo, read-only fields and field descriptions. Values update
as fields change. Credentials are omitted. Custom DuckLake catalog URLs
and ClickHouse endpoints are masked as whole fields, with an eye toggle;
changing a URL masks it again.

Preview off and editing keep the existing layout. Validation and
creation behaviour stay the same; no wizard routing is added.
Publication, advanced settings and cost review will follow in later
slices.

| This PR | Reference: Final Wizard |
| --- | --- |
| <img width="1254" height="1308" alt="CleanShot 2026-10-14 at 11 01
05@2x"
src="https://github.com/user-attachments/assets/e792ed7f-d4f4-4557-b338-8a120c8663b5"
/> | <img width="1486" height="2364" alt="CleanShot 2026-10-14 at 10 50
30@2x"
src="https://github.com/user-attachments/assets/982b7d23-9449-4841-b002-9e30fbbabfe9"
/> |

## Review instructions

1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-destinati-25606b-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled and go to **Database →
Pipelines**. Enable **Pipeline creation wizard** in Feature Previews,
then click **Add pipeline**. Confirm the review follows **Data**, with
**Destination** and **Connection** sections.
2. With BigQuery selected, enter a pipeline name, project ID and dataset
ID. Confirm the review updates with those values in read-only fields,
includes field descriptions and the destination logo/region, and omits
the service-account key. Check desktop and phone widths.
3. If available, select DuckLake with a custom catalog. Enter a catalog
URL and data path. Confirm the whole URL is hidden in review, use the
eye toggle to reveal/hide it, then change the URL and confirm it is
hidden again. For Supabase DuckLake, confirm the bucket is shown
instead. Snowflake shows account/database/schema without its private
key; ClickHouse shows database/engine and a masked endpoint without its
password.
4. Cancel and discard changes; no pipeline creation is needed. Turn the
preview off and reopen **Add pipeline**: confirm there is no review
section. With the preview on, edit an existing pipeline and confirm
there is no review section there either.
2026-10-15 10:44:23 +11:00
Sam Meech-WardandJon Meyers f56efc3a79 blog: How we made the Supabase Select 2026 badge (#51422)
## Problem

The Supabase Select 2026 badge needs a write-up: how it came together,
and what attendees and people watching from home are already building
with it.

## Solution

- New post:
`apps/www/_blog/2026-10-07-how-we-made-the-supabase-select-2026-badge.mdx`
(the date is a placeholder until we set the publish date)
- Images in
`apps/www/public/images/blog/how-we-made-the-supabase-select-2026-badge/`,
resized and compressed
- Adds Sam Meech-Ward to `apps/www/lib/authors.json`

## Review instructions

1. Open the Vercel preview at
`/blog/how-we-made-the-supabase-select-2026-badge`.
2. Read through the post and check the images and links.

---------

Co-authored-by: Jon Meyers <13792200+dijonmusters@users.noreply.github.com>
2026-10-14 15:53:46 -06:00
Sahil Jagtap 135d8f00c3 fix(studio): match composite primary keys as tuples when deleting rows (#51575)
## 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?

Bug fix

## What is the current behavior?

Fixes #51574

Deleting several selected rows from a table with a composite primary key
builds one `IN` list per key column:

```sql
delete from public.user_roles where user_id in (1,2) and role_id in ('admin','viewer');
```

That matches the cartesian product of the selected values, so rows the
user never selected are deleted too. In the example above, selecting
`(1, 'admin')` and `(2, 'viewer')` also deletes `(1, 'viewer')` and `(2,
'admin')`.

## What is the new behavior?

When there is more than one primary-key column, the delete uses the
tuple `IN` filter that pg-meta already supports:

```sql
delete from public.user_roles where (user_id, role_id) in ((1, 'admin'), (2, 'viewer'));
```

Single-column primary keys keep the same SQL as before. The batched
operation queue uses the same helper for its delete operations, so it is
covered as well.

Added unit tests for both the single and composite cases.

## Additional context

This is silent data loss on join tables, which are the most common place
for composite keys and for multi-row deletes.
2026-10-14 19:24:36 +00:00
Charis cfdc81e1fe test(studio): raise timeout for NewScopedTokenSheet tests (#51755)
## Summary

- The `NewScopedTokenSheet` tests were flaky on master. The 5s default
timeout was hit intermittently, most visibly in the "falls back to
Custom when a row diverges from the preset" test, plus some sibling
tests.
- Observed in unit-test runs on master. Reproduced locally by running
the file under heavy CPU load, where tests took 4.5-5s versus ~1s on an
idle machine.
- Fix: file-level `vi.setConfig({ testTimeout: 15_000 })`. This only
affects this file because vitest isolates test files.

## Testing

- Ran the file 5 times under the same CPU load. All 21 tests passed each
time.
2026-10-14 14:30:41 -04:00
Ikki Nishihara cba8bc0b30 fix(studio): clarify system role grouping and deletion actions (#51526)
## Problem

The Database Roles page groups `postgres` and the reserved
`supabase_privileged_role` alongside custom roles, while labeling the
other section as "Roles managed by Supabase." The `postgres` actions
menu also offers an enabled Delete action.

Fixes #51525.

## Solution

- Rename the sections to "Supabase service roles" and "Project database
roles," and explain that the latter includes the `postgres`
administrator and custom roles.
- Include `supabase_privileged_role` among the protected service roles.
- Disable Delete for the existing `SYSTEM_ROLES` list, using
`DropdownMenuItemTooltip` to explain the restriction. Keep the
`postgres` permission editor available.
- Add component regressions for grouping, system-role menus, permission
editing, and custom-role deletion confirmation.

## Validation

- Studio unit suite: 732 files passed; 8,343 tests passed and one
expected failure.
- `pnpm --filter studio typecheck` passed.
- `SKIP_ASSET_UPLOAD=1 pnpm build --filter=studio` passed.
- ESLint for changed files, the Studio lint ratchet, monorepo Prettier,
and Studio knip passed.
- Playwright smoke verification of the production Studio build with
synthetic API responses: grouping, disabled Delete and tooltip, keyboard
interaction, permission editing/cancellation, read-only service roles,
search, and custom-role deletion confirmation/cancellation.

## Review instructions

1. Open Database → Roles. Check the two section names and the
administrator description. If present, `supabase_privileged_role`
belongs to the protected service section.
2. Open the `postgres` actions menu. Delete is disabled, and hovering it
explains why.
3. Expand `postgres`. Its existing editable permission switches remain
enabled for a user who can edit roles.
4. Open a custom role's actions menu. Delete still opens the
confirmation dialog; cancel the dialog.
5. Run `pnpm --filter studio exec vitest run
tests/components/Database/Roles.test.tsx`.

## Checklist

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [ ] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
— not applicable; this changes Studio UI and tests.
2026-10-14 13:57:01 -04:00
claude[bot]andClaude 4c7014745c feat(studio): add custom OIDC option to third-party auth providers (#51612)
<!-- claude-slack-attribution -->
_Requested by **Stojan Dimitrovski** · [Slack
thread](https://supabase.slack.com/archives/C022071RB2L/p1791475016175969?thread_ts=1791475016.175969&cid=C022071RB2L)_

## Problem

The Management API accepts any OIDC issuer for third-party auth (`POST
/v1/projects/{ref}/config/auth/third-party-auth` with
`oidc_issuer_url`), but the Dashboard only offers Firebase, Clerk,
WorkOS, Auth0 and Amazon Cognito. Users with another OIDC provider have
no way to register it from the Dashboard.

Studio also hides any issuer it does not recognize: `IntegrationCard`
returns `null` for the `custom` type, so an issuer added through the API
never shows up in the list and cannot be deleted from the Dashboard.

## Solution

- Add a "Custom OIDC" item to the Add provider menu on the Third-Party
Auth page.
- New `CreateCustomOidcDialog` with a single required Issuer URL field.
It reuses `useCreateThirdPartyAuthIntegrationMutation`, so query
invalidation and the error toast behave like the other providers. The
URL is sent as typed after trimming whitespace.
- New `isValidOidcIssuerUrl` helper in `ThirdPartyAuthForm.utils.ts`:
the value must be an `https://` URL with a host, no query string, no
fragment, and no embedded credentials.
- The dialog copy is kept short: a one-line description and a single
helper line noting that signing keys are found at the issuer's
`/.well-known/openid-configuration`.
- `IntegrationCard` now renders custom issuers (badge-check icon,
"Custom OIDC" label, Issuer URL, Delete integration) instead of hiding
them. Delete uses the existing flow and permission check.
- The `custom` label changes from "Custom" to "Custom OIDC".
- New docs page
`apps/docs/content/guides/auth/third-party/custom-oidc.mdx` (served at
`/docs/guides/auth/third-party/custom-oidc`). It covers the Dashboard
flow, the Management API alternative, the `role` claim, client setup,
and RLS. It is linked from the third-party auth overview and added to
the docs sidebar. This supersedes the draft docs PR #51611.

Not included: UI for `jwks_url` and `custom_jwks`. The page and menu
keep the same feature gate (`authentication:third_party_auth`) and the
same permission checks as the other providers.

Before: the Add provider menu lists five providers. An issuer that is
not one of them is registered only through the API and does not appear
in the Dashboard.

After: the menu has a sixth item, Custom OIDC. It opens a dialog that
takes an issuer URL, rejects non-HTTPS values with an inline message,
and registers the issuer. The new provider appears in the list and can
be deleted from there.

## Review instructions

1. Open a project's Authentication > Third-Party Auth page and open Add
provider. Check for the new Custom OIDC item.
2. Enter `http://example.com` and submit. The field shows an inline
error and no request is sent.
3. Enter a valid HTTPS issuer URL that serves an OIDC discovery document
and submit. A success toast appears and the provider shows in the list
as Custom OIDC with its Issuer URL.
4. Enter an issuer the API rejects. The API error shows in the existing
error toast and the dialog stays open.
5. Delete the provider with Delete integration and confirm it disappears
from the list.
6. Read the new docs page and check that its Dashboard steps match the
UI.

Local checks:

- `vitest --run components/interfaces/Auth/ThirdPartyAuthForm`: 20 tests
pass (validation helper unit tests plus dialog component tests with
MSW).
- `tsc --noEmit` in `apps/studio`: no new errors.
- ESLint on the directory: no warnings in the new or changed code.
- Prettier is clean on the changed files, including the docs page. The
typos check is clean on the docs page and overview.

I did not run the dialog in a browser against a real project, so there
are no screenshots. The docs app was not built or rendered locally.

## Checklist

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

🤖 Generated with [Claude
Code](https://claude.ai/code/session_011HY2zckzPLcvXd28JPSqBe)

https://claude.ai/code/session_011HY2zckzPLcvXd28JPSqBe


---
_Generated by [Claude
Code](https://claude.ai/code/session_011HY2zckzPLcvXd28JPSqBe)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-14 19:01:08 +02:00
Wen Bo Xie 626f0d412a docs(branching): explain what a new branch inherits and what each push runs (#51753)
## Problem

Users ask whether the GitHub integration applies migrations and syncs
`config.toml` to a branch on its own or whether they need a GitHub
Action for it but there's no docs clarifying that.

The branching guides also does not have when a new branch inherits from
its base project, where a dashboard branch gets its schema, what the
`configure`, `migrate`, and `deploy` steps read from the repository, and
what the workflow step statuses mean.

## Solution

Added the missing facts to the four pages that already cover each topic,
with no new pages and no moved headings.

- Overview: a "What a new branch starts with" section listing the copied
settings, the placeholder Auth secrets, the webhook default, and where
each branch kind gets its schema.
- GitHub integration: a "What runs on each push" subsection that answers
the FDBKIN-11978 question directly, the `config.toml` sections the
configure step applies and the protected-branch rule, two migrate edge
cases and the `[db.migrations]` switch, and a new "Edge Functions"
subsection on copy-from-base and checksum skips.
- Dashboard: "Where a dashboard branch gets its schema".
- Troubleshooting: the step status table and two new causes under
"Config.toml not applying".

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
2026-10-14 15:56:15 +00:00
Kody Jackson 21934397ca feat(changelog) - add structured data to entries (#51496)
## Problem

The current entries at `/changelog` have no [structured
metadata](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)
about any of the pages, which can be important for LLM-indexing.

## Solution

Adds:
- a `techArticle` and `breadcrumb` schema items to the changelog
entries.
- adds `CollectionPage` and `Breadcrumb` schemas to `/changelog` itself

## Preview links

### Changelog entries


https://zone-www-dot-com-git-kody-devrel-696-changelog-4b1bb5-supabase.vercel.app/changelog/status-page-migration

Validates fine at
https://validator.schema.org/#url=https%3A%2F%2Fzone-www-dot-com-git-kody-devrel-696-changelog-4b1bb5-supabase.vercel.app%2Fchangelog%2Fstatus-page-migration

<img width="1095" height="492" alt="Screenshot 2026-10-09 at 2 35 30 PM"
src="https://github.com/user-attachments/assets/6d8d4890-5eb7-458b-addb-935c25e2df2b"
/>

### Changelog listing


https://zone-www-dot-com-git-kody-devrel-696-changelog-4b1bb5-supabase.vercel.app/changelog

Validation at
[schema.org](https://validator.schema.org/#url=https%3A%2F%2Fzone-www-dot-com-git-kody-devrel-696-changelog-4b1bb5-supabase.vercel.app%2Fchangelog).

<img width="1101" height="751" alt="image"
src="https://github.com/user-attachments/assets/305a25d3-06ea-46c9-990e-6cdc4ae771cf"
/>
2026-10-14 10:44:06 -05:00
Wen Bo Xie d46e226af8 docs(cli): update local stack guides for CLI v2.120.0 and v2.121.0 behavior (#51751)
## Problem

The two `supabase stack` guides describe behavior the CLI changed in
v2.120.0 (Oct 6) and v2.121.0 (deploy PR supabase/cli#7104 open). A
reader following them today hits different output than the pages
promise.

  | Guide says | CLI does | Since |
  | --- | --- | --- |
| `stack logs` streams live lines only, no history | Keeps history, adds
`--tail`, `--since`, `--service gateway`, reads while stopped
(supabase/cli#6893) | v2.120.0 |
| Rejected config change fails with `cannot change on the saved stack` |
Fails with `The saved stack cannot adopt these changes`
(supabase/cli#6944) | v2.120.0 |
| Port changes always need a new local project | A stopped project
re-plans ports on next start (supabase/cli#6950) | v2.121.0 |
| No bulk destroy | `destroy` accepts repeated `--stack-id`
(supabase/cli#7000) | v2.121.0 |
| OrioleDB unsupported | `db.orioledb_version` runs in both runtimes
(supabase/cli#6934) | v2.121.0 |
| Nothing about native `pg_cron` | Jobs run in background workers;
earlier versions fail every job (supabase/cli#7039) | v2.121.0 |

The CLI getting-started guide (#50736) also says a container runtime is
required and never mentions the native runtime.

  ## Solution

Updated both stack guides and added one sentence to the getting-started
prerequisites.

- v2.121.0-only behavior is marked "In CLI v2.121.0 or later", with the
earlier behavior stated beside it. The guides' baseline stays at
v2.119.0.
- Every claim was checked against supabase/cli `develop` source and the
commits above.
- The `supabase stack` commands stay out of the generated CLI reference
by design, so these guides remain the only place the flags are
documented.

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
2026-10-14 16:45:07 +02:00
Charis cd6afdd8b2 refactor(studio): add tool contracts and migrate update_notebook (#51626)
## Summary

Each assistant tool's identity and contract is currently written in up
to nine places that nothing ties together at compile time. This PR adds
a contract/server split and migrates `update_notebook`, the tool with
the most copies, as the first proof of the design.

- **Contract** (`lib/ai/tools/update-notebook.ts`): isomorphic file with
the input and output schemas, approval flag, minimum opt-in level, and
`toModelOutput`, the single rule for what the model may see.
- **Server** (`update-notebook.server.ts`): the executable tool, built
with `approvalGatedToolFromContract`.
- **Registry** (`registry.ts`): collects contracts, derives a typed
`StudioUIMessage`, and provides `sanitizeContractPart` for history
replay.
- **Shared types** (`types.ts`): `ToolContract`, `ToolContext`,
`ToolFactory`, plus a single `getAuthHeaders` replacing three variants.
- **Approval gate** (`approval-gate.ts`): approval-gated tools get
`acceptUntrustedSql` / `acceptUntrustedLogsSql` through a gate passed to
`execute`, and `*.server.ts` files can't import the raw functions
(ESLint).
- **Opt-in level**: `update_notebook` is gated by its contract's
`minOptInLevel`. `TOOL_CATEGORY_MAP` is now typed against `ToolName` and
excludes migrated tools, which exposed `get_active_incidents` missing
from the name enum.

Removed duplicates: the `update_notebook` sanitizer in
`tool-sanitizer.ts`, the client-side `stripNotebookSnapshot`, and the
copied update schemas in `Message.utils.ts`.

## Behavior changes

- The client no longer strips `previous_content` from `update_notebook`
outputs before sending history, so requests carry the previous notebook
snapshot. The server still strips it before the model sees it.
- On history replay, an `update_notebook` output that doesn't match its
schema is dropped instead of passed through minus `previous_content`.

## Testing

- New `registry.test.ts` (typed parts, replay sanitizer) and a contract
case in `tool-filter.test.ts`.
- Studio typecheck, lint ratchet, knip, Prettier and the affected vitest
suites pass.
2026-10-14 10:44:38 -04:00
Luiz Felipe Machado 7767e1ab6e fix(self-hosted): update Functions auth smoke tests and preserve Storage .gitkeep (#51108) 2026-10-14 15:52:01 +02:00
Crispy 427d5f4681 chore: catch you all later (#51746)
Bye!
2026-10-14 13:49:10 +00:00
Inder Singh 31a74e8663 fix(self-hosted): align OAuth and OIDC discovery api-gw routes with the platform (#51493) 2026-10-14 15:47:45 +02:00
Kody JacksonandCodesmith 2d7e5f57ed chore(docs / www) - update video links to latest DevRel videos where applicable (#51606)
## Problem

Several outdated (or missing) video references across docs and www apps.

## Solution

Updates these links (and adds where appropriate) to link out to the
newer series on Supabase by @dshukertjr and individual videos by
@dijonmusters

## Preview links


[docs](https://docs-git-kody-devrel-708-update-video-links-supabase.vercel.app/docs)

[www](https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/)

## Review instructions

For marketing folks specifically, sanity check on the
[changes](https://github.com/supabase/supabase/pull/51606/changes#diff-1fb413a22e16c9b7b200e47aa9661c8be240a52a06276ed04c450e3d92c9a12a)
to the features.tsx file, which render to:



Page | Before (live) | After (preview)
-- | -- | --
vector-database | https://supabase.com/features/vector-database |
https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/features/vector-database
realtime-postgres-changes |
https://supabase.com/features/realtime-postgres-changes |
https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/features/realtime-postgres-changes
realtime-broadcast | https://supabase.com/features/realtime-broadcast |
https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/features/realtime-broadcast
realtime-presence | https://supabase.com/features/realtime-presence |
https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/features/realtime-presence
deno-edge-functions | https://supabase.com/features/deno-edge-functions
|
https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/features/deno-edge-functions
cli | https://supabase.com/features/cli |
https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/features/cli
role-based-access-control |
https://supabase.com/features/role-based-access-control |
https://zone-www-dot-com-git-kody-devrel-708-update-vid-8e2d6a-supabase.vercel.app/features/role-based-access-control

---------

Co-authored-by: Codesmith <codesmith-bot@users.noreply.github.com>
2026-10-14 08:27:19 -05:00
Paul Cioanca 83ee918e80 chore: remove redundant personnel (#51663)
* Some things are harder to delete than others
* No breaking changes expected

---

<img width="498" height="482" alt="gif"
src="https://github.com/user-attachments/assets/a33ff7da-2815-438d-ac7b-d6b2f91c8404"
/>
2026-10-14 13:06:32 +00:00
Alex Gercog 0f618d8efb fix(mcp): use native HTTP for Devin MCP connections (#51646)
## Problem

The Devin Desktop preset wraps Supabase MCP URLs in `npx -y mcp-remote`,
although Devin Local and Devin CLI support Streamable HTTP natively.
Connecting therefore adds a Node/npm bridge that the client does not
need. The preset also lacks Devin-specific setup and authentication
instructions.

## Solution

Use the existing native `url` configuration for Devin:

```json
{
  "mcpServers": {
    "supabase": {
      "url": "https://mcp.supabase.com/mcp"
    }
  }
}
```

The generated URL retains the selected project, read-only mode, and
features. The internal `windsurf` key is preserved.

Add shared setup instructions for the configuration panel and generated
Markdown: user-scope installation, the Windows config file location next
to the shared macOS/Linux one, a re-authentication command for hosted
connections, and loading tools in a new Devin Local or CLI session.
Local connections omit the re-authentication step.

Include Devin in the shared client URL round-trip test. The Devin-only
test files from the first revision were removed in review so that tests
stay shared across clients.

Native configuration follows the official [Devin MCP
documentation](https://docs.devin.ai/cli/extensibility/mcp/configuration)
and [Devin Local
integration](https://docs.devin.ai/desktop/devin-local).

## Validation

- **273 tests passed** across 28 `ui-patterns` test files on the current
revision; 34 of them in the MCP section.
- Package typechecking, Prettier on the four changed files, and `git
diff --check` passed.
- **Devin CLI 3000.11.3:** native HTTP initialization and tool
discovery; synthetic OAuth with S256 PKCE and authenticated tool
discovery using a saved token.
- **Devin Desktop 3.10.48 / bundled Devin Local 3000.10.48:** the server
card showed `Connected` and the fixture tool. Its `tools/list` request
came from the bundled Devin Local process.

OAuth validation used controlled local fixtures; live Supabase Hosted
authorization was not exercised. The full monorepo application build was
not run.

## Review instructions

1. Run `pnpm --filter ui-patterns exec vitest run src/McpUrlBuilder` and
`pnpm --filter ui-patterns typecheck`.
2. Select **Devin Desktop** in the MCP configuration panel. Confirm that
the JSON uses `url` and preserves the selected project, read-only mode,
and features.
3. Switch to the local connection. Confirm that Hosted login
instructions disappear. Check that generated Markdown explicitly limits
that login step to Hosted connections.

## Checklist

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [ ] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide).
N/A: no docs topic edited; the change is in the shared MCP configuration
component and its generated instructions.
2026-10-14 15:19:04 +03:00
Joshen Lim 09a1f431bc Mass update for all lucide icon imports to use the component with Icon suffix (#51659)
## Context

This is largely just a mechanical change here:
Opting to use lucide icons with the `Icon` suffix across all icon
imports within `studio`
- so that it’s clearer which components are icons + reduces the
possibility of name collision with our own components
- e.g <User /> vs <UserIcon />

Also added a eslint rule for this:
<img width="1069" height="167" alt="image"
src="https://github.com/user-attachments/assets/7f36f443-5ca2-4bf6-8d22-86e774513bfc"
/>

And updated `AGENTS.md` as such:
```
Icons come from `lucide-react`, always imported with the `Icon` suffix (`import { CheckIcon, Trash2Icon } from 'lucide-react'`) — never the bare names (`Check`) or `Check as CheckIcon` aliases (lint-enforced).
```
2026-10-14 12:56:55 +02:00
21f7e306ee docs(cli): align declarative schema and diff engine docs with CLI behavior (#51609)
## Problem

Four docs pages describe CLI behavior that v2.120.0 no longer has. A
reader following them hits a wrong result in three places.

- The declarative guide tells legacy-engine users who ran `db pull
--declarative` to delete the exported tree. The command also rewrites
`[db.migrations].schema_paths` in `config.toml`, so `db diff` keeps
failing after the delete. The guide also claims the failure happens "on
the first file". The code does not guarantee that.
- The declarative directory moved from `supabase/database` to
`supabase/schemas` in v2.115.0. The CLI warns when it finds a tree at
the old path. No page mentions the move or the warning, and the `db
schema declarative sync` example in the command reference still prints
the old path.
- The command reference marks `--experimental` as required on the
declarative commands. `[experimental.pgdelta] enabled = true` also
unlocks them.

Two smaller gaps: the diff engines page shows how to fall back to
`migra` for one run but not how to try `pg-delta` for one run, and the
guide omits the note `db diff -f` prints when it ignores schema files.

Every claim was checked against the CLI source on `develop` and the
v2.120.0 tag.

## Solution

Docs-only change. Four files, 17 insertions, 8 deletions.

- `declarative-database-schemas.mdx`: corrects the legacy caution,
documents the pre-2.115.0 directory and its warning, adds the `db diff
-f` note.
- `diff-engines.mdx`: adds the single-run opt-in table (`db diff
--use-pg-delta`, `db pull --diff-engine pg-delta`, `--experimental` for
the declarative commands) and the `SUPABASE_EXPERIMENTAL_PG_DELTA`
override. Updates the legacy `db pull --declarative` row. Prettier
realigned the comparison table, which accounts for most of that page's
diff.
- `cli_v1_config.yaml`: `schema_paths` notes the automatic rewrite on
`migra` and the warning on `pg-delta`. `declarative_schema_path` notes
the pre-2.115.0 default.
- `cli_v1_commands.yaml`: fixes the example path and drops `required:
true` from `--experimental` on the two declarative commands. Both match
the spec the CLI generator produces from `develop`.

The command reference is generated from the CLI repo, so the same fixes
are in supabase/cli as a separate PR. Without that, the next release's
reference update reverts them here.

## Review instructions

1. Open the preview for
`/docs/guides/local-development/declarative-database-schemas` and search
for "schema_paths". The legacy caution should say the command rewrites
the setting and tell readers to remove it.
2. On the same page, search for "2.115.0". The directory note should
name the version and both fixes.
3. Open the preview for `/docs/guides/local-development/diff-engines`
and search for "single run". The opt-in table should render, and the
comparison table below it should still align.
4. Open the CLI reference for `db schema declarative sync`. The second
example should print `supabase/schemas`, and `--experimental` should not
show as required.
5. Open the config reference entries for `db.migrations.schema_paths`
and `experimental.pgdelta.declarative_schema_path` and read the added
sentences.
6. Optional source check in supabase/cli `develop`:
`updateDeclarativeSchemaPathsConfig` in
`apps/cli/src/commands/db/shared/pgdelta.write.ts` and
`apps/cli/src/commands/db/schema/declarative/declarative.former-default.ts`
back the two main claims.

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

---------

Co-authored-by: avallete <andrew.valleteau@supabase.io>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:53:16 +00:00
Wendie CheungandClaude Sonnet 5.5 9aea81c3b7 fix(www): rename Enterprise "Designated Support manager" to "Technical Account Management" (#51628)
## What kind of change does this PR introduce?

Copy fix on the pricing page.

## What is the current behavior?

The Enterprise tier on supabase.com/pricing lists "Designated Support
manager". We can't offer a dedicated support manager for tickets, but
all Enterprise customers do get access to the Technical Account
Management (TAM) service.

## What is the new behavior?

The Enterprise feature reads "Technical Account Management"
(`packages/shared-data/plans.ts`).

## Additional context

Requested by Brad Gyger in Slack. Not changed in this PR (different
copy, flagging for follow-up): the "Designated support" row in
`packages/shared-data/pricing.ts`, the "Designated support team, account
manager and technical specialist" description in
`apps/www/components/Pricing/PricingComparisonTable.tsx`, and
"Designated Support" in `apps/www/data/PricingAddOnTable.json`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 21:29:40 +11:00
Anthony Lio 0fe320e5e3 chore: shiki velite migration (#51579)
## Problem

design-system, ui-library and learn highlight code through
`@shikijs/compat` and `rehype-pretty-code` 0.9, which both predate shiki
1

compat has no v4 release, so these apps were stuck on shiki 1.6 and
couldn't pick up the injection fix from the previous pr

## Solution

- drops `@shikijs/compat`
- moves all three apps to `rehype-pretty-code`

<!--
## Preview links

If relevant, include links to changed pages for easy review access.

Copy the preview base URL from the Vercel bot comment on this PR. Use
the following table as an example template.

| Site | Live | Preview | Search for |
| -------------- |
-------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------
| ----------------------------- |
| WWW | [/blog/your-post](https://supabase.com/blog/your-post) |
[/blog/your-post](https://zone-www-dot-com-git-branch-name-supabase.vercel.app/blog/your-post)
| unique phrase from the change |
| Docs |
[/docs/guides/your-page](https://supabase.com/docs/guides/your-page) |
[/docs/guides/your-page](https://docs-git-branch-name-supabase.vercel.app/docs/guides/your-page)
| unique phrase from the change |
| Studio | [/dashboard](https://supabase.com/dashboard) |
[/dashboard](https://studio-git-branch-name-supabase.vercel.app/dashboard)
| unique phrase from the change |
| Design system | [/design-system](https://supabase.com/design-system) |
[/design-system](https://design-system-git-branch-name-supabase.vercel.app/design-system)
| unique phrase from the change |
| UI library | [/library](https://supabase.com/library) |
[/library](https://ui-library-git-branch-name-supabase.vercel.app/library)
| unique phrase from the change |
| Knowledge base |
[/kb/guides/your-page](https://supabase.com/kb/guides/your-page) |
[/kb/guides/your-page](https://kb-git-branch-name-supabase.vercel.app/kb/guides/your-page)
| unique phrase from the change |
-->

<!-- ## Additional context

Optionally add any other context or screenshots.

-->

## Review instructions

1. open
[/design-system/docs/accessibility](https://design-system-gd7xzujta-supabase.vercel.app/design-system/docs/accessibility)
on the preview and on production side by side _ highlighted lines should
keep the left border and background, and line numbers should line up
2. open
[/design-system/docs/components/chart](https://design-system-gd7xzujta-supabase.vercel.app/design-system/docs/components/chart)
_ highlighted words should have the gray pill, with no yellow background
or black text + code blocks with titles should still show the title
above the block
3. toggle light and dark mode on both pages _ token colors and the block
background should match production
4. open [ui-library
preview](https://ui-library-hmuv1teie-supabase.vercel.app/library/docs/starters/nextjs-starter)
and do a copy check
5. open a learn lesson with code `/foundations/authentication` and
compare it with production.

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
2026-10-14 12:46:03 +03:00
Anthony Lio 4b93c5186d chore: bump shiki and catalog entry (#51578)
## Problem

monorepo resolved four different shiki majors _ shiki was never added to
the pnpm catalog so each app kept whatever version it started with.

shiki 4.5.0 stops grammar injections from being registered again on
every language load (shikijs/shiki#1318) and docs worked around the same
problem locally in #50501

## Solution

- adds `shiki: ^4.5.0` to the catalog and points docs, www and marketing
at it
- docs preload guard from #50501 stays but will be ff by moving docs to
lazy language loading in another pr

<!--
## Preview links

If relevant, include links to changed pages for easy review access.

Copy the preview base URL from the Vercel bot comment on this PR. Use
the following table as an example template.

| Site | Live | Preview | Search for |
| -------------- |
-------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------
| ----------------------------- |
| WWW | [/blog/your-post](https://supabase.com/blog/your-post) |
[/blog/your-post](https://zone-www-dot-com-git-branch-name-supabase.vercel.app/blog/your-post)
| unique phrase from the change |
| Docs |
[/docs/guides/your-page](https://supabase.com/docs/guides/your-page) |
[/docs/guides/your-page](https://docs-git-branch-name-supabase.vercel.app/docs/guides/your-page)
| unique phrase from the change |
| Studio | [/dashboard](https://supabase.com/dashboard) |
[/dashboard](https://studio-git-branch-name-supabase.vercel.app/dashboard)
| unique phrase from the change |
| Design system | [/design-system](https://supabase.com/design-system) |
[/design-system](https://design-system-git-branch-name-supabase.vercel.app/design-system)
| unique phrase from the change |
| UI library | [/library](https://supabase.com/library) |
[/library](https://ui-library-git-branch-name-supabase.vercel.app/library)
| unique phrase from the change |
| Knowledge base |
[/kb/guides/your-page](https://supabase.com/kb/guides/your-page) |
[/kb/guides/your-page](https://kb-git-branch-name-supabase.vercel.app/kb/guides/your-page)
| unique phrase from the change |
-->

<!-- ## Additional context

Optionally add any other context or screenshots.

-->

## Review instructions

1. open `/docs/guides/database/full-text-search` on the docs preview and
on production side by side _ sql, js, dart and python blocks should have
the same colors in light and dark mode
2. hover a function name in one of the js blocks on that page, the type
popover should still show
3. open the www preview home page, scroll to the frameworks section and
switch a few tabs _ code should be highlighted.
4. open `/go/supabase-stripe-projects` on the www preview _ code block
section should be highlighted the same as production

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
2026-10-14 12:46:03 +03:00
Brian-AnandDanny White f1082e28c7 chore: migrate Framer Motion imports to Motion (#51520)
## Problem

Closes #31221.
The applications and shared UI packages still import the former
`framer-motion` package instead of Motion's React entry point.

## Solution

Replace runtime imports, type imports, and three test mocks with
`motion/react` across the consuming workspaces.
Replace the seven direct dependency declarations with `motion:
^11.18.2`.
Preserve the existing animation engine version and all other dependency
resolutions, including the asynchronous `domMax` feature loader.
Historical blog examples remain as published; `framer-motion` remains a
transitive implementation dependency of Motion.

## Review instructions

1. Run `pnpm install --frozen-lockfile` and check the seven dependency
replacements in the lockfile.
2. Open the WWW Auth page and Docs homepage at desktop and mobile
widths, with normal and reduced motion preferences.
3. Open the mobile navigation, expand Product on WWW, and close the menu
using Escape and the close button.
4. Check the existing animation components, shared form validation, and
Studio tests for unchanged behavior.

Validation:

- Studio: 731 test files, 8,334 passing tests and one expected failure,
with `--maxWorkers=4`.
- Shared UI, UI patterns, WWW, and UI library: 615 passing tests.
- `pnpm run typecheck --concurrency=1`: all 16 repository tasks pass.
- All six application source lint scripts and lint ratchets pass;
generated Docs example copies are excluded from local lint.
- Repository Prettier source check, lockfile formatting, and case hazard
check pass.
- WWW: 10 existing end-to-end checks across nine pages.
- Docs: 5 existing guide link and accessibility checks across Database
and Auth.
- WWW and Docs mobile navigation pass at desktop/mobile sizes with
normal/reduced motion; SQL-to-REST translation tabs exercise the
asynchronous feature loader without browser errors.
- Frozen-lockfile installation passes; all existing package and snapshot
resolutions are unchanged.
- Learn and UI library command palettes open, filter results, and close
with Escape without browser errors.
- Independent code review finds no actionable defects.
- `npm run build -- --filter=www --filter=docs --filter=studio
--filter=learn --filter=library --concurrency=1 --continue=always`: all
five affected applications build successfully (9 tasks including
prerequisites); asset uploads disabled for local validation.

## Checklist

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
(no docs topics changed)

---------

Co-authored-by: Danny White <3104761+dnywh@users.noreply.github.com>
2026-10-14 07:16:00 +00:00
Danny White 7fa436050a refactor(studio): compose the pipeline data section for wizard reuse (#51572)
## Problem

The pipeline wizard in #49243 needs publication, initial sync and
replication settings together on its data step.

## Solution

Compose `PipelineDataSection` from the existing controls and use it in
preview-enabled creation. It includes the publication selector,
initial-sync controls and data advanced settings, including BigQuery
table layout.

This preserves the grouping from #51570. Preview off and editing keep
the existing layout. Validation and creation behaviour stay the same; no
wizard routing is added. Stacked on #51570.

## Review instructions

1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-data-section-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled and go to **Database →
Pipelines**. Enable **Pipeline creation wizard** in Feature Previews,
then click **Add pipeline**. Confirm **Data** follows **Destination
connection**, with publication and initial sync above its **Advanced
settings**.
2. Select a publication and change the initial-sync option. For
selected-table options, confirm the publication tables are available.
Click **New publication** in the publication selector and confirm the
existing creation panel opens, then cancel it.
3. Expand **Advanced settings** under **Data**. Confirm replication
settings appear, plus table layout for BigQuery, without connection pool
size, staleness or role. Change **Batch wait time**, collapse and reopen
the accordion, and confirm the value remains. Check desktop and phone
widths. Cancel and discard changes; no credentials or pipeline creation
are needed.
4. Turn the preview off and reopen **Add pipeline**. Confirm the
original layout remains. With the preview on, edit an existing pipeline
and confirm its original layout also remains.
2026-10-14 10:28:21 +11:00
Danny White 37fb536e6c feat(studio): group connection settings in the pipeline creation preview (#51570)
## Problem

The pipeline wizard in #49243 needs connection settings before table
selection.

## Solution

With **Pipeline creation wizard** enabled, rearrange the creation sheet
into destination selection, **Destination connection**, then **Data**.
Group name, region, credentials and connection advanced settings
together. Keep publication, initial sync, replication settings and
BigQuery table layout in the data section.

Preview off and editing keep the existing layout. Validation and
creation behaviour stay the same. This still uses the sheet; no wizard
routing is added. Stacked on #51568.

| Feature Preview Off | Feature Preview On |
| --- | --- |
| <img width="1272" height="2536" alt="CleanShot 2026-10-13 at 13 16
36@2x"
src="https://github.com/user-attachments/assets/ebad1082-b9ae-4f5e-91ad-08638ea2b032"
/> | <img width="1244" height="2538" alt="CleanShot 2026-10-13 at 13 17
20@2x"
src="https://github.com/user-attachments/assets/b5400b31-d60e-44e7-a4d6-cca1732b7974"
/> |
| _One “Advanced settings” at the bottom of the sheet that combines
everything. Destination details handles Publication and Initial sync._ |
_An “Advanced settings” accordion under BigQuery settings. Another
“Advanced settings” under Data (clipped above). Data contains fields for
Publication and Initial sync._ |

## Review instructions

1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-connectio-6d0876-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled and click **Add pipeline**.
Enable **Pipeline creation wizard** in Feature Previews, then reopen the
sheet. Confirm the order is destination cards → connection → data.
2. With BigQuery selected, expand **Advanced settings** under
**Destination connection**. Confirm it contains pool size and staleness.
Expand **Advanced settings** under **Data** below publication and
initial sync. Confirm it contains replication settings and table layout,
without duplicate connection fields. Change a value and collapse/reopen
the accordion; confirm it remains.
3. If available, select DuckLake or Snowflake. Confirm their connection
accordion contains **Pool size** or **Role**, respectively. ClickHouse
and Analytics Bucket have no connection accordion. Check desktop and
phone widths. Cancel and discard changes; no credentials or pipeline
creation are needed.
4. Turn the preview off and reopen **Add pipeline**. Confirm the
original layout returns. With the preview on, edit an existing pipeline
and confirm it also keeps the original layout.
2026-10-14 10:17:20 +11:00
Danny White d457ab59c7 feat(studio): add pipeline wizard destination selection (#51568)
## Problem

The pipeline creation wizard in #49243 needs a destination selection
step that can be reviewed before wizard routing lands.

## Solution

Add `PipelineDestinationSelection` with BigQuery, DuckLake, Snowflake,
ClickHouse and deprecated Analytics Bucket radio options, using Studio’s
existing destination logos. Show it in the creation sheet only when
**Pipeline creation wizard** is enabled in Feature Previews and allowed
by ConfigCat. Preview off and editing retain the existing dropdown.

This is an incremental preview: creation still uses the sheet. No wizard
routing or design-system changes are included.

| Feature Preview Off | Feature Preview On |
| --- | --- |
| <img width="1274" height="1316" alt="CleanShot 2026-10-13 at 10 39
24@2x"
src="https://github.com/user-attachments/assets/433e4fb1-5fa2-4dc3-982e-0aee6b266015"
/> | <img width="1250" height="1890" alt="CleanShot 2026-10-13 at 10 53
09@2x"
src="https://github.com/user-attachments/assets/033d7e43-1a57-4d61-90e8-9048e3560909"
/> |

## Review instructions

1. Open the [preview to Database →
Pipelines](https://studio-staging-git-dnywh-featpipeline-destinati-54dc7d-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled and click **Add pipeline**.
With **Pipeline creation wizard** off, confirm the existing destination
dropdown appears.
2. Close the sheet, enable **Pipeline creation wizard** in Feature
Previews and reopen **Add pipeline**. Confirm radio cards replace the
dropdown, with BigQuery selected initially and only destinations
available to your project shown.
3. If Analytics Bucket is available, confirm its card has a
**DEPRECATED** badge. Select it and confirm the bucket fields appear and
the description below says **Destination type cannot be changed after
creation. Analytics Bucket is deprecated.** Click another destination.
Confirm only one card is selected and the connection fields below switch
to that destination. Use arrow keys to move focus and Space to select a
destination. Check at desktop and phone widths. Cancel and discard
changes; no credentials or pipeline creation are needed.
4. With the preview still on, open an existing pipeline for editing.
Confirm its destination dropdown remains locked. Turn the preview off
and reopen **Add pipeline** to confirm the original dropdown returns.
2026-10-14 09:59:48 +11:00
Kody Jackson 3910dda149 chore(docs) - update vercel marketplace mention (#51617)
## Problem

outdated placeholder for the `vercel marketplace` navigation. this is
now live

## Preview URL


https://docs-git-docs-chore-update-vercel-marketplace-mention-supabase.vercel.app/docs/guides/integrations/vercel-marketplace#via-vercel-marketplace
2026-10-13 15:35:40 -07:00
Gonzalo ServatandCopilot App 7642d1c4a4 chore(docs): add Gonzalo Servat to humans.txt (#51581)
## Problem

I recently joined Supabase as part of the Container Engineering team,
and adding myself to `humans.txt` is one of my onboarding tasks.

## Solution

Add my full name, Gonzalo Servat, to the team list in alphabetical
order, between Giuseppe Mandato and Greg Kress.

## Review instructions

1. Confirm Gonzalo Servat appears between Giuseppe Mandato and Greg
Kress.
2. Confirm the rest of the list is unchanged.

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [ ] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-13 15:07:51 -07:00
Jeremias Menichelli e4bf448352 chore: Rotate GH app env vars name (#51627) 2026-10-13 18:40:34 -03:00
Ana 9ced729c39 Revert "docs(blog): add blog post for .NET SDK v8.0.0" (#51625)
Reverts supabase/supabase#50001
2026-10-13 21:03:03 +00:00
Ana 1dffb467cf Revert "docs: add introduction blog post for .NET SDK" (#51624)
Reverts supabase/supabase#50209
2026-10-13 21:02:29 +00:00
supabase-vercel-tedd[bot] 78eb416b03 chore: remove marketing as KB codeowner (#51622)
## Problem

#51196 added `/apps/kb/` to CODEOWNERS with both `@supabase/docs` and
`@supabase/marketing`. Because of that, every knowledge base change also
asks marketing for review. Marketing should not be a required reviewer
for KB.

## Solution

Remove `@supabase/marketing` from the `/apps/kb/` line only.
`@supabase/docs` still owns KB. All other CODEOWNERS entries, including
marketing's `/apps/www/` ownership, are unchanged.

```diff
-/apps/kb/ @supabase/docs @supabase/marketing
+/apps/kb/ @supabase/docs
```

## Review instructions

1. Check that the diff is a single line in `.github/CODEOWNERS`.
2. Confirm `/apps/kb/` is still owned by `@supabase/docs`.
3. Optional: `gh api
repos/supabase/supabase/codeowners/errors?ref=tedd/remove-marketing-kb-codeowner`
returns no errors.

## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [ ] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

Co-authored-by: supabase-vercel-tedd[bot] <336548405+supabase-vercel-tedd[bot]@users.noreply.github.com>
2026-10-13 20:49:14 +00:00
Jeremias Menichelli 9f7d28058b chore: Rotate env vars name correctly (#51619) 2026-10-13 17:24:16 -03:00
2043400335 chore(www): update Declarative Schemas feature entry for pg-delta (#51588)
## Problem

Declarative schemas now runs on `pg-delta`. The Declarative Schemas
entry on the features page still describes the old diff flow: it points
readers to `supabase db diff`, says migrations come from the current
database state, and tells readers to use `supabase db dump` to start
from an existing project.

## Solution

Updates the `declarative-schemas` entry in `apps/www/data/features.tsx`:

- Adds a paragraph after the intro saying the feature now runs on
`pg-delta`, that it is in alpha, and how to opt in.
- Updates key benefit 5 to list grants, partitions, publications, and
domains, and extension-managed objects.
- Replaces the `supabase db diff` integration bullet with `supabase db
schema declarative sync`.
- Updates the intro bullet and three FAQ answers to match the current
docs: how migrations are generated, whether readers write their own
migration files, and how to start from an existing project (`supabase db
schema declarative generate --linked`, with `supabase db dump` kept for
the legacy engine).

The entry's status stays `PRODUCT_STAGES.GA`. The feature is GA and only
the new engine is alpha, and the new paragraph says so.

This should merge with or after the launch blog post (#51571), so the
page doesn't get ahead of the announcement.

## Preview links

| Site | Live | Preview | Search for |
| ---- | ---- | ------- | ---------- |
| WWW |
[/features/declarative-schemas](https://supabase.com/features/declarative-schemas)
| Vercel bot comment on this PR, `/features/declarative-schemas` | `now
runs on` |

## Review instructions

1. Open the live and preview links side by side.
2. Check that the new paragraph appears after the intro and renders its
inline code.
3. Check that key benefit 5 and the CLI integration bullet use the new
text.
4. Check the three updated FAQ answers: how declarative schemas differ
from migrations, whether you write your own migration files, and using
declarative schemas with an existing project.
5. Confirm the status badge still reads General Availability.

## Checklist

Check all before review:

- [ ] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [ ] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Wendie Cheung <wendie.cheung@supabase.io>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: Wen Bo Xie <wenbox323@gmail.com>
2026-10-14 07:02:22 +11:00
6f23988169 feat(blog): add Declarative Schemas 2.0 with pg-delta post (#51571)
## Problem

Declarative Schemas 2.0 runs on `pg-delta`. It needs a launch blog post.

## Solution

Adds `apps/www/_blog/2026-10-13-declarative-schemas-2-0-pg-delta.mdx`,
which will publish at `/blog/declarative-schemas-2-0-pg-delta`.

The post covers why the diff engine was rebuilt, what the new diff
covers, how to turn it on, a four-step walkthrough, and what stays out
of scope.

Adds the social and thumbnail images in
`apps/www/public/images/blog/select-rewind-2026-declarative-schemas-2-blog/`
(`og.png`, `thumb.png`) and references them from `imgSocial` and
`imgThumb`.

## Preview links

| Site | Live | Preview | Search for |
| ---- | ---- | ------- | ---------- |
| WWW | Not live yet |
[/blog/declarative-schemas-2-0-pg-delta](https://zone-www-dot-com-git-wendiecheung-declarative-s-817801-supabase.vercel.app/blog/declarative-schemas-2-0-pg-delta)
| `Declarative Schemas 2.0` |

## Review instructions

1. Open the preview link.
2. Check that the comparison table, code blocks, and links render.
3. Check that the post shows its thumbnail on `/blog` and its social
image in the page metadata.
4. Confirm the frontmatter: title, description, authors (`avallete`,
`wenbo`), date, tags, and images.

## Checklist

Check all before review:

- [ ] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [ ] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Wendie Cheung <wendie.cheung@supabase.io>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: Wen Bo Xie <wenbox323@gmail.com>
Co-authored-by: Prashant Sridharan <prashant_sridharan@hotmail.com>
2026-10-14 06:59:22 +11:00
Jeremias Menichelli 05396e3378 [DOCS-1422] feat: create GitHub workflow or script to fetch troubleshooting (#51365)
## Problem

Currently troubleshooting guides merged in a private repository trigger
an action to open a PR against our Docs project.

From now on, we want the `kb` to host the troubleshooting guides and
take care of all the Github discussion process while improving some of
its parts.

## Solution

With this PR now:
- All files and scripts related to handling the actions and processes
for handling troubleshooting entries and GitHub Discussion creation on
Docs are deleted.
- A new workflow to sync troubleshooting guides with Supabase's
`troubleshooting_entries` table was created with some improvements.
- Now troubleshooting entries are fetched at pre-build in `kb` project
directory.
- When troubleshooting guides are created a new script detects this,
creates the GitHub discussion for it, extracts the URL, and pushes the
row to a db table at `push`.
- When troubleshooting guides are updated, a checksum holding its title
and body is compared, and the GitHub discussion content gets updated.
 
_Note: all troubleshooting content hasn't been migrated for **kb**, so
content not ready is filtered and not placed in the directory. This
allow us to progressively migrate all pages without breaking the build._

<!--
## Preview links

If relevant, include links to changed pages for easy review access.

Copy the preview base URL from the Vercel bot comment on this PR. Use
the following table as an example template.

| Site | Live | Preview | Search for |
| -------------- |
-------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------
| ----------------------------- |
| WWW | [/blog/your-post](https://supabase.com/blog/your-post) |
[/blog/your-post](https://zone-www-dot-com-git-branch-name-supabase.vercel.app/blog/your-post)
| unique phrase from the change |
| Docs |
[/docs/guides/your-page](https://supabase.com/docs/guides/your-page) |
[/docs/guides/your-page](https://docs-git-branch-name-supabase.vercel.app/docs/guides/your-page)
| unique phrase from the change |
| Studio | [/dashboard](https://supabase.com/dashboard) |
[/dashboard](https://studio-git-branch-name-supabase.vercel.app/dashboard)
| unique phrase from the change |
| Design system | [/design-system](https://supabase.com/design-system) |
[/design-system](https://design-system-git-branch-name-supabase.vercel.app/design-system)
| unique phrase from the change |
| UI library | [/library](https://supabase.com/library) |
[/library](https://ui-library-git-branch-name-supabase.vercel.app/library)
| unique phrase from the change |
| Knowledge base |
[/kb/guides/your-page](https://supabase.com/kb/guides/your-page) |
[/kb/guides/your-page](https://kb-git-branch-name-supabase.vercel.app/kb/guides/your-page)
| unique phrase from the change |
-->

<!-- ## Additional context

Optionally add any other context or screenshots.

-->

## Review instructions

For the database workflow, sadly, we will have to wait and monitor, but
the fetching mechanism can be tested.

1. Go to the preview link for `kb`
2. Go to Topics > Troubleshooting
3. A new guide should be visible "Partial migrations and schema
inconsistencies from embedded transactions", click on its link
4. A page showing the guide's content should render

<img width="1022" height="810" alt="Screenshot 2026-10-07 at 13 19 17"
src="https://github.com/user-attachments/assets/cbd25a60-8721-4329-907f-f92de894c217"
/>



## Checklist

Check all before review:

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
2026-10-13 14:30:58 -03:00
Monica Khoury eaad809abf fix: webhook retry error handling (nested error envelope + unhandled rejections) (#51591)
## What
Fixes two bugs found while writing component tests for the platform
webhooks page (follow-up to FE-3749):

1. The webhooks API nests error details under an `error` key (`{ error:
{ code, message } }`), but the shared `handleError` only reads a
top-level `message`. This meant the friendly rate-limit message ("wait a
minute and try again") never actually fired, it always fell back to a
generic error. Fixed with a local unwrapping `handleError` in
`platform-webhooks-fetchers.ts`.
2. Every mutation handler on the page (`mutateAsync` for
create/update/delete/regenerate-secret/send-test-event/retry) left the
re-thrown error from React Query uncaught, producing an unhandled
promise rejection on every failure, even though the error toast itself
was already correct. Fixed by wrapping each call in try/catch.

## Why
Found while writing the stacked test PR for FE-3749; filed as
[FE-4620](https://linear.app/supabase/issue/FE-4620/two-webhook-error-handling-bugs-found-while-writing-retryrate-limit)
since it's a correctness fix independent of the test work.

## Testing
Manually verified both fixes on localhost: rate-limit retry now shows
the friendly message, and no `Uncaught (in promise)` errors appear in
the console on any mutation failure.
2026-10-13 19:44:21 +03:00