A 30,000-foot tour of how the pieces fit together.
Stack
- Next.js 16 App Router, React 19, React Compiler.
- Supabase: Postgres, Auth, Storage (resumable TUS uploads), pgvector for embeddings, RLS-first.
- Mapbox GL for 3D terrain, satellite imagery, globe view.
- Vercel AI SDK v6 + Anthropic Claude (Haiku / Sonnet / Opus).
- Model Context Protocol server (HTTP Streamable + SSE).
- Langfuse for tracing, prompt versioning, token accounting.
- TanStack Query (server cache) + Jotai (atomic local state).
- Vercel for deploy and OTEL instrumentation.
Why TanStack Query + Jotai (not Redux)
TanStack Query owns server state — caching, invalidation, optimistic updates. Jotai owns ephemeral UI state — playback position, selected POI, filter atoms. The split keeps server data normalized in one place and lets components stay tiny.
Data flow at a glance
- Strava webhooks → ingest pipeline → FIT parser → metrics extraction → Postgres.
- Rides → fitness model (Bannister) → CTL/ATL/TSB snapshots.
- Ride context + memory → AI coach (tool-using) → response + extracted memory.
- MCP server exposes search_rides, get_ride, get_fitness_state, generate_workout, ask_coach, etc. — scope-gated.