- Translation resources live under
translations/. Every page, module, and data change must support every locale configured insrc/i18n/config.ts; never hardcode a locale subset. - Always use
Linkfrom@/i18n/navigation, not the Next.js default. - Localize page metadata and reuse existing translation keys and shared phrases before adding new ones.
- Follow docs/I18N-ARCHITECTURE-RULES.md: keep page and component translations in their prescribed namespaces, co-locate page metadata under
meta, and minimize cross-namespace@:references. - Add new keys to every locale with English placeholders first; perform proper translation as a separate batch.
- Never store product, catalog, editorial, ranking, pricing, benchmark, configuration, or other independently adjustable data in
.tsor.tsxfiles. - Store data in schema-validated JSON under
data/, the appropriate manifest, or translation resources. This includes curated selections, display order, metadata, prices, scores, timelines, chart-label placement, and ranking weights. - TypeScript may contain types, loaders, validators, transformations, calculations, presentation logic, and implementation-only constants with no product or editorial meaning. When uncertain, treat a value as data.
- Update the JSON schema, corresponding TypeScript type, and validation tests together whenever a data shape changes.
- Keep
src/types/manifests.tsin one-to-one correspondence with the schemas undermanifests/$schemas/.
- Use the existing extremely minimalist visual language: sharp corners, restrained low-saturation color, and accents only where necessary.
- Prefer Lucide SVG icons; do not use emoji or text characters as icons.
- Use
max-w-8xlglobally andmax-w-6xlfor content pages and the homepage.
- Use route-level
opengraph-image.tsxfiles; do not manually set OpenGraph image paths. OG images are 1200×630 and follow the design system. - Wrap data fetchers shared by
generateMetadata()and page rendering with Reactcache(). - Use
Localefrom@/i18n/configfor locale types.
- Do not start
pnpm devautomatically; the user starts it when needed. - Before every
.next/standalone/server.jsstart, including after each production build, syncpublic/to.next/standalone/public/and.next/static/to.next/standalone/.next/static/. - Match standalone
HOSTNAMEto the preview URL hostname. Forhttp://localhost:<port>, useHOSTNAME=localhost, never127.0.0.1. - After each standalone start or restart, verify a default-locale URL, a locale-prefixed URL, and a referenced stylesheet all return
200, with the stylesheet served as CSS. A tmux start command must include asset sync and the matchingHOSTNAME. - Never create a commit without asking the user first.