OLAV

Olav

The model proposes.Code decides.You approve.

An open-source training coach on Telegram. Every morning it reads your Garmin and your calendar and adapts your week on its own. It only ships a workout to your watch after the rules pass and you say approve. First athlete: me. Half marathon in December, 8 hours a week, Forerunner 965.

  • Hermes Agent
  • wearable-mcp
  • Garmin
  • Composio
  • Parallel
  • Built with Cline

Before it says a word, it reads you

Synced 94 min ago
Data is fresh enough to plan on.
Garmin · Forerunner 965
Sleep 86 · 8 h 22
Best night of the week.
Garmin · Last night
Readiness 51
Moderate, after yesterday's ride.
Garmin · Today
4 h 00 ride · hard
Aerobic effect high enough to count as hard.
Garmin · Sunday
Last week 9 h 26
Over the 8-hour weekly cap.
Olav · vs your weekly cap
Travel week
Tue events 6–9 pm · Wed pickleball 3–5 pm · Thu red-eye 11:59 pm
Google Calendar · via Composio

Sleep says go. Readiness says easy.

It plans around your life

Plan my week.

wearable-mcp get_training_context · reconcile  ·  Composio Google Calendar
propose_plan → ok · 5 h 10 of 8 h · 0 hard · plan_id 3457dd270f

Olav Monday is rest after Sunday's 4-hour ride. Sleep is 86 but readiness is 51, so the whole week stays easy and I'm not making up the missed 4×1600. Tuesday is mornings only, strength goes after pickleball, and you run Thursday before the red-eye. You're staying at the Hilton Parc 55, so strength is in the hotel gym.
  • Tue 06:00Easy run · treadmill40′ Z2
  • Tue 06:45Strength A · hotel gym40′
  • Wed 06:00Easy bike · stationary40′ Z2
  • Wed 18:00Strength B · hotel gym40′
  • Thu 06:30Easy run before the flight45′ Z2
  • Sat 07:00Recovery run35′ Z2
  • Sun 07:00Conservative long run70′ Z2
Reply approve to send it to your watch and calendar.

It knows when to say no

Make it harder. Intervals Tuesday, tempo Wednesday, a 3-hour ride Saturday.

OlavI get it, you want more. But a 3-hour ride is past your 2 h 30 limit, and two hard days back to back is how injuries start. Your body is still recovering from Sunday. Let's do intervals Thursday and 2 h 30 on Saturday.

One word ships it

approve

wearable-mcp apply_plan("3457dd270f") → create → schedule → push to device
Composio 7 × create event "[Coach] …"

OlavSent. Tuesday's run is on your Forerunner with warm-up, Z2 and cool-down steps, and all seven sessions are on your calendar around your events and the flight.

Planned vs actual feeds the next plan

  • Mon 13Run 24′Done
  • Mon 13Ride 2 h 14Unplanned
  • Tue 14Swim 32′Done
  • Wed 15Run plannedMissed
  • Wed 15Swim plannedMissed
  • Wed 15Strength 30′ · Ride 1 h 47Unplanned
  • Sun 18Ride 4 h 00 · hardUnplanned

9 h 26 last week, over the cap. That's why this week is easy.

Open, end to end

Telegram

Where you talk to your coach. A daily cron check-in plus anything you ask.

Hermes Agent

Open-source agent runtime in Docker. The training-coach skill runs the five-step loop and the approval rule.

wearable-mcp

Ours, in Python. Garmin reads and writes, guardrails.py enforcing the limits you confirmed at onboarding, and two-phase writes: propose_plan stores a hashed plan, apply_plan executes exactly that plan. Brand-agnostic provider interface.

Composio

Google Calendar: free slots, events, and the [Coach] entries.

Parallel

Web search when the plan needs the outside world, like a hotel gym on a trip.

github.com/enzojunq/Olav Built with Cline
  1. TUE 06:00Run 40′
  2. TUE 06:45Strength
  3. WED 06:00Bike 40′
  4. WED 18:00Strength
  5. THU 06:30Run 45′
  6. SAT 07:00Run 35′
  7. SUN 07:00Run 70′
Limits enforced in code

Over your
limits

  1. Sat · 3-hour rideYour longest session is 2 h 30.
  2. Tue + Wed · both hardNever two hard days in a row.

Limits you set once. No prompt talks Olav out of them.