Commit Graph
35585 Commits
Author SHA1 Message Date
Jordi EnricandClaude Sonnet 4.6 9ce472d582 fix(devtool): remove critical option from auth rate limit warning
Auth rate limit only supports warning severity — critical is not a valid API return value. Added hasCritical flag per warning type to conditionally render the Crit button.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:54 +02:00
Jordi EnricandClaude Sonnet 4.6 3de503cb28 fix(dev-tools): rename window.devTelemetry to window.devToolbar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:54 +02:00
Jordi EnricandClaude Sonnet 4.6 34925ac0fb feat(dev-tools): extend toolbar for preview envs and add resource warnings tab
- Enable DevToolbar in Vercel preview deployments by checking
  NEXT_PUBLIC_VERCEL_ENV === 'preview' alongside NODE_ENV === 'development'
  in all guards and the index.ts tree-shaking condition
- Rename "Dev Telemetry" → "Dev Toolbar"; badge shows "Preview" or "Local"
- Add ExtraTab extension point to DevToolbar so consumers can inject tabs
- Add ResourceWarningsTab in studio: same off/warn/crit toggles for all
  resource warning types, wired into the existing DevToolbar via _app.tsx
- Remove standalone SupabaseDevToolbar (superseded by the tab above)
- localStorage persistence already handled by the existing STORAGE_KEY
  logic in DevToolbarContext — enabled state survives refreshes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:54 +02:00
Jordi EnricandClaude Sonnet 4.6 ae88d3d18c feat(studio): add hide button to SupabaseDevToolbar
EyeOff button in the panel header sets localStorage key
'supabase-dev-toolbar' to 'false' and unmounts the toolbar entirely.
To re-enable, run: localStorage.removeItem('supabase-dev-toolbar')
and refresh.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:54 +02:00
Jordi EnricandClaude Sonnet 4.6 53522efce2 feat(studio): rename devtool to SupabaseDevToolbar, center at bottom edge
- Rename ResourceExhaustionDevtool → SupabaseDevToolbar (new path:
  components/ui/SupabaseDevToolbar/) to reflect future growth beyond
  resource exhaustion warnings
- Position: fixed bottom-0, horizontally centered (left-1/2 -translate-x-1/2)
  so it no longer overlaps action buttons in the bottom-right corner
- Panel opens upward, flush with the toolbar button (rounded-t-lg, no bottom border)
- Toolbar button has rounded-b-none to visually connect with the panel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:54 +02:00
Jordi EnricandClaude Sonnet 4.6 046da3a04e fix(studio): format devtool files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:53 +02:00
Jordi EnricandClaude Sonnet 4.6 6ef83e3b74 feat(studio): show ResourceExhaustionDevtool on Vercel preview deployments
Extends the condition from NODE_ENV === 'development' to also include
NEXT_PUBLIC_VERCEL_ENV === 'preview' so the devtool is visible on
staging/preview URLs without affecting production or test environments.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:53 +02:00
Jordi EnricandClaude Sonnet 4.6 3e2f8c4d30 fix(studio): scope ResourceExhaustionDevtool to development only
Checking !== 'production' also matched the 'test' environment, causing
tests to render the devtool without a QueryClientProvider. Changed to an
explicit === 'development' check so the module is never loaded in test
or production builds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:53 +02:00
Jordi EnricandClaude Sonnet 4.6 46ac7d15c0 feat(studio): add ResourceExhaustionDevtool for toggling banners in dev
Floating devtool (bottom-right, dev/staging only) lets you toggle each
resource warning type (off / warning / critical) and read-only mode
independently. Uses queryClient.setQueryData to inject mock data directly
into the React Query cache — no network calls or API mocks needed. The
module is dynamically imported and the throw-in-production guard ensures
it is never bundled into the production build.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 11:50:53 +02:00
Gildas Garcia e95f1cc67c chore: migrate MFA settings form to zod (#44751)
## Problem

We currently have 2 libraries for schema validation: `yup` that was used
with `formik` and `zod` which is now the preferred one.

## Solution

Migrate the MFA settings form to use `zod`.
No visual changes.

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

* **Refactor**
* MFA settings forms now use stronger, consistent schema validation with
numeric input coercion and improved typing for more reliable form
behavior.
* Simplified form reset/synchronization for more predictable state
updates.

* **Bug Fixes**
  * MFA update requests now send only intended fields.
* Fixed Enhanced MFA Security “Save changes” button to show the correct
loading state.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-10 22:30:00 +02:00
Prashant Sridharan 5f669d2c7b Fixed redirect off form (#44736) 2026-04-10 16:25:17 +01:00
Gildas Garcia 56066fe1aa chore: remove formik dependency (#44744)
## Problem

Now that all forms have been migrated to `react-hook-form`, we can
remove `formik` as well as some unused deprecated components

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

* **Chores**
  * Removed formik dependency from the UI package.
  * Removed Form and InputNumber components and their public re-exports.
  * Removed FormContext and the form hook exports.
* Simplified multiple components (Input, Checkbox, Radio, Select,
Toggle, Listbox) by removing form-context integration.
  * Removed InputNumber styling and theme configuration.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-10 16:07:08 +01:00
Ali Waseem d48958c5e5 chore: remove outdated GitHub discussion link (#44746)
## Summary
- Remove the outdated GitHub discussion feedback link from the "Queue
table operations" dashboard setting
- Clean up the unused `discussionsUrl` prop and related rendering logic
from `DashboardToggle`

Closes FE-2973
## Test plan
- [ ] Verify the "Queue table operations" toggle in Account >
Preferences no longer shows a "Give feedback" link
- [ ] Verify the "Edit entities in SQL" toggle still renders correctly

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

## Summary by CodeRabbit

## Release Notes

* **Refactor**
* Removed the feedback link from dashboard settings toggles. The "Give
feedback" option is no longer available in the preferences interface.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-10 08:39:32 -06:00
Charis 00ef40cfe1 turn off email signup temporarily on live supabase (#44745)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
  * Disabled email-based user signup for the production environment.
* Disabled local database network restrictions to simplify local
development and testing.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-10 10:32:17 -04:00
Vaibhav 18def1710d fix: provider badge (#44726)
## TL;DR

fixes the Auth Users provider badge for Web3 users so it reflects the
actual enabled provider state

## problem

Web3 authenticated users appeared `Disabled` in `Authentication -> Users
-> Provider Information`
This happened because the user provider is stored as `web3`, while the
actual enabled state is chain specific (`solana` / `ethereum`)

<p align="left">
<img width="443" height="281" alt="Image"
src="https://github.com/user-attachments/assets/4918cbdb-75a4-4bd9-b9e5-511dcced5447"
/>
</p>

## solution

When the provider is `web3`,  resolve the enabled badge from 
`raw_user_meta_data.custom_claims.chain` (saw that in the payload while
testing) and map it to the correct Web3 config flag:
- `solana` -> `EXTERNAL_WEB3_SOLANA_ENABLED`
- `ethereum` -> `EXTERNAL_WEB3_ETHEREUM_ENABLED`



<p align="left">
<img width="148" height="43" alt="image"
src="https://github.com/user-attachments/assets/9d21b8fc-da93-4dcd-9cdb-5c0eacef2a27"
/>
</p>



## ref:
- closes https://github.com/supabase/supabase/issues/44724
- closes https://github.com/supabase/supabase/issues/39568
- closes https://github.com/orgs/supabase/discussions/39563

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

## Summary by CodeRabbit

* **Bug Fixes**
* Corrected web3 provider enabled status detection by mapping user chain
configuration to provider settings.

* **Tests**
  * Added test coverage for web3 user enabled status display.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-10 07:07:09 -06:00
Ignacio DobronichandClaude Opus 4.6 cfce3c7efc refactor: save tax ID via customer update endpoint (#44728)
## Summary

- Consolidate tax ID saving into the `PUT
/organizations/{slug}/customer` endpoint instead of using a
separate `/tax-ids` endpoint


## Test plan

### Updating billing information
From the billing dashboard`/org/_/billing`:
- [ ] Manually test updating billing address + tax ID from org billing
settings - single API call should save both
- [ ] Clear the Tax ID in the org, save and assert that it has been
deleted
- [ ] Modify all the fields in the address form, including TaxID. Click
"Cancel" and assert that everything has returned to the previous values.

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

* **Refactor**
* Billing address and tax ID updates are now sent in a single update
operation.
* Error messaging for billing updates consolidated into a single failure
notification.
* Tax ID handling clarified: you can clear tax ID explicitly or leave it
unchanged; omitting address fields no longer overwrites existing
address.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 09:49:57 -03:00
Gildas Garcia a9fdb09c66 chore: migrate docs feedback modal to react-hook-form (#44739)
## Problem

The Docs feedback modal still uses the old `Form` component with
`formik`

## Solution

Migrate it to `react-hook-form`

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

* **Improvements**
* Enhanced feedback form with schema-driven validation requiring title
and comment before submission.
* Submission buttons disable while submitting; cancel now also resets
the form state.

* **Chores**
* Added form handling and validation libraries to support the improved
feedback experience.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-10 12:11:30 +02:00
Saxon Fletcher b8a246f2d7 Errors since last deploy (#44733) 2026-04-10 20:11:02 +10:00
Jeremias Menichelli ac439d2366 fix(Docs): Fix oddly sized images (#44630) 2026-04-10 09:14:14 +00:00
supabase-supabase-autofixer[bot] 6196e51650 docs: update js sdk docs (2.103.0) (#44700) 2026-04-10 11:11:15 +02:00
Alaister YoungandAlaister Young dd41a34706 [FE-2478] feat(studio): simplify Connect modal for HA projects (#44695)
Simplify the Connect modal for Multigres/High Availability projects.
Pooling is always on for these projects, so the connection method
distinction doesn't apply.

**Removed:**
- Connection Method selector (Direct/Transaction/Session) for HA
projects
- IPv4 add-on panel for HA projects
- Pooler badge (Shared/Dedicated) for HA projects

**Changed:**
- "Type" label renamed to "Connection Type" for HA projects
- Default connection method set to `transaction` (instead of `direct`)
for HA projects

Non-HA projects are completely unaffected.

## To test

- Open Connect sheet → Direct tab on a **non-HA project** — verify
everything looks the same as before
- Open Connect sheet → Direct tab on an **HA project** — verify:
  - No Connection Method radio selector
  - Label reads "Connection Type" instead of "Type"
  - No IPv4 status panel
  - No pooler badge
  - Connection string displays correctly

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

* **Improvements**
* Connection UI now adapts for high-availability projects: hides pooler
options and IPv4 status, and updates the connection type label for
clarity.

* **Tests**
* Added tests covering connection configuration behavior when a project
is high-availability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Alaister Young <10985857+alaister@users.noreply.github.com>
2026-04-10 17:16:29 +09:00
Illia BasalaievandJeremias Menichelli 4bfcfe8298 add guide on restoring project after 90-day pause (#44549)
## 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

## What is the new behavior?

How to Restore Project After a 90-Day Pause troubleshooting guide

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

* **Documentation**
* Added a troubleshooting guide for recovering projects paused over 90
days that cannot be restored via the dashboard.
* Describes a step-by-step recovery workflow: export available database
backups and Storage objects, create a replacement project, restore the
database, restore Storage content, and reapply project configurations.
* Notes expected errors during restore, includes an image and video
walkthrough, optional automation script guidance, and links to related
migration and backup/restore guides.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Jeremias Menichelli <jmenichelli@gmail.com>
2026-04-10 07:46:11 +02:00
Manuel RubioandDanny White d1f54cd411 fix(studio): resolve layout shift on account preferences page (#42680)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES

## What kind of change does this PR introduce?

Bug fix

## What is the current behavior?

Fixes #34967 

The `/account/me`
([https://supabase.com/dashboard/account/me](https://supabase.com/dashboard/account/me))
preferences page has layout shifting during profile loading.

## What is the new behavior?

- Loading skeletons now match the structure of the loaded content (one
card per dynamic section)
- Static sections only render in the non-error branch, preventing them
from appearing alongside error messages
- Removed unused `isSuccess` destructure from `useProfile()`
- CLS value now on good range <= 0.10.

<img width="1917" height="905" alt="Screenshot from 2026-02-11 00-39-19"
src="https://github.com/user-attachments/assets/1d8fa7e1-9ca3-49ae-b4b8-1c0f28ebbf93"
/>

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

## Summary by CodeRabbit

* **Refactor**
* Enhanced the loading state interface on the account settings page with
improved visual indicators. Updated the component structure for better
UI consistency and refined the visual feedback mechanism during profile
data retrieval.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Danny White <3104761+dnywh@users.noreply.github.com>
2026-04-10 12:42:03 +10:00
Danny White 0005d3742d fix: clean up grouped input border rendering (#44690)
## What kind of change does this PR introduce?

Bug fix. Resolves FE-2959.

## What is the current behaviour?

Grouped inputs strip the inner control border with `border-0`, while the
outer `InputGroup` is responsible for the visible outline. After #44703,
grouped form inputs now receive the correct validation attributes, but
the primitive still removes the inner border dimensions entirely. That
keeps the visual layer brittle and can lead to inconsistent error
rendering, especially in light mode where the grouped password field
does not match the Project name input.

The shared `ui-patterns` input wrapper also inherits the generic
`inline-end` button spacing from `InputGroupAddon`, which pushes the
password copy button slightly too far to the right.

## What is the new behaviour?

The shared grouped-input primitive now keeps a transparent inner border
instead of removing border widths entirely. The outer `InputGroup`
continues to own the visible border, focus ring and error treatment, but
the inner control now has stable border metrics and no redundant
dark-mode background override.

The grouped invalid state now also matches the plain input treatment
more closely:

- unfocused error border uses `destructive-400`
- focused error border uses `destructive`
- error background uses `destructive-200`

The `ui-patterns` input wrapper now overrides the inherited `inline-end`
negative margin for its own copy/reveal button addon, so the password
copy button sits in the right place without changing spacing for other
direct `InputGroup` consumers.

| Before | After |
| --- | --- |
| <img width="1338" height="284" alt="CleanShot 2026-04-09 at 13 43
50@2x-91489355-5EEA-4884-BAA2-B93B28F1D7CB"
src="https://github.com/user-attachments/assets/ed40683b-8a87-4deb-8a0f-f892d00894f0"
/>| <img width="1334" height="278" alt="CleanShot 2026-04-09 at 13 41
36@2x-5D7E930B-EDB2-4002-9367-34ACE2DF4DB4"
src="https://github.com/user-attachments/assets/7d9594a4-9988-480e-a809-9f5ed29e8e24"
/> |
| <img width="1336" height="210" alt="CleanShot 2026-04-09 at 14 06
15@2x-05379F74-4CA5-4E6E-9250-CBA2764C1318"
src="https://github.com/user-attachments/assets/25e48cd4-de0a-47f3-9022-d7a3829a0626"
/> | <img width="1334" height="210" alt="CleanShot 2026-04-09 at 14 12
11@2x-11FBC519-D398-4A59-971A-97FBFEF610DE"
src="https://github.com/user-attachments/assets/91c3710c-7773-4286-854d-7b7144db85ab"
/> |

An easy place to test this is the Database password field in the New
Project creation flow. See also the Minimum password length field in
Email (Sign In / Providers).

## Summary

- update `packages/ui/src/components/shadcn/ui/input-group.tsx`
- replace `border-0` on grouped inputs/textareas with transparent
borders
- remove the redundant `dark:bg-transparent`
- keep the inner grouped controls visually neutral so the outer group
owns the rendered border state
- align grouped invalid border and background styling with the plain
input treatment
- update `packages/ui-patterns/src/DataInputs/Input.tsx` so copy/reveal
buttons do not inherit the extra right pull intended for other
`inline-end` addons
2026-04-10 12:03:23 +10:00
Gildas GarciaandIvan Vasilov d95fdfd566 fix: input-group don't have the proper validation attributes (#44703)
## Problem

The input groups components introduced in #44282 don't have the
validation attributes when invalid. This hurts accessibility and also
break the design:
<img width="1730" height="324" alt="image"
src="https://github.com/user-attachments/assets/a3fb8d86-f3a8-46bb-aa53-d0599c11f056"
/>

## Solution

This is because the wrapper `<FormControl_Shadcn_>` passes the
validation props to its direct child.
The solution is to avoid applying them on the `<InputGroup>` and to
apply them manually on the inputs.

I also fixed a small accessibility issue by moving the addon texts after
the input so that screen readers announce them in the correct order. No
visual change for this

<img width="587" height="158" alt="image"
src="https://github.com/user-attachments/assets/1f8858ea-6659-45f9-964e-8c43a7fe14ba"
/>


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

* **Style**
* Unified numeric input layout by moving unit labels/suffixes (e.g.,
"seconds", "GB", "%", "connections", "digits", "IOPS", "MB/s", "rows")
to appear after their inputs for a consistent, predictable form
appearance.

* **Accessibility**
* Form controls now expose IDs and ARIA attributes from form context
when available, improving screen-reader descriptions and error
association.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com>
2026-04-10 11:45:30 +10:00
Charis bf46092290 ci: add safesql ratchet (#44678)
We are currently migrating to the safeSql utility for all SQL arguments
of executeSql. During the migration, executeSql will continue to accept
plain strings for backwards compatibility. Adding a custom ESLint rule
so we can ratchet this and prevent new calls of executeSql with plain
strings.

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

## Summary by CodeRabbit

* **New Features**
* Added SQL safety validation throughout the application to enforce
secure query construction and prevent SQL-related vulnerabilities
* Introduced type-aware linting to identify and catch type-related
issues during development and continuous integration processes

* **Chores**
* Enhanced continuous integration pipeline with improved code quality
enforcement

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 15:32:33 -04:00
Charis 5d013cb2f6 refactor(pg-meta): expand safeSql usage (#44674)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Refactor**
* Standardized SQL construction across the pg-meta package to use
parameter-safe SQL fragments instead of raw string assembly, improving
safety for dynamic values (filters, limits, offsets, identifiers) and
unifying how exported SQL constants and query helpers are produced. No
functional query behavior changes expected.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 14:32:02 -04:00
Gildas Garcia 054e44f7e6 fix: improve oauth apps callback urls UX (#44714)
## Problem

#44677 modified the previous behaviour on callback URLs. It used to
prevent users to remove the URL if only one was provided.

## Solution

Restore the previous behaviour.

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

## Summary by CodeRabbit

* **Bug Fixes**
* Fixed the Remove button behavior for OAuth callback URLs. The button
now only appears when multiple callback URLs are configured, preventing
accidental deletion of the only redirect URI.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 18:30:24 +00:00
Illia Basalaiev dc39d0fe3d chore: add ssl modes table for reference (#44546)
## 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

## What is the new behavior?

SSL modes table reference
<img width="1000" height="567" alt="CleanShot 2026-04-05 at 15 39 27"
src="https://github.com/user-attachments/assets/ed05d05b-b559-4554-aef1-d70038f520b9"
/>

## Additional context
While there is a table available in postgres docs, other providers do
include simplified versions of that table.

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

* **Documentation**
* Added a clear reference table for Postgres client-side SSL modes
(disable, allow, prefer, require, verify-ca, verify-full), summarizing
encryption, certificate authority validation, hostname verification, and
connection behavior for each mode.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 20:30:06 +02:00
Ali Waseem 3cb440e844 fix(studio): fix multiple Sentry errors (#44715)
## Summary

-
[**SUPABASE-APP-E2R**](https://supabase.sentry.io/issues/SUPABASE-APP-E2R):
Guard against undefined entries in notifications array in
`AdvisorButton` (optional chaining on `.some()` callbacks)
-
[**SUPABASE-APP-EBA**](https://supabase.sentry.io/issues/SUPABASE-APP-EBA):
Remove render-time `handleError()` throw in `useEdgeFunctionsDiff` — the
hook already handles missing body data gracefully
-
[**SUPABASE-APP-BVN**](https://supabase.sentry.io/issues/SUPABASE-APP-BVN)
/
[**SUPABASE-APP-BTV**](https://supabase.sentry.io/issues/SUPABASE-APP-BTV):
Guard `localStorage` access in `FeaturePreviewContext` with try-catch,
matching the established pattern in `useLocalStorage.ts` (Safari private
browsing)
-
[**SUPABASE-APP-AV3**](https://supabase.sentry.io/issues/SUPABASE-APP-AV3):
Filter stale folder IDs before passing `expandedIds` to
`react-accessible-treeview` in the SQL editor nav

## Test plan

- [x] Verify AdvisorButton renders without errors when notifications
data has sparse pages
- [x] Verify branch merge page loads when edge function body fetch fails
- [x] Verify feature previews initialize correctly in Safari private
browsing
- [x] Verify SQL editor folder expand/collapse works after deleting a
folder

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

* **Bug Fixes**
* Feature preview now falls back safely when browser storage is
unavailable
* Notifications display updated to tolerate missing entries without
errors
* Private snippets navigation no longer preserves expansion state for
removed nodes

* **Refactor**
  * Streamlined error aggregation in edge functions diff processing
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 11:10:47 -06:00
Gildas Garcia 2538b56b71 chore: migrate oauth apps form to react-hook-form (#44677)
## Problem

Foreign wrapper forms still use `formik` but we now use
`react-hook-form` everywhere and we'd like to reduce our dependencies.

## Solution

This PR focuses on migrating the OAuth apps form to `react-hook-form`


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

* **Refactor**
* Reworked the OAuth app publish form to use schema-driven validation
and managed callback URL fields.
* Replaced bespoke URL state/handlers with add/remove field array logic;
consolidated error rendering.
* Submission, loading and preview now reflect real-time form state and
reset correctly when the panel or selection changes.

* **Bug Fixes**
* Improved URL validation to handle localhost cases and optional
HTTPS-only enforcement.

* **Tests**
* Extended URL validation tests to cover localhost, HTTP/HTTPS and
HTTPS-only scenarios.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 17:06:03 +02:00
Sreyas Udayavarmanandferhat elmas 152d36bb17 Clarification on signed urls caching (#44708)
## What kind of change does this PR introduce?

Docs update

## Additional context

The Smart CDN documentation lacked clarity around caching behavior for
signed URLs used with private bucket assets. This update adds that
missing detail.

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

* **Documentation**
* Added a Smart CDN guide section on signed URL caching at the CDN edge:
each unique signed URL is a separate cache key.
* Explained cache behavior: first request for a specific signed URL is a
miss; subsequent identical requests are cache hits; cached responses
remain until CDN cache expiry.
* Clarified access-control interactions: revoking/expiring a token does
not purge cached content; deleting the object invalidates cached entries
(propagates within ~60s).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: ferhat elmas <elmas.ferhat@gmail.com>
v1.26.04
2026-04-09 20:05:45 +05:30
Francesco SansalvadoreandAli Waseem 82f798f75a chore(studio): show oauth server endpoints in oauth server settings (#41783)
Show OAuth server endpoints in oauth server settings page.

Preview: [OAuth Server
settings](https://studio-staging-git-chore-show-oauth-server-endpoints-supabase.vercel.app/dashboard/project/_/auth/oauth-server)

<img width="1138" height="496" alt="Screenshot 2026-01-09 at 12 00 31"
src="https://github.com/user-attachments/assets/eeca7726-0426-4abe-990d-271b702e4f7b"
/>

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

* **New Features**
* Added an OAuth endpoints table showing Authorization, Token, JWKS, and
Discovery/OpenID URLs with copy-to-clipboard and a masked preview mode.
* Inline preview of the Authorization URL when an authorization path is
set.

* **Improvements**
* Reorganized OAuth server settings for clearer enable/disable flow,
conditional field visibility, and disable confirmation.
* Dynamic loading of the endpoints table, improved loading skeletons,
layout refinements, and form reset to reflect saved defaults.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Ali Waseem <waseema393@gmail.com>
2026-04-09 16:01:26 +02:00
Matt Rossman a325e86845 fix: only prefix scorer slugs on PR builds, not master deploys (#43578)
Cleanup task following https://github.com/supabase/supabase/pull/43194

I noticed the run of `braintrust-scorers-deploy.yml` included the branch
prefix on scorers in Assistant. This is unnecessary since there's only
one copy of scorers in the "Assistant" project, unlike "Assistant
(Staging Scorers)" which uses prefixes to disambiguate branches.

<img width="502" height="262" alt="CleanShot 2026-03-09 at 15 45 19@2x"
src="https://github.com/user-attachments/assets/214ec1e8-5f40-411f-8d2a-71cc4a5fc294"
/>

This is a small housekeeping correction so scorers in the main
"Assistant" project don't include branch prefixes, whereas scorers from
PRs deployed to "Assistant (Staging Scorers)" remain prefixed.

https://docs.github.com/en/actions/reference/variables-reference

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

## Summary by CodeRabbit

* **Chores**
* Updated CI deployment configuration for scorer branch/prefix handling
to optimize behavior across different GitHub event types (PR vs.
push/dispatch events).

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 09:57:42 -04:00
Ali Waseem a45e6cf333 fix: remove _DEFAULT from connect menu env var names (#44462)
## Summary

Removes `_DEFAULT` from the publishable key env var name across all
Connect and ConnectSheet framework content, so that e.g.
`NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY` becomes
`NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY`. This matches the docs and sample
apps.

### Connect

- Next.js (App Router)
- Next.js (Pages Router)
- React (Create React App)
- React (Vite)
- Remix
- SolidJS
- SvelteKit

### ConnectSheet

- Next.js (App Router)
- Next.js (Pages Router)
- React (Create React App)
- React (Vite)
- Remix
- SolidJS
- SvelteKit
- Vue.js
- shadcn env step

Resolves FE-2934

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

* **Bug Fixes**
* Standardized environment variable names in generated connection/setup
instructions: when a publishable key is present the templates now
reference the publishable env var (e.g.,
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, VITE_SUPABASE_PUBLISHABLE_KEY,
REACT_APP_SUPABASE_PUBLISHABLE_KEY, etc.) with unchanged anon-key
fallback behavior.
* Updated cURL/tab placeholders to reflect the new publishable-key
identifier when hiding keys.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 13:23:21 +00:00
Alaister YoungandAlaister Young ed09fbc6ad fix(studio): add @supabase/ssr to Connect Sheet install step (#44694)
The Connect Sheet install step only listed `@supabase/supabase-js`, but
the generated code for Next.js (app router) and Remix imports from
`@supabase/ssr` – so users following the steps immediately hit import
errors.

**Added:**
- `EXTRA_PACKAGES` map in `connect.schema.ts` – frameworks declare
additional packages on top of the base library install, keyed by
`framework/variant` for granularity (e.g. `nextjs/app` gets
`@supabase/ssr`, `nextjs/pages` does not)
- Install content component appends extras automatically
- Step title pluralises to "Install packages" when extras are present
- Tests for extra packages, variant-specific install commands, and step
titles

**Changed:**
- Next.js steps now branch on `frameworkVariant` so app router and pages
router can have different install steps
- Remix gets an explicit entry in the step tree (previously fell through
to DEFAULT)

## To test

- Open Connect Sheet → Framework → Next.js → App Router
- Install step should say "Install packages" and show `npm install
@supabase/supabase-js @supabase/ssr`
- Switch to Pages Router
- Install step should say "Install package" and show `npm install
@supabase/supabase-js`
- Switch to Remix
- Install step should say "Install packages" and show `npm install
@supabase/supabase-js @supabase/ssr`
- Other frameworks (Vue, SvelteKit, etc.) should be unchanged

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

## Summary by CodeRabbit

## Release Notes

* **New Features**
* Enhanced package installation guidance to include framework-specific
additional packages (e.g., @supabase/ssr for Next.js App Router and
Remix).
* Installation step labels now accurately reflect the number of packages
being installed.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Alaister Young <10985857+alaister@users.noreply.github.com>
2026-04-09 07:07:55 -06:00
Matt Rossman 4f90833ed9 feat(assistant): enable Braintrust tracing in production (#44644)
Removes the temporary killswitch that was blocking tracing in production
environments.

Note this still excludes from tracing projects that are any of the
following:
- HIPAA sensitive
- Hosted in EU regions
- Within orgs where some owner previously signed our DPA

See [approval
message](https://supabase.slack.com/archives/C051L8U2EJF/p1775526578561789?thread_ts=1775144006.270549&cid=C051L8U2EJF)
for context.

Closes AI-450

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

## Summary by CodeRabbit

* **Bug Fixes**
* Tracing enablement now depends solely on the presence of required API
credentials instead of environment-based restrictions, enabling
diagnostic tracing functionality across all environments.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 08:47:27 -04:00
Francesco Sansalvadore f380c40b53 chore: mobile input font-size (#43244)
Bump font-size to 16px for inputs and textareas on mobile viewports to
avoid auto zoom-in when focusing the inputs on ios.
2026-04-09 11:41:01 +02:00
Gildas Garcia 40ce2a1cdb fix: enforce imports pattern in ColumnType (#44701) 2026-04-09 07:40:45 +00:00
Gildas Garcia 914677ed4b chore: migrate foreign wrapper forms to react-hook-form (#44512)
## Problem

Foreign wrapper forms still use `formik` but we now use
`react-hook-form` everywhere and we'd like to reduce our dependencies.

## Solution

- [x] Write e2e tests for wrappers
- [x] Migrate to `react-hook-form`

## Notes

I tried to cover the 3 cases I identified for foreign wrappers with e2e
tests:
- Add all available tables to a new schema (stripe)
- Add selected tables to a new table (stripe)
- Create dynamic columns (s3 wrapper)

However, they are not exhaustive as I can't test the integration
actually works, only that it was created successfully. Besides, I can't
test the Iceberg wrapper case as it needs actual S3 buckets.

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

* **New Features**
* Enhanced column-type selector with searchable combobox, enum support,
icons, and optional recommendation prompts.

* **Refactor**
* Migrated many wrapper/table/editor forms to a schema-driven form
system with stronger validation, dynamic field arrays, and consistent
form controls.
* Updated input field integration to work with the new form control
model.

* **Bug Fixes**
* Improved handling of missing wrapper/error states during wrapper
loading.

* **Tests**
* Added unit tests for form schemas and end-to-end tests for wrapper
creation flows.

* **Chores**
  * Removed legacy dynamic-columns component.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 09:20:27 +02:00
supabase-supabase-autofixer[bot]andsupabase-workflow-trigger[bot] 96f1b2cd7b feat: update @supabase/*-js libraries to v2.103.0 (#44699)
This PR updates @supabase/*-js libraries to version 2.103.0.

**Source**: supabase-js-stable-release

**Changes**:
- Updated @supabase/supabase-js to 2.103.0
- Updated @supabase/auth-js to 2.103.0
- Updated @supabase/realtime-js to 2.103.0
- Updated @supabase/postgest-js to 2.103.0
- Refreshed pnpm-lock.yaml

---

## Release Notes

## v2.103.0

## 2.103.0 (2026-04-09)

### 🚀 Features

- **postgrest:** add stripNulls method for null value stripping
([#2189](https://github.com/supabase/supabase-js/pull/2189))
- **storage:** add cacheNonce parameter for download
([#2234](https://github.com/supabase/supabase-js/pull/2234))

### 🩹 Fixes

- **postgrest:** fix scalar computed column type inference for
isNotNullable and SETOF scalar
([#2224](https://github.com/supabase/supabase-js/pull/2224))

### ❤️ Thank You

- Katerina Skroumpelou @mandarini
- Seydi Charyyev @TheSeydiCharyyev
- Vaibhav @7ttp

This PR was created automatically.

Co-authored-by: supabase-workflow-trigger[bot] <266661614+supabase-workflow-trigger[bot]@users.noreply.github.com>
2026-04-09 10:14:34 +03:00
Vaibhav f902273c33 docs: cacheNonce (#44679)
smol follow up to: 
- https://github.com/supabase/supabase-js/pull/2234

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


## Summary by CodeRabbit

* **Documentation**
* Improved Smart CDN documentation with updated cache-bypass
instructions. The guidance now uses the `cacheNonce` query parameter to
clarify how to force the CDN to fetch fresh content from origin.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-09 09:21:07 +03:00
Pedro RodriguesandClaude Sonnet 4.6 4d497b6498 feat(blog): add Supabase Agent Skills blog post (#44641)
## 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 — new blog post.

## What is the current behavior?

No blog post exists for the Supabase Agent Skills release.

## What is the new behavior?

Adds a new blog post: **"AI Agents Know About Supabase. They Don't
Always Use It Right."**

The post covers:
- What Supabase Agent Skills teaches (docs access, security checklist,
tooling, schema management)
- How the skill was designed (why everything critical lives in
`SKILL.md`)
- How we test it (eval framework, LLM judge, results table across Claude
and GPT models)
- Lessons for skill authors
- Installation instructions for `npx skills add` and Claude Code plugin

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

* **Documentation**
* Published a new blog post introducing Supabase Agent Skills:
installation options, core skill areas (docs access, security/RLS
safeguards, tooling/workflow, schema-management guidance), testing and
evaluation methodology with example results, and links for getting
started and reporting issues.
* **Chores**
* Updated app build configuration to enforce consistent React module
resolution, improving build stability across environments.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 01:52:22 +01:00
Alan Daniel 652a4fc01d SoS 2026: fix shirt image artifacts (#44669)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES
2026-04-08 22:53:43 +02:00
AnaandAna 78ee50e671 feat(www): add go page for Prompt to Prod x Sentry webinar (#44680)
## 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 go landing page for Prompt to Prod: Debug Your Full Supabase Stack
with Sentry webinar (April 30, 2026)

## What is the current behavior?

No landing page exists for the webinar

## What is the new behavior?

Adds supabase.com/go/prompt-to-prod-debug-supabase-stack-sentry, a page
promoting the webinar with a CTA that drives to Sentry's registration at
sentry.io/resources/sentry-supabase-workshop/

## Additional context

n/a


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

* **New Features**
* Added a new webinar landing page: "Prompt to Prod Sentry" with
lead-generation form, hero section including webinar date/time and
primary CTAs (Register, Learn more), and a feature grid outlining four
key learning outcomes (end-to-end instrumentation, error tracing,
AI-assisted root-cause analysis, and actionable patch guidance).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Ana <ana1337x@users.noreply.github.com>
2026-04-08 15:53:28 -04:00
Ivan VasilovandClaude Opus 4.6 f55797fcda fix(studio): only redirect after project deletion if still on project page (#44633)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES

## What kind of change does this PR introduce?

Bug fix

## What is the current behavior?

After clicking delete on a project, the `onSuccess` callback
unconditionally redirects to `/org/{slug}` or `/organizations`. If the
user has already navigated away from the project page before the
deletion completes, this causes an unwanted redirect back to the
organizations page.

## What is the new behavior?

The redirect now only happens if the user is still viewing the deleted
project's page (`router.asPath.startsWith(/project/${projectRef})`). If
they've already navigated away, only the success toast is shown.

## Additional context

The Next.js pages router object is mutable, so `router.asPath` reflects
the current URL at callback execution time, not at closure creation
time.

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

## Summary by CodeRabbit

* **Bug Fixes**
* Fixed navigation behavior after project deletion to avoid unnecessary
redirects when you've already navigated away from the deleted project.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 19:40:56 +02:00
Raúl BarrosoandIvan Vasilov 1797842ee5 refactor(stripe projects): always create a new org (#44634)
## 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?

Refactor based on https://github.com/supabase/platform/pull/31325

## What is the current behavior?

We presented a page to Stripe users to let them either pick an existing
org or create one.

## What is the new behavior?

We're forcing them to create a new one (or show that there was one
already linked).

- It also adds the option to sign out when there's a conflict. Fixes
https://linear.app/supabase/issue/API-963/add-a-button-to-logout-from-the-page-you-must-be-logged-in-as-x-to
- And adds the link to root from the logo.


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

* **New Features**
  * Added organization preview creation endpoint for billing workflows.

* **Bug Fixes**
* Removed organization-picking flow from Stripe Projects login; users
now proceed directly with confirmation.
  * Added a "Sign out" button on error pages.

* **Refactor**
  * Removed a legacy billing partner option.
  * Made the Supabase logo clickable for quick navigation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com>
2026-04-08 17:11:28 +00:00
kemal.earth fe67f11190 fix(studio): spacing on pricing table header (#44676)
## 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?

Missing a `w-full` to apply `justify-between`. 

| Before | After |
|--------|--------|
| <img width="894" height="98" alt="Screenshot 2026-04-08 at 17 05 26"
src="https://github.com/user-attachments/assets/c3c2cfe3-0280-4772-bbad-9570b5595981"
/> | <img width="897" height="101" alt="Screenshot 2026-04-08 at 17 05
18"
src="https://github.com/user-attachments/assets/36b65fc0-bb9c-43c4-a6da-670c753f846a"
/> |






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

## Summary by CodeRabbit

## Style
* Adjusted the subscription plan panel header to span the full available
width.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-08 17:24:10 +01:00
kemal.earth 7d369571ce feat(studio): revamp compute upgrade review dialog (#44639)
## 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?

This takes our dialog to review compute upgrade's and gives it a bit
more visual clarity (as it can get confusing). Simplification and clear
communication of what differences there are.

| Before | After |
|--------|--------|
| <img width="663" height="722" alt="Screenshot 2026-04-07 at 16 58 33"
src="https://github.com/user-attachments/assets/dbb699b4-89ad-4172-8c23-e5d1ca5045f8"
/> | <img width="608" height="635" alt="Screenshot 2026-04-08 at 12 28
32"
src="https://github.com/user-attachments/assets/9a4a5952-6049-4cda-86e6-73773f001010"
/> |




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

* **UI Improvements**
* Redesigned disk review dialog to a stacked "Before/After" layout with
a clear vertical breakdown of changes.
* Replaced badges/tooltips with inline per-line monthly deltas and
explicit summed totals.
* Replica note moved inline; cooldown and throughput explanations
consolidated and more broadly shown when storage type changes.
  * Arrow between totals updated and "After" state emphasized.

* **Chores**
* Updated dialog spacing, padding, min-width, confirm button styling,
and dialog wording.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-08 16:58:58 +01:00
Danny White 8939c97574 chore(studio): standardise keyboard shortcut UI (#44262)
## What kind of change does this PR introduce?

Chore / UI consistency fix. Resolves DEPR-418.

## What is the current behavior?

Shortcut hints are still hand-built in several high-traffic Studio
surfaces, which leads to inconsistent rendering and stale
platform-specific markup. Buttons in particular can end up with awkward
spacing and baseline alignment when shortcut labels are inserted
directly into the button text.

## What is the new behavior?

This PR standardises those shortcut hints around `KeyboardShortcut` and
updates the surrounding layout primitives to support that approach more
cleanly.

It includes:
- Design docs
- using `KeyboardShortcut` in the table side-panel `ActionBar`
- replacing hardcoded operation queue button shortcuts in
`OperationQueueSidePanel`
- standardising the command menu trigger shortcut chip and updating the
`LayoutHeader` overrides to match the new DOM shape
- replacing the AI editor empty-state `Cmd/Ctrl + K` hint with
`KeyboardShortcut`
- refining shared shortcut/button primitives so inline shortcuts align
better when used as button accessories
- keeping the SQL utility shortcut work on this branch consistent with
the same shared component approach

| Before | After |
| --- | --- |
| <img width="1454" height="902" alt="CleanShot 2026-03-27 at 15 55
32@2x"
src="https://github.com/user-attachments/assets/3a8de192-3f4c-480b-9d26-9b28becd0ee3"
/> | <img width="1488" height="906" alt="CleanShot 2026-03-27 at 15 29
31@2x-63A17C58-D023-4D3A-9355-6C40A6485328"
src="https://github.com/user-attachments/assets/46ef7f7a-2b8b-4c10-8935-84ca5ad44562"
/> |
| <img width="738" height="328" alt="CleanShot 2026-03-27 at 15 57
07@2x"
src="https://github.com/user-attachments/assets/ad459c41-867d-42f9-a8cb-c936af8326b7"
/> | <img width="726" height="290" alt="CleanShot 2026-03-27 at 15 56
29@2x-ECE4E10F-9693-4ED8-B085-DC436A839F52"
src="https://github.com/user-attachments/assets/95b4bfb4-ec34-4080-8b69-211b5045ca26"
/> |

## Later todo

- [ ] Replace the string-based SQL editor placeholder shortcut in
`SQLEditor` once that placeholder API supports rich content
- [ ] Refactor `CommandOption` to use `KeyboardShortcut` instead of
bespoke platform detection and command-key markup
- [ ] Standardise the remaining DataTable shortcut hints
(`DataTableToolbar`, `DataTableResetButton`, `DataTableFilterCommand`,
`DataTableFilterControlsDrawer`) around `KeyboardShortcut`


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

## Summary by CodeRabbit

* **New Features**
* Introduced a new KeyboardShortcut component for displaying keyboard
shortcuts with two visual variants (pill and inline).
* Standardized keyboard shortcut indicators across the application
interface for consistent user experience.

* **Bug Fixes**
* Fixed capitalization inconsistencies in button labels and hotkey
settings.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-08 09:42:55 -06:00