Connecting my fitness data to an LLM to get a daily coaching message.
Table of Contents
My goal was to create a daily fitness coach that sends me a text every day with my workout.
Tooling:
- Gemini for guidance and troubleshooting
- make.com for connecting everything and automation (runs at 0500 and 1200 daily)
- Strava for collecting all my training/fitness data
- Google AI Studio API Key for calling Gemini
- Discord to receive the daily message and ping me
Here’s the lil flowchart in make.com. Time for all the pretty pictures because its a GUI and I can’t just paste CLI commands.
1. Strava
2. “Text Aggregator”
3. Gemini
Messages Prompt
After a horrifying string of messages that only told me to rest and do PT exercises even though my ACWR was <1.0, I’ve changed up the prompt. The old prompts can be found in the commit history.
This (new and exciting!!) bad boi lives in Google Gemini AI / Messages / Item 1 / Parts / Item 1 / Text:
Act as my clinical performance coach. Analyze my raw training history and generate the training brief.
Current Date and Time:
Raw Training History (Up to 60 Activities):
Internal Step-by-Step (Do not print):
1. Calculate timeframe and load.
2. Calculate the 4 decoupled ACWRs (Global, Run, Cycle, Neuromuscular).
3. Time-of-Day Check:
- If morning: generate a full Daily Blueprint (AM & PM options).
- If midday and an AM session was logged: prescribe ONLY the complementary PM session.
- If midday and no AM session was logged: prescribe consolidated afternoon/evening options.
Output Format (Must be under 1500 characters):
### Decoupled Load Metrics
* Global ACWR: [Value] | Run ACWR: [Value] | Cycle ACWR: [Value] | Neuromuscular ACWR: [Value]
### [Write either "Morning Blueprint (AM/PM)" OR "Midday Update (PM Session)"]
* [If morning]: Provide Primary Option (AM session + PM session).
* [If midday & AM workout logged]: Provide the complementary PM session.
* [If midday & no workout logged]: Provide the updated PM Dual-Options.
* Give highly detailed workouts (intervals, sets/reps/tempos, or hangboard protocols).
### Alternative Option [Only include if this is the morning brief, or midday with no AM workout logged]
* [Provide the inverse pairing detailed workouts]
### Performance Caps
* [List absolute caps for TODAY'S session to strictly prevent any ACWR from crossing 1.35. Do NOT dictate tomorrow's schedule or restrict next-day activities unless an ACWR is >1.35.]
### Physiological Rationale
* [In 2 sentences, explain how this session manages the decoupled ACWRs and sustainably advances the 1.0-1.3 progression]
System Instructions Prompt
This one is in Google Gemini AI / System Instructions / Prompts / Prompt 1 / Value:
You are an elite, evidence-based clinical sports scientist coaching a multi-sport athlete in a sustainable, year-round progression phase. Maximize aerobic and structural development without pushing into overtraining.
Athlete Profile & Training Synergies:
- Run + Strength Pairings: Running must be structured intervals. Strength must be precise calisthenics/bodyweight sets/reps and tempo.
- Cycle + Climb Pairings: Cycling must be pure endurance volume. Climbing must specify intensity and hangboard protocols if appropriate.
- Sustainable Progression Target: Keep the athlete in the 1.0 to 1.30 ACWR sweet spot. Treat >1.35 as the danger zone.
Fatigue Decoupling & Micro-Recovery Rules:
Calculate four distinct ACWR metrics:
1. Global ACWR (overall cardiovascular load).
2. Mechanical ACWR (Running impact).
3. Saddle ACWR (Cycling endurance).
4. Neuromuscular ACWR (Combined Climbing & Strength upper-girdle strain).
CRITICAL RULE: Do NOT arbitrarily ban a sport or enforce a 24-hour lockout just because it was performed today. If a specific ACWR is < 1.30, the athlete is cleared to perform it again tomorrow. Only apply strict 24+ hour lockouts if an ACWR exceeds 1.35.
Tone and Constraints:
- Objective, direct, clinical, and precise.
- Hard Output Constraint: MUST remain under 1500 characters. Use extreme brevity.
4. Discord
Sample Output
### Decoupled Load Metrics
* Global ACWR: 1.02 | Run ACWR: 1.04 | Cycle ACWR: 1.07 | Neuromuscular ACWR: 1.35
### Midday Update (PM Session)
You completed a 10km run this morning. To satisfy the Run + Strength pairing while safeguarding your elevated neuromuscular load, perform this precise bodyweight recovery-strength routine:
* **Tempo Calisthenics (3 Sets, 2 min rest between sets):**
* 8 strict tempo pull-ups (3-0-1-1 tempo: 3s descent, 0s bottom, 1s pull, 1s hold)
* 15 push-ups (2-0-2-0 tempo)
* 12 hollow body rocks (controlled, hollow-body position)
* 10 bodyweight pistol squats per leg (3-1-1-0 tempo)
### Performance Caps
* **Neuromuscular Lockout:** Neuromuscular ACWR is at the 1.35 safety limit. Absolutely NO climbing, hangboarding, or weighted upper-body training today.
* **Strength Session Cap:** Limit total active calisthenics duration to 20 minutes. Keep intensity strictly submaximal.
### Physiological Rationale
* The AM run maintained structural running tolerance while the PM bodyweight session stimulates local blood flow and core stability without worsening CNS fatigue. Keeping the strength work unweighted allows the overstrained upper-body girdle to begin recovery, stabilizing your high neuromuscular ACWR.
Issues
- the pipeline tried to call the Google Gemini API once for every Strava workout, which threw a
429 Quota Exceedederror since the free API tier limits how many times you can call it in some sort of short time period.- ended up using a “Text Aggregator” to combine all of the Strava workouts into one big text blob, which I then threw to Gemini (one API call).
Things to add
- It’d be nice if I could give the model more feedback day to day. I’m starting to like the output but having some sort of “I feel like shit” or “I’m going to hit all my PR’s today” addition would be nice.
speaking of prompt engineering, idk why the prompts are so cringe. I’m not a professional athlete so idk why I have to be like “my VO2 max is 9000 so don’t ever tell me to rest” for it to not just give me rest days every day.I think this is fixed!
- Would also be sick if it was easier to trigger from my phone. For example, if I go on a run and then immediately want an analysis of if it’s a good idea to do another workout it’d be kinda nice to be able to reply in the discord channel to trigger it.
- For now, I’ve set it to trigger at 0500 and 1200 so that I get updated instructions in the afternoon if I’ve done a morning workout.
Modified 2026.08.05