Daybreak — a personal training coach in Telegram
A training coach I built for myself and am slowly opening up. Daybreak uses an athlete's Strava data, injury history, and training goals to deliver personalized daily training advice grounded in real-world training plans and principles. Onboarding, daily check-ins, plan adjustments for flare-ups and tweaks, and calendar integration all happen entirely in Telegram; a minimalist Next.js app handles allowlist signup, Strava OAuth, and a read-only plan view.
- Onboarding and identity. /signup allowlist gate with one-time link_tokens and a QR deeplink; full Telegram onboarding state machine (steps 0–5 plus plan handoff).
- Daily check-in loop. /checkin wellness battery (readiness, soreness, note) feeds a single-call Claude coaching response; wellness_log.md, checkin_log.md, and agent_runs persisted, with a Sentry fallback.
- Strava and infra. OAuth wired end-to-end via /connect_strava, encrypted token storage, and a health-check ping.
- For just myself, I could manage all of this with .md context files. Introducing a full database added a lot of scope.
- Telegram integration has been easy. Strava is a pain in the ass.
- Spent a bunch of time fussing with env variables on Vercel.















