--- title: 'Lancement du site TrainUs' date: 2026-06-14 description: 'Présentation du projet TrainUs : une application de suivi fitness locale, bilingue et installable, entièrement dans le navigateur.' --- > This article is available in English: [Launching the TrainUs website]({{< relref "2026-06-14-lancement.en.md" >}}) Aujourd'hui, je publie le site de documentation de **TrainUs**, une application de suivi fitness que je développe depuis quelques mois. ## C'est quoi TrainUs ? TrainUs est une application web progressive (PWA) qui tourne **entièrement dans le navigateur**. Il n'y a pas de serveur, pas de compte à créer, pas de données envoyées quelque part. Tout est stocké localement sur votre appareil grâce à SQLite WASM et l'API OPFS (Origin Private File System). L'application est **bilingue** (français et anglais) et **installable** sur votre téléphone ou votre ordinateur comme une vraie application native — avec support hors-ligne complet. ## Pourquoi ce projet ? La plupart des applications de fitness que j'ai essayées partagent les mêmes limitations : elles exigent un compte, envoient vos données dans le cloud, et disparaissent si l'abonnement s'arrête ou si le service ferme. Et quand on veut partager un entraînement ou exporter ses données vers un autre outil, c'est souvent impossible — ou verrouillé derrière un format propriétaire. Je voulais quelque chose de simple, qui fonctionne sans connexion, qui ne collecte rien, et qui permette de partager librement ses données. Alors je l'ai construit. > **L'IA a écrit presque tout le code.** J'ai les compétences techniques pour mener ce type de projet, mais pas le temps — et pour être transparent : la grande majorité du code source a été écrite par des assistants IA, pas par moi. J'ai dirigé l'architecture, relu chaque modification, guidé l'implémentation et pris toutes les décisions. Mais si l'auteur, c'est celui qui tape les lignes, ce crédit revient en grande partie à l'IA. L'émergence de ces outils a complètement changé l'équation : ce qui m'aurait pris des mois de soirées et de week-ends est devenu réalisable, et j'ai pu tester et comparer pas mal de modèles et d'assistants au fil du développement — ce qui est en soi un bénéfice. ## Ce que l'application permet de faire TrainUs couvre l'ensemble du cycle d'entraînement : - **Exercices** — définir chaque mouvement avec description, reps par défaut, poids, gestion des côtés (gauche/droite), liens image et vidéo. - **Combos** — regrouper des exercices en circuits avec minuteur intégré (EMOM, AMRAP, TABATA ou superset classique). - **Séances** — composer des séances à partir d'exercices et de combos, dans l'ordre que vous voulez. - **Collections** — organiser plusieurs séances en programme hebdomadaire ou en phase d'entraînement. - **Mode exécution** — suivre une séance en temps réel : minuteurs, reps réelles, poids utilisé, côté gauche/droite, audio. - **Statistiques** — graphiques de fréquence, de volume et de progression par exercice. - **Import / export** — partager exercices et séances entre appareils ou avec d'autres utilisateurs via des fichiers JSON. - **Sauvegarde** — télécharger la base SQLite directement ; l'application rappelle régulièrement de faire une sauvegarde. ## Choix techniques | Aspect | Choix | Raison | | --------------- | -------------------------- | ------------------------------------------------- | | Framework UI | Vue 3 (Composition API) | Légèreté, réactivité déclarative, bon écosystème | | Base de données | SQLite WASM + OPFS | Persistance locale performante, pas de serveur | | PWA | vite-plugin-pwa + Workbox | Mise en cache complète, installation native | | i18n | i18next + i18next-vue | Changement de langue instantané sans rechargement | | Graphiques | Chart.js 4 + vue-chartjs 5 | Légère, bien documentée, intégration Vue simple | | Build | Vite 7 | Build rapide, bonne gestion des assets WASM | Le choix de **SQLite WASM avec le VFS `opfs-sahpool`** mérite une mention particulière. C'est la configuration la plus performante disponible dans un navigateur : I/O synchrone via `FileSystemSyncAccessHandle`, sans avoir besoin des en-têtes COOP/COEP. Le seul compromis est qu'il faut exécuter SQLite dans un Web Worker (les APIs OPFS synchrones ne sont pas disponibles sur le thread principal) — ce qui est de toute façon une bonne pratique pour ne pas bloquer l'interface. ## Et maintenant ? L'application est en **préversion** — fonctionnelle et assez complète — mais pas encore publiée. La prochaine étape est de la déployer publiquement et de finaliser la documentation en français. Le code source est disponible sur GitHub sous licence GNU AGPL v3 (lien en pied de page). --- _Ce billet inaugure le blog du projet. Les prochains articles parleront des décisions techniques, des fonctionnalités à venir et des retours d'usage._