Public-facing curated sample trip catalog at /explore. No auth required. Pages fetch from convex/sampleTrips.ts and render read-only trip views via src/modules/explore/.
| File | Description |
|---|---|
index.astro | /explore - grid of curated sample trips; mounts <ExploreGrid client:load> from src/modules/explore/; uses requireConsentFromHeaders for GDPR consent |
[id].astro | /explore/<id> - sample trip detail by Convex document ID; SSR-fetches title/description via Convex HTTP query sampleTrips:getCuratedById; sets 5-min cache + SWR headers; mounts <SampleDetailView> |
| Directory | Purpose |
|---|---|
by-slug/ | Slug-based canonical URLs for sample trips (see by-slug/AGENTS.md) |
convex/sampleTrips.ts; never re-add them client-side[id].astro fetches Convex via raw HTTP (/api/query) in the Astro frontmatter script to build SSR meta tags; this is intentional for SEO - do not move to client-onlypublic, max-age=300, stale-while-revalidate=86400) is set on detail pages; keep it in sync with any Convex data TTL decisionsid param, redirect to /explore rather than 404requireConsentFromHeaders(Astro.request.headers) is called server-side and passed to <BaseHead> for GDPR-aware PostHog initializationPUBLIC_CONVEX_URL/api/query in the frontmatter with a try/catch fallback to generic copysrc/modules/explore/ - ExploreGrid and SampleDetailView componentssrc/modules/common/utils/geoConsent - requireConsentFromHeadersconvex/sampleTrips.ts - getCuratedById, getCuratedBySlug queries (called via Convex HTTP)astro, react (ExploreGrid/SampleDetailView hydrated with client:load)