Darrao Sport
Suivi d'entraînement et d'énergie sur iOS
Captures de l'appLa séance sur l'Apple Watch
4'46"/km
Écran par écran

01Ton énergie : le score du jour, la séance prévue, les records du mois et l'agenda.

02Le bilan du matin, rédigé sur l'appareil par Apple Intelligence. Aucune donnée ne sort du téléphone.

03Le détail du calcul : sommeil, qualité, variabilité cardiaque, fréquence au repos, charge d'activité.

04Semaine 7 sur 10 : une séance double, seuil et neuromusculaire, avec ses allures cibles.

05L'avancement du programme et les raccourcis : séance libre, historique, modifier la semaine, mes fichiers.

06Les outils : créer une course envoyée sur la montre, routines, séances de salle, tapis de course.

07L'onboarding : ce que l'app lit dans Santé, en lecture seule.
Rôle
Projet personnel
Une application iOS qui calcule un score d'énergie quotidien depuis Apple HealthKit et envoie des séances structurées à l'Apple Watch. Le coach IA tourne sur l'appareil : aucune donnée de santé ne quitte le téléphone.
Ce qu'il y a dedans
- Score d'énergie quotidien calculé depuis Apple HealthKit.
- Séances structurées envoyées à l'Apple Watch via WorkoutKit.
- Live Activities pendant l'entraînement.
- Capteurs Bluetooth Polar H10 et FTMS.
- Coach IA embarqué sur l'appareil, aucune donnée de santé ne quitte le téléphone.
- Flutter, Swift natif, backend NestJS.
En détail
01Le principe
Une app iOS personnelle qui réunit trois carnets habituellement séparés : l'énergie du jour, lue dans Santé ; le programme de course, celui que le coach écrit dans un Excel ; et la salle, avec ses séries, ses charges et ses records. Tout est calculé sur le téléphone, sans compte et sans serveur, avec une IA embarquée qui commente les chiffres sans jamais les produire.
Trois règles expliquent la plupart des choix. Le modèle ne calcule jamais : un score produit par un modèle n'est ni reproductible ni testable, donc tout ce qui est chiffré est calculé en Dart et le modèle le raconte. L'IA tourne sur le téléphone, avec Apple Foundation Models sur iOS 26 : zéro octet ajouté, zéro coût, hors ligne, aucune donnée de santé ne sort. Et il y a toujours un repli déterministe : aucun écran ne dépend d'un appel réseau ou d'une inférence pour s'afficher.
148 fichiers Dart, environ 49 300 lignes, 10 fichiers Swift, 93 fichiers de test et 698 tests. 187 commits depuis le 21 juillet, version 1.14.5.
02Énergie
La chaîne : HealthKit, agrégation de la nuit et de la veille, calcul du score, puis texte. Le score part d'un socle de 40 points, plus des contributions signées : durée de sommeil, qualité, variabilité cardiaque, fréquence au repos, charge d'activité, stress déclaré. Borné de 1 à 100.
Tout est relatif à la personne : chaque métrique est comparée à sa ligne de base sur 30 jours, et c'est l'écart en pourcentage qui pèse. La tendance a un seuil de 4 points pour qu'un bruit de mesure ne fasse pas osciller la flèche.
Autour : un cache du dernier bilan, le détail par métrique avec accès direct au coach sur ce sujet, des écrans vides qui disent pourquoi ils sont vides, et un coach énergie à questions libres avec des garde-fous non négociables : jamais de diagnostic, jamais de nom de pathologie, pas de jeûne, pas d'effort intense sur récupération basse.
03Course
L'import lit le fichier du coach en .xlsx, .csv ou .pdf et en tire les répétitions, les récupérations noyées dans une consigne, les plages d'allure et de fréquence cardiaque, l'onglet muscu rattaché au bon jour. Les contradictions du fichier sont signalées, jamais corrigées en silence, et réimporter conserve l'avancement.
Le programme est une file, pas un calendrier : la prochaine séance est la première non faite. Faire le lundi un mardi est normal. On peut recaler des semaines entières ou déplacer une seule séance.
L'envoi à l'Apple Watch passe par WorkoutKit : « 8 × 1 min à 4'08"–4'27"/km, récup 1 min » devient un entraînement à intervalles natif exécuté par l'app Exercice, sans app watchOS à écrire. Un créateur de course compose une séance à la main, avec ce que la montre vise à chaque étape.
Le bilan d'après-séance relit HealthKit et confronte le réalisé au prévu : durée, distance, allure, fréquence moyenne et max, et surtout le temps par zone. Le verdict est calculé avant tout appel au modèle. S'y ajoutent le kilomètre par kilomètre, le découpage bloc par bloc, la comparaison avec les séances du même type, et l'export en images ou en JSON et CSV.
04Salle, capteurs, agenda
Trois sources de séances de salle : les cycles du fichier du coach, les séances créées à la main, et la séance libre. Des routines rangées en dossiers, un écran de séance avec la série d'avant sous les yeux, un pavé numérique maison, et une coche qui lance le chrono de récupération. Ce chrono survit au changement d'écran, à la fermeture de l'app et au verrouillage : notification et Live Activity dans la Dynamic Island, avec boutons exécutés par App Intents.
Rien ne se perd : chaque geste va dans un brouillon, chaque série cochée dans l'historique à l'instant. Le carnet suit l'historique par exercice, le 1RM estimé, les records et le calcul des disques à mettre sur la barre.
Capteurs : ceinture Polar H10 lue en Bluetooth, fréquence et intervalles RR, avec sa mémoire interne pour la natation ; tapis de course en FTMS pour la distance et l'inclinaison réelles ; écriture dans Santé avec une liste fermée de sports ; export TCX vers Strava.
En option : un module nutrition avec des besoins calculés d'après ce que la montre a vu, un agenda synchronisé avec le calendrier de l'iPhone, et le suivi du corps. Tout vit sur l'appareil, exportable et restaurable en un fichier, effaçable depuis le profil.
05Natif, design, livraison
Neuf canaux natifs Swift : entraînement, IA, Live Activity, rappels, calendrier, Polar, tapis, ceinture, fichiers. Côté IA, la génération est guidée par structure déclarée : le JSON est valide par construction. Cinq usages, tous sous la même règle, et sur un iPhone sans Apple Intelligence tout fonctionne encore.
Un design system unique : fond quasi noir, verre dépoli, dégradé violet vers bleu. Jamais d'ombre sur un élément animé, pas d'animation en boucle, l'état sélectionné jamais porté par la couleur seule, reduced motion respecté. Des orbes à neuf états remplacent les indicateurs de chargement, et une orbe compagnon suit l'utilisateur, respire, et glisse un mot dans une bulle.
698 tests dits en français, qui décrivent une garantie produit plutôt qu'une implémentation. CI à chaque push, reproductible en local. Distribution TestFlight avec correctifs Dart en OTA via Shorebird, jamais installés en silence : sur une app santé, on doit savoir quand le code qui interprète les données change.