Vous avez déjà cherché une appli de sport qui coche vraiment toutes les cases ? Course à pied pour un vrai débutant qui n’en a jamais fait, rando avec un vrai tracé GPX, séances de renforcement à la maison, et même le suivi cardio pendant une session de VR Fitness dans le casque ? Moi, j’ai cherché. Et je n’ai jamais trouvé d’appli qui fait tout ça sans compromis, sans compte à créer partout, et sans mes données qui finissent sur je-ne-sais-quel serveur. Alors j’ai fait ce que je fais souvent ici : je l’ai construite moi-même.
Dans cet article, je vous raconte pourquoi j’ai développé EgaPulse, comment elle a été faite, ce qu’elle fait aujourd’hui, et — parce que ce serait malhonnête de vous montrer que le résultat fini — les galères bien réelles rencontrées en cours de route, jusqu’au vrai test terrain qui a manqué de tout faire dérailler.
Pourquoi construire ma propre appli de sport ?
Le point de départ, c’est une remise en forme après une période difficile : cela fait maintenant deux ans et demi que je vis avec les suites d’un problème de thyroïde pris en charge trop tard, avec à la clé un traitement bien plus lourd que la normale — son lot de prises de sang à répétition, de médicaments à ajuster, de blocages respiratoires, et une prise de poids importante liée au traitement lui-même. À un moment, faire dix mètres à pied relevait de l’épreuve, avec un cardio qui ne descendait jamais sous les 125 pulsations par minute, même au repos. Retrouver un corps qui répond, petit à petit, c’est le vrai point de départ de ce projet. Et à partir de là, plusieurs objectifs sportifs très différents se sont ajoutés, sans qu’aucune appli du marché ne les couvre tous correctement en même temps.
- Je voulais me mettre à la course à pied façon couch-to-5k — un sport que je n’avais jamais pratiqué avant, en partant vraiment de zéro : alternance marche/course sur des durées configurables, avec un vrai suivi de progression.
- Je fais régulièrement de la rando, avec un tracé prévu à l’avance et l’envie de le suivre précisément sur le terrain.
- Je fais aussi du renforcement musculaire à la maison (squats, gainage…), sans forcément vouloir sortir le téléphone à chaque série.
- Et je pratique le fitness en VR (Beat Saber, Les Mills XR) — si si, c’est bien du sport, il suffit de voir le cardio grimper pendant une séance pour s’en convaincre — un cas d’usage que quasiment aucune appli de sport classique ne gère, puisqu’on a un casque sur les yeux, pas le téléphone en main.
Ajoutez à ça mon habitude de tout auto-héberger (mon NAS Synology tourne déjà pas mal de services chez moi) et mon peu d’enthousiasme à l’idée de nourrir encore une base de données proprement commerciale — Strava, Garmin Connect, Nike Run Club, et consorts — avec mon rythme cardiaque et mes trajets GPS, et la conclusion s’est imposée d’elle-même : autant construire l’outil qui me correspond vraiment, avec mon propre site pour héberger l’historique.
Comment elle a été faite
EgaPulse est une application Android native, développée en Kotlin avec Jetpack Compose pour l’interface, accompagnée d’un module Wear OS pour la montre connectée (une TicWatch Pro 5 chez moi, appairée via l’appli Mobvoi) et d’un site compagnon en PHP/MySQL, pulse.egamaker.be, qui reçoit et archive l’historique des séances.
💡 Petite précision technique pour les curieux : une partie non négligeable du code a été écrite avec l’aide d’un assistant IA (Claude, d’Anthropic), en particulier pour tout l’aller-retour entre le code de l’appli et les vrais tests sur le terrain qui ont suivi. Je garde évidemment la main sur les choix de fonctionnement et je teste tout moi-même en conditions réelles — mais je trouve ça honnête de le mentionner plutôt que de laisser croire que chaque ligne est sortie de mes dix doigts.
Le développement s’est fait module par module, dans l’ordre où j’en avais besoin : d’abord la course à pied (le cœur du réacteur), puis la rando, le renforcement à la maison, et enfin le fitness en VR. Chaque module a son propre écran, sa propre logique de suivi, mais tous partagent le même socle : localisation GPS, cardio via la montre, et synchronisation vers le site.

Les quatre activités, en détail
Avant d’entrer dans le détail de chacune, voici un aperçu rapide de ce que couvre EgaPulse aujourd’hui :
| Activité | GPS | Cardio | Depuis la montre | Export GPX |
|---|---|---|---|---|
| 🏃 Course à pied | ✅ | ✅ | ✅ (démarrage autonome) | ✅ |
| 🥾 Rando | ✅ | ✅ | Affichage seul | ✅ |
| 🏋️ Home training | ❌ | ✅ | Affichage seul | ❌ |
| 🕶️ VR Fitness | ❌ | ✅ | Affichage seul | ❌ |
🏃 Course à pied
C’est le module fondateur, pensé pour l’apprentissage progressif de la course façon couch-to-5k : on définit des phases de marche et de course, chacune avec sa propre durée, et l’appli alterne automatiquement entre les deux avec un retour audio pour ne pas avoir à regarder l’écran en permanence.
Particularité par rapport aux autres modules : la séance peut être lancée, mise en pause et arrêtée directement depuis la montre, sans sortir le téléphone de la poche. La montre tourne de façon autonome — GPS et cardio y sont suivis en direct, même si le téléphone reste loin — et remonte les données en fin de séance.
À la fin, un résumé complet : distance, allure, temps par phase, fréquence cardiaque, et export du tracé réellement parcouru en GPX.


🥾 Rando
Le module rando fonctionne différemment : c’est le téléphone qui pilote tout (la montre affiche l’état et relaie le cardio, mais ne commande rien). L’idée, inspirée d’applis comme Komoot, Visorando ou AllTrails, est de préparer sa sortie à l’avance.
Concrètement : on importe un fichier GPX (le tracé prévu), avec la possibilité de l’inverser si l’export d’origine était dans le mauvais sens. Une fois sur place, l’appli affiche ce tracé de référence sur une carte OpenStreetMap, superposé au tracé réellement parcouru en direct, avec sa propre couleur pour bien distinguer les deux. La position actuelle s’affiche avec une flèche orientée par la boussole du téléphone, et un bouton permet de recentrer la carte sur soi à tout moment — pratique quand on a fait glisser la carte pour regarder la suite du parcours.
En fin de rando : distance, dénivelé (montée/descente), profil altimétrique, statistiques cardio, et export GPX du tracé réellement suivi.


🏋️ Home training
Pensé pour les séances de renforcement à la maison — squats, gainage, et autres exercices au poids du corps — organisées en séries. Pas de GPS ici évidemment, mais le suivi cardio continue de tourner via la montre, ce qui permet de voir l’intensité réelle de l’effort et pas seulement le nombre de répétitions.

🕶️ VR Fitness
Le module qui a motivé pas mal des choix d’architecture de l’appli : impossible d’avoir le téléphone en main pendant une session de Beat Saber ou Les Mills XR, casque sur les yeux. Ici, la montre fait donc tout le travail de collecte pendant la séance — cardio en continu — et remonte les données au téléphone une fois la session terminée, sans aucune action de ma part pendant que je transpire dans le salon.

Le rôle central de la montre
La montre Wear OS n’est pas un simple accessoire dans EgaPulse : selon le module, son rôle change complètement.
- Course à pied : elle est autonome — elle démarre, suit et arrête la séance elle-même, GPS et cardio inclus.
- Rando, home training, VR Fitness : elle relaie le cardio en direct au téléphone (ou l’enregistre pour la VR), sans prendre de décision elle-même.
Un détail qui m’a pris du temps à bien régler : par défaut, Android coupe pas mal de choses en arrière-plan pour économiser la batterie — y compris la collecte cardio, si on éteint l’écran de la montre ou qu’on lance autre chose dessus. La solution a été de faire tourner chaque suivi (course, home training, VR, et maintenant rando) dans un service dédié au premier plan, avec une petite notification permanente — la même technique que celle qu’utilisent les applis de musique pour continuer à jouer une fois l’écran éteint. Un petit cœur apparaît même sur l’écran de la montre pendant que le cardio est actif, pour être sûr en un coup d’œil que le suivi tourne bien.

Le site compagnon, pulse.egamaker.be
Chaque séance terminée est automatiquement synchronisée vers pulse.egamaker.be, mon site PHP/MySQL fait maison. C’est là que je retrouve tout l’historique, avec des fiches détaillées par séance (carte, profil altimétrique, graphique cardio, répartition par zones), sans dépendre d’un service tiers pour garder une trace de mes progrès.



Les galères rencontrées (la partie honnête de l’article)
Construire une appli, c’est une chose. La faire tenir face à la réalité — un système Android qui tue les process en arrière-plan, une politique d’usage qu’on n’avait pas anticipée, un vrai test terrain sur plusieurs heures — c’en est une autre. Voici les principales galères, dans l’ordre où elles se sont posées.
Le suivi qui s’arrête tout seul en arrière-plan
Le premier vrai problème : dès que l’écran de la montre s’éteignait ou qu’on lançait une autre appli dessus (typiquement, la musique), le suivi cardio s’arrêtait purement et simplement, parce qu’il était lié au cycle de vie de l’écran affiché. La correction a été le principe du service dédié au premier plan évoqué plus haut, appliqué à chaque module l’un après l’autre.
Le tracé prévu qui disparaît après une coupure — et le vrai test terrain
Celle-là m’a fait un peu peur. Pour se prémunir d’un plantage ou d’un système Android trop agressif qui tuerait l’appli en pleine rando, une sauvegarde de secours du tracé en cours est écrite régulièrement sur le disque, pas seulement en mémoire. Au redémarrage de l’appli, si une sauvegarde interrompue traîne encore, un écran propose de reprendre le suivi là où il s’était arrêté.
Le jour du vrai test terrain, tout s’est bien passé… jusqu’à un long arrêt en pleine rando. L’appli, tuée en arrière-plan par le système, a bien proposé de reprendre le suivi comme prévu — mais le tracé GPX prévu à l’avance, lui, avait disparu de la carte. La sauvegarde de secours retrouvait bien les points déjà parcourus et le cardio, mais pas le tracé de référence à suivre : il n’avait jamais été inclus dans cette sauvegarde. Résultat : pas d’autre choix que d’arrêter la séance et d’en repartir une nouvelle depuis zéro pour terminer la rando.
Conséquence : je me suis retrouvé avec deux séances enregistrées ce jour-là au lieu d’une seule, qu’il a fallu fusionner après coup pour que mon historique reflète la réalité — une seule et même rando, pas deux tronçons séparés par une coupure technique. Et côté code, le tracé prévu fait désormais partie de la sauvegarde de secours, pour que ce problème ne se reproduise plus.
La carte qui revenait sans arrêt sur ma position
Autre souci découvert pendant ce même test : impossible d’explorer librement la carte pendant la rando. Dès que je la faisais glisser pour jeter un œil à la suite du parcours, elle revenait de force sur ma position dans la seconde qui suivait — la carte se recentrait automatiquement à chaque nouveau point GPS reçu, sans jamais laisser le temps de regarder ailleurs. Le recentrage automatique ne se fait désormais qu’une seule fois, en tout début de séance ; un bouton dédié permet de revenir sur sa position à la demande, plutôt que de la subir en continu.
La limite (légitime) d’OpenStreetMap sur le téléchargement en masse
J’avais ajouté une fonction pour télécharger à l’avance les tuiles de carte d’un itinéraire, histoire de pouvoir suivre le tracé même sans réseau une fois sur place. Sauf qu’au premier vrai essai, l’appli plantait systématiquement au lancement du téléchargement. En creusant, la cause n’était pas un bug côté appli : le serveur de tuiles gratuit d’OpenStreetMap interdit explicitement le téléchargement en masse automatisé, pour éviter de surcharger leur infrastructure — une politique tout à fait légitime, à laquelle je n’avais simplement pas pensé en concevant la fonction. Plutôt que de contourner la limite d’un service gratuit et partagé par toute la communauté, j’ai préféré retirer purement et simplement cette fonctionnalité. C’est exactement le genre de compromis qu’implique un outil fait maison face aux applis du commerce — j’y reviens juste après.
Ce que les applis du commerce font mieux
Soyons honnête : construire son propre outil, c’est gratifiant, mais ça ne remplace pas des années de développement par des équipes entières. Des applis comme Strava, Garmin Connect ou Komoot ont des atouts qu’EgaPulse n’aura jamais, et ce serait malhonnête de prétendre le contraire.
- Le volet social : segments comparés à des milliers d’autres pratiquants, défis communautaires, abonnés qui commentent vos sorties — hors de portée d’un outil perso.
- Des cartes hors-ligne dignes de ce nom, via des fournisseurs de tuiles payants et sous licence, là où EgaPulse se heurte à la limite du serveur gratuit OpenStreetMap.
- Une fiabilité éprouvée sur des dizaines de modèles de montres et de téléphones différents, quand moi je teste avant tout sur ma propre TicWatch et mon propre Samsung.
- Des fonctions avancées comme les plans d’entraînement personnalisés ou l’intégration météo, construites par des équipes dédiées.
Ce qu’EgaPulse apporte en échange, c’est une appli taillée exactement pour mes usages (le VR Fitness y compris, qu’aucune des applis citées ne gère), mes données qui restent chez moi, et la liberté de corriger un bug le soir même où je le découvre plutôt que d’attendre une mise à jour. Un compromis assumé, pas une prétention à faire mieux que les pros sur tous les tableaux.
Et la suite ?
Deux pistes déjà identifiées pour la suite de la course à pied : un mode « course complète » sans alternance marche/course pour les moments où le couch-to-5k sera terminé, et la possibilité d’allonger progressivement mon parcours de référence habituel au fur et à mesure que ma forme progresse.
