## Context
If you create a table with a `jsonb` **array** column, then try to
insert a new row with `[["` as the `jsonb` column value, the dashboard
currently incorrectly flags it as a large value and blocks the user from
editing it
<img width="583" height="133" alt="image"
src="https://github.com/user-attachments/assets/28b89648-12b6-4b49-a862-b4ec0db03e24"
/>
It's happening due to a small issue in `table-row-query` regarding its
truncation logic, a stop gap to prevent fetching large column values
which will cause browser performance issues. Multi dimension arrays are
being handled differently in which there's no `...` appended at the end.
And hence the naive check in `isValueTruncated` caused this issue to
happen.
Opting to adjust the SQL in `table-row-query` to align the truncation
behaviour for multi dim array, such that it will end with `...` if the
value being fetched is too large.
## To test
We mainly need to ensure that the original problem no longer happens +
truncation of large values is still working as expected. The following
SQL here sets up some sample rows to test the truncation logic in the
UI.
```
create table trunc_test (
id int primary key,
label text,
big_text text,
big_json jsonb,
big_text_1d text[],
big_grid text[][],
big_docs jsonb[][],
small_grid text[][],
small_docs jsonb[]
);
insert into trunc_test values
-- row 1: everything large
(1, 'large', repeat('a', 20000),
jsonb_build_object('k', repeat('b', 20000)),
(select array_agg(repeat('c', 300)) from generate_series(1, 120)),
(select array_agg(array[repeat('d', 300), 'x']) from generate_series(1, 120)),
(select array_agg(array['{"k":1}'::jsonb, to_jsonb(repeat('e', 300))]) from generate_series(1, 120)),
array[array['a','b'], array['c','d']],
array['["x"]'::jsonb]),
-- row 2: everything small
(2, 'small', 'hi', '{"k":1}', array['a'], array[array['a','b'], array['c','d']],
array[array['{"k":1}'::jsonb]], array[array['a','b'], array['c','d']], array['["x"]'::jsonb]);
```
## Problem
Deleting a paid project could show a "Failed to submit exit survey"
toast with a permissions error. The survey was sent after the delete
succeeded. Deleting a project removes its permissions, so the survey
endpoint's project-level access check rejected the request with a 403.
<img width="510" height="196" alt="Screenshot 2026-10-16 at 15 27 40"
src="https://github.com/user-attachments/assets/f01cb89f-597e-492d-bfc4-37f7260c25d3"
/>
## Solution
- Send the exit survey before the delete, while the project still has
its permissions.
- Never block the delete on the survey: a failed survey is ignored.
- Pass a no-op `onError` so the survey failure toast no longer shows.
The old `catch` swallowed the exception but not the hook's default
toast.
## Known trade-off
If the survey succeeds and the delete then fails, a survey is recorded
for a project that still exists. A separate backend change to authorize
deletes against the organization would let the survey move back after
the delete.
## How to test
- Delete a project on a paid plan with a survey reason selected: no
error toast, the survey is recorded, and the project is deleted.
- `pnpm --filter studio exec vitest run
components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal.test.tsx`
## Problem
Browser Back and router navigation can leave the pipeline wizard without
confirming unsaved changes. This is a slice of #49243, builds on merged
#51821.
## Solution
- Protect unsaved changes in both runtimes: Close and header links use
the discard dialog; document exits and refresh use the browser warning.
- Add TanStack confirmation for client-side navigation, preserving
Back/Forward history. Step changes do not prompt.
Next.js client-side router exits remain outside this slice. **Start
pipeline** stays disabled.
## Review instructions
1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-navigation-guard-supabase.vercel.app/dashboard/project/_/database/pipelines),
choose a test project and enable **Pipeline creation wizard**. Open the
[wizard
preview](https://studio-staging-git-dnywh-featpipeline-navigation-guard-supabase.vercel.app/dashboard/project/_/database/pipelines/new).
2. Continue to Connection and enter a pipeline name. Try a header link
and **Close**: **Keep editing** preserves values, while **Discard
changes** leaves without a second prompt.
3. Use browser Back to return to Destination without a prompt, then Back
again to leave. Cancel the prompt and check the URL and values remain;
Forward should still reach Connection. Document exits show the native
browser warning in both runtimes; TanStack client-side exits show **Keep
editing / Discard changes**.
4. With changes, refresh and cancel the browser warning. Check values
remain. A fresh wizard with no changes should close without
confirmation.
## Problem
The pipeline wizard lets users reach Review without a valid publication
or initial-sync selection. This is a slice of #49243, following the
merged #51818.
## Solution
- Refresh publication metadata on **Continue** and reject unavailable
publications or removed initial-sync tables.
- Validate initial-sync and advanced data settings, reveal invalid
fields and preserve values for retry.
- Block browser-history shortcuts to Review after data settings change.
| Normal State | Error State (Expanded) |
| --- | --- |
| <img width="1486" height="1010" alt="CleanShot 2026-10-16 at 13 18
25@2x"
src="https://github.com/user-attachments/assets/74ec0785-3bd4-407a-aa3c-7fe69c338488"
/> | <img width="1506" height="2516" alt="CleanShot 2026-10-16 at 13 21
27@2x"
src="https://github.com/user-attachments/assets/6193d8c4-ab9d-47ca-9d9d-1a31198145d1"
/> |
Pipeline creation and navigation-out guards remain for later slices.
**Start pipeline** stays disabled.
## Review instructions
1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-data-validation-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project and enable **Pipeline creation wizard**. Open the
[wizard
preview](https://studio-staging-git-dnywh-featpipeline-data-validation-supabase.vercel.app/dashboard/project/_/database/pipelines/new),
choose a destination, then enter credentials and test the connection to
reach Data.
2. Click **Continue** without a publication. Check the field error.
Select a publication, choose a selective initial-sync mode and leave its
table selection empty. Check Continue requires at least one table.
Select a table and confirm you can reach Review.
3. Return to Data. Enter a negative **Batch wait time** under **Advanced
settings**, collapse it and click Continue. Check it reopens with the
error. Correct it and continue, then use browser Back, change a data
setting and try browser Forward. Check you stay on Data until you click
Continue again.
4. For a stale-selection check, select an initial-sync table, remove it
from the publication in another tab, then click Continue. Check the
selection is rejected and your other values remain. A failed metadata
request should also keep values and allow retry with Continue.
## Problem
The pipeline wizard from #51776 allows users to continue without valid
destination credentials. This is the next slice of #49243.
## Solution
- Validate connection fields for all four destinations using the
existing schemas and helpers.
- Validate the destination on **Continue** and advance to Data on
success. Show field errors and connection failures inline; pause for
warnings before continuing.
- Require a new check after connection settings change and block
browser-history shortcuts past an unverified connection.
| Errored Test | Success Test |
| --- | --- |
| <img width="1532" height="2062" alt="CleanShot 2026-10-16 at 12 19
51@2x"
src="https://github.com/user-attachments/assets/a40a6c01-ee89-4601-b5d7-6ffc85071dc7"
/> | <img width="1500" height="1950" alt="CleanShot 2026-10-16 at 12 18
33@2x"
src="https://github.com/user-attachments/assets/c50c1ad4-256b-44b5-bd06-ec0685aae759"
/> |
The screenshots show earlier test states; successful checks now advance
directly to Data.
Data validation and pipeline creation remain for later slices. **Start
pipeline** stays disabled.
## Review instructions
1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-connectio-eb9566-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project and enable **Pipeline creation wizard**. Open the
[wizard
preview](https://studio-staging-git-dnywh-featpipeline-connectio-eb9566-supabase.vercel.app/dashboard/project/_/database/pipelines/new)
for that project.
2. Choose a destination and click **Continue** with empty or invalid
fields. Check the errors, then enter valid credentials and retry. A
failed check keeps your values. A failed result stays visible while
editing, until retry or destination change. Changed settings still
require a fresh check. A successful check opens Data automatically;
warnings remain for review before continuing.
3. Continue to Data, return to Connection and change a credential or
advanced connection setting. Check that browser **Forward** cannot skip
the new check, then click **Continue** to validate again.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Added Farley Thomas to the team list.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Nik Richers <nrichers@gmail.com>
Adds Carlos Robles to `apps/docs/public/humans.txt`, in alphabetical
order between Carel de Waal and Carson Adam.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Added Carlos Robles to the team list.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Nik Richers <nrichers@gmail.com>
adding myself to humans.txt as a new employee
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Added Masha Koltsova to the team information page.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Nik Richers <nrichers@gmail.com>
Adding myself as part of the Supabase humans!!!
## 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?
Docs
## What is the current behavior?
I'm not in the humans.txt
## What is the new behavior?
I'm now in the humans.txt
## Additional context
This is a task in my onboarding.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated the team credits page to include Francisco Ulate.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Nik Richers <nrichers@gmail.com>
## Summary
- Add Anil Maharjan to the team list in humans.txt
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Added Anil Maharjan to the team roster on the documentation site.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Nik Richers <nrichers@gmail.com>
## 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?
Update
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Removed two names from the public team listing.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## 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?
Add Andrew Jackson to humans.txt
## What is the current behavior?
Andrew Jackson is not in humans.txt.
## What is the new behavior?
Andrew Jackson is in humans.txt
## Additional context
N/A
## Summary
The incident.io status page is now the only status banner for everyone,
so the legacy status banner path is removed:
- Removed the `incidentIoStatusPage` ConfigCat flag. The incident.io
path is unconditional.
- Deleted the legacy status banner code (`StatusPageBanner` and its
utils/visibility hook) and its tests.
- Deleted the legacy API endpoints `/api/incident-banner`,
`/api/incident-status`, and `/api/status-override` (pages, app, and
routes variants), along with their data hooks, query keys, and lib
helpers.
- Removed `STATUSPAGE_*` env vars from the Turbo config and the
`INCIDENT_BANNER_DISMISSED_IDS` local storage key from
`packages/common`.
- Updated the AI tools and SQL generation endpoint that read the flag.
`NEXT_PUBLIC_ONGOING_INCIDENT` / the `ongoingIncident` override is kept.
The `incident_status_cache` table and its migration are intentionally
untouched. Studio no longer reads it, and dropping it is a separate
cleanup.
## Testing
- Studio typecheck passes.
- Related vitest suites pass (414 tests).
## Summary
Migrates four more assistant tools to the contract + `.server.ts`
pattern used by the notebook tools. Each tool now declares its schemas,
opt-in level, approval and model-visible output once.
## Changes
* Add contracts and server factories for `execute_sql`,
`deploy_edge_function`, `rename_chat`, `load_knowledge`;
`getStudioTools` now composes them.
* Add `execute-sql-output.ts` (output schema, `toModelRows`,
`NO_DATA_PERMISSIONS`) and `knowledge-topics.ts` (topic names + UI
labels, replacing the copy in `Message.Parts.utils.ts`).
* Delete `executeSqlSanitizer` and `ALL_TOOL_SANITIZERS`; history replay
goes through `sanitizeContractPart` only.
* Drop the four tools from `TOOL_CATEGORY_MAP`; the UI and evals import
schemas from the contracts; `rename_chat` input casts now use the
contract type.
## Deviations worth reviewing
* `execute_sql` replay: a bare-array legacy output is stamped `schema`
via a union transform (still hidden from the model, still shown in the
UI). A malformed non-array output is now dropped, where before it passed
through at the data level.
* The "no data permission" message now reaches the model as a JSON
string value instead of a text part. The text the model sees is
unchanged.
* `deploy_edge_function` output is now strictly `{ success: boolean }`
in the UI parse (was optional/passthrough).
## Problem
Two writing patterns came up while editing the Vercel Marketplace guide
in #51630, and the style guide doesn't cover either one.
- **References to a list:** When another sentence sits between a
reference and its list, as in "start from these tabs. Each one opens a
different page:", _these_ has nothing to point back to. Nothing in the
style guide covers this.
- **Order of UI instructions:** Nothing says whether an instruction
names the location or the control first. "Click **Manage** next to
Supabase" asks the reader to look for **Manage** before they know where
it is.
Resolves DOCS-1452.
## Solution
`02-elements.md` gets a new rule for lists and an addition to the
existing step guidance, each with a recommended and a not recommended
example.
- **Point forward to a list with _the following_** (under **Lists**):
When another sentence sits between a reference and its list, use _the
following_, which points forward. When the reference is directly before
the list, _these_ works too.
- **Location before the action** (under **Procedures**): The step
guidance now says that a step can begin with a short location phrase
followed by the imperative verb, and that when a step says where to act,
the location comes first.
The examples use _click_ for buttons, following the `click` and `select`
entries in `WORD_LIST.md`.
## Review instructions
1. Open `apps/docs/style-guide/02-elements.md` in the **Files changed**
tab.
2. Read **Point forward to a list with _the following_** under
**Lists**, and confirm that the examples separate the two cases: a
reference directly before the list, and one with a sentence in between.
3. Read the step guidance at the start of **Procedures**, and confirm
that the examples agree with the `click` entry in `WORD_LIST.md`.
## Checklist
Check all before review:
- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [x] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
---------
Co-authored-by: Miranda Limonczenko <miranda.limonczenko@supabase.io>
## Summary
- Adds cross-links from 2024 blog posts to related pages on supabase.com
where the post already mentions the topic.
- Updates existing links in these posts that redirected or returned 404
so they point to the final destination.
## Notes
- Link changes only; no prose changes beyond wrapping existing wording
in links.
- All internal targets were checked against the sitemap.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
## Summary
- Adds cross-links from 2023 blog posts to related pages on supabase.com
where the post already mentions the topic.
- Updates existing links in these posts that redirected or returned 404
so they point to the final destination.
## Notes
- Link changes only; no prose changes beyond wrapping existing wording
in links.
- All internal targets were checked against the sitemap.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
## Summary
- Adds cross-links from 2025 blog posts to related pages on supabase.com
where the post already mentions the topic.
- Updates existing links in these posts that redirected or returned 404
so they point to the final destination.
## Notes
- Link changes only; no prose changes beyond wrapping existing wording
in links.
- All internal targets were checked against the sitemap.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
## Summary
- Adds cross-links from 2026 blog posts to related pages on supabase.com
where the post already mentions the topic.
- Updates existing links in these posts that redirected or returned 404
so they point to the final destination.
## Notes
- Link changes only; no prose changes beyond wrapping existing wording
in links.
- All internal targets were checked against the sitemap.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
## Problem
Changing the restore date resets the entered time, and the repeated hour
at the end of daylight saving time can resolve to the wrong occurrence.
Both can change the submitted recovery timestamp.
## Fix
Store the recovery point as a Unix timestamp and preserve its occurrence
when editing an ambiguous local time. Calendar edits carry the entered
hours, minutes, and seconds onto the selected day, applying that day's
timezone offset and retaining the existing backup-range clamping.
This focuses on date edits and repeated-hour handling from #48903. It
changes only the PITR form, its utilities, and regression tests. Related
to
[FE-4129](https://linear.app/supabase/issue/FE-4129/r2np-datetime-widget).
## How to test
- In PITR or restore-to-new-project, enter a time and select another
available calendar day. Expected result: the entered hours, minutes, and
seconds remain selected, and the submitted timestamp matches the new
date.
- Run the PITRForm and PITR.utils Vitest suites. Their fixtures cover
both occurrences of the repeated Madrid/New York hour, edits across DST,
spring-forward normalization, fractional offsets, and backup boundaries.
- Twelve focused regression cases passed under a Madrid browser
timezone. Those cases plus the existing selector component test passed
under Hong Kong, thirteen tests total. All CI checks passed, including
Studio tests, all four Next.js/TanStack E2E shards, typecheck, lint
ratchet, formatting, spelling, unused-code checks, and Docker build.
## Problem
New projects created on staging default to v2 (`cloud_provider: 'AWS'`).
We want staging to start exercising v3 (`AWS_K8S`). Resolves FE-4640.
## Solution
In `ProjectCreationForm`, the initial cloud provider is now rolled once
per mount: on staging (`NEXT_PUBLIC_ENVIRONMENT === 'staging'`) it is
`AWS_K8S` with 50% probability, otherwise the existing default. v3 is
only rolled if the `infra:cloud_providers` custom content allows
`AWS_K8S`. Prod and local are unchanged, and the internal-only "Cloud
provider" selector still lets admins override the default.
## Review instructions
1. Run Studio with `NEXT_PUBLIC_ENVIRONMENT=staging` and the
`newProjectInternalOnlyConfiguration` flag on.
2. Reload the new-project page several times and check that the "Cloud
provider" select defaults to AWS and AWS (Revamped) about equally often.
3. Change the select manually and confirm the choice is kept and the
project is created with it.
4. With `NEXT_PUBLIC_ENVIRONMENT=prod` or `local`, confirm the default
is always AWS.
## Checklist
- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
- [ ] If I wrote a new docs topic or edited an existing topic, I used
the `/write-the-docs` or `/edit-the-docs` skill, which applies the docs
[style
guide](https://github.com/supabase/supabase/tree/master/apps/docs/style-guide)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
## Summary
- Adds cross-links from 2022 blog posts to related pages on supabase.com
where the post already mentions the topic.
- Updates existing links in these posts that redirected or returned 404
so they point to the final destination.
## Notes
- Link changes only; no prose changes beyond wrapping existing wording
in links.
- All internal targets were checked against the sitemap.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
## Summary
- Adds cross-links from 2021 blog posts to related pages on supabase.com
where the post already mentions the topic.
- Updates existing links in these posts that redirected or returned 404
so they point to the final destination.
## Notes
- Link changes only; no prose changes beyond wrapping existing wording
in links.
- All internal targets were checked against the sitemap.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
## Summary
- Adds cross-links from 2020 blog posts to related pages on supabase.com
where the post already mentions the topic.
- Updates existing links in these posts that redirected or returned 404
so they point to the final destination.
## Notes
- Link changes only; no prose changes beyond wrapping existing wording
in links.
- All internal targets were checked against the sitemap.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
## Problem
The time-range dropdown above the request charts on the project home
page resets on every visit, so users who prefer a different range have
to re-select it each time.
Resolves FE-2828.
<img width="819" height="353" alt="Screenshot 2026-10-16 at 10 42 05"
src="https://github.com/user-attachments/assets/cb8d467b-e709-43b0-9ae4-b02ebccf5faf"
/>
## Solution
Persist the selection in localStorage, keyed per project
(`home-chart-interval-${ref}`), in both usage section variants
(`ProjectUsageSection` and `ProjectUsageSectionDeltas`, chosen by the
`newHomepageUsageDeltas` flag).
- New `resolveChartInterval` helper validates the stored value against
the known keys and the plan's log retention, falling back to the plan
default for corrupt values or after a plan downgrade. Unit tested.
- Removed the `useEffect` in `ProjectUsageSection` that reset the
interval on retention change, since it would overwrite the saved value.
- Moved `getDaysRequired` into `logs.utils.ts` so the dropdown and the
helper share the retention check.
Manually verified with the flag on and off: reload keeps the selection,
and each project keeps its own.
## Problem
Several snippets in the dashboard Connect sheet still mention anon keys
in placeholder text, even though publishable keys are now the
recommended client key:
- Swift, Kotlin, Expo, Ionic React and Ionic Angular show `<prefer
publishable key instead of anon key ...>` when the project has no
publishable key.
- Astro, Nuxt, Refine, TanStack, Flask and the three .NET snippets fall
back to `your-anon-key` when the project has neither key.
- Ionic React stores the key in a variable called `supabaseAnonKey`.
## Solution
- Both placeholders become `your-publishable-key`.
- The Ionic React variable becomes `supabaseKey`, matching the other
snippets.
Snippets that switch to `*_ANON_KEY` environment variables for projects
with only legacy keys (Next.js, Vite, SvelteKit and others) are
unchanged. There, `your-anon-key` still matches the variable name.
The Flutter snippet is handled separately in #51792.
## Review instructions
1. Open the Connect sheet for a project without a publishable key.
2. Go through the frameworks listed above and check that the
placeholders say `your-publishable-key`.
## Checklist
- [x] I have read
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
## Problem
The feature flag enabling the new scoped oauth apps UI was enabled by
mistake in production but this UI currently only work with mocks. We
added an environment check in some places but not all so users did see
the new UI
## Solution
Add the environment check wherever needed
## Context
Replaces the individual filters on the Account audit logs page with the
filter bar to match a consistent UX across log surfaces
<img width="1206" height="360" alt="image"
src="https://github.com/user-attachments/assets/c5bdfd7e-3277-4695-b9fc-1791df8720c7"
/>
Also uses the `supportOperators` param for the `FilterBar` to support
"OR" based operations when filtering for projects
<img width="1219" height="97" alt="image"
src="https://github.com/user-attachments/assets/d4748e6c-d1f3-4f23-b767-e0f4bb1c0a1c"
/>
The main changes for the `FilterBar` component made in this PR (which
would be more relevant for the design team) are:
- Added a divider between the options and "New group"
- Originally didn't have a divider
- So there's a clearer distinction that the "New group" isn't a option
to set as the value for
- Add a new `defaultGroupOperator` prop
- Originally defaults to `AND`
- However, in the context of Audit Logs when filtering for projects,
you'd expect `OR` to be the default to filter across several projects
(`AND` wouldn't make sense here)
## Problem
The file list in an Edge Function's code view is shown in the order the
Management API returns it (roughly `created_at` order), not sorted by
name. Users expect name order, as in VS Code.
Resolves FE-2799
## Solution
- `formatFunctionBodyToFiles` now sorts files by their displayed name
before assigning ids, using a case-insensitive numeric comparison
(`file2` before `file10`). The list is flat, so there is no folder
grouping.
- Sorting would have changed which file opens first, so the code page
now selects the function's entrypoint file by default.
`getDefaultSelectedFileId` matches the entrypoint's basename, then falls
back to `index.ts`, then to the first file. The entrypoint isn't always
`index.ts`: the docs allow any `.ts`, `.js`, `.tsx`, `.jsx` or `.mjs`
file.
- The shared `FileExplorerAndEditor` and the new-function page are
unchanged. The code page passes the selection through the explorer's
existing `selectedFileId` / `setSelectedFileId` props.
- Files added or renamed in the editor keep their position until the
next load.
Before:
<img width="259" height="370" alt="Screenshot 2026-10-15 at 16 44 50"
src="https://github.com/user-attachments/assets/611fe2b9-5676-496a-85a9-e50032708c7a"
/>
After:
<img width="259" height="371" alt="Screenshot 2026-10-15 at 16 35 19"
src="https://github.com/user-attachments/assets/7f433661-ef34-4e3f-9143-afc67be1b30a"
/>
## Review instructions
1. Open an Edge Function's Code tab for a function with several files,
for example `utils.ts`, `index.ts`, `deno.json`.
2. Confirm the files are listed alphabetically and that `index.ts` is
selected on load.
3. For a function with a custom entrypoint (for example `main.ts`),
confirm that file is selected on load.
4. Run `pnpm test:studio -- components/interfaces/EdgeFunctions`.
## Problem
The pipeline wizard in #49243 needs its merged components composed into
a full-page flow, with values preserved when moving backwards and
forwards.
## Solution
- Compose four full-page SteppedFlow steps behind **Pipeline creation
wizard**.
- Preserve values through step navigation and browser Back/Forward.
Refresh starts at Destination.
- Reuse Studio’s header controls and confirm before discarding changes.
- Defer step validation and creation; **Start pipeline** is disabled.
**Add pipeline** and preview-off visits keep the sheet.
| After |
| --- |
| <img width="1024" height="759" alt="New Pipeline Supabase"
src="https://github.com/user-attachments/assets/7c3c4511-9a00-4e64-a86a-d6d9489f7d75"
/> |
| _Only available by navigating to `database/pipelines/new` with the
feature preview on._ |
## Review instructions
1. Open the [Pipelines
preview](https://studio-staging-git-dnywh-featpipeline-stepped-n-ce5307-supabase.vercel.app/dashboard/project/_/database/pipelines),
select a test project and enable **Pipeline creation wizard**. Open the
[wizard
preview](https://studio-staging-git-dnywh-featpipeline-stepped-n-ce5307-supabase.vercel.app/dashboard/project/_/database/pipelines/new)
for that project. Check the full-page layout and header at desktop and
phone widths.
2. Enter connection details, select a publication and change
initial-sync and advanced settings. Use **Back/Continue**, browser
**Back/Forward**, and switch destinations to confirm values remain.
3. Check Review shows your settings, masks secrets and disables **Start
pipeline**. Refresh and confirm it restarts at Destination. Incomplete
steps are allowed in this navigation-only slice.
4. With changes, try header navigation or **Close**. Check **Keep
editing** preserves values and **Discard changes** leaves the flow. Turn
the preview off and confirm the wizard URL opens the sheet.
## 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?
Docs update (www feature catalog).
## What is the current behavior?
Follow-up to supabase/supabase#51773.
- `/features/native-local-runtime` has no hero image, so it shows the
green placeholder block.
- `/features/parallel-local-projects` shows the same placeholder.
## What is the new behavior?
- Native runtime uses the Local development hero images
(`local-development.png` and `-light.png`).
- Adds an optional `hideHero` field to the feature type. When true,
`pages/features/[slug].tsx` skips the hero block. Parallel local
projects sets it. All other features render as before.
## Additional context
The diff in `[slug].tsx` is mostly re-indentation from wrapping the hero
block in a conditional.
## Problem
Lucide React v1 improves screen reader behaviour (icons are hidden from
assistive tech by default). It also removes brand icons such as GitHub.
We were still on Lucide 0.x across the monorepo.
## Solution
- Move every workspace onto one shared Lucide React v1 version via the
pnpm catalog.
- But Lucide React v1 [deprecated brand
icons](https://github.com/lucide-icons/lucide/blob/main/BRAND_LOGOS_STATEMENT.md)
- Meaning we need to handle any _old_ brand icons we used from Lucide
0.x.
- Luckily, that was just `GitHubIcon`. So...
- Add a `GithubIcon` in `packages/ui` that matches Lucide’s previous
GitHub icon, and use it wherever we imported GitHub from Lucide.
- No other Lucide brand icons were in use.
- Studio “Continue with GitHub” sign-in still uses the existing SVG
asset (`github-icon.svg`), not this component.
- Keep the `Icon` suffix import style [recently
introduced](https://github.com/supabase/supabase/pull/51659)
- Monorepo apps now use `catalog` Lucide React v1.
## Review instructions
1. Open [Studio
preview](https://studio-staging-git-dnywh-bump-lucide-react-v1-supabase.vercel.app/dashboard/org)
on a project that is connected to GitHub:
- Project home → Activity stats “GitHub” row
- Org project list → GitHub badge on a connected project card/row
- Branches → GitHub link on a branch row, or “Sync with a GitHub branch”
- Project Settings → Integrations → GitHub integration panel
2. Open
[/kb/guides/sample-guide](https://supabase.com/kb/guides/sample-guide) →
confirm “Go to the GitHub discussion” shows the icon.
3. Open
[/docs/reference/javascript](https://supabase.com/docs/reference/javascript)
→ confirm the header GitHub control still shows the icon. Or
[/docs/guides/troubleshooting/rls-simplified-BJTcS8](https://supabase.com/docs/guides/troubleshooting/rls-simplified-BJTcS8)
→ “View discussion on GitHub”.
## 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?
Docs update: adds a new blog post to `apps/www/_blog`.
## What is the current behavior?
There is no blog post covering multiple local Supabase projects (one per
git worktree), the native no-Docker runtime, or faster remote branches
in CLI v2.119.0.
## What is the new behavior?
Adds "A local Supabase project per agent, with or without Docker" at
`/blog/local-supabase-project-per-agent-with-or-without-docker`, dated
2026-10-14.
Prettier passes on the new file. The `og.png` and `thumb.png` images are
not included in this PR yet.
## Additional context
Authors: `jgoux`, `wenbo` (both already in `authors.json`).
## 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?
Docs update (www feature catalog copy).
## What is the current behavior?
- No feature page for local development.
- The CLI entry predates multi-project local dev, config-driven
development, and declarative schemas.
- The Branching entry still says "Branching 2.0 (currently in public
alpha)" and links to `/platform/branching`.
Linear: MARKET-1648 (Local development, CLI), MARKET-1919 overlaps on
CLI bullet 3.
## What is the new behavior?
Updates `apps/www/data/features.tsx` so the catalog matches what shipped
at Select 2026:
- **New: Local development** (`/features/local-development`). Multiple
local projects per machine, one per git worktree, plus the native
runtime for environments without Docker. Experimental behind
`SUPABASE_EXPERIMENTAL_STACK=1`, so the stage is Public Alpha.
- **Rewrite: CLI** (`/features/cli`). New subtitle, body, and `docsUrl`.
- **Rewrite: Branching** (`/features/branching`). Dashboard branching is
the default, with inherited configuration and faster provisioning. Stage
is GA, and `docsUrl` moves to `/deployment/branching`.
Copy comes from the Notion Features Page database, reviewed 2026-10-14.
## Additional context
- Adds the Local development hero images
(`/images/features/local-development.png` and `-light.png`).
- The existing `parallel-local-projects` and `native-local-runtime`
entries are left as is. They overlap with the new page.
---------
Co-authored-by: Wen Bo Xie <wenbox323@gmail.com>
## Problem
We want a public engineering post that explains what runs when a
Supabase branch is created, in what order, and what to check when a step
fails.
## Solution
Adds the engineering post "How a new branch gets its config, migrations,
and functions" under the `engineering` category, with the OG and
thumbnail images at
`apps/www/public/images/blog/how-a-new-branch-gets-its-config-migrations-and-functions/`.
## Review instructions
1. Open
`/blog/how-a-new-branch-gets-its-config-migrations-and-functions` on the
preview link.
2. Check that the mermaid diagram renders and the H3 headings appear in
the table of contents.
3. Check that the post card and link preview show the images and that
the post appears under the Engineering filter on `/blog`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Wendie Cheung <wendie.cheung@supabase.io>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
## Problem
Updating our region experiment flags to be able to handle latest
experiment.
## Solution
Make flags resolve independently. cc @charislam
## Review instructions
tbc
---------
Co-authored-by: Charis Lam <26616127+charislam@users.noreply.github.com>