The 30 km program wasn’t downloaded from a training site — I built it in conversation with an AI (Claude), and the same AI stays in the loop as a kind of coach. A small summary of how the pieces fit.

Building the program

We started from data, not a template: my Strava history (volume patterns, the fast-flat runs that reliably preceded flare-ups), my injury history (calf / quad / plantar), heart-rate numbers, life constraints (young kids, volatile sleep). From that came the principles — injury-first, 100 % Zone 2, one variable at a time, deload every third week — and the 18-week structure, leaning on La Clinique du Coureur’s methodology. The program is completion-driven: the October 24 date slides before I break.

It’s not set-and-forget. After every run the data gets pulled and analyzed — zone discipline, aerobic decoupling, how the foot responded, morning HRV and resting HR — and the program absorbs what happened. Every amendment lands, dated, in the changelog.

The plumbing

Everything lives in org-mode plain text — the master plan document, the run log, the wellness log. Two Python scripts do the boring work:

  • one syncs the plan to intervals.icu as structured workouts and pulls back completed runs + daily wellness (resting HR, HRV, sleep, training load),
  • one creates the strength sessions as native Garmin workouts and schedules them on the watch — animations, rep counting, rest timers.

So the loop is: plan in org → workouts appear on the watch → I run → Garmin syncs to intervals.icu → the script pulls the numbers back into org → the AI reads them and we adjust. My only jobs are running and answering “how did the foot feel this morning?”

Both scripts — and the generator behind this blog’s data pages — are downloadable here, scrubbed of anything personal, and bundled with the prompt template and the Claude skills in a public repo: running-plan-kit.

This blog, same idea

The blog is Hugo + ox-hugo (posts are written in org too), self-hosted on a small VPS behind nginx — deploying is a two-second rsync. The run-by-run log, the calendar, the live week table and the per-run posts are generated from the same org data by another small script — I annotate, the pipeline publishes. The AI built that pipeline as well, DNS records to CSS.

Nothing here is revolutionary — it’s a text file, two APIs and a feedback loop. But it means the plan, the execution and the story all come from one source of truth, and none of it depends on my discipline to keep a spreadsheet up to date.

Build your own

The whole methodology is encoded in a reusable intake prompt: fill in your own history and constraints, paste it into an AI conversation, and it walks the same process we did — principles, guardrails, week-by-week table, the lot.