Teissier YannisDéveloppeur · IA & fullstackLyon · sept. 2026
Retour à l'indexProjet 03 sur 06
03Étude de cas — 2026

AltiTrak
l'analytique du trail, avec le dénivelé en premier

Des activités GPX et Strava traduites en vitesse verticale, segments de montée, ratio course/marche, charge d'entraînement et un score « toi vs la course ». FastAPI, PostGIS et TimescaleDB, React.

Rôle
Produit, backend, modèle de données, frontend, CI
Stack
FastAPI · PostgreSQL · PostGIS · TimescaleDB · React · Playwright
Statut
Livrée jusqu'à la V2, puis archivée ; une réécriture en microservices a suivi

Le problème

Les applications de course sont faites pour la route : allure au kilomètre, distance hebdomadaire. En trail, l'allure ne veut rien dire et c'est la montée qui fait la séance. Je voulais une application qui lise une activité comme un traileur : combien j'ai grimpé, à quelle vitesse, quelle part j'ai marché, à quel point la descente a cogné, et qui réponde à une question avant une course : suis-je prêt pour celle-là ?

Ce que j'ai construit

Un monorepo avec un front React et un back FastAPI en quatre couches, où le domaine est fait de fonctions pures sans aucun import externe : indicateurs de qualité des données, segmentation des montées, vitesse verticale en montée et en descente, temps par 100 m, part course/marche, un indice de « descente destructrice ». Les points de trace vivent dans une hypertable TimescaleDB avec une colonne géométrique PostGIS, une seule instance pour les séries temporelles et la géographie, décision consignée dans un ADR, préférée à une seconde base.

Par-dessus : une charge d'entraînement qui pondère chaque séance par son dénivelé (D+ et D− ne comptent pas pareil), un double graphique de gestion de la performance (global avec le vélo en entraînement croisé, trail seul sans), des alertes hebdomadaires, et le score « toi vs la course » : distance et dénivelé d'une course face aux quatre dernières semaines de volume, de grimpe, de sorties longues et d'exposition à la descente, rendus en préparation de 0 à 100 avec trois forces, trois manques et trois actions. Un serveur MCP tourne dans le même processus pour qu'un assistant interroge les données. La CI enchaîne lint, audits, tests unitaires et environ deux cents tests Playwright de bout en bout, smoke à chaque déploiement et suite complète chaque nuit.

fig. 1 — pas de capture, un croquis
Fig. 1 — d'un fichier de trace à un score de préparation · et les montées dont l'app se soucie vraiment01

Ce que j'ai appris

Que la première version du modèle de charge surestimait la fatigue de deux à quatre fois (fenêtre de chauffe absente, facteur terrain appliqué à la mauvaise entrée), et que se comparer à un outil établi est la façon de s'en apercevoir. Qu'une application doit fonctionner avec seulement un type, une date et une durée, et considérer tout le reste comme optionnel. Et qu'un monolithe aux fonctions de domaine pures est un bon endroit où être ; la réécriture en microservices qui a suivi m'a appris le prix de l'alternative.

“La semaine d'un traileur se mesure en mètres grimpés, pas en minutes par kilomètre.”
Suivant — 04Un serveur Minecraft moddé, en production