+ )
+ }
+
const external = isExternalContentListingHref(item.href)
- const key = `${group.id}-${item.href}`
if (isGrid) {
return (
@@ -87,26 +126,7 @@ function ContentListingsGroup({ group }: { group: ContentListingGroup }) {
target={external ? '_blank' : undefined}
rel={external ? 'noopener noreferrer' : undefined}
>
- {item.badge}
- ) : undefined
- }
- >
- {item.badge && item.badgePosition === 'below' && (
-
- {item.badge}
-
- )}
- {item.subtitle && (
- {item.subtitle}
- )}
- {item.description}
-
+ {panel}
)
@@ -120,7 +140,7 @@ function ContentListingsGroup({ group }: { group: ContentListingGroup }) {
target={external ? '_blank' : undefined}
rel={external ? 'noopener noreferrer' : undefined}
>
- {item.title}: {item.description}
+ {listContent}
)
diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts
index 7898f39f534..17022d54b9b 100644
--- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts
+++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts
@@ -1139,6 +1139,20 @@ export const database: NavMenuConstant = {
},
],
},
+ {
+ name: 'Multigres',
+ url: undefined,
+ items: [
+ {
+ name: 'Overview',
+ url: '/guides/database/multigres' as `/${string}`,
+ },
+ {
+ name: 'Compatibility',
+ url: '/guides/database/multigres/compatibility' as `/${string}`,
+ },
+ ],
+ },
{
name: 'Access and security',
url: undefined,
diff --git a/apps/docs/content/guides/database/multigres.mdx b/apps/docs/content/guides/database/multigres.mdx
new file mode 100644
index 00000000000..3100f911fbf
--- /dev/null
+++ b/apps/docs/content/guides/database/multigres.mdx
@@ -0,0 +1,60 @@
+---
+id: 'multigres'
+title: 'Multigres'
+subtitle: 'Horizontally scalable Postgres for high availability'
+description: 'Run high availability Postgres across multiple nodes with automatic failover, using Multigres.'
+---
+
+
+
+Multigres is in [Private Alpha](/docs/guides/getting-started/features#feature-status). It's free during the Alpha for organizations on a paid plan, for up to two projects, but pricing may change once it leaves Alpha. It isn't covered by the [uptime SLA](/sla), and Supabase isn't targeting production or mission-critical workloads with it during this stage.
+
+
+
+Multigres gives your project high availability by running Postgres across multiple nodes instead of one, so reads and writes continue if a node fails. It is Supabase's integration of [Multigres](https://multigres.com), an open-source project that brings the same distributed-systems approach Vitess brought to MySQL to Postgres.
+
+
+
+## Eligibility
+
+During the Private Alpha:
+
+- Multigres is available to organizations on a paid plan. It isn't available on the Free plan.
+- Availability is being rolled out gradually, so the option to enable it may not yet appear for every eligible organization.
+- Up to two projects per eligible organization can use Multigres for free during the Alpha.
+
+## Enabling Multigres
+
+In the Dashboard, Multigres appears as **High availability** during project creation:
+
+1. Open [Create a new project](/dashboard/new/_) in the Dashboard.
+2. Under **High availability**, turn on **Enable high availability**.
+3. Finish the remaining fields such as database password, region, and compute size, if shown.
+4. Click **Create new project**.
+
+If your organization isn't eligible or hasn't been rolled out yet, **High availability** won't appear.
+
+## What's not included in the alpha
+
+Some Supabase features and project operations aren't yet available on Multigres-backed projects:
+
+- **Realtime.** Multigres doesn't yet support the logical replication that Realtime depends on, so Realtime is unavailable.
+- **Point-in-Time Recovery.** Only the standard daily backups are available.
+- **Cross-region read replicas.** Multigres projects run in a single region during the Alpha.
+- **OrioleDB.** A project can use Multigres or [OrioleDB](/docs/guides/database/orioledb), not both.
+- **Resizing after creation.** Compute size, disk, and the number of replicas can't be changed after a Multigres project is created.
+- **Sharding and custom durability policies.** These are on the longer-term roadmap but aren't part of the Alpha.
+
+
+
+Enabling Multigres migrates your project's database to run on Multigres. There's currently no managed path to move it back to a standard Postgres project.
+
+
+
+## Compatibility
+
+Multigres aims for full compatibility with standard Postgres, but there are some differences to be aware of. See [Multigres compatibility](/docs/guides/database/multigres/compatibility) for details.
+
+## Resources
+
+[Multigres documentation](https://multigres.com/docs) — architecture, self-hosted deployment, and other technical depth that goes beyond the hosted Supabase integration covered on this page.
diff --git a/apps/docs/content/guides/database/multigres/compatibility.mdx b/apps/docs/content/guides/database/multigres/compatibility.mdx
new file mode 100644
index 00000000000..75f1f1deac3
--- /dev/null
+++ b/apps/docs/content/guides/database/multigres/compatibility.mdx
@@ -0,0 +1,6 @@
+---
+title: 'Multigres compatibility'
+description: 'Where Multigres-backed Postgres projects differ from standard Postgres.'
+---
+
+Multigres targets full compatibility with standard Postgres, verified against the [`pg_regress`](https://www.postgresql.org/docs/current/regress.html) test suite. See the [Multigres documentation](https://multigres.com/docs) for lower-level architecture and compatibility details, and the [Multigres overview](/docs/guides/database/multigres#whats-not-included-in-the-alpha) for what's not yet supported during the Private Alpha.
diff --git a/apps/docs/content/guides/getting-started/features.mdx b/apps/docs/content/guides/getting-started/features.mdx
index ed3054170aa..77d13dadc2e 100644
--- a/apps/docs/content/guides/getting-started/features.mdx
+++ b/apps/docs/content/guides/getting-started/features.mdx
@@ -199,61 +199,62 @@ Features in Beta are tested by an external penetration tester for security issue
In addition to the Beta requirements, features in GA are covered by the [uptime SLA](/sla).
-| Product | Feature | Stage | Available on self-hosted |
-| -------------- | -------------------------- | -------------- | ------------------------------------------- |
-| Database | Postgres | `GA` | ✅ |
-| Database | Vector Database | `GA` | ✅ |
-| Database | Auto-generated Rest API | `GA` | ✅ |
-| Database | Auto-generated GraphQL API | `GA` | ✅ |
-| Database | Webhooks | `beta` | ✅ |
-| Database | Vault | `public alpha` | ✅ |
-| Database | Supabase Pipelines | `public alpha` | N/A |
-| Platform | | `GA` | ✅ |
-| Platform | Point-in-Time Recovery | `GA` | 🚧 [wal-g](https://github.com/wal-g/wal-g) |
-| Platform | Custom Domains | `GA` | N/A |
-| Platform | Network Restrictions | `GA` | N/A |
-| Platform | SSL enforcement | `GA` | N/A |
-| Platform | Branching | `beta` | N/A |
-| Platform | Terraform Provider | `public alpha` | N/A |
-| Platform | Read Replicas | `GA` | N/A |
-| Platform | Log Drains | `public alpha` | ✅ |
-| Platform | MCP | `public alpha` | ✅ |
-| Platform | PrivateLink | `beta` | N/A |
-| Studio | | `GA` | ✅ |
-| Studio | SSO | `GA` | ✅ |
-| Studio | Column Privileges | `public alpha` | ✅ |
-| Realtime | Postgres Changes | `GA` | ✅ |
-| Realtime | Broadcast | `GA` | ✅ |
-| Realtime | Presence | `GA` | ✅ |
-| Realtime | Broadcast Authorization | `public beta` | ✅ |
-| Realtime | Presence Authorization | `public beta` | ✅ |
-| Realtime | Broadcast from Database | `public beta` | ✅ |
-| Storage | | `GA` | ✅ |
-| Storage | CDN | `GA` | 🚧 [Cloudflare](https://www.cloudflare.com) |
-| Storage | Smart CDN | `GA` | 🚧 [Cloudflare](https://www.cloudflare.com) |
-| Storage | Image Transformations | `GA` | ✅ |
-| Storage | Resumable Uploads | `GA` | ✅ |
-| Storage | S3 compatibility | `GA` | ✅ |
-| Edge Functions | | `GA` | ✅ |
-| Edge Functions | Regional Invocations | `GA` | ✅ |
-| Edge Functions | NPM compatibility | `GA` | ✅ |
-| Auth | | `GA` | ✅ |
-| Auth | Email sign-in | `GA` | ✅ |
-| Auth | Social login | `GA` | ✅ |
-| Auth | Phone sign-in | `GA` | ✅ |
-| Auth | Passwordless sign-in | `GA` | ✅ |
-| Auth | SSO with SAML | `GA` | ✅ |
-| Auth | Authorization via RLS | `GA` | ✅ |
-| Auth | CAPTCHA protection | `GA` | ✅ |
-| Auth | Server-side Auth | `beta` | ✅ |
-| Auth | Third-Party Auth | `GA` | ✅ |
-| Auth | Hooks | `beta` | ✅ |
-| CLI | | `GA` | ✅ Works with self-hosted |
-| Management API | | `GA` | N/A |
-| Client Library | JavaScript | `GA` | N/A |
-| Client Library | Flutter | `GA` | N/A |
-| Client Library | Swift | `GA` | N/A |
-| Client Library | Python | `beta` | N/A |
+| Product | Feature | Stage | Available on self-hosted |
+| -------------- | -------------------------- | --------------- | ------------------------------------------- |
+| Database | Postgres | `GA` | ✅ |
+| Database | Vector Database | `GA` | ✅ |
+| Database | Auto-generated Rest API | `GA` | ✅ |
+| Database | Auto-generated GraphQL API | `GA` | ✅ |
+| Database | Webhooks | `beta` | ✅ |
+| Database | Vault | `public alpha` | ✅ |
+| Database | Supabase Pipelines | `public alpha` | N/A |
+| Database | Multigres | `private alpha` | N/A |
+| Platform | | `GA` | ✅ |
+| Platform | Point-in-Time Recovery | `GA` | 🚧 [wal-g](https://github.com/wal-g/wal-g) |
+| Platform | Custom Domains | `GA` | N/A |
+| Platform | Network Restrictions | `GA` | N/A |
+| Platform | SSL enforcement | `GA` | N/A |
+| Platform | Branching | `beta` | N/A |
+| Platform | Terraform Provider | `public alpha` | N/A |
+| Platform | Read Replicas | `GA` | N/A |
+| Platform | Log Drains | `public alpha` | ✅ |
+| Platform | MCP | `public alpha` | ✅ |
+| Platform | PrivateLink | `beta` | N/A |
+| Studio | | `GA` | ✅ |
+| Studio | SSO | `GA` | ✅ |
+| Studio | Column Privileges | `public alpha` | ✅ |
+| Realtime | Postgres Changes | `GA` | ✅ |
+| Realtime | Broadcast | `GA` | ✅ |
+| Realtime | Presence | `GA` | ✅ |
+| Realtime | Broadcast Authorization | `public beta` | ✅ |
+| Realtime | Presence Authorization | `public beta` | ✅ |
+| Realtime | Broadcast from Database | `public beta` | ✅ |
+| Storage | | `GA` | ✅ |
+| Storage | CDN | `GA` | 🚧 [Cloudflare](https://www.cloudflare.com) |
+| Storage | Smart CDN | `GA` | 🚧 [Cloudflare](https://www.cloudflare.com) |
+| Storage | Image Transformations | `GA` | ✅ |
+| Storage | Resumable Uploads | `GA` | ✅ |
+| Storage | S3 compatibility | `GA` | ✅ |
+| Edge Functions | | `GA` | ✅ |
+| Edge Functions | Regional Invocations | `GA` | ✅ |
+| Edge Functions | NPM compatibility | `GA` | ✅ |
+| Auth | | `GA` | ✅ |
+| Auth | Email sign-in | `GA` | ✅ |
+| Auth | Social login | `GA` | ✅ |
+| Auth | Phone sign-in | `GA` | ✅ |
+| Auth | Passwordless sign-in | `GA` | ✅ |
+| Auth | SSO with SAML | `GA` | ✅ |
+| Auth | Authorization via RLS | `GA` | ✅ |
+| Auth | CAPTCHA protection | `GA` | ✅ |
+| Auth | Server-side Auth | `beta` | ✅ |
+| Auth | Third-Party Auth | `GA` | ✅ |
+| Auth | Hooks | `beta` | ✅ |
+| CLI | | `GA` | ✅ Works with self-hosted |
+| Management API | | `GA` | N/A |
+| Client Library | JavaScript | `GA` | N/A |
+| Client Library | Flutter | `GA` | N/A |
+| Client Library | Swift | `GA` | N/A |
+| Client Library | Python | `beta` | N/A |
- ✅ = Fully Available
- 🚧 = Available, but requires external tools or configuration
diff --git a/apps/docs/data/content-listings/database.data.ts b/apps/docs/data/content-listings/database.data.ts
index 60c9b4c038e..65cd98428f1 100644
--- a/apps/docs/data/content-listings/database.data.ts
+++ b/apps/docs/data/content-listings/database.data.ts
@@ -94,3 +94,27 @@ export const databaseNextSteps: ContentListingGroup = {
},
],
}
+
+export const databaseMultigresWhatYouGet: ContentListingGroup = {
+ id: 'database-multigres-what-you-get',
+ heading: 'What you get',
+ description:
+ 'When you enable Multigres on a project, your database runs as a small cluster instead of a single instance:',
+ type: 'grid',
+ items: [
+ {
+ title: 'Automatic failover',
+ description:
+ 'If a node fails, another in the cluster is promoted within seconds, without you having to intervene.',
+ },
+ {
+ title: 'No connection changes',
+ description:
+ 'Use the same connection string. Coordination is transparent to your application.',
+ },
+ {
+ title: 'Consensus-backed durability',
+ description: 'Writes are acknowledged only after the cluster agrees they are durable.',
+ },
+ ],
+}
diff --git a/apps/docs/data/content-listings/index.ts b/apps/docs/data/content-listings/index.ts
index b3aa5c13798..df2d27f335f 100644
--- a/apps/docs/data/content-listings/index.ts
+++ b/apps/docs/data/content-listings/index.ts
@@ -2,7 +2,7 @@ import type { ContentListingGroup } from '~/lib/content-listings.schema'
import { aiToolsBuildingIntoApp, aiToolsSupportedAgents } from './ai-tools.data'
import { authGetStarted, authNextSteps, authPricing } from './auth.data'
-import { databaseGetStarted, databaseNextSteps } from './database.data'
+import { databaseGetStarted, databaseMultigresWhatYouGet, databaseNextSteps } from './database.data'
import {
functionsExamplesAiMedia,
functionsExamplesMessaging,
@@ -47,6 +47,7 @@ const ALL_GROUPS: readonly ContentListingGroup[] = [
authPricing,
authNextSteps,
databaseGetStarted,
+ databaseMultigresWhatYouGet,
databaseNextSteps,
functionsGetStarted,
functionsExamplesSupabase,
diff --git a/apps/docs/internals/markdown-schema/ContentListings.ts b/apps/docs/internals/markdown-schema/ContentListings.ts
index 6817ce1f919..56b1c7ba404 100644
--- a/apps/docs/internals/markdown-schema/ContentListings.ts
+++ b/apps/docs/internals/markdown-schema/ContentListings.ts
@@ -34,6 +34,11 @@ export function serializeContentListingGroupToMarkdown(
}
for (const item of items) {
+ if (!item.href) {
+ lines.push(`- **${item.title}:** ${item.description}`)
+ continue
+ }
+
const href = isExternalContentListingHref(item.href)
? item.href
: `${linkBaseUrl}${withDocsBasePath(item.href)}`
diff --git a/apps/docs/lib/content-listings.test.ts b/apps/docs/lib/content-listings.test.ts
index cd3166285cf..1eeb4059884 100644
--- a/apps/docs/lib/content-listings.test.ts
+++ b/apps/docs/lib/content-listings.test.ts
@@ -147,6 +147,27 @@ describe('serializeContentListingGroupToMarkdown', () => {
)
})
+ it('renders items without href as unlinked list entries', () => {
+ const markdown = serializeContentListingGroupToMarkdown(
+ {
+ id: 'what-you-get',
+ heading: 'What you get',
+ items: [
+ {
+ title: 'Automatic failover',
+ description: 'Another node is promoted if a node goes down.',
+ },
+ ],
+ },
+ 'https://supabase.com'
+ )
+
+ expect(markdown).toContain(
+ '- **Automatic failover:** Another node is promoted if a node goes down.'
+ )
+ expect(markdown).not.toContain('](')
+ })
+
it('omits heading line when heading is not set', () => {
const markdown = serializeContentListingGroupToMarkdown(
{
@@ -260,9 +281,11 @@ describe('dashboard content listing hrefs', () => {
// Root-relative /dashboard hrefs get the docs basePath and 404; use absolute URLs.
it('uses absolute https://supabase.com dashboard URLs', () => {
const dashboardLinks = Object.values(CONTENT_LISTINGS).flatMap((group) =>
- group.items
- .filter((item) => isDashboardHref(item.href))
- .map((item) => ({ listingId: group.id, title: item.title, href: item.href }))
+ group.items.flatMap((item) =>
+ item.href && isDashboardHref(item.href)
+ ? [{ listingId: group.id, title: item.title, href: item.href }]
+ : []
+ )
)
expect(dashboardLinks.length).toBeGreaterThan(0)
@@ -275,6 +298,16 @@ describe('dashboard content listing hrefs', () => {
})
})
+describe('contentListingItemSchema href', () => {
+ it('accepts an item without href', () => {
+ const result = contentListingItemSchema.safeParse({
+ title: 'Automatic failover',
+ description: 'Another node is promoted if a node goes down.',
+ })
+ expect(result.success).toBe(true)
+ })
+})
+
describe('contentListingItemSchema icon', () => {
const baseItem = {
title: 'Datadog',
diff --git a/apps/docs/lib/content-listings.zod.mjs b/apps/docs/lib/content-listings.zod.mjs
index decf8220a03..bc9b6de5e2d 100644
--- a/apps/docs/lib/content-listings.zod.mjs
+++ b/apps/docs/lib/content-listings.zod.mjs
@@ -22,7 +22,7 @@ export const contentListingIconSchema = z.union([z.string().min(1), contentListi
export const contentListingItemSchema = z.object({
title: z.string().min(1),
- href: z.string().min(1),
+ href: z.string().min(1).optional(),
description: z.string().min(1),
/** Shown under the title on grid cards, before the description. */
subtitle: z.string().min(1).optional(),
diff --git a/apps/docs/style-guide/WORD_LIST.md b/apps/docs/style-guide/WORD_LIST.md
index ae05cb3ecf6..61470ca93bc 100644
--- a/apps/docs/style-guide/WORD_LIST.md
+++ b/apps/docs/style-guide/WORD_LIST.md
@@ -539,6 +539,10 @@ Write _microservices_, not _micro-services_.
Use _might_ for possibility or an uncertain outcome.
+### Multigres
+
+Use _Multigres_ for the product name. Don't write _multi-gres_ or _MultiGres_.
+
### must
Use _must_ or _need to_ for a requirement. Don't use _must_ for a recommendation.
diff --git a/apps/studio/components/interfaces/ProjectHome/HighAvailabilityBadge.tsx b/apps/studio/components/interfaces/ProjectHome/HighAvailabilityBadge.tsx
index 15041a5c3c5..b1b45f29756 100644
--- a/apps/studio/components/interfaces/ProjectHome/HighAvailabilityBadge.tsx
+++ b/apps/studio/components/interfaces/ProjectHome/HighAvailabilityBadge.tsx
@@ -37,7 +37,7 @@ export function HighAvailabilityBadge({ size = 'default' }: HighAvailabilityBadg
globally distributed deployments.
Date: Fri, 2 Oct 2026 18:45:57 +0200
Subject: [PATCH 2/2] fix: ratchet lints on compute page (#51192)
## Problem
ratchet lints were failing after merging the compute landing page on a
previous PR.
## Solution
This PR cleans up the ratchet lint run.
## Review instructions
- Check that no ratchet lint fails on this PR
---
.../compute/_components/ComputeVisual.tsx | 27 ++++++++++---------
.../_components/TrustBoundarySection.tsx | 18 ++++++-------
.../compute/_components/WorkloadsSection.tsx | 4 +--
3 files changed, 26 insertions(+), 23 deletions(-)
diff --git a/apps/www/app/(products)/compute/_components/ComputeVisual.tsx b/apps/www/app/(products)/compute/_components/ComputeVisual.tsx
index c9520572ef0..c2f4922c572 100644
--- a/apps/www/app/(products)/compute/_components/ComputeVisual.tsx
+++ b/apps/www/app/(products)/compute/_components/ComputeVisual.tsx
@@ -1,5 +1,6 @@
'use client'
+import SectionContainerWithCn from 'components/Layouts/SectionContainerWithCn'
import { AnimatePresence, motion, useReducedMotion } from 'framer-motion'
import { Database } from 'icons'
import type { LucideIcon } from 'lucide-react'
@@ -7,7 +8,6 @@ import { Bot, User } from 'lucide-react'
import { useCallback, useEffect, useId, useRef, useState } from 'react'
import { cn } from 'ui'
-import SectionContainerWithCn from '../../../../components/Layouts/SectionContainerWithCn'
import styles from './compute-visual.module.css'
import { ComputeLogo } from './ComputeLogo'
@@ -185,6 +185,7 @@ function ComputeCardHeader({
{name}
+ {/* eslint-disable-next-line shadcn/no-arbitrary-values -- 11px is a deliberate micro-size for this diagram's dense card header, not a token gap */}
{runtime}
@@ -513,9 +514,9 @@ function buildConnectors(geometry: Geometry, live: Record): Con
const box = (key: NodeKey) => boxes[key] as Box
const top = (key: NodeKey) => box(key).y
const bottom = (key: NodeKey) => box(key).y + box(key).height
- const cx = (key: NodeKey) => box(key).x + box(key).width / 2
- const cy = (key: NodeKey) => box(key).y + box(key).height / 2
- const center = (key: NodeKey): Point => ({ x: cx(key), y: cy(key) })
+ const centerX = (key: NodeKey) => box(key).x + box(key).width / 2
+ const centerY = (key: NodeKey) => box(key).y + box(key).height / 2
+ const center = (key: NodeKey): Point => ({ x: centerX(key), y: centerY(key) })
const at = (x: number, y: number): Point => ({ x, y })
// Horizontal bands: the empty strips above and below the card grid, where
@@ -533,16 +534,16 @@ function buildConnectors(geometry: Geometry, live: Record): Con
// Each source feeds its own column.
connector('human-embeddings', [
center('human'),
- at(cx('human'), sourceBand),
- at(cx('embeddings'), sourceBand),
+ at(centerX('human'), sourceBand),
+ at(centerX('embeddings'), sourceBand),
center('embeddings'),
]),
connector(
'agent1-sandboxBottomMid',
[
center('agent1'),
- at(cx('agent1'), sourceBand),
- at(cx('sandboxBottomMid'), sourceBand),
+ at(centerX('agent1'), sourceBand),
+ at(centerX('sandboxBottomMid'), sourceBand),
center('sandboxBottomMid'),
],
live.sandboxBottomMid
@@ -551,8 +552,8 @@ function buildConnectors(geometry: Geometry, live: Record): Con
'agent2-sandboxBottomRight',
[
center('agent2'),
- at(cx('agent2'), sourceBand),
- at(cx('sandboxBottomRight'), sourceBand),
+ at(centerX('agent2'), sourceBand),
+ at(centerX('sandboxBottomRight'), sourceBand),
center('sandboxBottomRight'),
],
live.sandboxBottomRight
@@ -561,8 +562,8 @@ function buildConnectors(geometry: Geometry, live: Record): Con
// The always-on column serves the application.
connector('api-app', [
center('api'),
- at(cx('api'), appBand),
- at(cx('app'), appBand),
+ at(centerX('api'), appBand),
+ at(centerX('app'), appBand),
center('app'),
]),
]
@@ -592,6 +593,7 @@ function ConnectorLayer({
aria-hidden="true"
>
+ {/* eslint-disable-next-line shadcn/no-raw-colors -- SVG mask luminance requires literal white, not a theme color */}
{Object.entries(boxes).map(([key, node]) => (
))}
diff --git a/apps/www/app/(products)/compute/_components/TrustBoundarySection.tsx b/apps/www/app/(products)/compute/_components/TrustBoundarySection.tsx
index 424514d02a0..9c7c3323a70 100644
--- a/apps/www/app/(products)/compute/_components/TrustBoundarySection.tsx
+++ b/apps/www/app/(products)/compute/_components/TrustBoundarySection.tsx
@@ -5,32 +5,32 @@ const features = [
{
title: 'Short-lived credentials',
paragraph: 'Access runs through Supabase Auth with short-lived keys, not standing secrets.',
- icon: ,
+ icon: ,
},
{
title: 'Zero-config data access',
paragraph: 'Reach your database and Storage with the permissions your key already carries.',
- icon: ,
+ icon: ,
},
{
title: 'Per-workload firewalls',
paragraph: 'Define which external endpoints and ports each workload can reach.',
- icon: ,
+ icon: ,
},
{
title: 'Cloaked secrets',
paragraph: 'Scope secrets per workload, and cloak values so your code never sees them.',
- icon: ,
+ icon: ,
},
{
title: 'Patched automatically',
paragraph: 'Kernel-level security patches roll out automatically. Nothing to do on your part.',
- icon: ,
+ icon: ,
},
{
title: 'Dependency scanning',
paragraph: 'Dependencies are scanned at runtime, with alerts as new vulnerabilities land.',
- icon: ,
+ icon: ,
},
]
@@ -46,9 +46,9 @@ export function TrustBoundarySection() {
preconfigured
- Every sandbox and service inherits your project's auth, roles, and permissions the moment
- it starts, running in its own microVM with dedicated CPU and memory. Agents get a sandbox
- that is already scoped to the data it is allowed to touch — nothing more.
+ Every sandbox and service inherits your project's auth, roles, and permissions the
+ moment it starts, running in its own microVM with dedicated CPU and memory. Agents get a
+ sandbox that is already scoped to the data it is allowed to touch — nothing more.