The three frontends are separate deployments that share configuration and design tokens but never import each other's code.
Marketing site
Next.js App Router, server-rendered, localized in English, Spanish and Portuguese. Routes
live under src/app/[locale], and the reusable product sections under src/product.
SEO is handled at the framework level: robots.ts, sitemap.ts and a generated llms.txt
sit at the root of src/app, and every page emits canonical, hreflang and Open Graph tags
from generateMetadata. Structured data comes from src/components/structured-data.tsx.
Each blog post is also served as raw markdown at /blog/<slug>.md, which is what AI crawlers
prefer to read.
Web app and admin panel
Both are Vite + React single-page apps. They authenticate against the same API and read the
same config/ files, so a plan added to pricing.json shows up in both without a code
change.
Adding a page
Create the route under src/app/[locale], export generateMetadata, and add the path to the
staticPaths array in src/app/sitemap.ts. Text goes in src/product/messages/*.json, and
the language guard rejects Spanish or Portuguese strings written directly into components.