mirror of
https://github.com/supabase/supabase.git
synced 2026-05-06 14:05:05 +08:00
## Summary
- Adds `breadcrumbListSchema(items)` helper to `apps/www/lib/json-ld.ts`
and a hand-curated `apps/www/lib/breadcrumbs.ts` route map.
- Wires inline `<script type="application/ld+json">` BreadcrumbList
blocks into 18 marketing surfaces: blog (index + slug), customers (index
+ slug), events (index + slug), 5 product pages (database, auth,
storage, edge-functions, realtime), 3 modules (vector, cron, queues),
pricing, careers, company, features.
- Pages router callers wrap the script in `<Head>`; app router callers
place it directly in JSX. Dynamic surfaces append a leaf at render time
using the page's title (`frontmatter.title` for blog, `meta_title ??
title` for customers, `event.meta_title ?? event.title` for events).
- Modules sit at `Home > {Name}` since no `/modules` index page exists;
products sit at `Home > {Product}` (no shared products parent). Absolute
`https://supabase.com` URLs match the existing `CANONICAL_ORIGIN`
convention so anchors stay stable across Vercel previews.
Linear:
[GROWTH-822](https://linear.app/supabase/issue/GROWTH-822/add-breadcrumblist-json-ld-to-www-marketing-surfaces)
(sub-issue under
[GROWTH-724](https://linear.app/supabase/issue/GROWTH-724)).
> **Note on branch name:** the branch is
`pamela/growth-820-www-breadcrumb-jsonld`; the actual Linear issue is
GROWTH-822. The branch was named before the sub-issue was created.
Ignore the `820` in the branch.
Explicitly deferred (separate PRs / low SEO ROI): `/launch-week/*`,
`/solutions/*`, `/partners/*`, `/alternatives/*`, `/changelog`,
`/legal/dpa`, `/aws-reinvent-2025`, `/wrapped`, `/contribute/*`,
`/brand-assets`, `/ga`, `/ga-week`, `/state-of-startups*`, and the
homepage (Organization + WebSite already cover homepage entity signals;
single-item BreadcrumbList is ignored by Google).
## Test plan
- [x] On the Vercel preview, `curl -s https://<preview>/database | grep
'"BreadcrumbList"'` returns the script block with `Home > Database`.
- [x] `curl -s https://<preview>/blog/<recent-slug> | grep
'"BreadcrumbList"'` returns `Home > Blog > {post title}`.
- [x] `curl -s https://<preview>/customers/<slug> | grep
'"BreadcrumbList"'` returns `Home > Customer Stories > {customer
title}`.
- [x] `curl -s https://<preview>/events/<slug> | grep
'"BreadcrumbList"'` returns `Home > Events > {event title}`.
- [x] `curl -s https://<preview>/modules/vector | grep
'"BreadcrumbList"'` returns `Home > Vector`.
24 lines
1.2 KiB
TypeScript
24 lines
1.2 KiB
TypeScript
import type { BreadcrumbItem } from './json-ld'
|
|
|
|
const SITE = 'https://supabase.com'
|
|
|
|
const home: BreadcrumbItem = { name: 'Home', url: SITE }
|
|
|
|
export const breadcrumbs = {
|
|
blogIndex: [home, { name: 'Blog', url: `${SITE}/blog` }],
|
|
customersIndex: [home, { name: 'Customer Stories', url: `${SITE}/customers` }],
|
|
eventsIndex: [home, { name: 'Events', url: `${SITE}/events` }],
|
|
database: [home, { name: 'Database', url: `${SITE}/database` }],
|
|
auth: [home, { name: 'Auth', url: `${SITE}/auth` }],
|
|
storage: [home, { name: 'Storage', url: `${SITE}/storage` }],
|
|
edgeFunctions: [home, { name: 'Edge Functions', url: `${SITE}/edge-functions` }],
|
|
realtime: [home, { name: 'Realtime', url: `${SITE}/realtime` }],
|
|
vector: [home, { name: 'Vector', url: `${SITE}/modules/vector` }],
|
|
cron: [home, { name: 'Cron', url: `${SITE}/modules/cron` }],
|
|
queues: [home, { name: 'Queues', url: `${SITE}/modules/queues` }],
|
|
pricing: [home, { name: 'Pricing', url: `${SITE}/pricing` }],
|
|
careers: [home, { name: 'Careers', url: `${SITE}/careers` }],
|
|
company: [home, { name: 'Company', url: `${SITE}/company` }],
|
|
features: [home, { name: 'Features', url: `${SITE}/features` }],
|
|
} satisfies Record<string, BreadcrumbItem[]>
|