mirror of
https://github.com/supabase/supabase.git
synced 2026-10-19 16:19:10 +03:00
9ae8432dc71af9dbefcd3500feaab01bba91ebe5
39136
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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. |
||
|
|
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) |
||
|
|
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 |
||
|
|
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>
|
||
|
|
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) |
||
|
|
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) |
||
|
|
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) |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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" /> |
||
|
|
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 🙏
|
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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> |
||
|
|
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. |
||
|
|
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.
|
||
|
|
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. |
||
|
|
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> |
||
|
|
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) |
||
|
|
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" /> |
||
|
|
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) |
||
|
|
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. |
||
|
|
7767e1ab6e | fix(self-hosted): update Functions auth smoke tests and preserve Storage .gitkeep (#51108) | ||
|
|
427d5f4681 |
chore: catch you all later (#51746)
Bye! |
||
|
|
31a74e8663 | fix(self-hosted): align OAuth and OIDC discovery api-gw routes with the platform (#51493) | ||
|
|
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> |
||
|
|
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" /> |
||
|
|
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.
|
||
|
|
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). ``` |
||
|
|
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> |
||
|
|
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> |
||
|
|
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) |
||
|
|
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) |
||
|
|
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> |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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 |
||
|
|
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> |
||
|
|
e4bf448352 | chore: Rotate GH app env vars name (#51627) | ||
|
|
9ced729c39 |
Revert "docs(blog): add blog post for .NET SDK v8.0.0" (#51625)
Reverts supabase/supabase#50001 |
||
|
|
1dffb467cf |
Revert "docs: add introduction blog post for .NET SDK" (#51624)
Reverts supabase/supabase#50209 |
||
|
|
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> |
||
|
|
9f7d28058b | chore: Rotate env vars name correctly (#51619) | ||
|
|
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> |
||
|
|
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> |
||
|
|
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) |
||
|
|
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.
|