Elio Darras

Technical note · Published on 25 September 2026

My coach sent me an Excel file, so I built an app

A running programme in an old file, an iOS app that reads it, an energy score computed without AI, and an AI that only narrates.

I have a coach for my baseball preparation and for the races ahead. He sent me my programme in an old Excel file, painful to follow day to day. Rather than copy it out, I built an iOS app that reads it directly, and that brings together everything I was noting elsewhere, today's energy, running, the gym.

The import reads the file as .xlsx, .csv or .pdf and pulls out the repetitions, the recoveries buried in an instruction, the pace and heart-rate ranges. Contradictions in the file are flagged, never silently fixed. The programme is a queue, not a calendar. The next session is the first one not done, and doing Monday on a Tuesday is normal.

Three rules explain most of my choices. The model never computes, because a score produced by an AI is neither reproducible nor testable. Everything numeric is computed in Dart, and the model narrates it. The AI runs on the phone, with Apple Foundation Models on iOS 26, so nothing leaves, not even a piece of health data. And there is always a deterministic fallback, no screen depends on an inference to render.

The energy score starts from 40 points and adds signed contributions, sleep, heart-rate variability, resting rate, load, declared stress, each compared to the person's own 30-day baseline. The free-question coach has non-negotiable guardrails. Never a diagnosis, never the name of a condition, no fasting, no hard effort on low recovery.

Sending to the Apple Watch goes through WorkoutKit. "8 × 1 min at 4'08"–4'27"/km, 1 min recovery" becomes a native interval workout, with no watchOS app to write. After the session, the report re-reads HealthKit and compares planned to actual, above all time spent per zone, before any call to the model.

698 tests written in French, describing a product guarantee rather than an implementation. TestFlight distribution, with over-the-air hotfixes never installed silently, because on a health app you need to know when the code that interprets your data changes.