refactor(www): unify legal page shells and versioning (#48483)

<!-- ccr-slack-attribution -->
_Requested by **Francesco Sansalvadore, Nicole Kramer** · [Slack
thread](https://supabase.slack.com/archives/C0161K73J1J/p1785399057853249?thread_ts=1785399057.853249&cid=C0161K73J1J)_

## 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 of the marketing site's legal pages, plus two small content
fixes (removal of duplicated dates, two heading corrections) and two
permanent redirects.

## What is the current behavior?

The documents linked from the Legal Hub are built three different ways:

- `/terms` and `/enterprise-terms` render a plain inline heading with no
breadcrumbs.
- `/sla`, `/support-policy`, `/aup` and `/privacy` are standalone MDX
pages carrying their own layout.
- `/legal/dpa` has a one-off centered heading and grid of its own.

On top of that, the documents that already have a version selector
*also* print a "Last Modified" line inside the document body, so the
same fact is stated twice on the page. On `/terms` and
`/enterprise-terms` the two statements disagree: the selector says
"Version 2 — May 6, 2026" while the body says "Last Modified: 1 May
2026".

`/privacy` handles its history differently again — earlier versions live
at their own archived URLs (`/privacy-260316` and `/privacy-250528`),
strung together by "Previous Version" links at the bottom of each page.

## What is the new behavior?

Every legal page now renders through one shell: `PageHeader` with a
`PageBreadcrumb`, so the Legal Hub is one click away from any document.

- The duplicate "Last Modified" rows are removed from the five versioned
documents. The version selector is now the single place a date appears.
- `/aup` and `/privacy` gain the version selector.
- `/privacy`'s three historical versions are now selectable from the one
page, and the two old archived URLs permanently redirect to it.
- `/sla` and `/support-policy` pick up the shell and breadcrumbs but
intentionally show neither a date nor a selector — neither document has
ever carried one, and Legal asked that the SLA stay that way for now.

Implementation-wise the canonical pattern is the one the Data Processing
Addendum page was already using: `DefaultLayout` > `NextSeo` >
`PageHeader` (with a `breadcrumb` slot) > `MDXProvider` >
`SectionContainer className="prose"` > `LegalDocVersions`. The
standalone MDX pages were moved to `apps/www/data/legal/<slug>/vN.mdx`
as bare content partials, with a new TSX shell taking over the original
route. No route changed except the two archived privacy pages, which
redirect.

Dates were carried across from the "Last Modified" lines being deleted
rather than invented: `/aup` becomes Version 1 — June 1, 2026, and
privacy v1/v2/v3 become May 28 2025, March 16 2026 and May 13 2026.

## Additional context

**This is a stacked PR.** It is sequenced behind three PRs that touch
the same files and should land first: the Terms of Service v3 bump, the
Enterprise SaaS Subscription Agreement v3 bump, and #48481 (DPA
effective date → August 1, 2026). #48481 edits the very "Last Modified"
line this PR removes from the DPA content file, so a trivial conflict
there is expected. This branch will be rebased onto master before it
leaves draft.

**Two contracts now contain a clause that no longer describes the
page.** `apps/www/data/legal/terms/v1.mdx` and `v2.mdx` — and the same
sentence in the MPPA and both integration-partner addenda — still read
"The date on which the Agreement was last modified will be updated at
the top of this Agreement". There is no longer a date in the document
body; it sits in the version selector above it. Left untouched here
because it is contract text, but Legal should re-word it.

**The date mismatch is resolved in favour of the selector.** On `/terms`
and `/enterprise-terms`, deleting the body line leaves May 6, 2026 as
the only date on the page. Nicole Kramer confirmed in Slack that May 6
is the correct date.

**Two headings change visibly**, to line up with the labels used on the
Legal Hub: "Terms of service" → "Terms of Service", and "Service Level
Agreements" → "Service Level Agreement".

**`/legal/dpa` now looks almost identical to
`/legal/customer-resources/data-processing-addendum`** — same heading,
same breadcrumb, different content. The legacy page is a PDF download
plus a signing flow and was deliberately left live, but the overlap is
more obvious than it was. Redirecting it to the versioned page is the
natural follow-up; it is not done here.

**Build verification was incomplete in this environment.** `pnpm
install` could not finish because `npm.jsr.io` is blocked by network
policy (403), so `next build` never gave a real signal. What did run and
pass:

- `tsc --noEmit` on `apps/www`, with output byte-identical to clean
master
- ESLint on every changed file — 0 errors
- Prettier using the repo's actual config
- a direct MDX compile of all 14 `data/legal/**/*.mdx` files using the
app's own MDX options

The one thing left unverified is webpack resolving
`ui-patterns/PrivacySettings` from the privacy content's new directory.
CI will confirm that.

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
claude[bot]andClaude authored and GitHub committed 2026-07-30 14:05:46 +02:00
1 parent 8a607a6108
commit 76a9ba968c
21 files changed
+242 -182

No files matched your search

@@ -1,17 +1,3 @@
import Layout from '../layouts/Layout'
import SectionContainer from '../components/Layouts/SectionContainer'
export const meta = {
title: 'Acceptable Use Policy | Supabase',
description: 'Supabase Acceptable Use Policy',
}
<SectionContainer>
# Acceptable Use Policy
_Last Modified: 1 June 2026_
This Acceptable Use Policy (this "Policy") describes prohibited uses of the web services offered by Supabase, Inc. and its affiliates (the "Services") and the website located at https://supabase.com (the "Supabase Site").
By using the Services or accessing the Supabase Site, you agree to the latest version of this Policy. Violation of this Policy may result in the immediate suspension or termination of your Accounts and / or Services.
@@ -61,7 +47,3 @@ By using the Services or accessing the Supabase Site, you agree to the latest ve
## 7. Reporting Violations
Report violations to legal@supabase.io or abuse@supabase.io
</SectionContainer>
export default (context) => <Layout meta={meta} children={context.children} context={context} />
@@ -1,5 +1,3 @@
_Last Modified: 1 August 2026_
This Data Processing Addendum (the “**DPA**”) supplements and forms part of the Supabase Terms of Service available at [https://supabase.com/terms](https://supabase.com/terms), or such other agreement entered into between the Customer and Supabase Pte. Ltd (“**Supabase**”) relevant to Customer’s use of the Services (the “**Agreement**”), and in case of any conflict, supersedes the Agreement in relation to the transfer and processing of Covered Data in connection with the performance of the Services. This DPA is effective as of the Effective Date of the Agreement.
## 1. Definitions.
@@ -1,5 +1,3 @@
_Last Modified: 17 April 2026_
This Enterprise SaaS Subscription Agreement (this "**Agreement**") is entered into by and between the customer identified in the signature to the Order which references these terms ("**Customer**") and the Supabase Affiliate entity identified in such Order ("**Supabase**") (Customer and Supabase each, a "**Party**" and collectively, the "**Parties**"), and is effective as of the Services Start Date identified in such Order ("**Effective Date**"), and sets forth the terms and conditions under which Customer may subscribe to certain products and services of Supabase as set forth in one or more Orders (defined below).
## 1. Definitions.
@@ -1,5 +1,3 @@
_Last Modified: 1 May 2026_
This Enterprise SaaS Subscription Agreement (this "**Agreement**") is entered into by and between the customer identified in the signature block below ("**Customer**") and Supabase, Pte. Ltd., as subsidiary of Supabase, Inc., a Delaware corporation ("**Supabase**") (Customer and Supabase each, a "**Party**" and collectively, the "**Parties**"), effective as of [Deal.CloseDate] ("**Effective Date**"), and sets forth the terms and conditions under which Customer may subscribe to certain products and services of Supabase as set forth in one or more Orders (defined below).
**Accepted and agreed to as of the Effective Date by the authorized representative of each Party by Customer's entering into an Order referencing this Agreement.**
@@ -1,5 +1,3 @@
_Last Modified: 1 August 2026_
This Enterprise SaaS Subscription Agreement (this "**Agreement**") is entered into by and between the customer identified in the signature block in an Order ("**Customer**") and Supabase, Pte. Ltd., as subsidiary of Supabase, Inc., a Delaware corporation ("**Supabase**") (Customer and Supabase each, a "**Party**" and collectively, the "**Parties**"), effective as of the date of last signature of an Order referencing these terms ("**Effective Date**"), and sets forth the terms and conditions under which Customer may subscribe to certain products and services of Supabase as set forth in one or more Orders (defined below).
**Accepted and agreed to as of the Effective Date by the authorized representative of each Party by Customer's entering into an Order referencing this Agreement.**
@@ -1,20 +1,5 @@
import Layout from '../layouts/Layout'
import SectionContainer from '../components/Layouts/SectionContainer'
import { PrivacySettings } from 'ui-patterns/PrivacySettings'
export const meta = {
title: 'Privacy Policy | Supabase',
description: 'Supabase Privacy Policy',
}
<SectionContainer>
# Privacy Policy
_Last Modified: 28 May 2025_
Previous Version: [14 March 2025](/privacy-250314)
Thank you for your interest in Supabase, Inc., ("**_Supabase_**," "**_we_**", "**_our_**" or "**_us_**"). Supabase provides a suite of open source tools, stitched together to build a seamless developer experience. This Privacy Notice explains how information about you, that directly identifies you, or that makes you identifiable ("**_personal information_**") is collected, used and disclosed by Supabase in connection with our website at [supabase.com](https://supabase.com) (the "**_Site_**") and our services offered in connection with the Site (collectively with the Site, the "**_Service_**").
## What Does This Privacy Notice Apply To?
@@ -343,7 +328,3 @@ Most browsers also allow you to change your cookie settings to block certain coo
If you would like to find out more about cookies and other similar technologies, please visit [allaboutcookies.org](http://www.allaboutcookies.org).
Please note that deleting or blocking cookies may not be effective for all types of tracking technologies, such as Local Storage Objects (LSOs) like HTML5.
</SectionContainer>
export default (context) => <Layout meta={meta} children={context.children} context={context} />
@@ -1,20 +1,5 @@
import Layout from '../layouts/Layout'
import SectionContainer from '../components/Layouts/SectionContainer'
import { PrivacySettings } from 'ui-patterns/PrivacySettings'
export const meta = {
title: 'Privacy Policy | Supabase',
description: 'Supabase Privacy Policy',
}
<SectionContainer>
# Privacy Policy
_Last Modified: 16 March 2026_
Previous Version: [28 May 2025](/privacy-250528)
Thank you for your interest in Supabase, Inc., ("**_Supabase_**," "**_we_**", "**_our_**" or "**_us_**"). Supabase provides a suite of open source tools, stitched together to build a seamless developer experience. This Privacy Notice explains how information about you, that directly identifies you, or that makes you identifiable ("**_personal information_**") is collected, used and disclosed by Supabase in connection with our website at [supabase.com](https://supabase.com) (the "**_Site_**") and our services offered in connection with the Site (collectively with the Site, the "**_Service_**").
## What Does This Privacy Notice Apply To?
@@ -346,7 +331,3 @@ Most browsers also allow you to change your cookie settings to block certain coo
If you would like to find out more about cookies and other similar technologies, please visit [allaboutcookies.org](http://www.allaboutcookies.org).
Please note that deleting or blocking cookies may not be effective for all types of tracking technologies, such as Local Storage Objects (LSOs) like HTML5.
</SectionContainer>
export default (context) => <Layout meta={meta} children={context.children} context={context} />
@@ -1,21 +1,5 @@
import { PrivacySettings } from 'ui-patterns/PrivacySettings'
import SectionContainer from '../components/Layouts/SectionContainer'
import Layout from '../layouts/Layout'
export const meta = {
title: 'Privacy Policy | Supabase',
description: 'Supabase Privacy Policy',
}
<SectionContainer>
# Privacy Policy
_Last Modified: 13 May 2026_
Previous Version: [16 March 2026](/privacy-260316)
Thank you for your interest in Supabase, Inc., ("**_Supabase_**," "**_we_**", "**_our_**" or "**_us_**"). Supabase provides a suite of open source tools, stitched together to build a seamless developer experience. This Privacy Notice explains how information about you, that directly identifies you, or that makes you identifiable ("**_personal information_**") is collected, used and disclosed by Supabase in connection with our website at [supabase.com](https://supabase.com) (the "**_Site_**") and our services offered in connection with the Site (collectively with the Site, the "**_Service_**").
## What Does This Privacy Notice Apply To?
@@ -349,7 +333,3 @@ Most browsers also allow you to change your cookie settings to block certain coo
If you would like to find out more about cookies and other similar technologies, please visit [allaboutcookies.org](http://www.allaboutcookies.org).
Please note that deleting or blocking cookies may not be effective for all types of tracking technologies, such as Local Storage Objects (LSOs) like HTML5.
</SectionContainer>
export default (context) => <Layout meta={meta} children={context.children} context={context} />
@@ -1,15 +1,3 @@
import Layout from '../layouts/Layout'
import SectionContainer from '../components/Layouts/SectionContainer'
export const meta = {
title: 'Service Level Agreement | Supabase',
description: 'Supabase Service Level Agreement',
}
<SectionContainer>
# Service Level Agreements
## Enterprise Platform Uptime SLA
The following Service Level Agreement, which is incorporated into and forms part of the Subscription Agreement between Supabase, Inc. ("Supabase") and Customer (the "Agreement"), will apply to the Services for Enterprise Customers specified in an Order Form during the applicable Subscription Term.
@@ -370,7 +358,3 @@ An Information request about Supabase or feature request.
| 4. Low | 2 business days<br />Monday - Friday | 2 business days<br />Monday - Friday | 24 hours<br />24/7 x 365 |
Business hours are 6am to 6pm local time unless stated otherwise.
</SectionContainer>
export default (context) => <Layout meta={meta} children={context.children} context={context} />
@@ -1,15 +1,3 @@
import SectionContainer from '../components/Layouts/SectionContainer'
import Layout from '../layouts/Layout'
export const meta = {
title: 'Support Policy',
description: 'Supabase Support Policy',
}
<SectionContainer>
# Support Policy
Supabase is dedicated to providing an exceptional customer experience. As a crucial aspect of
this commitment, we offer limited technical support for all paid projects running on our hosted Supabase platform. Technical support is confined to the scope, hours, contacts, and channels below.
@@ -77,7 +65,3 @@ In the event of a platform issue, a notice will be posted on our platform status
Please contact us to find out about our Premium Support options available for Team Plan and Enterprise customers using the form below:
[https://forms.supabase.com/enterprise](https://forms.supabase.com/enterprise)
</SectionContainer>
export default (context) => <Layout meta={meta} children={context.children} context={context} />
-2
View File
@@ -1,5 +1,3 @@
_Last Modified: 11 July 2025_
These Terms of Service (this "**Agreement**") are a binding contract between you ("**Customer**," "**you**," or "**your**") and Supabase, Inc., a Delaware corporation with offices located at 65 Chulia Street #38-02/03, OCBC Centre, Singapore 049513 ("**Supabase**," "**we**," or "**us**"). This Agreement governs your access to and use of the Cloud Services. Supabase and Customer may be referred to herein collectively as the "**Parties**" or individually as a "**Party**."
## Agreement Acceptance
-2
View File
@@ -1,5 +1,3 @@
_Last Modified: 1 May 2026_
These Terms of Service (this "**Agreement**") are a binding contract between you ("**Customer**," "**you**," or "**your**") and SUPABASE PTE. LTD., a Singapore entity with a registered address of 65 Chulia Street #38-02/03, OCBC Centre, Singapore 049513 ("**Supabase**," "**we**," or "**us**"). This Agreement governs your access to and use of the Cloud Services. Supabase and Customer may be referred to herein collectively as the "**Parties**" or individually as a "**Party**."
THIS AGREEMENT TAKES EFFECT WHEN YOU CLICK THE "I ACCEPT" BUTTON BELOW OR BY ACCESSING OR USING THE SERVICES (the "**Effective Date**"). BY CLICKING ON THE "I ACCEPT" BUTTON BELOW OR BY ACCESSING OR USING THE SERVICES YOU (A) ACKNOWLEDGE THAT YOU HAVE READ AND UNDERSTAND THIS AGREEMENT; (B) REPRESENT AND WARRANT THAT YOU HAVE THE RIGHT, POWER, AND AUTHORITY TO ENTER INTO THIS AGREEMENT AND, IF ENTERING INTO THIS AGREEMENT FOR AN ORGANIZATION, THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THAT ORGANIZATION; AND (C) ACCEPT THIS AGREEMENT AND AGREE THAT YOU ARE LEGALLY BOUND BY ITS TERMS.
-2
View File
@@ -1,5 +1,3 @@
_Last Modified: 1 August 2026_
These Terms of Service (this "Agreement") are a binding contract between you ("Customer," "you," or "your") and SUPABASE PTE. LTD., a Singapore entity with a registered address of 65 Chulia Street #38-02/03, OCBC Centre, Singapore 049513 ("Supabase," "we," or "us"). This Agreement governs your access to and use of the Cloud Services, except to the extent that Customer has entered into an Order or separate agreement with Supabase that expressly incorporates different terms, in which case those other terms will govern. Supabase and Customer may be referred to herein collectively as the "Parties" or individually as a "Party."
THIS AGREEMENT TAKES EFFECT WHEN YOU CLICK THE "I ACCEPT" BUTTON BELOW OR BY ACCESSING OR USING THE SERVICES (the "Effective Date"). BY CLICKING ON THE "I ACCEPT" BUTTON BELOW OR BY ACCESSING OR USING THE SERVICES YOU (A) ACKNOWLEDGE THAT YOU HAVE READ AND UNDERSTAND THIS AGREEMENT; (B) REPRESENT AND WARRANT THAT YOU HAVE THE RIGHT, POWER, AND AUTHORITY TO ENTER INTO THIS AGREEMENT AND, IF ENTERING INTO THIS AGREEMENT FOR AN ORGANIZATION, THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THAT ORGANIZATION; AND (C) ACCEPT THIS AGREEMENT AND AGREE THAT YOU ARE LEGALLY BOUND BY ITS TERMS.
+10
View File
@@ -1732,6 +1732,16 @@ module.exports = [
source: '/docs/company/privacy',
destination: '/privacy',
},
{
permanent: true,
source: '/privacy-260316',
destination: '/privacy?version=v2',
},
{
permanent: true,
source: '/privacy-250528',
destination: '/privacy?version=v1',
},
{
permanent: true,
source: '/docs/company/sla',
+35
View File
@@ -0,0 +1,35 @@
import { MDXProvider } from '@mdx-js/react'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import LegalDocVersions, { type LegalDocVersion } from '~/components/Legal/LegalDocVersions'
import PageBreadcrumb from '~/components/Sections/PageBreadcrumb'
import PageHeader from '~/components/Sections/PageHeader'
import V1 from '~/data/legal/aup/v1.mdx'
import mdxComponents from '~/lib/mdx/mdxComponents'
import { NextSeo } from 'next-seo'
const meta = {
title: 'Acceptable Use Policy | Supabase',
description: 'Supabase Acceptable Use Policy',
}
const versions: LegalDocVersion[] = [
{ id: 'v1', label: 'Version 1', effectiveDate: 'June 1, 2026', Component: V1 },
]
export default function AcceptableUsePolicyPage() {
return (
<DefaultLayout>
<NextSeo {...meta} />
<PageHeader
breadcrumb={<PageBreadcrumb items={[{ label: 'Legal', href: '/legal' }]} />}
h1="Acceptable Use Policy"
/>
<MDXProvider components={mdxComponents()}>
<SectionContainer className="prose">
<LegalDocVersions versions={versions} />
</SectionContainer>
</MDXProvider>
</DefaultLayout>
)
}
+9 -6
View File
@@ -2,6 +2,8 @@ import { MDXProvider } from '@mdx-js/react'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import LegalDocVersions, { type LegalDocVersion } from '~/components/Legal/LegalDocVersions'
import PageBreadcrumb from '~/components/Sections/PageBreadcrumb'
import PageHeader from '~/components/Sections/PageHeader'
import V1 from '~/data/legal/enterprise-terms/v1.mdx'
import V2 from '~/data/legal/enterprise-terms/v2.mdx'
import V3 from '~/data/legal/enterprise-terms/v3.mdx'
@@ -25,13 +27,14 @@ export default function EnterpriseTermsPage() {
return (
<DefaultLayout>
<NextSeo {...meta} />
<PageHeader
breadcrumb={<PageBreadcrumb items={[{ label: 'Legal', href: '/legal' }]} />}
h1="Enterprise SaaS Subscription Agreement"
/>
<MDXProvider components={mdxComponents()}>
<div className="prose max-w-none">
<SectionContainer>
<h1>Enterprise SaaS Subscription Agreement</h1>
<LegalDocVersions versions={versions} />
</SectionContainer>
</div>
<SectionContainer className="prose">
<LegalDocVersions versions={versions} />
</SectionContainer>
</MDXProvider>
</DefaultLayout>
)
+59 -48
View File
@@ -1,60 +1,71 @@
import Layout from '~/components/Layouts/Default'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import PageBreadcrumb from '~/components/Sections/PageBreadcrumb'
import PageHeader from '~/components/Sections/PageHeader'
import { useSendTelemetryEvent } from '~/lib/telemetry'
import CTABanner from 'components/CTABanner/index'
import { NextSeo } from 'next-seo'
const meta = {
title: 'Data Processing Addendum',
description: 'Supabase Data Processing Addendum',
}
const DPA = () => {
const sendTelemetryEvent = useSendTelemetryEvent()
return (
<>
<Layout>
<SectionContainer>
<div className="mx-auto grid max-w-2xl grid-cols-12 rounded-lg">
<div className="col-span-12 flex items-center lg:col-span-12">
<div className="prose flex flex-col space-y-8 pb-16">
<h1 className="text-center text-5xl">DPA</h1>
<p>
We have a long-standing commitment to customer privacy and data protection. As
part of this commitment, we have prepared a Data Processing Addendum ("DPA"). You
can review a static PDF version of our latest DPA document{' '}
<a
href="https://supabase.com/downloads/docs/Supabase+DPA+260601.pdf"
target="_blank"
rel="noopener noreferrer"
className="text-brand-link hover:underline"
onClick={() =>
sendTelemetryEvent({
action: 'dpa_pdf_opened',
properties: { source: 'www' },
})
}
>
here
</a>
.
</p>
<DefaultLayout>
<NextSeo {...meta} />
<PageHeader
breadcrumb={
<PageBreadcrumb
items={[
{ label: 'Legal', href: '/legal' },
{ label: 'Customer Legal Resources', href: '/legal#customer-legal-resources' },
]}
/>
}
h1="Data Processing Addendum"
/>
<SectionContainer className="prose">
<p>
We have a long-standing commitment to customer privacy and data protection. As part of
this commitment, we have prepared a Data Processing Addendum ("DPA"). You can review a
static PDF version of our latest DPA document{' '}
<a
href="https://supabase.com/downloads/docs/Supabase+DPA+260601.pdf"
target="_blank"
rel="noopener noreferrer"
className="text-brand-link hover:underline"
onClick={() =>
sendTelemetryEvent({
action: 'dpa_pdf_opened',
properties: { source: 'www' },
})
}
>
here
</a>
.
</p>
<p>
To make the DPA legally binding, you need to sign and complete the details through
a PandaDoc document that we prepare. To get this version of the DPA,{' '}
<a
href="https://supabase.com/dashboard/org/_/documents"
target="_blank"
rel="noopener noreferrer"
className="text-brand-link hover:underline"
>
request it from the legal documents page
</a>{' '}
of your Supabase dashboard.
</p>
</div>
</div>
</div>
</SectionContainer>
<CTABanner />
</Layout>
</>
<p>
To make the DPA legally binding, you need to sign and complete the details through a
PandaDoc document that we prepare. To get this version of the DPA,{' '}
<a
href="https://supabase.com/dashboard/org/_/documents"
target="_blank"
rel="noopener noreferrer"
className="text-brand-link hover:underline"
>
request it from the legal documents page
</a>{' '}
of your Supabase dashboard.
</p>
</SectionContainer>
<CTABanner />
</DefaultLayout>
)
}
export default DPA
+39
View File
@@ -0,0 +1,39 @@
import { MDXProvider } from '@mdx-js/react'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import LegalDocVersions, { type LegalDocVersion } from '~/components/Legal/LegalDocVersions'
import PageBreadcrumb from '~/components/Sections/PageBreadcrumb'
import PageHeader from '~/components/Sections/PageHeader'
import V1 from '~/data/legal/privacy/v1.mdx'
import V2 from '~/data/legal/privacy/v2.mdx'
import V3 from '~/data/legal/privacy/v3.mdx'
import mdxComponents from '~/lib/mdx/mdxComponents'
import { NextSeo } from 'next-seo'
const meta = {
title: 'Privacy Policy | Supabase',
description: 'Supabase Privacy Policy',
}
const versions: LegalDocVersion[] = [
{ id: 'v3', label: 'Version 3', effectiveDate: 'May 13, 2026', Component: V3 },
{ id: 'v2', label: 'Version 2', effectiveDate: 'March 16, 2026', Component: V2 },
{ id: 'v1', label: 'Version 1', effectiveDate: 'May 28, 2025', Component: V1 },
]
export default function PrivacyPolicyPage() {
return (
<DefaultLayout>
<NextSeo {...meta} />
<PageHeader
breadcrumb={<PageBreadcrumb items={[{ label: 'Legal', href: '/legal' }]} />}
h1="Privacy Policy"
/>
<MDXProvider components={mdxComponents()}>
<SectionContainer className="prose">
<LegalDocVersions versions={versions} />
</SectionContainer>
</MDXProvider>
</DefaultLayout>
)
}
+37
View File
@@ -0,0 +1,37 @@
import { MDXProvider } from '@mdx-js/react'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import PageBreadcrumb from '~/components/Sections/PageBreadcrumb'
import PageHeader from '~/components/Sections/PageHeader'
import Content from '~/data/legal/sla/v1.mdx'
import mdxComponents from '~/lib/mdx/mdxComponents'
import { NextSeo } from 'next-seo'
const meta = {
title: 'Service Level Agreement | Supabase',
description: 'Supabase Service Level Agreement',
}
export default function SLAPage() {
return (
<DefaultLayout>
<NextSeo {...meta} />
<PageHeader
breadcrumb={
<PageBreadcrumb
items={[
{ label: 'Legal', href: '/legal' },
{ label: 'Customer Legal Resources', href: '/legal#customer-legal-resources' },
]}
/>
}
h1="Service Level Agreement"
/>
<MDXProvider components={mdxComponents()}>
<SectionContainer className="prose">
<Content />
</SectionContainer>
</MDXProvider>
</DefaultLayout>
)
}
+37
View File
@@ -0,0 +1,37 @@
import { MDXProvider } from '@mdx-js/react'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import PageBreadcrumb from '~/components/Sections/PageBreadcrumb'
import PageHeader from '~/components/Sections/PageHeader'
import Content from '~/data/legal/support-policy/v1.mdx'
import mdxComponents from '~/lib/mdx/mdxComponents'
import { NextSeo } from 'next-seo'
const meta = {
title: 'Support Policy',
description: 'Supabase Support Policy',
}
export default function SupportPolicyPage() {
return (
<DefaultLayout>
<NextSeo {...meta} />
<PageHeader
breadcrumb={
<PageBreadcrumb
items={[
{ label: 'Legal', href: '/legal' },
{ label: 'Customer Legal Resources', href: '/legal#customer-legal-resources' },
]}
/>
}
h1="Support Policy"
/>
<MDXProvider components={mdxComponents()}>
<SectionContainer className="prose">
<Content />
</SectionContainer>
</MDXProvider>
</DefaultLayout>
)
}
+16 -6
View File
@@ -2,6 +2,8 @@ import { MDXProvider } from '@mdx-js/react'
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
import LegalDocVersions, { type LegalDocVersion } from '~/components/Legal/LegalDocVersions'
import PageBreadcrumb from '~/components/Sections/PageBreadcrumb'
import PageHeader from '~/components/Sections/PageHeader'
import V1 from '~/data/legal/terms/v1.mdx'
import V2 from '~/data/legal/terms/v2.mdx'
import V3 from '~/data/legal/terms/v3.mdx'
@@ -23,13 +25,21 @@ export default function TermsPage() {
return (
<DefaultLayout>
<NextSeo {...meta} />
<PageHeader
breadcrumb={
<PageBreadcrumb
items={[
{ label: 'Legal', href: '/legal' },
{ label: 'Customer Legal Resources', href: '/legal#customer-legal-resources' },
]}
/>
}
h1="Terms of Service"
/>
<MDXProvider components={mdxComponents()}>
<div className="prose max-w-none">
<SectionContainer>
<h1>Terms of service</h1>
<LegalDocVersions versions={versions} />
</SectionContainer>
</div>
<SectionContainer className="prose">
<LegalDocVersions versions={versions} />
</SectionContainer>
</MDXProvider>
</DefaultLayout>
)