Problème
Je voulais un outil simple pour enchaîner mes séances sans réfléchir : savoir quel exercice faire, combien de répétitions, quand faire une pause, puis garder une trace de ma régularité. Les applications existantes imposent presque toutes un compte, un abonnement ou une synchronisation cloud, et proposent des programmes génériques plutôt que les miens. J’ai donc conçu une app à usage personnel, installée par APK, dont toutes les données restent sur le téléphone.
Choix techniques
- Zéro backend, SQLite local avec Drizzle. Une seule personne, un seul appareil : un serveur n’apporterait que de la maintenance. Drizzle me donne un schéma typé en TypeScript et des requêtes vérifiées à la compilation. Les médias (images, vidéos) sont stockés comme fichiers, et seul leur chemin est enregistré en base pour que celle-ci reste légère.
- Migration de Flutter vers React Native / Expo. J’avais démarré en Flutter/Drift pour découvrir une nouvelle stack, mais la configuration du SDK Android en local sous Windows me faisait perdre plus de temps que le code lui-même. Je suis passé à Expo, sur une stack TypeScript que je maîtrise, avec EAS Build pour générer l’APK sans SDK Android local.
- Simplicité assumée. Pas de couche repository : les écrans appellent directement des DAO limités
à leurs besoins réels. Pas de librairie de state management, seulement
useState/useRef. Chaque abstraction doit être justifiée par un besoin concret. - Historique figé des séances. À la fin d’une séance, la séquence réellement jouée est copiée dans une table dédiée (avec le nom du programme dénormalisé). Modifier ou supprimer un programme plus tard ne fausse donc pas l’historique.
Difficulté rencontrée
Je voulais afficher les démonstrations vidéo des exercices sur le fond sombre de l’app, en m’appuyant
sur des vidéos libres de droits tournées sur fond blanc. J’ai d’abord essayé les GIF : les fichiers
étaient lourds et la lecture saccadée. En comparant les formats, j’ai vu qu’un MP4 court en boucle
(H.264/H.265), lu avec expo-video, est beaucoup plus léger grâce à la compression inter-images. J’ai
ensuite tenté la transparence vidéo (HEVC avec canal alpha, WebM VP9), mais le rendu sur Android
n’était pas fiable. La solution retenue consiste à détourer le fond blanc par chroma key avec ffmpeg
(en lot), puis à exporter directement sur la couleur de fond de l’app (#0a0e12). La vidéo s’intègre
alors visuellement, sans dépendre du support de l’alpha.
Résultat
L’app couvre aujourd’hui tout le parcours :
- bibliothèque d’exercices (répétitions ou durée, image ou vidéo) ;
- création de programmes (étapes, séries, tours, pauses) ;
- lecteur de séance avec compte à rebours pour les étapes chronométrées, chrono global masqué pendant l’effort et affiché seulement à la fin ;
- calendrier de régularité avec le détail de chaque séance ;
- profil avec IMC calculé à la volée et historique du poids.


