Inspiration
I started running about 6 months ago. Like most beginners, I picked up a Garmin watch and slowly accumulated months of data including heart rate, pace, cadence, elevation, suffer score etc. But unfortunately I was unable to draw any useful insights on how I was training from all that data.
I injured myself a few times early on due to bad running routines which I didn't know were bad while I was doing them. I watched YouTube videos. I read generic training guides. But none of it was grounded in my data, my current fitness level, or my specific goal. I knew I wanted to run a sub-30 minute 5k. I had no idea if I was on track, whether I was overtraining, or what my easy pace should actually be.
I started manually exporting my Garmin data and pasting it into AI models to ask for coaching advice. The guidance was genuinely useful, but the process was tedious, inconsistent, and impossible to sustain after every run. That's when the idea for PaceCoach took shape: automate the loop between running data and personalised coaching, and make it feel like having a coach in your inbox.
I also knew I wasn't alone. There are millions of runners with GPS watches and Strava accounts who are in exactly the same position i.e. data-rich and coaching-poor.
What it does
PaceCoach connects to your Strava account and uses Amazon Nova 2 Lite to deliver personalised running coaching through three automated pipelines: Plan generation - On sign-up, you set your goal (target distance, time, and race date) and how many days a week you can train. Nova takes that alongside your last 90 days of Strava activity history and generates a full structured training plan from today to your race date, broken down into weekly sessions with types, target paces, and effort levels. The complete plan lands in your inbox immediately.
Post-run analysis - Every time you finish a run and it syncs to Strava, PaceCoach receives a webhook event and triggers a Nova analysis within 30 minutes. Nova compares what you actually ran against the planned session, highlights what went well, gives one specific thing to focus on next time, and previews your next session. All the analysis is delivered by email while the run is still fresh.
Weekly summary and adaptation - Every Monday morning, Nova evaluates the last two weeks of training and writes a personalised weekly summary. If you've missed sessions, improved faster than expected, or deviated significantly from the plan, Nova decides whether to rewrite the remaining training weeks and explains why. Your plan stays current without you having to do anything.
Your projected finish time is calculated deterministically once you have minimum 10 runs from your actual run data and not estimated by the AI model. Nova receives the number as context and narrates around it. This keeps coaching grounded in reality.
How I built it
PaceCoach is built on Next.js 14 with the App Router, Supabase (Postgres), NextAuth.js v5 for Strava OAuth, and Amazon Nova 2 Lite via Amazon Bedrock for all AI calls. Email is handled by Resend with React Email components. The app is deployed on Vercel.
I started by mapping the core user flows before touching any code - onboarding goal setting and plan generation, the post-run coaching loop, and the weekly summary with plan adaptation. Those three flows became the three distinct Nova call types in the system. As I am not a coder myself, I took Claude Code's help to write the code for the app.
Challenges I ran into
Understanding the data available The first challenge was figuring out exactly what data I could get and in what format. I wanted to get the rich running data that Garmin collects but was disappointed to know that Garmin doesnt allow individual developers API access. Then I researched which other apps provided credible running performance data and found Strava. Strava's webhook delivers a minimal event payload and the full activity detail requires a second API call. Understanding which fields were available, which were reliable, and which required a Garmin connection to populate took significant trial and error.
Vercel function timeouts Deploying on Vercel's free tier introduced a 10-second function timeout constraint. The post-run analysis pipeline i.e. Strava fetch, session matching, Nova call, email send can exceed that limit under load. The solution was to use Vercel's waitUntil() API to process the pipeline in the background after returning a 200 to Strava immediately, combined with an admin retry sweep endpoint that catches any runs that didn't get analysed within a 24-hour window. Admin failure notifications include a pre-filled retry command so no run goes uncoached.
Prompt quality Getting Nova to produce consistently structured, coaching-appropriate output required iteration. Nova proved to be a responsive model as prompt improvements produced noticeably better outputs. The final prompts are stored as versioned .txt files, editable without touching application code, which made iteration fast.
What I learned
The biggest technical lesson was understanding the boundary between what AI should do and what deterministic code should do. Early in the design process I considered asking Nova to generate projection numbers for estimated finish times and confidence ranges. I quickly realised that was the wrong call as LLMs are not reliable calculators.
The solution was to build lib/projection.ts - a deterministic module using weighted averaging and linear regression over real run data to calculate projections and pass the result to Nova as context. Nova narrates the number in plain language. It never generates it. That separation became one of the core architectural principles of the project: use AI where language and reasoning matter, use code where precision matters.
I also learned a lot about working with the Strava API. My initial plan included pulling richer metrics from Garmin directly, but accessing Garmin's API was not possible for me as an individual developer. I adapted by connecting Garmin to Strava, which surfaces a useful subset of Garmin metrics through the Strava feed which is enough to support meaningful coaching without needing a separate integration.
What's next for PaceCoach
PaceCoach will continue beyond the hackathon. The immediate next step is testing and validation with real runners to understand whether the coaching output is genuinely useful and whether users complete more of their planned sessions with it than without it. Once there is enough demonstrated user interest, the plan is to apply for higher-tier Strava API access, which would allow more than just the app owner to authenticate and to explore integrations with other running platforms and watch ecosystems, bringing AI coaching to runners regardless of which app they use today.
Built With
- amazon-web-services
- next.js14
- nextauth.jsv5
- react
- react-email-ai-amazon-nova-2-lite-via-amazon-bedrock-(aws)-database-supabase-(postgres)-authentication-nextauth.js-v5
- recharts
- resend
- strava-oauth-2.0-apis-strava-api-(activity-data
- stravaapi
- stravaoauth
- supabase(postgres)
- tailwind-css
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.