- Inscrit
- 2026-09-29
- Premier commit
- 2026-09-30
Séance
App · entraînement · installable, hors ligne
Un manuel d’entraînement qui marche hors ligne et se souvient de tout, sur l’appareil seul.
Un programme au poids du corps dessiné comme un manuel de gymnastique, une planche par mouvement. Il guide une séance de trente minutes, tient un journal et trace les courbes de progrès — installable, hors ligne, avec des rappels, et chaque chiffre gardé sur l’appareil.
- TypeScript
- React
- PWA
- Workbox
- IndexedDB
- Vitest
- Inscrit
- 2026-09-29Livré
- Premier commit
- 2026-09-30Séance, a bodyweight training PWA drawn as a gymnastics manual
- Commits
- 4sur main, lus le 2026-10-02
- Couverture
- 14 %lignes exécutées par les tests unitaires de l’app, lues le 2026-10-02
- Paquets maison
- 10 sur 11installés depuis npm
Ce qui est livré
- Installable et entièrement hors ligne : un service worker Workbox écrit à la main met toute l’app en cache, et chaque route répond réseau coupé, séance en cours comprise.
- Des rappels sans serveur : une horloge dans l’app, les Notification Triggers là où ils existent, et le Periodic Background Sync qui lit le planning dans IndexedDB depuis le worker — et l’écran de réglages dit franchement ce que ce navigateur sait faire.
- Des graphiques de progression dessinés à la main en SVG et HTML : régularité comptée en semaines, volume par semaine, tour de taille et poids jamais sur un même axe, chacun parcourable par un input range natif invisible et doublé d’un tableau.
- Chaque chiffre reste sur l’appareil : une sauvegarde JSON le transporte ailleurs, et un profil spécimen généré à graine montre les graphiques pleins sans jamais toucher aux données du lecteur.
- Trente-sept figures animées dessinées à partir d’articulations, pas de tracés : l’interpolation est polaire et chaînée depuis la hanche, pour qu’aucun os ne s’étire en plein mouvement.
Comment ça marche
zéro serveur, tout en cache sur l’appareil
Tel que le compilateur le lit
Mis en page comme dans un éditeur : une ligne ondulée est un build qui refuse, une ligne violette est ce que le compilateur déduit tout seul.
export const isReminderOwed = ({ lastSessionDay, lastShownDay, now, schedule, today }) => schedule.isEnabled && schedule.days.some((day) => day === now.getDay()) && now.getTime() >= reminderOn(now, schedule.time).getTime() && lastShownDay !== today && lastSessionDay !== today
Historique
Tiré du git log, abrégé, et laissé dans sa langue : 4 commits sur 4, du plus récent au plus ancien.
- Deploy the public demo from CI on every push to main
- Deploy the public demo to Cloudflare Pages from a clean clone
- Deploy the private build to Netlify on push to main, drop Cloudflare Pages
- Séance, a bodyweight training PWA drawn as a gymnastics manualPremier commit
Installe
10 des 11 paquets maison, depuis npm, jusqu’aux réglages du compilateur et du linter.
- @adrienlcp/react-routerLe fournisseur de routeur que prend chaque app.0.1.1
- @adrienlcp/i18nTraduit, et sait dès la compilation ce que chaque message attend.0.3.0
- @adrienlcp/theme-preferenceGarde le thème choisi sans flash, jusqu’à la barre du téléphone.0.3.0
- @adrienlcp/browserCopie dans le presse-papiers même en HTTP simple, où l’API Clipboard n’existe pas.0.1.1
- @adrienlcp/reactLes utilitaires de contexte dont part chaque app React.0.3.0
- @adrienlcp/stylesLe reset et les styles partagés dont part chaque projet.0.5.0
- @adrienlcp/resultDit si quelque chose a marché, sans exception et sans null.0.1.0
- @adrienlcp/safe-storageÔte les exceptions de localStorage et renvoie un Result à la place.0.1.0
- @adrienlcp/tsconfigLes réglages du compilateur qu’étend chaque projet.0.1.0
- @adrienlcp/biome-configLes réglages du linter et du formateur qu’étend chaque projet.0.1.0