From 26a42537d2bccec8f29cb24627aafc3e836b40c7 Mon Sep 17 00:00:00 2001 From: "Andrey A." <56412611+aantti@users.noreply.github.com> Date: Tue, 17 Feb 2026 13:33:23 +0100 Subject: [PATCH 01/11] chore: rename configuration to how-to guides https://github.com/supabase/supabase/blob/master/docker/docker-compose.s3.yml --- .../Navigation/NavigationMenu/NavigationMenu.constants.ts | 8 +++++--- .../content/guides/self-hosting/restore-from-platform.mdx | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index dc336db3fb88e..69dd8d4d5d53f 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -2827,10 +2827,12 @@ export const self_hosting: NavMenuConstant = { items: [ { name: 'Overview', url: '/guides/self-hosting' }, { name: 'Self-Hosting with Docker', url: '/guides/self-hosting/docker' }, - { name: 'Restore from Platform', url: '/guides/self-hosting/restore-from-platform' }, { - name: 'Configuration', - items: [{ name: 'Enabling MCP server', url: '/guides/self-hosting/enable-mcp' }], + name: 'How-to Guides', + items: [ + { name: 'Enabling MCP server', url: '/guides/self-hosting/enable-mcp' }, + { name: 'Restore from Platform', url: '/guides/self-hosting/restore-from-platform' }, + ], }, { name: 'Auth Server', diff --git a/apps/docs/content/guides/self-hosting/restore-from-platform.mdx b/apps/docs/content/guides/self-hosting/restore-from-platform.mdx index 05ae9cbc32bde..7b300083aec75 100644 --- a/apps/docs/content/guides/self-hosting/restore-from-platform.mdx +++ b/apps/docs/content/guides/self-hosting/restore-from-platform.mdx @@ -96,7 +96,7 @@ SELECT count(*) FROM auth.users; SELECT * FROM pg_extension; ``` -## What's included and what's not +## What's included in the restore and what's not The database dump includes your schema, data, roles, RLS policies, database functions, triggers, and `auth.users`. However, several things require separate configuration on your self-hosted instance: From 32f70db13d4124da82e903abbd6469b18f5191f0 Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Tue, 17 Feb 2026 09:48:12 -0300 Subject: [PATCH 02/11] docs: Update documentation from SDK changes (Jan 22 - Feb 16) (#42874) ## Summary This PR updates documentation based on recent changes across multiple SDK repositories since the last run on 2026-01-22. ## Changes Analyzed | SDK | Repository | Commits | Latest Tag | |-----|-----------|---------|------------| | **js** | supabase/supabase-js | 40 | v2.95.4-canary.2 | | **dart** | supabase/supabase-flutter | 4 | - | | **py** | supabase/supabase-py | 12 | v2.28.0 | | **swift** | supabase/supabase-swift | 14 | v2.41.1 | | **kt** | supabase-community/supabase-kt | 36 | 3.3.0 | | **csharp** | supabase-community/supabase-csharp | 1 | v1.1.2 | ## Documentation Updates ### JavaScript SDK (`supabase_js_v2.yml`) - Added optional `jwt` parameter documentation to `mfa.getAuthenticatorAssuranceLevel()` - Added `timeout` and `urlLengthLimit` options to `PostgrestClient` constructor with example ### Kotlin SDK (`supabase_kt_v3.yml`) - Added new `getClaims()` API section with description, parameters, and 3 examples - Added `channel` parameter to OTP `signInWith` config for WhatsApp support - Added WhatsApp OTP sign-in example ### Python SDK (`supabase_py_v2.yml`) - Added `from_.list_v2()` method documentation with cursor-based pagination support - Includes `SearchV2Options` parameter documentation and pagination example - Added note about new User model fields (`is_sso_user`, `deleted_at`, `banned_until`) on `get_user` ### Swift SDK (`supabase_swift_v2.yml`) - Added breaking change note for `mfa.unenroll()`: response now uses `id` instead of `factorId` (since v2.41.1) ### Phone Login Guide (`phone-login.mdx`) - Added Kotlin WhatsApp OTP example to the sign-in section ### SDKs with no documentation updates needed - **Dart**: Only CI and realtime type-cast fix (no user-facing API changes) - **C#**: Only README badge fix ## Test plan - [ ] Verify YAML spec files parse correctly - [ ] Review rendered documentation for new sections - [ ] Confirm code examples match actual SDK APIs --- Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 --- apps/docs/content/guides/auth/phone-login.mdx | 9 ++ apps/docs/spec/supabase_js_v2.yml | 27 +++++ apps/docs/spec/supabase_kt_v3.yml | 63 ++++++++++ apps/docs/spec/supabase_py_v2.yml | 108 ++++++++++++++++++ apps/docs/spec/supabase_swift_v2.yml | 3 + 5 files changed, 210 insertions(+) diff --git a/apps/docs/content/guides/auth/phone-login.mdx b/apps/docs/content/guides/auth/phone-login.mdx index fab354ef5a29c..b817093423c8b 100644 --- a/apps/docs/content/guides/auth/phone-login.mdx +++ b/apps/docs/content/guides/auth/phone-login.mdx @@ -77,6 +77,15 @@ supabase.auth.signInWith(OTP) { } ``` +To send the OTP via WhatsApp instead of SMS (requires Twilio or Twilio Verify provider): + +```kotlin +supabase.auth.signInWith(OTP) { + phone = "+13334445555" + channel = Phone.Channel.WHATSAPP +} +``` + <$Show if="sdk:python"> diff --git a/apps/docs/spec/supabase_js_v2.yml b/apps/docs/spec/supabase_js_v2.yml index fe4f0bc838391..738682fe13cea 100644 --- a/apps/docs/spec/supabase_js_v2.yml +++ b/apps/docs/spec/supabase_js_v2.yml @@ -2590,6 +2590,12 @@ functions: - Authenticator Assurance Level (AAL) is the measure of the strength of an authentication mechanism. - In Supabase, having an AAL of `aal1` refers to having the 1st factor of authentication such as an email and password or OAuth sign-in while `aal2` refers to the 2nd factor of authentication such as a time-based, one-time-password (TOTP) or Phone factor. - If the user has a verified factor, the `nextLevel` field will return `aal2`, else, it will return `aal1`. + - An optional `jwt` parameter can be passed to check the AAL level of a specific JWT instead of the current session. + params: + - name: jwt + isOptional: true + type: string + description: An optional JWT to check the AAL level for. If not provided, the current session's JWT is used. examples: - id: get-aal name: Get the AAL details of a session @@ -2615,6 +2621,12 @@ functions: error: null } ``` + - id: get-aal-with-jwt + name: Get the AAL details for a specific JWT + code: | + ```js + const { data, error } = await supabase.auth.mfa.getAuthenticatorAssuranceLevel(jwt) + ``` - id: admin-api title: 'Overview' notes: | @@ -7724,6 +7736,9 @@ functions: - id: postgrest-js-postgrestclient-constructor title: new PostgrestClient() $ref: '@supabase/postgrest-js.PostgrestClient.constructor' + notes: | + - A `timeout` option (in milliseconds) can be set to automatically abort requests that take too long. + - A `urlLengthLimit` option (default: 8000) can be set to control when URL length warnings are included in error messages for aborted requests. examples: - id: postgrest-js-postgrestclient-constructor-example-1 name: Example 1 @@ -7736,6 +7751,18 @@ functions: schema: 'public', }) ``` + - id: postgrest-js-postgrestclient-constructor-with-timeout + name: With timeout + code: |- + ```ts + import PostgrestClient from '@supabase/postgrest-js' + + const postgrest = new PostgrestClient('https://xyzcompany.supabase.co/rest/v1', { + headers: { apikey: 'public-anon-key' }, + schema: 'public', + timeout: 30000, // 30 second timeout + }) + ``` - id: postgrest-js-postgrestclient-from title: PostgrestClient.from() $ref: '@supabase/postgrest-js.PostgrestClient.from' diff --git a/apps/docs/spec/supabase_kt_v3.yml b/apps/docs/spec/supabase_kt_v3.yml index 54092d4247e66..228e3759c0ae6 100644 --- a/apps/docs/spec/supabase_kt_v3.yml +++ b/apps/docs/spec/supabase_kt_v3.yml @@ -3160,6 +3160,10 @@ functions: isOptional: true type: String? description: The captcha token when having captcha enabled. + - name: channel + isOptional: true + type: Phone.Channel? + description: The channel to send the OTP to when using phone sign-in. Defaults to SMS. Set to `Phone.Channel.WHATSAPP` for WhatsApp delivery. examples: - id: sign-in-with-email name: Sign in with email @@ -3181,6 +3185,17 @@ functions: phone = "+4912345679" } ``` + - id: sign-in-with-whatsapp-otp + name: Sign in with WhatsApp OTP + isSpotlight: false + description: The user will be sent a WhatsApp message which contains an OTP. Requires a Twilio or Twilio Verify provider to be configured. + code: | + ```kotlin + supabase.auth.signInWith(OTP) { + phone = "+4912345679" + channel = Phone.Channel.WHATSAPP + } + ``` - id: sign-in-with-oauth title: 'signInWith(OAuthProvider)' $ref: '@supabase/gotrue-js.GoTrueClient.signInWithOAuth' @@ -4055,6 +4070,54 @@ functions: //flow variant, automatically emitting new values on session changes val statusFlow = supabase.auth.mfa.statusFlow ``` + - id: get-claims + title: 'getClaims()' + description: | + Extracts the JWT claims from the access token by first verifying the JWT against the server's JSON Web Key Set (JWKS) endpoint. + notes: | + - Prefer this method over `retrieveUser()` as JWKS responses are cached, resulting in significantly faster responses. + - If the project is not using an asymmetric JWT signing key (like ECC or RSA), it sends a request to the Auth server (similar to `retrieveUser()`) to verify the JWT. + - Returns a `ClaimsResponse` containing `claims` (a `JwtPayload` with typed accessors for standard JWT fields), `header`, and `signature`. + - Standard claims available on `JwtPayload`: `iss`, `sub`, `aud`, `exp`, `iat`, `role`, `aal`, `sessionId`, `email`, `phone`, `isAnonymous`, `amr`, `appMetadata`, `userMetadata`. + - Use `claims.getClaim(key)` or `claims.getClaimOrNull(key)` for custom claims. + params: + - name: jwt + isOptional: true + type: String? + description: An optional specific JWT to verify. If not provided, uses the current session's access token. + - name: options + isOptional: true + type: ClaimsRequestBuilder.() -> Unit + description: Options to customize the behavior, such as allowing expired tokens. + subContent: + - name: allowExpired + isOptional: true + type: Boolean + description: Whether to allow expired JWTs. Defaults to `false`. + examples: + - id: get-claims-basic + name: Get claims from current session + isSpotlight: true + code: | + ```kotlin + val response = supabase.auth.getClaims() + val email = response.claims.email + val role = response.claims.role + val aal = response.claims.aal + ``` + - id: get-claims-custom + name: Get a custom claim + code: | + ```kotlin + val response = supabase.auth.getClaims() + val customValue = response.claims.getClaimOrNull("my_custom_claim") + ``` + - id: get-claims-specific-jwt + name: Verify a specific JWT + code: | + ```kotlin + val response = supabase.auth.getClaims(jwt = "your-jwt-token") + ``` - id: admin-api title: 'Overview' notes: | diff --git a/apps/docs/spec/supabase_py_v2.yml b/apps/docs/spec/supabase_py_v2.yml index 0e0f3410959e0..3172bbb02d7ea 100644 --- a/apps/docs/spec/supabase_py_v2.yml +++ b/apps/docs/spec/supabase_py_v2.yml @@ -1232,6 +1232,7 @@ functions: notes: | - This method fetches the user object from the database instead of local session. - This method is useful for checking if the user is authorized because it validates the user's access token JWT on the server. + - The User model includes the following fields (since v2.28.0): `is_sso_user` (bool, defaults to `False`), `deleted_at` (optional string), and `banned_until` (optional string) in addition to the existing fields. examples: - id: get-the-logged-in-user-with-the-current-existing-session name: Get the logged in user with the current existing session @@ -8478,6 +8479,113 @@ functions: ) ``` + - id: from-list-v2 + title: 'from_.list_v2()' + description: | + Lists files within a bucket using cursor-based pagination. Returns separate lists for folders and objects along with pagination metadata. + notes: | + - This method provides cursor-based pagination, which is more efficient for large result sets compared to offset-based pagination in `from_.list()`. + - The response separates folders and objects into distinct lists. + - Use the `nextCursor` field from the response to paginate through results. + - RLS policy permissions required: + - `buckets` table permissions: none + - `objects` table permissions: `select` + - Refer to the [Storage guide](/docs/guides/storage/security/access-control) on how access control works + params: + - name: options + isOptional: true + type: SearchV2Options + subContent: + - name: limit + isOptional: true + type: number + description: The maximum number of results to return. + - name: prefix + isOptional: true + type: string + description: Filter results to only objects with keys starting with this prefix. + - name: cursor + isOptional: true + type: string + description: The cursor for pagination, obtained from the `nextCursor` field of a previous response. + - name: with_delimiter + isOptional: true + type: bool + description: Whether to use delimiter-based folder grouping. + - name: sortBy + isOptional: true + type: SortByV2 + description: The column to sort by. + subContent: + - name: column + isOptional: true + type: '"name" | "updated_at" | "created_at"' + - name: order + isOptional: true + type: '"asc" | "desc"' + examples: + - id: list-files-v2 + name: List files with cursor-based pagination + code: | + ```python + response = ( + supabase.storage + .from_("avatars") + .list_v2({"limit": 100, "prefix": "folder/"}) + ) + + print(response.objects) # List of file objects + print(response.folders) # List of folders + print(response.hasNext) # Whether more results exist + print(response.nextCursor) # Use for next page + ``` + response: | + ```json + { + "hasNext": true, + "nextCursor": "eyJrZXkiOiJmb2xkZXIvYXZhdGFyMi5wbmcifQ==", + "folders": [ + { + "key": "folder/subfolder/", + "name": "subfolder" + } + ], + "objects": [ + { + "id": "e668cf7f-821b-4a2f-9dce-7dfa5dd1cfd2", + "name": "avatar1.png", + "key": "folder/avatar1.png", + "updated_at": "2024-05-22T23:06:05.580Z", + "created_at": "2024-05-22T23:04:34.443Z", + "metadata": { + "eTag": "\"c5e8c553235d9af30ef4f6e280790b92\"", + "size": 32175, + "mimetype": "image/png" + } + } + ] + } + ``` + - id: paginate-files-v2 + name: Paginate through all files + code: | + ```python + all_objects = [] + cursor = None + + while True: + options = {"limit": 100} + if cursor: + options["cursor"] = cursor + + response = supabase.storage.from_("avatars").list_v2(options) + all_objects.extend(response.objects) + + if not response.hasNext: + break + cursor = response.nextCursor + ``` + - id: analytics-buckets title: 'Overview' notes: | diff --git a/apps/docs/spec/supabase_swift_v2.yml b/apps/docs/spec/supabase_swift_v2.yml index fb56458bf512e..21c302bda5eef 100644 --- a/apps/docs/spec/supabase_swift_v2.yml +++ b/apps/docs/spec/supabase_swift_v2.yml @@ -1286,6 +1286,8 @@ functions: ``` - id: mfa-unenroll title: 'mfa.unenroll()' + notes: | + - Since v2.41.1, the unenroll response uses `id` instead of `factorId` to match the server response format. If upgrading from an earlier version, update your code to use `response.id`. examples: - id: unenroll-a-factor name: Unenroll a factor @@ -1297,6 +1299,7 @@ functions: factorId: "34e770dd-9ff9-416c-87fa-43b31d7ef225" ) ) + print(response.id) // ID of the unenrolled factor ``` - id: mfa-get-authenticator-assurance-level title: 'mfa.getAuthenticatorAssuranceLevel()' From d8dd65374d519bccb8465620a427503de344ebd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Og=C3=B3rek?= Date: Tue, 17 Feb 2026 13:51:32 +0100 Subject: [PATCH 03/11] fix(studio): Update disk resize cooldown to 4 hours (#42943) It has been changed last week, but never reflected in the UI. --- ...or-must-be-a-superuser-to-terminate-superuser-process.mdx | 2 +- .../interfaces/DiskManagement/ui/DiskCountdownRadial.tsx | 5 +++-- .../DiskManagement/ui/DiskManagementCoolDownSection.tsx | 2 +- .../components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx | 4 ++-- .../interfaces/Settings/Database/DiskSizeConfiguration.tsx | 2 +- .../Settings/Database/DiskSizeConfigurationModal.tsx | 2 +- apps/studio/data/config/disk-attributes-update-mutation.ts | 2 +- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx index 7b1203a22e20e..43a460c9e175e 100644 --- a/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx +++ b/apps/docs/content/troubleshooting/high-cpu-and-slow-queries-with-error-must-be-a-superuser-to-terminate-superuser-process.mdx @@ -51,7 +51,7 @@ Since the wraparound prevention autovacuum cannot be stopped, the best approach 2. **Increase Disk Throughput/IOPS:** - **Action:** If disk I/O utilization is also consistently high (e.g., near 100%), consider temporarily increasing your disk's provisioned IOPS and throughput. - **Why it helps:** Autovacuum is an I/O-intensive operation, involving a lot of reading and writing. Higher disk performance can significantly speed up the process. - - **Considerations:** Cloud providers often have limitations, such as a cooldown period (e.g., 6 hours) between disk modification operations. + - **Considerations:** Cloud providers often have limitations, such as a cooldown period (e.g., 4 hours) between disk modification operations. ### **Monitoring progress and future prevention** diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx index 3f4b6389d2a53..510bf8e13e2ee 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx @@ -7,6 +7,7 @@ import CountdownTimerSpan from 'components/ui/CountdownTimer/CountdownTimerSpan' import { useRemainingDurationForDiskAttributeUpdate } from 'data/config/disk-attributes-query' import { COOLDOWN_DURATION } from 'data/config/disk-attributes-update-mutation' import { Card, CardContent } from 'ui' + import FormMessage from './FormMessage' export function DiskCountdownRadial() { @@ -52,10 +53,10 @@ export function DiskCountdownRadial() {

- 6-hour cooldown period is in progress + 4-hour cooldown period is in progress

- You can't modify your disk configuration again until the 6-hour cool down period + You can't modify your disk configuration again until the 4-hour cool down period ends.

diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx index c6d2349e0f3d6..766a22b09df50 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx @@ -72,7 +72,7 @@ export const DiskMangementCoolDownSection = ({ visible }: { visible: boolean })

- For 6 hours you will not be able to change any disk attributes. + For 4 hours you will not be able to change any disk attributes.

There is a cooldown period enforced for any disk attribute modifications diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx index 7c789d17e79a8..7fbcd6c73574b 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx @@ -191,10 +191,10 @@ export const DiskSpaceBar = ({ form }: DiskSpaceBarProps) => {

Supabase expands your disk storage automatically when the database reached 90% of the disk size. However, any disk modifications, including auto-scaling, can - only take place once every 6 hours. + only take place once every 4 hours.

- If within those 6 hours you reach 95% of the disk space, your project{' '} + If within those 4 hours you reach 95% of the disk space, your project{' '} will enter read-only mode.

diff --git a/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx b/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx index bc8dce9893d41..b7236b99aea7d 100644 --- a/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx +++ b/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx @@ -152,7 +152,7 @@ const DiskSizeConfiguration = ({ disabled = false }: DiskSizeConfigurationProps) - This operation is only possible every 6 hours + This operation is only possible every 4 hours
diff --git a/apps/studio/data/config/disk-attributes-update-mutation.ts b/apps/studio/data/config/disk-attributes-update-mutation.ts index bb61a3ebfcc0e..df4d7e84271f9 100644 --- a/apps/studio/data/config/disk-attributes-update-mutation.ts +++ b/apps/studio/data/config/disk-attributes-update-mutation.ts @@ -5,7 +5,7 @@ import { handleError, post } from 'data/fetchers' import type { ResponseError, UseCustomMutationOptions } from 'types' import { configKeys } from './keys' -export const COOLDOWN_DURATION = 60 * 60 * 6 +export const COOLDOWN_DURATION = 60 * 60 * 4 export type UpdateDiskAttributesVariables = { ref?: string From df464bb823bd0ce2814a37cd8e209741d1e226a2 Mon Sep 17 00:00:00 2001 From: Bobbie Soedirgo <31685197+soedirgo@users.noreply.github.com> Date: Tue, 17 Feb 2026 20:53:48 +0800 Subject: [PATCH 04/11] docs: update configurable superuser settings (#42850) ## 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 current behavior? Superuser settings list is out of date ## What is the new behavior? Update superuser settings with [new configs](https://github.com/supabase/postgres/blob/21338c84583acc6f0d65fc99f014c83206aaa32d/ansible/files/postgresql_config/supautils.conf.j2#L13) ## Summary by CodeRabbit * **Documentation** * Updated PostgreSQL custom configuration guide with new superuser-level settings options including deadlock timeout, parameter logging, network connectivity, safe update enforcement, and function tracking capabilities. --- .../docs/content/guides/database/custom-postgres-config.mdx | 6 +++++- supa-mdx-lint/Rule003Spelling.toml | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/docs/content/guides/database/custom-postgres-config.mdx b/apps/docs/content/guides/database/custom-postgres-config.mdx index d905c06564171..2d9d2b6363d14 100644 --- a/apps/docs/content/guides/database/custom-postgres-config.mdx +++ b/apps/docs/content/guides/database/custom-postgres-config.mdx @@ -51,19 +51,23 @@ Some settings can only be modified by a superuser. Supabase pre-enables the [`su | Setting | Description | | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `auto_explain.*` | Configures the [auto_explain module](https://www.postgresql.org/docs/current/auto-explain.html). Can be configured to log execution plans for queries expected to exceed x seconds, including function queries. | +| `deadlock_timeout` | Sets the time to wait on a lock before checking for deadlock. | | `log_lock_waits` | Controls whether a log message is produced when a session waits longer than [deadlock_timeout](https://www.postgresql.org/docs/current/runtime-config-locks.html#GUC-DEADLOCK-TIMEOUT) to acquire a lock. | | `log_min_duration_statement` | Causes the duration of each completed statement to be logged if the statement ran for at least the specified amount of time. | | `log_min_messages` | Minimum severity level of messages to log. | +| `log_parameter_max_length` | Sets the maximum length in bytes of data logged for bind parameter values when logging statements. | | `log_replication_commands` | Logs all replication commands | | `log_statement` | Controls which SQL statements are logged. Valid values are `none` (off), `ddl`, `mod`, and `all` (all statements). | | `log_temp_files` | Controls logging of temporary file names and sizes. | -| `pg_net.ttl` | Sets how long the [pg_net extension](/docs/guides/database/extensions/pg_net) saves responses | | `pg_net.batch_size` | Sets how many requests the [pg_net extension](/docs/guides/database/extensions/pg_net) can make per second | +| `pg_net.ttl` | Sets how long the [pg_net extension](/docs/guides/database/extensions/pg_net) saves responses | | `pg_stat_statements.*` | Configures the [pg_stat_statements extension](https://www.postgresql.org/docs/current/pgstatstatements.html). | | `pgaudit.*` | Configures the [PGAudit extension](/docs/guides/database/extensions/pgaudit). The `log_parameter` is still restricted to protect secrets | | `pgrst.*` | [`PostgREST` settings](https://docs.postgrest.org/en/stable/references/configuration.html#db-aggregates-enabled) | | `plan_filter.*` | Configures the [pg_plan_filter extension](/docs/guides/database/extensions/pg_plan_filter) | +| `safeupdate.enabled` | Enables the [safeupdate extension](https://github.com/eradman/pg-safeupdate), which requires a `WHERE` clause on `UPDATE` and `DELETE` statements. | | `session_replication_role` | Sets the session's behavior for triggers and rewrite rules. | +| `track_functions` | Controls whether function call counts and timing are tracked. Valid values are `none`, `pl` (only procedural-language functions), and `all`. | | `track_io_timing` | Collects timing statistics for database I/O activity. | | `wal_compression` | This parameter enables compression of WAL using the specified compression method. | diff --git a/supa-mdx-lint/Rule003Spelling.toml b/supa-mdx-lint/Rule003Spelling.toml index 8e09dc8ca2e01..4a9c8f435a8b4 100644 --- a/supa-mdx-lint/Rule003Spelling.toml +++ b/supa-mdx-lint/Rule003Spelling.toml @@ -398,6 +398,7 @@ allow_list = [ "pgvector", "plpgsql", "psql", + "safeupdate", "scrypt", "screencast", "sessionStorage", From 6a2dabc05881797c6dcae30f07a3127d72404c35 Mon Sep 17 00:00:00 2001 From: Francesco Sansalvadore Date: Tue, 17 Feb 2026 13:59:29 +0100 Subject: [PATCH 05/11] fix: card paddings (#42775) Uniform card paddings to use the `--card-padding-x` css var and `px-card` tw utility class. --- .../interfaces/Database/Roles/RoleRow.tsx | 10 +++++----- .../interfaces/Database/Roles/RolesList.tsx | 16 ++++++++-------- .../DiskManagement/DiskManagementForm.tsx | 18 +++++++++--------- .../interfaces/HomeNew/ProjectUsageSection.tsx | 2 +- .../Observability/ObservabilityOverview.tsx | 4 ++-- .../Observability/ServiceHealthCard.tsx | 8 ++++---- .../Observability/ServiceHealthTable.tsx | 10 ++++------ .../BillingSettings/BillingEmail.tsx | 11 +++++------ .../studio/components/ui/Forms/FormSection.tsx | 2 +- apps/studio/components/ui/Panel.tsx | 9 ++++----- packages/config/tailwind.config.js | 1 + packages/ui-patterns/src/Chart/index.tsx | 6 +++--- packages/ui-patterns/src/MetricCard/index.tsx | 4 ++-- 13 files changed, 49 insertions(+), 52 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx b/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx index 87622057466c8..71f5143ba9a2d 100644 --- a/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -1,3 +1,7 @@ +import { useDatabaseRoleUpdateMutation } from 'data/database-roles/database-role-update-mutation' +import { PgRole } from 'data/database-roles/database-roles-query' +import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { ChevronUp, HelpCircle, MoreVertical, Trash } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { @@ -15,10 +19,6 @@ import { TooltipTrigger, } from 'ui' -import { useDatabaseRoleUpdateMutation } from 'data/database-roles/database-role-update-mutation' -import { PgRole } from 'data/database-roles/database-roles-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { ChevronUp, HelpCircle, MoreVertical, Trash } from 'lucide-react' import { ROLE_PERMISSIONS } from './Roles.constants' interface RoleRowProps { @@ -93,7 +93,7 @@ export const RoleRow = ({ role, disabled = false, onSelectDelete }: RoleRowProps diff --git a/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx b/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx index 40a2cd5378a97..308396df92ec1 100644 --- a/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx +++ b/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx @@ -1,10 +1,10 @@ import NoDataPlaceholder from 'components/ui/Charts/NoDataPlaceholder' import Link from 'next/link' -import { Button, Card, CardContent, CardFooter, CardHeader, CardTitle, Loading, cn } from 'ui' +import { Button, Card, CardContent, CardFooter, CardHeader, CardTitle, cn, Loading } from 'ui' import { LogsBarChart } from 'ui-patterns/LogsBarChart' import type { LogsBarChartDatum } from '../HomeNew/ProjectUsage.metrics' -import { type ServiceKey, getHealthStatus } from './ObservabilityOverview.utils' +import { getHealthStatus, type ServiceKey } from './ObservabilityOverview.utils' const colorClassMap: Record = { muted: 'bg-muted', @@ -81,7 +81,7 @@ export const ServiceHealthCard = ({
- + - + {reportUrl && (