Precision race strategy for serious trail runners. Next.js + Vercel + Strava OAuth + Anthropic API.
npm installEdit .env.local:
STRAVA_CLIENT_ID=244814
STRAVA_CLIENT_SECRET=a8afacabbf4551781b818526e788b5bd20230c26
NEXT_PUBLIC_BASE_URL=http://localhost:3000
ANTHROPIC_API_KEY=sk-ant-...your key here...
SESSION_SECRET=some-random-32-char-string-here-ok
npm run devnpm install -g vercel
vercelThen in Vercel dashboard → Project Settings → Environment Variables, add all five variables from .env.local. Also update:
NEXT_PUBLIC_BASE_URL→ your Vercel URL (e.g.https://talus.vercel.app)- In Strava API settings → change Authorization Callback Domain to your Vercel domain
In https://www.strava.com/settings/api, set:
- Authorization Callback Domain:
localhost(local) oryour-domain.vercel.app(production)
The full redirect URI used is: {NEXT_PUBLIC_BASE_URL}/api/auth/callback
app/
├── page.tsx # Landing — Strava connect or demo mode
├── callback/page.tsx # OAuth redirect handler
├── blueprint/page.tsx # Main app — params → race → blueprint
└── api/
├── auth/strava/route.ts # Initiates OAuth flow
├── auth/callback/route.ts # Token exchange (server-side, secret stays safe)
├── blueprint/route.ts # Streams Anthropic API response
└── session/route.ts # Returns current session info to client
lib/
├── strava.ts # Strava API client
├── blueprint-engine.ts # Core race calculation logic
└── session.ts # iron-session cookie management
Edit lib/blueprint-engine.ts → RACES object. Add CPs with km, elev, gainFromStart and an elevation profile array.
- Race Mode view (minimal on-course UI)
- Post-Race Autopsy (upload .fit file, find the collapse point)
- Offline PWA support
- COROS / Garmin Connect integration