#Product Pages

Each product lives under public/products/[slug]/ and is rendered as static localized routes.

#Product file structure

Minimum recommended structure:

public/products/[slug]/
  config.json
  locales/en-US.json
  privacy.md
  terms.md
  icons/icon.png
  og-image.png

Optional:

  • screenshots/[locale]/phone/*.png
  • screenshots/[locale]/tablet/*.png

#Routes generated for each product

  • /{locale}/{product}: product detail page
  • /{defaultLocale}/{product}/privacy-policy: privacy page
  • /{defaultLocale}/{product}/terms-of-use: terms page
  • /{locale}/{product}/contact: contact page (when eligible)

Note:

  • Privacy and Terms routes are generated for the default locale only.
  • Locale availability for detail pages follows product locale support settings.

#Contact page and email receiving

The contact route is available only when the product has store identifiers:

  • appStoreAppId, or
  • packageName, or
  • bundleId

Behavior:

  • SMTP configured: form sends email through server action + Nodemailer.
  • SMTP missing: contact page shows a mailto fallback button.

For SMTP setup, see Email Contact Setup.

#Setup checklist for a new product

  1. Add public/products/[slug]/config.json.
  2. Add at least one locale file in public/products/[slug]/locales/.
  3. Add legal documents: privacy.md, terms.md.
  4. Add icon: icons/icon.png and optional og-image.png.
  5. Run yarn dev and verify all routes.