Skip to content

feat: centralize SEO metadata and integrate resolver#1281

Open
h4rkl wants to merge 11 commits intomainfrom
feat/SEO
Open

feat: centralize SEO metadata and integrate resolver#1281
h4rkl wants to merge 11 commits intomainfrom
feat/SEO

Conversation

@h4rkl
Copy link
Copy Markdown
Collaborator

@h4rkl h4rkl commented Mar 24, 2026

Why

SEO metadata handling and root SEO assets were duplicated across apps. That duplication made it easy for canonical tags, alternates, social metadata, icons, manifests, and feed metadata to drift apart over time.

This PR centralizes that logic so the apps generate SEO metadata from a shared resolver and generate root public SEO assets from a single source.

What Changed

Shared SEO package

  • adds packages/seo
  • introduces a shared SEO resolver for:
    • base metadata
    • page metadata
    • Open Graph metadata
    • Twitter metadata
    • robots directives
    • icon and manifest wiring
  • adds a shared public-asset sync script that generates:
    • favicon.svg
    • favicon.png
    • favicon.ico
    • apple-touch-icon.png
    • icon-192.png
    • icon-512.png
    • site.webmanifest

App integrations

  • apps/web now uses the shared resolver for site metadata
  • apps/docs now uses the shared resolver for base metadata and MDX page metadata
  • apps/media now uses the shared resolver for layout metadata, listing metadata, article metadata, podcast metadata, and RSS/favicon references
  • apps/breakpoint now uses the shared resolver for base metadata
  • apps/accelerate now uses generated root SEO assets and manifest paths consistently

Routing / alternates

  • normalizes alternate path generation in packages/i18n so canonical and hreflang URLs are built consistently for root and nested routes

LLM / public content outputs

  • adds generated llms.txt outputs for apps/web
  • updates the related generator tooling and skill docs

Tests

  • adds tests for the new SEO package
  • adds tests for public asset generation
  • adds routing tests for canonical / alternate normalization
  • updates media SEO metadata coverage

Why This Approach

  • one metadata implementation is easier to keep correct than 4-5 similar implementations
  • icon and manifest generation now comes from a single source SVG instead of hand-maintained copies
  • canonical, hreflang, Open Graph, and Twitter metadata become easier to reason about and test
  • future SEO changes can be made once and rolled out across apps predictably

Manual Review

Setup

Run this once before manual review so generated root SEO assets exist locally:

pnpm seo:sync-public

Primary review path

  1. Start the main site and review http://localhost:3000
  2. Validate the homepage and one or two nested pages such as:
    • /validators
    • /developers
    • /ecosystem
  3. Validate one localized route such as /de or /ja/validators
  4. Confirm the page still renders normally and the metadata output is correct

What to check on localhost:3000

  • page content and navigation are unchanged
  • canonical tag matches the current route
  • hreflang alternates are present and correctly formatted
  • root route uses / rather than malformed double-slash variants
  • localized routes use the locale prefix only when expected
  • favicon links resolve successfully:
    • /favicon.ico
    • /favicon.png
    • /favicon.svg
    • /apple-touch-icon.png
    • /site.webmanifest
  • social metadata is still present in the document head:
    • og:title
    • og:description
    • og:image
    • twitter:title
    • twitter:description
    • twitter:image

Secondary review paths

If you want broader confidence, also spot check:

  • Docs on http://localhost:3003
    • root docs page
    • one MDX content page
    • one Learn page
    • confirm metadata is still correct and page-specific metadata still works
  • Media on http://localhost:3002
    • /news
    • one news article
    • /podcasts
    • one podcast or episode page
    • confirm canonical/Open Graph/Twitter metadata still matches the content type
  • Breakpoint on http://localhost:3005
    • confirm base metadata still renders correctly
  • Accelerate on http://localhost:3004
    • confirm icons/manifest metadata still resolve correctly

Expected review outcome

You should see no visual or routing regressions. The intended change is in metadata generation and SEO asset generation, not in user-facing page layout or copy.

Notes For Reviewers

  • icon-192.png and icon-512.png changes are generated output from the new shared asset pipeline
  • some public SEO files are generated during prebuild, so local review should start with pnpm seo:sync-public
  • Vercel builds still run the package build script, which triggers each app's prebuild and generates these files during deployment

Validation

  • pnpm seo:sync-public
  • pnpm --filter @workspace/seo test
  • pnpm --filter @workspace/i18n test -- routing

@vercel
Copy link
Copy Markdown

vercel bot commented Mar 24, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
solana-com Ready Ready Preview, Comment Mar 24, 2026 1:37am
solana-com-accelerate Ready Ready Preview, Comment Mar 24, 2026 1:37am
solana-com-breakpoint-2 Ready Ready Preview, Comment Mar 24, 2026 1:37am
solana-com-docs Ready Ready Preview, Comment Mar 24, 2026 1:37am
solana-com-media Ready Ready Preview, Comment Mar 24, 2026 1:37am
templates Ready Ready Preview, Comment Mar 24, 2026 1:37am

Request Review

@vercel vercel bot temporarily deployed to Preview – templates March 24, 2026 01:04 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com-accelerate March 24, 2026 01:04 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com-media March 24, 2026 01:04 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com-breakpoint-2 March 24, 2026 01:04 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com-docs March 24, 2026 01:16 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com-media March 24, 2026 01:16 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com March 24, 2026 01:16 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com-accelerate March 24, 2026 01:16 Inactive
@vercel vercel bot temporarily deployed to Preview – solana-com-breakpoint-2 March 24, 2026 01:16 Inactive
@vercel vercel bot temporarily deployed to Preview – templates March 24, 2026 01:16 Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant