Pages

Astro builds every .astro here into a static route at the same path.

Route map

RouteFileNotes
/index.astroLanding page. CTA opens SignupModal.
/approachapproach.astroEditorial about the editorial stance.
/aboutabout.astroAbout page.
/archivearchive.astroPlaceholder for past readings.
/customizecustomize.astroAuto-opens the SignupModal on load. Kept as a stable URL for backlinks.
/subscribedsubscribed.astroConfirmation page after MailerLite double-opt-in click; advertises Reading #1 customization (which now opens the modal).
/readingsreadings/index.astroPublic readings index.
/readings/<slug>readings/your-teens-body-is-ahead-of-their-mind.astroWelcome reading, free for everyone.
/glossaryglossary.astroA–Z teen-slang/trends dictionary built from trends.ts (term = title, definition = blurb), each linking to the full trend guide. SEO surface: DefinedTermSet schema + sitewide footer/home-map links.
/trendstrends/index.astroAll 150 trends. Free tier sees first 12 sorted; members see all 150. Membership state read from the mtw-api Worker’s /api/me.
/trends/<slug>trends/[slug].astroOne trend per slug; static-generated from src/data/trends.ts.
/sciencescience/index.astro”The Science of Teens — in plain words.” 50 adolescent-psychology concepts. First 10 free / 20 with signup / rest with membership. Same /api/me pattern + family sort as /trends.
/science/<slug>science/[slug].astroOne concept per slug; static-generated from src/data/science.ts. Sections: takeaway → what it is → the science → optional inline SVG chart → what it looks like at home → what to do → myth/reality → related. Heroes are programmatic (domain gradient + line icon), no image files.
/dialoguesdialogues/index.astroParent–teen conversation scripts. Topic chips re-rank locally; signup unlocks full library. First 10 free; remainder gated by membership. Same /api/me membership pattern as /trends.
/dialogues/<slug>dialogues/[slug].astroOne dialogue per slug; static-generated from src/data/dialogues.ts. Sections: scenario → wrong exchange + why-fails → right exchange + why-works → key phrases.
/storiesstories/index.astroCase Studies (route kept as /stories; nav + labels read “Case Studies”). Real situations where the right intervention led to a good outcome — sourced and linked. First 10 free / 20 with signup / rest with membership. Same /api/me pattern + family sort as /trends.
/stories/<slug>stories/[slug].astroOne case study per slug; static-generated from src/data/stories.ts. A takeaway callout, then: what happened (situation → move → outcome) → bigger picture → how to apply → solutions → sources → related.
/membershipmembership.astro$12/mo + $99/yr Stripe Checkout buttons. Calls the Worker /api/checkout to mint a session.
/membership/welcomemembership/welcome.astroStripe Checkout success_url. Calls /api/checkout/complete to set the mtw_member cookie.
/sign-insign-in.astroEmail + password sign-in. POSTs to /api/auth/signin. Members → /trends, non-members → /membership.
/sign-upsign-up.astroEmail + password account creation. POSTs to /api/auth/signup-password. Redirects to /membership on success.
/forgot-passwordforgot-password.astroEmail-only form. POSTs to /api/auth/forgot-password. Worker emails a reset link if Resend is configured.
/reset-passwordreset-password.astroAccepts ?token=... from the reset email and POSTs the new password to /api/auth/reset-password.
/r/<topic>r/mental-health.astro, r/screens.astro, r/understand.astroHidden landing pages for paid ads. Use LandingBase.astro (no nav).
/looksmaxxing-guidelooksmaxxing-guide.astroPaid-ad landing for the Looksmaxxing Parent Guide hook test. Uses LandingBase. CTA opens SignupModal; signup:done fires Meta Pixel Lead event (if META_PIXEL_ID is set in LandingBase.astro).
/newsletternewsletter.astroPaid-ad landing for the Friday Newsletter hook test. Sister to /looksmaxxing-guide for the A/B. Same SignupModal + pixel wiring.

When adding a page