Commit Graph
39079 Commits
Author SHA1 Message Date
Wen Bo Xie 2ba7352cfe docs: clarify declarative pg_cron job workflow (#51596)
## Problem

The declarative schemas guide does not explain how pg-delta tracks
pg_cron jobs. Its guidance that schema diffs exclude row data can also
suggest that jobs stored in cron.job are excluded.

Readers need to know where to declare jobs, how changes become
migrations, and why jobs without unique names are skipped.

## Solution

Document the declarative workflow for pg_cron jobs, including:

- Declaring jobs in SQL files under supabase/schemas/.
- Giving each job a unique name.
- Generating migrations when job declarations change or are removed.
- The scheduling and unscheduling calls emitted by the engine.

Connect the DML caveat to the extension configuration explanation so
readers understand why supported configuration rows are tracked.

Validation: Prettier, Markdown generation, and git diff --check passed.
The cron workflow was checked against source code but was not executed
in a sandbox.

## Review instructions

1. Open the declarative database schemas guide in the docs preview.
2. Read Data manipulation language and follow the extension
configuration link.
3. In Extension-managed objects, confirm that the cron guidance explains
where to declare jobs, the naming requirement, and the generated
migration behavior.
4. Follow generate and apply a migration and confirm it leads to the
existing workflow.

## 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)
2026-10-13 16:45:48 +02:00
Satya Rohith 1b1c495c6a docs: note deno.json/package.json required for .npmrc (#50320)
## Summary
- .npmrc is only read when deno.json or package.json also exists in the
function's directory. Adds a caution note to the private npm packages
section.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Documentation**
- Added a caution explaining that private NPM package configuration
requires a `deno.json` or `package.json` file in the function directory.
- Clarified that `.npmrc` is ignored when neither configuration file is
present.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-10-13 08:39:38 -06:00
ChloeGarciaMillerandandGildas Garcia e0d3489c87 fix: ESLint errors relating to accessibility in project settings (#50848)
## Problem

Some aria-label and Tooltip are missing for icon-only buttons.

The components are used in
- project settings / infrastructure
- integrations / data API / settings

## Solution

Improving accessibility by adding `aria-label` and `Tooltip`.

<!--
## 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

No visual changes have been made.

-->

## Review instructions

Provide a clear numbered procedure that the PR reviewer can walk
through.

1. Open the pages where the updated components are used
2. See that the tooltips appear correctly when interacting with the
relevant elements


## 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 references
[WORD_LIST](https://github.com/supabase/supabase/blob/master/apps/docs/WORD_LIST.md)
and the docs
[CONTRIBUTING](https://github.com/supabase/supabase/blob/master/apps/docs/CONTRIBUTING.md)
guide


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Accessibility**
* API function, schema, and table selectors have clear accessible names
and tooltips.
* Selector status summaries are announced politely by screen readers,
including schema loading states and available counts.
* **UI**
* Simplified the layout of the “Automatically expose new tables” setting
without changing its behavior.
* Corrected the transition styling on the infrastructure flow button;
its reduced-motion behavior remains unchanged.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Gildas Garcia <1122076+djhi@users.noreply.github.com>
2026-10-13 16:36:05 +02:00
claude[bot]andClaude 44ed522778 chore(studio): bump no-arbitrary-values ratchet baseline to 198 (#51594)
<!-- claude-slack-attribution -->
_Requested by **Charis Lam** · [Slack
thread](https://supabase.slack.com/archives/C0161K73J1J/p1791896774914759)_

**Before:** The `ratchet` check fails on any PR that includes current
master. The baseline for `shadcn/no-arbitrary-values` is 197, but master
has 198 since `text-[11px]` landed in `ArchivedVersionRestoreWidget.tsx`
via #51476. The baseline bot lowered it to 197 right after (#51524).

**After:** The baseline is 198, matching master, so the check passes
again.

This only changes that one rule's number (plus its per-file breakdown
entry for the widget) in
`apps/studio/.github/eslint-rule-baselines.json` and leaves the
underlying arbitrary value for its owner to fix.

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

https://claude.ai/code/session_01TsqepmwoWCXiv9BTxQK7MD

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

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 14:28:03 +00:00
Kody Jackson 9e05961079 feat(kb) - add edit page on github links to bottom of KB guides (#51268)
## Problem

The current KB guides don't have clear mappings back to their GitHub
source content, which is helpful for a) suggestions and fixes and b)
overall trust in the material we're putting out there.

## Solution

Adds in this functionality. May need to be conditionally hidden for some
areas, depending where we'd be sourcing the content from in the future.

## Preview links

-
https://kb-git-kody-market-2404-kb-add-edit-github-links-supabase.vercel.app/kb/guides/migrate-from-amazon-rds

<img width="1112" height="481" alt="Screenshot 2026-10-05 at 9 15 51 AM"
src="https://github.com/user-attachments/assets/ce95982c-27e3-48da-a6a5-9821d58e2b35"
/>
2026-10-13 09:08:37 -05:00
Mert YEREKAPANandJoshen Lim e5bc7d8fa1 chore(studio): ship fullscreen pricing panel, remove plan presentation experiment (#51554)
## Summary

The `pricingPanelPlanPresentation` experiment is concluded with
`fullscreen` as the winner. This makes it the only presentation and
removes the experiment code.

- Plan-change panel always opens as the full-screen overlay with the
pricing-page style cards.
- Removed the `control`, `parity`, `gaps` and `fullscreen-gaps`
presentations: the side-sheet shell, the original compact card, and the
"Not included" / "Plan limits" gap rows.
- Removed `plan-presentation.ts` (flag read, eligibility gate, exposure
tracking, gap lists) and its tests.
- Removed the `pricing_panel_plan_presentation_experiment_exposed` event
from `telemetry-constants.ts`.
- The panel no longer waits for PostHog flags to resolve before opening.
- `useTrackExperimentExposure` stays; it's kept across experiment gaps
in `knip.jsonc`.

**Behavior change for previously ineligible orgs:** partner-billed,
Stripe-managed, AWS Marketplace, Enterprise/Platform orgs and members
without billing write were held on `control` during the test. They now
also get the full-screen panel. Their partner-managed notices and
disabled CTAs are unchanged.

## After merge

- [ ] Archive the `pricingPanelPlanPresentation` flag and end the
experiment in PostHog.

## Test plan

- [x] `vitest` for `BillingSettings/Subscription`: 11 passing
(partner-managed messaging, full-screen shell, pricing-page cards, no
gap rows)
- [x] `tsc`: no errors in touched files
- [x] `knip --workspace apps/studio`: clean
- [ ] Preview: open `/org/[slug]/billing?panel=subscriptionPlan` for a
Free org and a partner-billed org

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

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-13 06:58:30 -07:00
Kody Jackson 6f45cf8f63 fix(docs,www) - add in redirects for high-traffic 404s (#51500)
## Problem

Missing redirects for changed paths and pages leading to an extra ~1500
404's in the past 24 hours for folks (and bots) browsing our web
properties.

## Solution

Added redirects

## Preview links


https://zone-www-dot-com-git-kody-devrel-699-high-traff-584bc9-supabase.vercel.app/
(though most of these are docs links so the behavior actually won't be
visible in the preview)
2026-10-13 08:55:38 -05:00
Joshen Lim 0f238b5296 Make project vercel integrations collapsible (#51585)
## Context

For a project that might have multiple connections to Vercel projects,
the Settings -> Integrations -> Vercel section can get really long as
we're showing the configuration fields for all projects by default

Opting to make each vercel integration a collapsible instead

Also improves the "Configure connection" CTA from org integration
settings to include an id in the URL, so that redirecting users to the
project settings integrations page will land them on the right section

### Before

Organization settings -> integrations
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/f5b9ea2c-0a95-4aff-9416-e16f853d3b8e"
/>

Project settings -> Integrations
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/361d5ac7-5919-4103-aaae-cdb5b1a1ce8c"
/>


### After

Organization settings -> integrations
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/232cfef7-affe-4f06-a019-7f86ee7805db"
/>

Project Settings -> Integrations
<img width="500" alt="image"
src="https://github.com/user-attachments/assets/c3902451-0578-4bfc-8149-2d6f9c276ebd"
/>
2026-10-13 07:52:33 -06:00
Kody Jackson eeef8d7507 feat(kb) - add optional, formatted date field to schema (#51271)
## Problem

LLMs especially are looking for freshness signals such as `published`
dates, especially high up in the content body.

## Solution

Adds a new date field in the schema and then conditionally renders it
within the GuideLayout template.

## Preview links


https://kb-git-kody-market-2505-guide-layout-date-formatted-supabase.vercel.app/kb/guides/sample-guide

<img width="1112" height="481" alt="image"
src="https://github.com/user-attachments/assets/e87fabaa-e5ec-47d4-9780-9e7fe90e16fb"
/>
2026-10-13 08:46:31 -05:00
supabase-supabase-autofixer[bot]andgithub-actions[bot] a89da5babb [bot] Decrease ESLint ratchet baselines (#51524)
Automated weekly decrease of ESLint ratchet baselines.

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-10-13 09:42:54 -04:00
claude[bot]andClaude ffef679f70 chore(docs): add hasResults to docs_search_v2_search_submitted (#51541)
<!-- claude-slack-attribution -->
_Requested by **Pam Chia** · [Slack
thread](https://supabase.slack.com/archives/C076KTY11DF/p1791767641595649?thread_ts=1791767641.595649&cid=C076KTY11DF)_

## Problem

**Before:** `docs_search_v2_search_submitted` (added in #51146) fires
when a Search V2 query settles on either the `results` or the
`noResults` state, but it only sends `query`. A search that found
nothing looks the same as one that found results, and no other Search V2
event carries the outcome, so the no-results rate for Search V2 can't be
computed.

**After:** the event also sends `hasResults`. It's `true` when the
endpoint returned at least one result and `false` when it returned none,
so zero-result searches can be counted and their queries inspected.

## Solution

- `packages/common/telemetry-constants.ts`:
`DocsSearchV2SearchSubmittedEvent` gains a doc-commented `hasResults:
boolean` property.
- `apps/docs/features/SearchV2/SearchV2Dialog.tsx`: the existing fire
site sends `hasResults: searchState.status === 'results'`. The
`useDocsSearchV2` reducer only sets `results` when the response has at
least one hit, and `noResults` otherwise, so the status is exactly the
outcome.

The change is additive: the event name and `query` are unchanged, and
the `loading`, `error`, and `initial` states still don't fire the event.

Linear:
[GROWTH-1330](https://linear.app/supabase/issue/GROWTH-1330/docs-search-v2-add-hasresults-to-docs-search-v2-search-submitted)

## Review instructions

1. Open the docs preview with the Search V2 flag query:
`?docs-search-v2=search-v2-active`.
2. Open search and type a query that returns results. In the network
tab, the `/platform/telemetry/event` request for
`docs_search_v2_search_submitted` has `custom_properties` `{ "query":
"...", "hasResults": true }`.
3. Type a query that returns nothing (for example random characters).
The event has `"hasResults": false`.

## 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)
(not applicable: no docs content changed)

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

https://claude.ai/code/session_01JaqCdU2sPkBMbaUmUPW75i

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

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-13 10:41:53 -03:00
Kody Jackson 24307c02e5 chore(kb) - add codeowner line (#51196)
## Problem

Add in formal ownership line for apps/kb w/in codeowners
2026-10-13 08:14:00 -05:00
Jordi Enric 6f36fe879b fix(studio): require an available project region FE-3884 (#51582)
## Problem

Project creation can send a request without a region, which the API
rejects. Empty region values pass frontend validation, and a failed
available-regions request fills in a static region name that cannot
resolve to a region selection.

## Fix

Keep the region selector controlled from mount and require a nonempty
value. Disable creation when available regions fail to load, guard
submission against unresolved region selections, and preserve the static
fallback for providers that use it.

Fixes
[FE-3884](https://linear.app/supabase/issue/FE-3884/project-creation-wizard-can-submit-with-an-empty-region).

## How to test

- Open the new-project form and verify the recommended region submits
without manually selecting a region.
- Submit with an empty region. Expected result: an inline validation
error appears and no project creation request is sent.
- Fail the available-regions endpoint, including after changing compute
size with a region already selected. Expected result: the region-loading
error appears, creation is disabled, and direct form submission sends no
project creation request.
- Run `pnpm --filter studio exec vitest --run
'tests/pages/new/[slug].test.tsx'
tests/pages/vercel-deploy-button-new-project.test.tsx
components/interfaces/ProjectCreation/ProjectCreation.schema.test.ts`.

Local validation: all 54 focused tests and formatting pass. Focused
ESLint has no errors. Local typecheck reports the existing image type
mismatch in InstructionBlocks.tsx; CI typecheck passed for the previous
commit.
2026-10-13 12:20:43 +02:00
ec2657e4f7 fix: Filter the version selector in the new project form by the chosen project type (#51490)
This pull request enhances the project creation flow by introducing
support for filtering Postgres versions based on the OrioleDB engine.
The main changes involve updating the `PostgresVersionSelector`
component to allow filtering for OrioleDB-specific versions, and
integrating this logic into the internal-only configuration step of
project creation. This provides a clearer and more flexible experience
when selecting Postgres versions, especially for internal or advanced
users.

**Postgres Version Selection Enhancements:**

* Added a new `useOrioleDbForCreate` prop to `PostgresVersionSelector`,
allowing the component to filter available Postgres versions to only
OrioleDB-based options or exclude them, based on user selection. The
prop defaults to `undefined` for no filtering.
[[1]](diffhunk://#diff-1842d78cb2a4be2c2b6e1581981d8111304fd9aaf0ad45df273d8c001938bcd9R41-R50)
[[2]](diffhunk://#diff-1842d78cb2a4be2c2b6e1581981d8111304fd9aaf0ad45df273d8c001938bcd9R82-R85)
[[3]](diffhunk://#diff-1842d78cb2a4be2c2b6e1581981d8111304fd9aaf0ad45df273d8c001938bcd9L92-R114)
* Added a `description` prop to `PostgresVersionSelector` for improved
UI guidance, and passed this prop through the form.
[[1]](diffhunk://#diff-1842d78cb2a4be2c2b6e1581981d8111304fd9aaf0ad45df273d8c001938bcd9R41-R50)
[[2]](diffhunk://#diff-1842d78cb2a4be2c2b6e1581981d8111304fd9aaf0ad45df273d8c001938bcd9R82-R85)
[[3]](diffhunk://#diff-1842d78cb2a4be2c2b6e1581981d8111304fd9aaf0ad45df273d8c001938bcd9L139-R161)

**Integration with Project Creation Flow:**

* Updated `InternalOnlyConfiguration` to watch the `useOrioleDb` form
field and pass its value to `PostgresVersionSelector`, ensuring the
version list is filtered appropriately during project creation. Also,
conditionally set the description to guide users toward advanced
configuration for OrioleDB.
[[1]](diffhunk://#diff-f0fa51a1cc67bb1a2c38d2c595eb3cab3a45813a027a04942d684914f2c3de93R33)
[[2]](diffhunk://#diff-f0fa51a1cc67bb1a2c38d2c595eb3cab3a45813a027a04942d684914f2c3de93R60-R65)
* Adjusted the render order in `ProjectCreationForm` to ensure advanced
configuration and internal-only configuration are displayed in a logical
sequence.

**Other Improvements:**

* Imported the `isSuccess` utility from `effect/Result` in
`PostgresVersionSelector.tsx` to support the updated logic.

---------

Co-authored-by: Alaister Young <alaister@users.noreply.github.com>
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-13 12:15:51 +02:00
kemal.earthandGildas Garcia 64a6aa9085 feat(studio): ui for oauth app create edit form (#51023)
## Problem

Extends the create and edit form for OAuth apps. Adds two toggles and
their connections.

## How to test

In _Organization Settings \ OAuth Apps_

### New app

- You should be able to create an app without toggling any of the two
new options
- Toggling any of the two new option should require a confirmation that
blocks the form submition until checked

### Existing app

**The default values for existing apps are hard coded for now**
- You should be able to update any of the app props except the _Use the
permissions of the person who connects_ option which should be disabled.
- Toggling the _Ask for specific projects_ option should require a
confirmation that blocks the form submition until checked

---------

Co-authored-by: Gildas Garcia <1122076+djhi@users.noreply.github.com>
2026-10-13 11:25:19 +02:00
Efekan 550f18b050 fix(studio): clarify authenticator app name and add direct support link during MFA sign-in (#51531)
## Problem

When users set up two-factor authentication (TOTP) in the dashboard, the
enrollment modal asks them to name their authenticator app, with the
placeholder suggesting `e.g.: Google Authenticator`. Many users keep or
type this example name without realizing it is simply a custom nickname
for the factor.

On the sign-in MFA screen (`SignInMfaForm.tsx`), the code input
previously rendered its label as:
> `Code generated by Google Authenticator`

This phrasing can lead users to believe that Supabase has locked their
account specifically to Google's authenticator app—even when they
actually scanned the QR code with Apple Passwords / iOS Keychain,
1Password, or Bitwarden. As reported in #51502, users who rely on their
iPhone's built-in authenticator can get alarmed, thinking their
authentication setup was unexpectedly swapped.

Furthermore, if a user is genuinely locked out (e.g. lost device and
backup codes), the "Email support" option previously only surfaced after
an explicit authentication exception occurred, rather than being readily
discoverable under the *"Unable to sign in?"* help section.

Closes #51502

## Solution

1. **Clear, standard form label & descriptive subtext**:
- Replaced the ambiguous `Code generated by [Friendly Name]` label with
a standard `Authentication code` label.
   - Moved the factor's friendly name into the field description:
- When a name is configured: `From the authenticator app registered as
[Friendly Name]`
- Fallback when no name is set: `From the authenticator app registered
to this account`
- This makes it immediately obvious that `[Friendly Name]` is just the
custom label they chose, rather than a hard vendor requirement.

2. **Direct support escape hatch**:
- Added an **"Email support to regain access"** link directly into the
*"Unable to sign in?"* list in both `SignInMfaForm` and
`SignInRecoveryCodeForm`.
- Users who are stuck now have an immediate, obvious way to reach out
without needing to trigger errors or hunt down the support email.

3. **Extracted testable helper logic**:
- Extracted friendly-name normalization and support mailto generation
into a dedicated `SignInMfa.utils.ts` module.
- Added unit test coverage in `SignInMfa.utils.test.ts` (9 tests
covering trims, null/empty cases, and mailto parameters).

## Review instructions

1. Navigate to `/sign-in-mfa` (with an account that has a TOTP factor
enrolled).
2. Verify that the input label reads `Authentication code`.
3. Check the subtext: verify that it clarifies `From the authenticator
app registered as [Name]`.
4. Inspect the *"Unable to sign in?"* section at the bottom:
- Confirm that "Email support to regain access" is visible and opens a
pre-addressed email to `support@supabase.com` with subject `Unable to
sign in via MFA`.
5. Check `/sign-in-recovery-code` and verify the same support link is
present.

## Checklist

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] Unit tests added and passing (`vitest run
components/interfaces/SignIn/SignInMfa.utils.test.ts`)
- [x] Code passes Prettier formatting check
- [x] Code passes ESLint without adding warnings
2026-10-13 09:59:32 +02:00
Drew McLellan e450aa5f85 chore(docs): Add Drew McLellan to humans.txt (#51557)
## Problem

I've joined Supabase and my name is not yet in the humans.txt file.

## Solution

Add my name (Drew McLellan) to the humans.txt file.
2026-10-13 07:46:38 +00:00
kemal.earthandCharis Lam b2dab2b896 feat(studio): update region selector in create form (#51282)
## Problem

Updates the region selector in create form to we can run a small
experiment.

---------

Co-authored-by: Charis Lam <26616127+charislam@users.noreply.github.com>
2026-10-13 08:43:21 +01:00
Joshen Lim fe8b4df66d Chore/tiny refactor org limit (#51550)
## Context

Tiny refactor that I happened to pass by as I was reviewing other PRs

`useOrgProjectsInfiniteQuery` has a default `limit` value at 96 set in
the hook, 96 mainly for the home page to render a full row of cards
since cards are rendered in rows of 3

However, we have a couple of callsites for `useOrgProjectsInfiniteQuery`
that were passing a different `limit` value, hence these would be
triggered as a separate API request.

Am opting to remove the `limit` parameter from
`useOrgProjectsInfiniteQuery` so that the limit is standardized to 96
- So that data can be cached without having to invoke another API
request wherever `useOrgProjectsInfiniteQuery` is called
- I doubt that there'll be a need in a UI that will require calling
`useOrgProjectsInfiniteQuery` with a separate value for `limit` but
please do let me know otherwise if I might be overlooking anything!
2026-10-13 11:06:49 +08:00
Francesco SansalvadoreandClaude Sonnet 5 cb4307f15b feat(studio): storage versioning - archived UI (#51476)
## This PR

Adds **Show archived** to the file explorer's view options and list them
in the file explorer.

- `useStoragePreference` — `showArchivedInline`, stored per project
- `ArchivedFilesContext` — owns the archived list and which object is
selected
- `FileExplorer` — merges archived rows into each column and re-sorts,
since the server-side sort never sees them
- `FileExplorerRow` — dimmed striped rendering, no checkbox, no context
menu
- `FileExplorerHeader` — the toggle, rendered only behind the feature
preview
- `StorageExplorer` — mounts the provider


https://github.com/user-attachments/assets/a26551b4-b22d-485e-9d23-3e78c4a89315

Clicking an archived row opens a preview panel: where the file used to
live, when it was archived, its retained versions, and the actions to
bring it back or delete it permanently.

- `ArchivedFilePreviewPane` — the pane, replacing `PreviewPane` while an
archived row is selected
- `ArchivedVersionRestoreWidget` — takes over the top of the pane when a
specific retained version is selected
- `ArchivedVersionRow` — one version, with its restore / delete actions
- `StorageExplorerContent` — the pane swap


https://github.com/user-attachments/assets/03c9eae6-e9e3-4bd0-8145-953625e125d1

Other additions behind the feature preview:

- The buckets list show a **Versioning** column.
- `BucketVersioningPill` — a `file-stack` badge beside the bucket name
in the breadcrumbs, brand when versioning is enabled and warning when it
is suspended, so the bucket's state is visible from inside the explorer
rather than only from the buckets list.


https://github.com/user-attachments/assets/f4827aac-a9ff-4300-92ac-073848d63606

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 17:13:16 +02:00
Katerina Skroumpelou d303c248d3 docs: drop stale alpha labels from server and middleware reference (#51494)
## Problem

The server and middleware reference pages on supabase.com still carry
alpha labels that were dropped from the source partials weeks ago.
#51031 (Sep 30) removed the alpha wording from the partials and #51276
(Oct 5) added the adapter removal date, but neither change reached the
live site.

The reference build (`apps/docs/scripts/build-reference-content.ts`,
`writeNewMarkdownPartials`) copies a partial to
`docs/ref/<library>/<name>.mdx` only when that file does not exist, and
the page renderer reads from `docs/ref`. Once a page has been seeded,
later edits to the partial are never picked up. The three affected pages
were seeded before those PRs merged.

The UI library MCP page has the same stale wording: it says the
`pipeline` entry form of `withSupabase` is alpha and tracks
`@supabase/middleware` 0.x. Middleware is at 1.x and `@supabase/server`
dropped the alpha label in supabase/server#185.

Linear:
[SDK-2161](https://linear.app/supabase/issue/SDK-2161/remove-the-public-beta-designation-from-supabaseserver).
Companion package PR: supabase/server#192.

## Solution

Copy the current partial bodies over their rendered twins. The
frontmatter is identical in each pair, and the partials are left
untouched:

- `apps/docs/docs/ref/server/frameworks.mdx`: adapters are now described
as deprecated with the December 1, 2026 removal date, the Versions note
tells readers to add `@supabase/middleware` as a direct dependency, the
migration steps include `npm install @supabase/middleware`, and "The
entry form is alpha" is gone.
- `apps/docs/docs/ref/middleware/introduction.mdx`: the "Alpha"
admonition is gone.
- `apps/docs/docs/ref/middleware/usage-examples.mdx`: the entry form
note no longer says alpha.

Rewrite one paragraph in `apps/ui-library/content/docs/headless/mcp.mdx`
so it states the version requirement (`@supabase/server` 1.6.0 or later)
and that the nested form behaves the same, without the alpha or 0.x
claims.

After this PR each `docs/ref` file is byte-identical to its partial, so
`diff` between the two is empty.

## Preview links

| Site | Live | Preview | Search for |
| ---------- |
---------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------
| --------------------------------------- |
| Docs |
[/docs/reference/server/frameworks](https://supabase.com/docs/reference/server/frameworks)
|
[/docs/reference/server/frameworks](https://docs-git-docs-drop-stale-alpha-labels-supabase.vercel.app/docs/reference/server/frameworks)
| `December 1, 2026` |
| Docs |
[/docs/reference/middleware/introduction](https://supabase.com/docs/reference/middleware/introduction)
|
[/docs/reference/middleware/introduction](https://docs-git-docs-drop-stale-alpha-labels-supabase.vercel.app/docs/reference/middleware/introduction)
| `is in alpha` (live only) |
| Docs |
[/docs/reference/middleware/usage-examples](https://supabase.com/docs/reference/middleware/usage-examples)
|
[/docs/reference/middleware/usage-examples](https://docs-git-docs-drop-stale-alpha-labels-supabase.vercel.app/docs/reference/middleware/usage-examples)
| `The entry form of` |
| UI library |
[/ui/docs/headless/mcp](https://supabase.com/ui/docs/headless/mcp) |
[/ui/docs/headless/mcp](https://ui-library-git-docs-drop-stale-alpha-labels-supabase.vercel.app/ui/docs/headless/mcp)
| `Composing` |

## Review instructions

1. Open the live and preview links for the frameworks page side by side.
Search for `alpha`: present on live, absent on preview. Search for
`December 1, 2026`: absent on live, present on preview.
2. Open the middleware introduction. The "Alpha" caution box is gone on
preview.
3. Open the middleware usage examples and expand the CORS example
details. The entry form note reads "needs `@supabase/server` 1.6.0 or
later" with no alpha.
4. Open the UI library MCP page. The paragraph after the `whoami` note
states the version requirement and no longer mentions alpha or 0.x.
5. Optional, in a checkout: `diff
apps/docs/spec/reference/server/v1/partials/frameworks.mdx
apps/docs/docs/ref/server/frameworks.mdx` prints nothing. Same for the
two middleware pages.

## 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)

The docs text is copied verbatim from partials that already went through
review in #51031 and #51276. The one rewritten paragraph in the UI
library page follows the Supabase writing style guide.
2026-10-12 11:46:49 +00:00
Guillaume Faas 29c6da54eb docs: add introduction blog post for .NET SDK (#50209)
## 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?

A new blog post to promote the .NET SDK
2026-10-12 09:39:39 +00:00
2e1a7afceb feat(www): add October 12, 2026 subprocessor list (#51549)
<!-- claude-slack-attribution -->
_Requested by **Sofia Calado** · [Slack
thread](https://supabase.slack.com/archives/C0161K73J1J/p1791792994853839?thread_ts=1791792994.853839&cid=C0161K73J1J)_

## Problem

**Before:** The Subprocessor List page
(`/legal/customer-resources/subprocessor-list`) showed one download
button, for the June 1, 2026 list.

**After:** The page shows two download buttons, newest first:
"Subprocessor List - Updated October 12, 2026" and "Subprocessor List -
Updated June 1, 2026". The June 1, 2026 PDF is kept as is.

This adds the October 12, 2026 subprocessor list as a new version
without replacing the existing one.

## Solution

How: the single `CURRENT_PDF` constant in
`apps/www/pages/legal/customer-resources/subprocessor-list.tsx` becomes
a `SUBPROCESSOR_LIST_VERSIONS` array (newest first, each entry has
`file` and `displayDate`), and the page maps over it to render one
button per version using the same `Button` and label format as before.
The new PDF is added as
`apps/www/public/legal/subprocessor-list/October-12-2026.pdf`, copied
byte for byte from the supplied file (2 pages, "As of October 12, 2026",
22 rows). The header comment now explains how to add a future version.
The page copy, the Customer.io subscribe form, the Legal Hub link, the
redirect and the DPA and FAQ links are untouched; none of them reference
a specific PDF.

## Review instructions

1. Open `/legal/customer-resources/subprocessor-list` on the Vercel
preview for this PR.
2. Confirm two buttons appear in this order: "Subprocessor List -
Updated October 12, 2026", then "Subprocessor List - Updated June 1,
2026".
3. Open each and confirm the PDF header date matches the button label.
4. Confirm the subscribe form below the buttons is unchanged.

**Not verified:** The Vercel preview and supabase.com are not reachable
from the environment this PR was prepared in, so the page was not viewed
rendered. `pnpm install` was not run, so ESLint and `tsc` did not run.
Prettier 3.8.1 was run on the changed file with the repo's formatting
options (the repo config's SQL plugin was not installed) and reported no
changes. The change was read through by hand for type and syntax errors.

## Checklist

- [ ] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)

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

https://claude.ai/code/session_01HtysymSUPZS8aJ1eTa7R9N


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

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-12 17:11:56 +08:00
Guillaume Faas 7625a0353e feat(studio): add dotnet framework to Connect flow (#51257)
## Feature

Add a ".NET" option to the "Connect" flow in the Dashboard, with several
variants.

## 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 |
| -------------- |
-------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------
| ----------------------------- |
| Studio | [/dashboard](https://supabase.com/dashboard) |
[/dashboard](https://studio-staging-git-guillaumefaas-sdk-1881-add-s-537090-supabase.vercel.app/)
| Add .NET option in Connect |

## Review instructions

1. Click on the "Connect" button when on a project page
2. Select ".NET" in the frameworks drop-down
3. Verify the 3 variants (ASP.NET Core, Unity, Console)

## 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-12 10:34:54 +02:00
Gildas GarciaandJoshen Lim 88bc1ac384 feat(studio): oauth apps users own grant list in account settings (#50903)
## Purpose

Users now have an _apps_ page in their account settings allowing them to
see their own grants, the projects they affect and to disconnect an app.

This PR only uses mock data. Besides, the page and menu item are behind
a feature flag enabled on staging

<!--
## 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

- In _Account/OAuth Apps_, you should see a list of apps
<img width="748" height="359" alt="image"
src="https://github.com/user-attachments/assets/8c50a467-e2c1-4000-aecf-09d5db1591d3"
/>
- Each app should have a menu entry allowing to disconnect it (fake for
now)
<img width="587" height="278" alt="image"
src="https://github.com/user-attachments/assets/6221fbd6-3b61-4d93-903e-9aedaf94de3f"
/>
- Each app but the last should have a menu entry that opens a dialog to
see the connected projects
<img width="657" height="651" alt="image"
src="https://github.com/user-attachments/assets/e985f933-fdfb-4d28-93c3-b3678d7d8a53"
/>

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-12 10:15:33 +02:00
Francesco SansalvadoreandClaude Sonnet 5 876bb8cf9e feat(storage): archived objects data layer (#49677)
## This PR

On a versioned bucket a file or a version can be "soft deleted/archived"
or "permanently deleted".

- `archived-objects-query.ts` — `ArchivedObject` /
`ArchivedObjectVersion` types + `archivedObjectsQueryOptions`
- `archived-object-restore-mutation.ts` — bring an archived object back
into the live tree
- `archived-object-purge-mutation.ts` — delete it and every version,
permanently
- `archived-object-version-delete-mutation.ts` — remove one retained
version
- `archivedOverlay.utils.ts` — synthesizes the explorer rows for one
folder from the archived list
- `archivedVersions.utils.ts` — an archived object's history as one
flat, newest-first list

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 09:57:39 +02:00
Danny White f2d8eba736 refactor(studio): share pipeline region and selection copy for wizard review (#51540)
## Problem

The pipeline creation wizard in #49243 needs to reuse the pipeline
region display and publication and initial-sync wording in review. These
currently live inside the sheet’s fields.

## Solution

Extract `PipelineRegionReadonly` and shared selection copy, with the
existing sheet as their first consumer. Region styling, labels,
descriptions and selection behaviour stay the same.

## Review instructions

1. Open the [preview to Database →
Pipelines](https://studio-staging-git-dnywh-refactorpipeline-revie-080d09-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled and click **Add pipeline**.
2. Confirm **Pipeline region** still shows the flag, region name and
code as read-only information, with the same description and spacing.
3. Select a publication and open **Initial sync**. Confirm the four
options keep their existing labels and descriptions. Choose **Selected
tables only**, select a table, then choose **All except selected
tables**. Confirm the selection description switches from running to
skipping initial sync and still says ongoing replication includes every
publication table. Cancel and discard changes; no credentials or
pipeline creation are needed.
2026-10-12 17:51:52 +11:00
Guillaume Faas 1c97fe51be docs: move C# SDK from community to official support (#51487)
## Problem

Remove COMMUNITY badge from C# SDK Reference, and fix links pointing to
`supabase community`.

## 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-12 14:48:36 +08:00
Danny White 188f5a743b refactor(studio): extract replication fields for wizard reuse (#51538)
## Problem

The pipeline creation wizard in #49243 needs replication settings on its
data step, separately from destination connection settings. These fields
currently live inside the sheet’s Advanced settings accordion.

## Solution

Extract **Batch wait time**, **Table sync workers**, **Initial sync
connections per table** and **Invalidated slot behavior** into
`ReplicationFields`. Keep the existing accordion as its first consumer.
Labels, defaults, units, field order and empty-value handling stay the
same.

## Review instructions

1. Open the [preview to Database →
Pipelines](https://studio-staging-git-dnywh-refactorpipeline-repli-2d71d1-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled and click **Add pipeline**.
Expand **Advanced settings**.
2. Confirm the four replication settings appear in their existing order,
before BigQuery’s connection settings and table layout. For DuckLake,
**Pool size** stays above them; for Snowflake, **Role** stays below
them.
3. Enter `0` for **Batch wait time**, `8` for **Table sync workers** and
`3` for **Initial sync connections per table**. Clear and re-enter each
value. Confirm no `NaN` appears. Select **Recreate slot**, then collapse
and reopen the accordion. Confirm all values remain. Cancel and discard
changes; no credentials or pipeline creation are needed.
2026-10-12 17:45:36 +11:00
Jordi EnricandJoshen Lim d1e0b551c5 fix(studio): show correct timezone offsets FE-4612 (#51484)
## Problem

Restore timezone labels use fixed UTC offsets from the timezone catalog.
Madrid displays UTC+01:00 during daylight saving time even though the
reported restore timestamp correctly uses UTC+02:00.

## Fix

Calculate display offsets from the restore instant and the timezone's
IANA identifier using Intl. Apply the same formatter to dropdown
options, the selected timezone, and PITR confirmation while preserving
existing restore calculations and timezone selection identity.

Fixes https://linear.app/supabase/issue/FE-4612

## How to test

- Choose Madrid in restore-to-new-project or PITR and compare winter and
summer restore dates. Expected result: UTC+01:00 in winter and UTC+02:00
during daylight saving time, including the confirmation label.
- Check UTC, New York, Kolkata, and Kathmandu. Expected result: correct
zero, negative, and fractional offsets.
- Focused Vitest suite: 15 tests passed, including both Madrid DST
boundaries and timestamp preservation. The component test verifies
visible trigger and option labels update after a date change, Madrid
search results, selection preserving the original timezone object, and
popover closure. It also passes under UTC and Hong Kong browser
timezones. Prettier and diff checks passed.
- All CI checks passed for the latest commit, including Studio tests,
all four Next.js/TanStack E2E shards, typecheck, lint ratchet,
formatting, spelling, unused-code checks, and Docker build. Full local
typecheck and ESLint validation were blocked by the shared dependency
installation being out of sync with this checkout.

Calculation audit confirmed the reported October 9 Madrid 05:12 to UTC
03:12 conversion. Separate existing date-control issues were found when
browser and restore timezones differ and around the repeated autumn
hour; those are outside this label fix and relevant to FE-4129.

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-12 14:36:48 +08:00
a741837c53 docs(blog): add blog post for .NET SDK v8.0.0 (#50001)
## 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?
It adds a blog post to promote the latest major version of the .NET SDK.

---------

Co-authored-by: Ana <30495040+ana1337x@users.noreply.github.com>
Co-authored-by: Jonathan Summers-Muir <MildTomato@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 07:35:15 +01:00
Joshen Lim 369927892f Harden profile creation logic from dashboard (#51483)
## Context

When signing up a new account on the dashboard, the dashboard's the one
making the request to create a new profile for the user (ideally not,
but the proper fix on the BE is currently blocked). We do so by making
an initial request to GET `/profile`, and if it returns a 404, it's
implied that the account doesn't exist and we fire `createProfile`

Because of this, a race condition could exist (due to replica lag for
example):
- GET `/profile` returns 404, treat user as new
- POST `/profile` returns 200
- Profile query is still in "error" state (`isError` is `true), and post
sign-in tries to redirect to the new org page which triggers the
`useEfect`
[here](https://github.com/supabase/supabase/blob/master/apps/studio/lib/profile.tsx#L82-L96)
- Which prompts another POST `/profile`, and it returns a 409 because
the account's already created
- This then keeps going in a loop which keeps calling `createProfile`
and we didn't have a way to handle this, leading to users in a stuck
loading state until the browser's refreshed

## Changes involved
- Opt to invalidate the profile, permissions, and organizations if the
user runs into a 409
- This should refresh the profile and we'll no longer be stuck in a
create loop since `isError` should no longer be `true` then
- Tighten the dependency array for where `createProfile` is triggered
- Add exponential backoff up to 3 times for profile creation for
transient failures (5xx, network, 429)
- Never retry profile creation for 409, since there's no point doing so
2026-10-12 11:28:12 +08:00
ChrisandDanny White 842e1b5e40 fix(ui-patterns): wrap long confirm strings in TextConfirmModal (#51503)
## Problem

Long confirm strings in `TextConfirmModal` don't wrap. I noticed it when
deleting a preview branch with a long name: the name runs past the edge
of the dialog and gets cut off, so you can't read what you're supposed
to type.

## Solution

Changed `whitespace-pre` to `whitespace-pre-wrap` on the confirm string
so it wraps. Did the same for the copy button in the `enableCopy`
variant and let it grow in height so the wrapped text fits.


https://github.com/user-attachments/assets/0a2aa346-8e61-4d58-b595-e6adee4aa1fd

## Review instructions

1. Open the Text Confirm Dialog page in the design system preview.
2. In the demo, change `bucketName` to something long and open the
dialog. The name should wrap instead of being cut off.
3. Add `enableCopy` to the demo and check the copy button wraps too.
4. Short names should look the same as before.

## 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: Danny White <3104761+dnywh@users.noreply.github.com>
2026-10-12 02:09:52 +00:00
Coenen BenjaminandDanny White 853bac960e feat(studio): limit DuckLake managed setup to the current project (#51380)
## Problem

In **Add pipeline**, the managed DuckLake configuration method (**Select
Supabase projects**) lets users pick any project in their organization
for the catalog and for storage. For now, managed DuckLake should only
use the current project.

## Solution

- Rename the option to **Use this Supabase project** and remove the
**Catalog project** and **Storage project** selectors. Users still set
**Metadata schema** and **Bucket**.
- Remove `ducklakeCatalogProjectRef` and `ducklakeStorageProjectRef`
from the form schema, default values, and validation rather than hiding
them, so the form can't carry another project's ref.
`buildDucklakeConfig` sets both `catalogProjectRef` and
`storageProjectRef` to the current project ref, which the config
builders already receive from the URL.
- The bucket list and the **New bucket** dialog always target the
current project. The cross-region warning is removed because it can no
longer trigger.
- `data/replication` (types and API payload mapping) is unchanged. It
still sends `project_ref` for the catalog and storage, now always the
current project.
- Fix in passing: creating a bucket from the dialog now sets the field
with `shouldDirty` and `shouldValidate`, so a stale "Bucket is
required." error clears.
- Edit mode and **Enter connection details** are unchanged.

The DuckLake docs page
(`apps/docs/content/guides/database/replication/pipelines/ducklake.mdx`)
still describes choosing separate projects. It'll be updated in a
follow-up PR that should merge after this one ships.

## Review instructions

1. Open a project, go to **Database** > **Pipelines**, select **Add
pipeline**, and choose **DuckLake**.
2. Under **Configuration method**, check that the first option is **Use
current Supabase project** and that there's no **Catalog project** or
**Storage project** selector.
3. Open the **Bucket** list and check that it shows the current
project's buckets. **New bucket** creates a private bucket in the
current project.
4. Create the pipeline and check that the request sends the current
project ref as both `catalog.project_ref` and `storage.project_ref`.
5. Run the unit tests: `cd apps/studio && pnpm vitest run
components/interfaces/Database/Replication/DestinationPanel/DestinationForm
data/replication`

## 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)

---------

Co-authored-by: Danny White <3104761+dnywh@users.noreply.github.com>
2026-10-12 00:14:22 +00:00
Danny White 7b48b298ee feat(apps): distinguish local development with blue blueprint favicons (#51420)
## Problem

- Local apps are hard to distinguish from hosted apps in browser tabs.

## Solution

- Add blue blueprint icons to local development in all 8 apps and Studio
CLI.
- Keep normal branding for production, hosted staging and self-hosted
Studio.
- Builds on #51419.


| Before | After |
| --- | --- |
| <img width="1290" height="76" alt="CleanShot 2026-10-08 at 13 29
14@2x"
src="https://github.com/user-attachments/assets/72bc50d7-37e0-47d0-8dfd-50e233a443bd"
/> | <img width="1282" height="72" alt="CleanShot 2026-10-08 at 13 30
03@2x"
src="https://github.com/user-attachments/assets/afb15a70-3938-4cff-9b41-dc6c25460b7c"
/> |

## Review instructions

- Start an app locally. Its browser tab should show the blue icon.
- Check Studio CLI uses blue and hosted staging uses white.
- Check production icons are unchanged, including Learn's black and
white icon.
- Run `node scripts/validate-favicons.mjs`. All 16 sets should pass.

Asset and routing checks, formatting and Common/Studio type checks
passed. Full builds have not been run.

## Checklist

- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
2026-10-12 10:26:51 +11:00
claude[bot]andClaude f44dc42b0c Add Enterprise Terms v4.1 (effective October 9, 2026) (#51474)
<!-- ccr-slack-attribution -->
_Requested by **Nicole Kramer** · [Slack
thread](https://supabase.slack.com/archives/C0161K73J1J/p1790784371448999)_

## Problem

Three corrections to the Enterprise SaaS Subscription Agreement
(supabase.com/enterprise-terms): a typo in the contracting-entity
sentence of Section 1.9, and conforming AWS Marketplace wording in
Sections 5.1 and 14.1.

## Solution

Adds Enterprise Terms v4.1 (effective October 9, 2026) as
`apps/www/data/legal/enterprise-terms/v4-1.mdx`, a copy of v4 with only
the changes below, and registers it as the newest version in
`apps/www/pages/enterprise-terms.tsx`. v4 stays available through the
version selector. The page remains `noindex`/`nofollow`.

### Section 1.9 (second sentence)

**Before:** For clarity, unless an Order expressly specifies otherwise,
the Supabase entity contracting with Customer hereunder will be (i)
Supabase, Inc., having its registered address at 3500 S. DuPont Highway,
Dover, Kent County, DE 19901, if Customer is purchasing via a cloud
service provider marketplace, or (ii) Supabase Pte. Ltd., a Singapore
corporate entity with a place of business located at 65 Chulia Street
#38-02/03, OCBC Centre, Singapore 049513, if Customer is not purchasing
via a cloud service provider marketplace.

**After:** For clarity, unless an Order expressly specifies otherwise,
the Supabase entity contracting with Customer hereunder will be (i)
Supabase, Inc., having its registered address at 3500 S. DuPont Highway,
Dover, Kent County, DE 19901, if Customer is purchasing via the
marketplace operated by Amazon Web Services, Inc. or its affiliates,
located at https://aws.amazon.com/marketplace, as it may be updated from
time to time ("**AWS Marketplace**"), or (ii) Supabase Pte. Ltd., a
Singapore corporate entity with a place of business located at 65 Chulia
Street #38-02/03, OCBC Centre, Singapore 049513, if Customer is not
purchasing via AWS Marketplace.

### Section 5.1 (body)

**Before:** Where paid-for services are agreed between Supabase and
Customer per the applicable Order, Customer shall pay Supabase the fees
("**Fees**") identified in the Order without offset or deduction at the
cadence identified in the Order (e.g., monthly or annually). Unless
otherwise provided in the applicable Order, (i) Customer will pay the
Fees within thirty (30) days of the issuance of an invoice, (ii) Fees
are payable by credit card or other payment method permitted by Supabase
from time to time, (iii) payment will be in USD, and (iv) Customer
authorizes Supabase to charge its provided billing method for all Fees.
Notwithstanding the foregoing, where Customer purchases via a cloud
service provider marketplace, Customer will pay the Fees through the
applicable marketplace in accordance with the applicable marketplace
terms. Customer further authorizes Supabase to use a third party to
process payments, and consents to the disclosure of Customer's payment
information to such third party. Fees paid by Customer are
non-refundable (except as set forth in Sections 10.3 or 11.1(b)). Where
Customer purchased the applicable Services via a cloud service provider
marketplace, any refund owed to Customer under this Agreement will be
paid or credited back through the applicable marketplace, and not
directly by Supabase to Customer. If Customer fails to make any payment
when due, and Customer has not notified Supabase in writing within ten
(10) days of the payment becoming due and payable that the payment is
subject to a good faith dispute, without limiting Supabase's other
rights and remedies: (a) Supabase may charge interest on the undisputed
past due amount at the rate of 1.5% per month, calculated daily and
compounded monthly or, if lower, the highest rate permitted under
applicable law; (b) Customer shall reimburse Supabase for all reasonable
costs incurred by Supabase in collecting any late payments or interest,
including attorneys' fees, court costs, and collection agency fees; and
(c) if such failure continues for ten (10) days or more, Supabase may
suspend Customer's and its Authorized Users' access to any portion or
all of the Services until such amounts are paid in full.

**After:** Where paid-for services are agreed between Supabase and
Customer per the applicable Order, Customer shall pay Supabase the fees
("**Fees**") identified in the Order without offset or deduction at the
cadence identified in the Order (e.g., monthly or annually). Unless
otherwise provided in the applicable Order, (i) Customer will pay the
Fees within thirty (30) days of the issuance of an invoice, (ii) Fees
are payable by credit card or other payment method permitted by Supabase
from time to time, (iii) payment will be in USD, and (iv) Customer
authorizes Supabase to charge its provided billing method for all Fees.
Notwithstanding the foregoing, where Customer purchases via AWS
Marketplace, Customer will pay the Fees through the AWS Marketplace in
accordance with the terms applicable to the AWS Marketplace. Customer
further authorizes Supabase to use a third party to process payments,
and consents to the disclosure of Customer's payment information to such
third party. Fees paid by Customer are non-refundable (except as set
forth in Sections 10.3 or 11.1(b)). Where Customer purchased the
applicable Services via AWS Marketplace, any refund owed to Customer
under this Agreement will be paid or credited back through the AWS
Marketplace, and not directly by Supabase to Customer. If Customer fails
to make any payment when due, and Customer has not notified Supabase in
writing within ten (10) days of the payment becoming due and payable
that the payment is subject to a good faith dispute, without limiting
Supabase's other rights and remedies: (a) Supabase may charge interest
on the undisputed past due amount at the rate of 1.5% per month,
calculated daily and compounded monthly or, if lower, the highest rate
permitted under applicable law; (b) Customer shall reimburse Supabase
for all reasonable costs incurred by Supabase in collecting any late
payments or interest, including attorneys' fees, court costs, and
collection agency fees; and (c) if such failure continues for ten (10)
days or more, Supabase may suspend Customer's and its Authorized Users'
access to any portion or all of the Services until such amounts are paid
in full.

### Section 14.1 (last sentence)

**Before:** For clarity, the terms of any cloud service provider
marketplace apply solely with respect to the payment matters described
in Section 5.1 and do not otherwise amend or supersede this Agreement.

**After:** For clarity, the terms of the AWS Marketplace apply solely
with respect to the payment matters described in Section 5.1 and do not
otherwise amend or supersede this Agreement.

## Review instructions

1. Open `/enterprise-terms` on the preview; the selector defaults to
"Version 4.1 — October 9, 2026".
2. Check Sections 1.9, 5.1, and 14.1 match the After text above.
3. Switch to "Version 4 — October 5, 2026" (or `?version=v4`) and
confirm it is unchanged.

## Checklist

- [ ] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)

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

https://claude.ai/code/session_01K2vqszbsJiMJPABAnLMgaC

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-12 10:23:40 +11:00
claude[bot]andClaude 05bca9e9d1 Add Terms of Service v4.1 (effective October 9, 2026) (#51473)
<!-- ccr-slack-attribution -->
_Requested by **Nicole Kramer** · [Slack
thread](https://supabase.slack.com/archives/C0161K73J1J/p1790784371448999)_

## Problem

This adds v4.1 (effective October 9, 2026) of the Terms of Service. It
corrects the second sentence of Section 1.j (which Supabase entity
contracts with the Customer) and conforms Sections 5(a) and 14(a) to the
new "AWS Marketplace" defined term. Nothing else in the document
changes, and v4 stays available through the version selector.

### Section 1.j, second sentence

**Before:** For clarity, unless an Order expressly specifies otherwise,
the Supabase entity contracting with Customer hereunder will be (i)
Supabase, Inc., having its registered address at 3500 S. DuPont Highway,
Dover, Kent County, DE 19901, if Customer is purchasing via a cloud
service provider marketplace, or (ii) Supabase Pte. Ltd., a Singapore
corporate entity with a place of business located at 65 Chulia Street
#38-02/03, OCBC Centre, Singapore 049513, if Customer is not purchasing
via a cloud service provider marketplace.

**After:** For clarity, unless an Order expressly specifies otherwise,
the Supabase entity contracting with Customer hereunder will be (i)
Supabase, Inc., having its registered address at 3500 S. DuPont Highway,
Dover, Kent County, DE 19901, if Customer is purchasing via the
marketplace operated by Amazon Web Services, Inc. or its affiliates,
located at
[https://aws.amazon.com/marketplace](https://aws.amazon.com/marketplace),
as it may be updated from time to time ("AWS Marketplace"), or (ii)
Supabase Pte. Ltd., a Singapore corporate entity with a place of
business located at 65 Chulia Street #38-02/03, OCBC Centre, Singapore
049513, if Customer is not purchasing via AWS Marketplace.

### Section 5(a) (Fees)

**Before:** ... Notwithstanding the foregoing, where Customer purchases
via a cloud service provider marketplace, Customer will pay the Fees
through the applicable marketplace in accordance with the applicable
marketplace terms. Fees paid by Customer are non-refundable. Where
Customer purchased the applicable Services via a cloud service provider
marketplace, any refund owed to Customer under this Agreement will be
paid or credited back through the applicable marketplace, and not
directly by Supabase to Customer. ...

**After:** ... Notwithstanding the foregoing, where Customer purchases
via AWS Marketplace, Customer will pay the Fees through AWS Marketplace
in accordance with the terms applicable to AWS Marketplace. Fees paid by
Customer are non-refundable. Where Customer purchased the applicable
Services via AWS Marketplace, any refund owed to Customer under this
Agreement will be paid or credited back through the AWS Marketplace, and
not directly by Supabase to Customer. ...

The rest of 5(a) is unchanged.

### Section 14(a) (Entire Agreement), last sentence

**Before:** For clarity, the terms of any cloud service provider
marketplace apply solely with respect to the payment matters described
in Section 5(a) and do not otherwise amend or supersede this Agreement.

**After:** For clarity, the terms of AWS Marketplace apply solely with
respect to the payment matters described in Section 5(a) and do not
otherwise amend or supersede this Agreement.

## Solution

- Add `apps/www/data/legal/terms/v4-1.mdx`, a copy of `v4.mdx` with only
three passages changed: the second sentence of Section 1.j, the
marketplace wording in Section 5(a), and the last sentence of Section
14(a). The AWS Marketplace URL in 1.j is formatted as a markdown link,
like the other URLs in the document.
- Register `v4-1` in `apps/www/pages/terms.tsx` as the newest entry
(label "Version 4.1", effective October 9, 2026). v4 and older entries
are unchanged.

## Preview links

| Site | Live | Preview |
| ---- | ---- | ------- |
| WWW | [/terms](https://supabase.com/terms) | See the Vercel bot
comment on this PR (`/terms`) |

## Review instructions

1. Open `/terms` on the preview. The version selector should default to
"Version 4.1 — October 9, 2026".
2. Check Sections 1.j, 5(a), and 14(a) read as in the **After** text
above.
3. Switch the selector to "Version 4" and confirm they still read as in
the **Before** text.

## 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 (not applicable: legal
page change)

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

https://claude.ai/code/session_01K2vqszbsJiMJPABAnLMgaC

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-12 10:23:01 +11:00
Danny White a42433c9bd refactor(studio): extract destination connection fields for wizard reuse (#51471)
## Problem

The pipeline creation wizard in #49243 needs destination connection
settings on its connection step, separately from replication settings
and table layout. These fields currently live inside the sheet’s
Advanced settings accordion.

## Solution

Extract BigQuery’s **Connection pool size** and **Maximum staleness**,
DuckLake’s **Pool size**, and Snowflake’s optional **Role** into
reusable connection-field components. Keep the existing accordion as
their first consumer. Labels, defaults, units, field order and
empty-value handling stay the same.

## Review instructions

1. Open the [preview to Database →
Pipelines](https://studio-staging-git-dnywh-refactorpipeline-conne-4a9108-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project with Pipelines enabled and click **Add pipeline**.
Keep BigQuery selected and expand **Advanced settings**.
2. Confirm **Connection pool size** and **Maximum staleness** still
appear below **Invalidated slot behavior** and above **Table layout**,
with the same descriptions and the **connections** and **minutes**
units.
5. Select DuckLake, if available, and expand **Advanced settings**.
Confirm **Pool size** remains above **Batch wait time**, with its
existing description and 1–6 limits.
6. Select Snowflake, if available, and expand **Advanced settings**.
Confirm optional **Role** remains below **Invalidated slot behavior**,
with the `PIPELINES_ROLE` placeholder.
2026-10-12 10:19:39 +11:00
Danny White ae69908aed refactor(studio): extract destination validation for wizard reuse (#51470)
## Problem

The pipeline creation wizard in #49243 needs to validate its destination
connection before table selection. The sheet currently builds that
request inside its full configuration validation.

## Solution

Extract `useDestinationValidation` and use it from the sheet. It builds
and sends the existing destination request, with optional pipeline
settings. The sheet still validates destination and pipeline settings in
parallel and retains its existing loading, error and warning handling.

This foundation adds no visible changes or wizard routing.

## Review instructions

Use a test project with Pipelines enabled, a publication containing
tables, and working BigQuery credentials.

1. Open the [deploy preview at Database →
Pipelines](https://studio-staging-git-dnywh-refactorpipeline-desti-ebcb9d-supabase.vercel.app/dashboard/project/_/database/pipelines),
select your test project and click **Add pipeline**. Confirm the
existing sheet opens with BigQuery selected.
2. Enter the required fields and select a publication. Use valid
service-account JSON, but set **Dataset ID** to a dataset that does not
exist. Click **Start pipeline**. While the request runs, expect a
loading state and disabled submission. Once validation completes, expect
configuration issues in the sheet, retained field values and no pipeline
creation.
3. Correct the dataset ID and click **Start pipeline** again. Expect
validation to recover and open the **Create and start pipeline** cost
confirmation when there are no remaining issues. Click **Cancel** to
avoid creating the pipeline.
4. If your test project returns warnings, confirm they appear inline and
the action changes to **Start pipeline anyway**. Click it again:
unchanged warnings should open the warning confirmation, and continuing
should open the cost confirmation. Critical issues must still block
progression.
2026-10-12 10:18:56 +11:00
Danny White 325a5a0da7 fix(studio): polish extension installation dialogs (#51463)
## Problem

The enable-extension dialog in #51440 needs clearer installation copy
and a consistent disclosure for custom-schema guidance. On narrow
screens, footer buttons touch and dialog content can scroll sideways.

## Solution

Polish the dialog on top of #51440:

- Explain fixed-schema requirements and hide custom-schema guidance when
the extension requires a specific schema.
- Share the disclosure interaction with the session-expired and
API-hardening dialogs through `ui-patterns/DialogDisclosure`, documented
with a live design-system example.
- Fix narrow-screen overflow and add vertical spacing to shared dialog
footers.
- Refine inline-code styling and update the PostGIS instructions and E2E
button locator.


| After |
| --- |
| <img width="852" height="710" alt="CleanShot 2026-10-09 at 12 17
47@2x"
src="https://github.com/user-attachments/assets/59f6f1e7-9884-4cdb-b678-62b7f88a8ec5"
/> |
| _Standard extension_ |
| <img width="836" height="1092" alt="52254"
src="https://github.com/user-attachments/assets/dbf53d3e-6583-4c3b-8f43-577e0723d9a7"
/> |
| _Standard extension expanded accordion_ |
| <img width="836" height="604" alt="CleanShot 2026-10-09 at 12 20
04@2x"
src="https://github.com/user-attachments/assets/c8e3961f-2683-440c-a2a2-48ccd53c4a17"
/> |
| _Extension with fixed schema_ |

## Review instructions

1. Open `/project/<ref>/database/extensions`. Turn on the toggle for a
disabled `postgres_fdw` extension. Expand **Install in a different
schema** and check its hover, keyboard focus and full-width click
target. Repeat with `pg_cron` or `pgmq`: the intro must say **must**,
and custom-schema guidance must be absent. Cancel without enabling.
2. At 320 px and 375 px, check the extension dialog's alignment,
inline-code rendering, wrapped SQL and stacked **Enable** / **Cancel**
spacing. Confirm the page does not scroll sideways.
3. On a platform project with the Data API enabled, open
`/project/<ref>/integrations/data_api/settings`. Under **Harden Data
API**, click **Harden Data API**. Expand both sections and check the
same trigger behaviour. Confirm completed sections still show their
check icons. Close without applying either action.
4. The session-expired dialog has no direct route. It is rendered by
`apps/studio/hooks/misc/withAuth.tsx` after authentication loading
exceeds 10 seconds. For repeatable local review, temporarily pass
`visible={true}` to its `SessionTimeoutModal` callsite, then open
`/projects`. Expand **Having trouble?** by clicking the text or chevron
and using Enter / Space. Check the help text and controls. Close the
dialog without signing out or clearing site data, then undo the
temporary prop change.
5. In the design system, open
[`/docs/components/dialog#optional-details`](https://design-system-git-dnywh-choreextension-dialog-polish-supabase.vercel.app/design-system/docs/components/dialog#optional-details).
Click **Export results**, then expand **What’s included** with the mouse
and keyboard. The demo imports the same `ui-patterns/DialogDisclosure`
used by Studio.
6. Open another dialog and an alert dialog at a narrow width. Check the
shared 8 px gap between stacked footer buttons. Review inline-code
examples on `/docs/components/typography` for the shared styling change.
2026-10-12 10:18:45 +11:00
Danny White 255a80e219 refactor(apps): standardise existing favicon assets and declarations (#51419)
## Problem

- Favicon files and markup are duplicated across apps.

## Solution

- Replace old files with one ICO, one Apple icon and two manifest icons
per set.
- Share icon markup and add generation notes and scripts.
- Keep existing branding, including Learn's black and white icon.
- Make the border radius match across all apps’ favicons.

## Review instructions

- Check normal app icons and Studio staging in browser tabs.
- Check icons load under `/docs` and `/kb`.
- Run `node scripts/validate-favicons.mjs`. All 8 sets should pass.
2026-10-12 10:18:18 +11:00
Alexis AguilarandMiranda Limonczenko 8617532ae1 fix(docs): remove orphaned cli.mdx and update stale /guides/cli link (#51495)
Resolves
[DOCS-1252](https://linear.app/supabase/issue/DOCS-1252/resolve-e2e-broken-link-errors-for-the-cli-guide).

#48453 updated most `/cli` links to `/local-development`. This PR covers
the remaining `/cli` references.

## Changes

- **Delete `apps/docs/content/guides/cli.mdx`.** The file has had no
route since the October 2024 docs IA reorganization (#29364), which
moved the CLI guides under `local-development/`.
- In production, `/docs/guides/cli` redirects to
`/docs/guides/local-development` through `apps/www/lib/redirects.js`, so
the file's content never renders.
- On Vercel previews, which don't have `www` redirects, the URL returns
404. Docs E2E tests every changed guide file, so any edit to `cli.mdx`
fails the required check.
- Deleting it is safe for Docs E2E, which only scopes added or changed
files. The redirect still covers the old URL.
- **Update the connection-refused troubleshooting page** to link to
`/docs/guides/local-development` instead of the redirected
`/docs/guides/cli`.
- **Point the "Go to Local Dev / CLI" command palette entry at
`/guides/local-development`.** It routed to `/guides/cli`, which only
resolves through the `www` redirect and returns 404 on previews.
- **Remove the unused `cli` navigation menu** from
`NavigationMenu.constants.ts`. No `MenuId` resolves to it, so it was
never rendered, and its links pointed to pages that no longer exist.

Question for @czenko: 
#48453 left `cli.mdx` alone on purpose, describing it as needing a
routing or content decision. Deleting it seemed like the simplest fix,
but is there a reason to keep it? It looks like it's an artifact that
sometimes gets updated because it's being mistaken as a living document.
Also, I believe troubleshooting guides are being currently moved - this
ticket and change might coincide with the new
https://github.com/supabase/troubleshooting repository, but I didn't see
this file existing in there just yet - it's being currently being moved
in this PR
https://github.com/supabase/troubleshooting/pull/330/changes#diff-b5908c6861f711c3a38fba99aa133cdb796f26c27a35e77c674cb21f988a1046
(so I think I should do the link change in that PR and I can remove it
from this PR as to not create merge conflicts or drift). But it makes
questions come up about how broken links are handled in that repository
👀

---------

Co-authored-by: Miranda Limonczenko <miranda.limonczenko@supabase.io>
2026-10-09 22:48:36 +00:00
Monica KhouryandCharis Lam 2d5768d3c1 feat(studio): wire Platform Webhooks UI to real backend API (#51352)
## What
Wires the existing (mocked) Platform Webhooks UI to the real Management
API backend, per FE-3749.

- New `data/platform-webhooks/` query/mutation hooks, calling the real
`/v2/organizations/{slug}/webhooks/...` and
`/v2/projects/{ref}/webhooks/...` endpoints
- Updated `PlatformWebhooks.types.ts` to match the real API contract
(field names, shapes)
- Added a signing secret field to the create-endpoint form (API requires
a user-provided secret, not server-generated like the mock assumed)
- Removed the event-type column from the deliveries table (the real
list-deliveries endpoint doesn't return event type, only the
single-delivery endpoint does)
- Removed `PlatformWebhooks.mock.ts` / `.store.ts` and their tests

## Why
UI was built ~80% against mock data months ago; this closes the gap to a
real, working feature.

## Known open items (not blocking, tracked separately)
- `name` field has no backend storage yet — client-only for now, open
question with Ali/Paweł
- Deliveries table only fetches the backend's default single page — real
server-side pagination not yet wired (see FE-3750)

## Follow-up PR (stacked)
Tests for the new `data/platform-webhooks/` hooks (MSW-based), per the
ticket's own scope split.

## Testing
Manually tested end-to-end against local backend: created/edited/deleted
an endpoint, verified the real signature using webhook.site,
independently recomputed the HMAC and confirmed it matches the
`webhook-signature` header.

Linear: FE-3749

---------

Co-authored-by: Charis Lam <26616127+charislam@users.noreply.github.com>
2026-10-09 22:41:09 +03:00
Ignacio Dobronich eeae6027d5 fix: don't warn about SMS MFA charges on branch projects (#51459) 2026-10-09 12:57:27 -03:00
Alaister Young f7b7969728 fix(studio): cancel pending banner removal timeouts on unmount (#51491) 2026-10-09 17:38:50 +02:00
Matt Rossman 0d8cd9c315 feat(studio): prompt for a higher AI opt-in level instead of "no tool access" (#51411)
## Motivation

When an Assistant tool needs a higher opt-in level than the org has, the
user only sees the model say it has no access with (inconsistent)
written instructions how to fix, instead of Assistant proactively
facilitating the fix.

<img width="400" alt="CleanShot 2026-10-07 at 3 44 29 PM@2x"
src="https://github.com/user-attachments/assets/ba95568a-5db4-4d8c-b4ff-64855f2b87ec"
/>

The majority of recent labelled [Assistant
Issues](https://www.braintrust.dev/app/supabase.io/p/Assistant/topics)
in Braintrust are tools or query results blocked by the org opt-in
level. We've considered making Assistant disabled entirely when data
opt-in is off to eliminate the most common footgun (AI-405), but that's
an intrusive change which could break legitimate use cases.

## Changes



https://github.com/user-attachments/assets/206a2438-630e-4368-9cec-2b04b66c9cd4



A new `update_opt_in_level` tool renders an inline card which prompts
admins to review the opt-in level and highlights the proposed change
(non-admins see a message telling them to contact their admin to change
the setting). Saving approves the call and the turn resumes at the new
level. Results appear in a Braintrust tool span based on
https://github.com/supabase/supabase/pull/45654.

I added 5 evals that simulate the user answering the opt-in card to
verify that the Assistant asks when blocked, continues after the user
accepts, and doesn't invent data after a skip. Tool Usage and
Correctness are at 100% in the [sample
run](https://www.braintrust.dev/app/supabase.io/p/Dev%20(mattrossman%2FAssistant)/experiments/mattrossman%2Fai-158-prompt-users-to-update-settings-instead-of-showing-no-tool-1791483991).

<details>
<summary>📸 Screenshots</summary>

| Admin, pending | Modal, Current and Proposed |
| -- | -- |
| <img width="100%" alt="CleanShot 2026-10-07 at 3 23 37 PM@2x"
src="https://github.com/user-attachments/assets/2fc8ba11-0530-4028-a056-40ca02afd3ef"
/> | <img width="1184" height="1754" alt="CleanShot 2026-10-07 at 3 32
37 PM@2x"
src="https://github.com/user-attachments/assets/73639633-89ac-4d4c-b869-d9301735d5b9"
/> |
| **After saving, turn continues** | **Non-admin** |
| <img width="100%" alt="CleanShot 2026-10-07 at 3 27 14 PM@2x"
src="https://github.com/user-attachments/assets/a91c6760-6dfb-4f51-9ef8-4bdbe1b22495"
/> | <img width="100%" alt="CleanShot 2026-10-07 at 3 15 33 PM@2x"
src="https://github.com/user-attachments/assets/ecb9aa87-26dc-4b69-a086-cb77a28bb860"
/> |

</details>

## Verification

To test in staging, set your org's Assistant opt-in level to Disabled,
ask "What tables do I have?", and review the card. Try selecting the
proposed (or different) opt-in level and saving to continue.

[This
trace](https://www.braintrust.dev/app/supabase.io/p/Dev%20(mattrossman%2FAssistant)/experiments/mattrossman%2Fai-158-prompt-users-to-update-settings-instead-of-showing-no-tool-1791483991?r=90066cd9-4da3-4817-9650-c369d2b42cea)
is a sample from the accept eval case after saving Schema Only, note the
`update_opt_in_level` span.

## Safety considerations

I added a banner to the modal to make it more obvious that this setting
impacts the whole org, not just the current chat or project:

<img width="592" height="78" alt="CleanShot 2026-10-08 at 2 04 44 PM@2x"
src="https://github.com/user-attachments/assets/6b140ed6-65fb-4bc0-b5cc-9c82fe2a67aa"
/>


I leave the current opt-in value selected by default in the form so the
user has to consciously select the proposed value instead of mindlessly
clicking save without understanding implications.

`execute_sql` and `run_notebook` outputs are now stamped with the level
they ran under, and history is sanitized by the least permissive of the
stamped vs current opt-in levels. That way raising the level mid-chat
doesn't unexpectedly expose earlier query rows to the model.

Closes AI-158
2026-10-09 10:39:23 -04:00
kemal.earth 6119ea1eb5 feat(design-system): remove table head hover in design system (#51452)
## Problem

All our tables had shadcn's rather annoying row hover on a
non-interactive `<thead>`.

## Solution

Some tailwind/css magic to stop the hover on `<thead>`.
2026-10-09 13:56:50 +01:00
Daniel Chapman 4fcd212d6a Add Daniel Chapman to humans.txt (#51467)
## Problem

I joined the company.

## Solution

Added myself to humans.txt.
2026-10-09 05:50:33 -04:00
4f23e91174 feat(studio): scoped oauth apps, admins can revoke an app (#50980)
## Problem

Admins should be able to revoke an OAuth app that uses scoped tokens.

## Solution

## Solution

- Add a menu to the org settings oauth approved apps rows to revoke the
app

<img width="1164" height="342" alt="image"
src="https://github.com/user-attachments/assets/1323318a-7c68-436e-ae77-0c79d763e4cc"
/>


<img width="441" height="350" alt="image"
src="https://github.com/user-attachments/assets/dd5cf88e-184a-4edb-a240-340bd2f58727"
/>

## Review instructions

In Org Settings/OAuth apps, you should see a menu button for each app
that contains a _Revoke_ item. Clicking this item should open a dialog
to revoke the app.
Notice how the focus is back on the dropdown trigger button when the
dialog is closed (canceled or success)

---------

Co-authored-by: kemal <hello@kemal.earth>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
2026-10-09 11:30:52 +02:00
Marcus Weinerandsupabase-vercel-tedd[bot] 8c10701cb5 feat(docs): Document TLS ciphers and upcoming CBC removal (#51390)
## Problem

We're soon going to remove CBC-mode ciphers from the HTTP APIs for
projects hosted on the platform.

## Solution

These docs help customers understand what our TLS offering looks like
and helps with the change.

## Review instructions

Check the copy if it's understandable and well written

## 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)

The `/write-the-docs` skill showed these notes:

- The error strings in the troubleshooting table are typical messages,
not taken from Supabase logs or tickets.
- The proxy workaround is my suggestion, not part of the approved comms.
- The openssl command appears on both pages. The troubleshooting
renderer (MDXRemoteBase) doesn't seem to support <$Partial>, and no
troubleshooting article uses one, so I didn't share it.
- Both pages describe a future removal. After November 10 the wording
("will remove", "until the removal date") needs a follow-up edit to
present tense.

---------

Co-authored-by: supabase-vercel-tedd[bot] <336548405+supabase-vercel-tedd[bot]@users.noreply.github.com>
2026-10-09 15:45:08 +07:00