mirror of
https://github.com/supabase/supabase.git
synced 2026-10-15 22:29:11 +03:00
eaad809abfc47c5f3634da6624ef90a013a784a8
39087
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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.
|
||
|
|
700365ffba |
fix(pg-meta): generate privilege, publication, role and schema SQL that servers can statically check (#51457)
## What kind of change does this PR introduce? Bug fix. ## What is the current behavior? On a project whose database server statically checks `DO` blocks before running them (Multigres does), several Studio actions fail: - Creating a table shows "Failed to update API access privileges for new table", although the table is created. - Toggling Realtime for a table fails with `EXECUTE of a runtime-built statement inside a PL/pgSQL body is not supported`. - The same error blocks editing a role or schema (rename, owner, drop) and changing column privileges. All of these come from SQL that `@supabase/pg-meta` generates. Such a server only accepts a dynamic `EXECUTE` when it can prove the statement is fixed, and two shapes in our SQL prevent that: - parentheses around the payload: `execute(format(...))` - `%s` conversions in `format()` strings, which substitute raw text (for example `%s` fed by `<oid>::regclass`, by a `string_agg(...)` subselect, or by a variable holding a table list) ## What is the new behavior? `tablePrivileges.grant/revoke`, `columnPrivileges.grant/revoke`, `publications.update`, `roles.update/remove` and `schemas.update/remove` generate SQL with no parentheses around the payload and only `%I`/`%L` conversions: - Table and column privileges name the table with `%I.%I`, taking the schema and name from `pg_class`/`pg_namespace`. - The publication update loops over the tables to drop and to add, with the same `tables` semantics as before (`undefined` keeps the tables, `null` publishes all tables, a list replaces them, bare names resolve through the search path). - `schemas.remove` picks between `drop schema … cascade` and `… restrict` with two plain statements instead of a `%s` fed by a `CASE`. - The grant and revoke format strings are built with `literal()`, so a quote in a role name can't end the string early. The statements are equivalent on regular Postgres. ## Additional context - New tests: replacing, clearing and keeping a publication's tables, switching between a table list and all tables, and a test (no database needed) that fails if the generated SQL of any of these builders goes back to `execute(...)` or `%s`. - I ran the pg-meta tests against a local Postgres 17. A set of existing snapshot tests were recorded on Postgres 14 and fail there with and without this change (for example the new `MAINTAIN` privilege in table privileges), so CI is the real check for those. The tests covering the changed SQL pass. - Some other Studio SQL is blocked on such servers for different reasons (for example creating foreign servers, and `SET` inside a `DO` block). It isn't addressed here. --------- Co-authored-by: Joshen Lim <joshenlimek@gmail.com> |
||
|
|
bdb86f4e59 |
chore(www): add blog post: Ship changes to your Supabase backend with Grok Bot (#51430)
## 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? New blog post (www): "Ship changes to your Supabase backend with Grok Bot", announcing Supabase joining the SpaceXAI Partner Network. ## What is the current behavior? N/A ## What is the new behavior? Adds `/blog/ship-changes-to-your-supabase-backend-with-grok-bot`, dated 2026-10-13, with Nick Littman, Elsa Heffernan, and Shaziya Bandukia as authors. ## Additional context Also updates Nick Littman's title in `authors.json` to Solution Architect. --------- Co-authored-by: dshukertjr <dshukertjr@gmail.com> |
||
|
|
3a33cbcce5 |
Show main branch as part of the empty state (#51607)
## Context Shows the production branch as part of the branching empty state (Shifts `BranchingEmptyState` into `Overview`) It's so that users can still then reach the "View logs" button for the production branch which was otherwise hidden <img width="1214" height="531" alt="image" src="https://github.com/user-attachments/assets/3bc702f2-950b-4d9e-8b4f-78149af9ed82" /> |
||
|
|
287c36447a |
chore(docs): add Matt McGill to humans.txt (#51610)
## Problem I joined Supabase! ## Solution I've recorded that I joined Supabase! ## 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) |
||
|
|
4bf7b16473 |
feat(studio): scoped oauth apps reconsent UI (#51078)
## Problem When users must grant access to an app they already added because its scopes changed, they should have a clear understanding of the changes ## Solution Show only the scopes differences by default <img width="844" height="962" alt="image" src="https://github.com/user-attachments/assets/6289f4cf-200f-4660-b9a1-aedbaaa963e3" /> ## Review instructions Try this UI with [`authorize?mock_scenario=reconsent`](https://studio-staging-git-gildasgarcia-oauth-apps-inte-6106b6-supabase.vercel.app/dashboard/authorize?mock_scenario=reconsent) --------- Co-authored-by: Joshen Lim <joshenlimek@gmail.com> |
||
|
|
25708ed67a |
chore(studio): storage versioning override conflict (#51593)
## Problem When uploading a file with same name of already existing file, the ui automatically creates a new file with incremental number and doesn't consider the scenario of giving the possibility of storing the new upload as a version of the already existing file. ## Solution Provide modal to chose the behaviour when name conflict happens when uploading a file: - Replace existing file (same file with version history) - Keep both (new file with incremental numbering) https://github.com/user-attachments/assets/ee192be9-4087-4e14-89f1-1c82acf550cd Manage edge case of clashes with files created when bucket had versioning enabled (so with `is_versioned` flag to true) and clashing upload happens when bucket is in SUSPENDED state. https://github.com/user-attachments/assets/00694c77-07c1-405e-bd54-bdf0bf99d274 Unrelated fix: - add "Delete permanently" action when selecting multiple files with versioning enabled <img width="510" height="203" alt="Screenshot 2026-10-13 at 15 59 27" src="https://github.com/user-attachments/assets/5692fc23-2fd3-4259-9de2-3932aecbccd0" /> |
||
|
|
8b9af56867 |
feat(studio): link specific region to regions docs in free-tier region selector (#51590)
<!-- claude-slack-attribution --> _Requested by **Charis Lam** · [Slack thread](https://supabase.slack.com/archives/C0161K73J1J/p1791896774914759)_ **Before:** The free-tier region selector footer read "Upgrade to Pro to choose a specific region." with only "Upgrade to Pro" linked (to the billing plan panel). **After:** "specific region" also links to https://supabase.com/docs/guides/platform/regions (opens in a new tab), so users can see which regions exist. Requested by Lukas Bernert on #51282. Wrapped "specific region" in `InlineLink` with `${DOCS_URL}/guides/platform/regions` in `RegionSelector.tsx` and extended the existing wizard test to assert the link href. 🤖 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> Co-authored-by: Ali Waseem <waseema393@gmail.com> |
||
|
|
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) |
||
|
|
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 --> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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" /> |
||
|
|
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> |
||
|
|
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) |
||
|
|
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" /> |
||
|
|
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" /> |
||
|
|
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> |
||
|
|
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> |
||
|
|
24307c02e5 |
chore(kb) - add codeowner line (#51196)
## Problem Add in formal ownership line for apps/kb w/in codeowners |
||
|
|
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. |
||
|
|
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> |
||
|
|
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> |
||
|
|
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 |
||
|
|
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. |
||
|
|
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> |
||
|
|
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! |
||
|
|
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> |
||
|
|
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. |
||
|
|
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 |
||
|
|
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> |
||
|
|
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) |
||
|
|
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> |
||
|
|
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> |
||
|
|
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. |
||
|
|
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) |
||
|
|
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. |
||
|
|
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> |
||
|
|
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> |
||
|
|
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 |
||
|
|
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> |
||
|
|
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> |
||
|
|
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) |
||
|
|
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> |
||
|
|
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> |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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> |