E. Leveque
ENThème : système
← Retour au parcours (P3 · km 58,2)

Oltre

Une application personnelle pour organiser vie pro et vie perso dans un agenda complet : sport, dépenses, tâches, rendez-vous.

Parcours dans Oltre : dépenses, tâches, repas. Données factices.

Le problème

Mon quotidien était éparpillé : les sorties dans Garmin, les dépenses d'un côté, les tâches et les rendez-vous de l'autre. Je voulais tout voir au même endroit, avec mes activités sportives dedans.

Les décisions

Garmin dans un service séparé

Compromis : Garmin n'offre pas d'accès officiel : j'utilise une bibliothèque non officielle, que j'ai isolée du backend. Un service de plus à lancer et à protéger, mais une dépendance fragile qui ne contamine pas le reste. Et quand Garmin refuse la connexion, l'erreur réelle remonte jusqu'à l'écran au lieu d'un message vague.

Gemini plutôt qu'Anthropic pour le coach IA

Compromis : Gemini propose un tier gratuit, pas l'API Anthropic : pour un projet personnel, le choix était vite fait. Contrepartie : le coach reste muet sans clé, et le nom du modèle a déjà demandé une correction.

Verrouillage de connexion par e-mail et par IP

Compromis : Un inconnu ne peut pas bloquer mon compte depuis sa propre machine. Contrepartie : le compteur vit en mémoire, il repart à zéro au redémarrage et ne se partage pas entre plusieurs instances.

L'architecture

Architecture d'OltreLe frontend Angular appelle le backend Spring Boot en REST avec un jeton JWT. Le backend lit MySQL, appelle le service garmin-mcp avec un jeton interne, qui interroge l'API Garmin Connect non officielle (le point fragile). Le backend appelle aussi Gemini pour le coach, de façon optionnelle.Frontend Angularnginx, SPABackend Spring Bootsport, dépenses, tâches,rendez-vous, repas, coachSécurité stateless (JWT)MySQL 8.4schéma Flywaygarmin-mcpREST, PythonGarminConnectnon officielleGeminicoach, optionnelREST + JWTJPAjeton interneclé APIArchitecture d'OltreFrontend Angular, puis backend Spring Boot, qui lit MySQL, appelle garmin-mcp puis Garmin Connect (API non officielle, point fragile), et appelle Gemini de façon optionnelle.Frontend Angularnginx, SPAREST + JWTBackend Spring Bootsport, dépenses, tâches,rendez-vous, repas, coachJPAMySQL 8.4Flywayjetongarmin-mcpRESTGarmin ConnectAPI non officielleclé APIGeminicoach, optionnel
Un trait plein : appel systématique. Pointillé : optionnel. Orange : la dépendance sur laquelle je n'ai aucune prise.

Le mur du 60e km

Le plus dur n'était pas le code : c'était de synthétiser mon idée et de lui donner forme. Passer d'un besoin flou, organiser ma vie pro et perso, à un produit concret.

Ce que j'en retire

Dépendre d'une API non officielle, c'est prévoir dès le départ où elle casse, et le dire clairement à l'utilisateur.