BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Suivi d’entraînement vélo personnel
Translation pending
Sports & fitnessTypeScript · CSSGitHub @TVSGit-devOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Interface mobile personnelle posée au-dessus d’intervals.icu : un plan d’entraînement de deux semaines qui se corrige tout seul, sans ouvrir le site web. Construite comme une PWA installable — une app web qui s’ajoute à l’écran d’accueil d’Android et se comporte comme une app native. Voir CLAUDE.md pour le contexte, les règles métier et les contraintes, et docs/section-5-regles-adaptation.md pour la spécification qui fait foi.Read the full README ↗
Interface mobile personnelle posée au-dessus d’intervals.icu : un plan d’entraînement de deux semaines qui se corrige tout seul, sans ouvrir le site web. Construite comme une PWA installable — une app web qui s’ajoute à l’écran d’accueil d’Android et se comporte comme une app native.
Voir CLAUDE.md pour le contexte, les règles métier et les contraintes, et
docs/section-5-regles-adaptation.md pour la spécification qui fait foi.
L’app ne fait que lire. Garmin verse les activités dans intervals.icu, intervals.icu calcule la charge, la forme et la fatigue, Makigawa lit tout cela et en déduit ce qu’il y a à faire les quatorze jours qui viennent. Elle n’écrit rien dans le calendrier — la seule exception est la suppression d’un événement, derrière un appui long de deux secondes.
Ce qu’elle sait faire :
Local-first : ce que l’athlète choisit — sa marque de trajet, un refus, une décharge acceptée — reste dans le stockage du navigateur, sur le téléphone. Pas de compte, pas de serveur, pas de synchronisation. Corollaire à garder en tête : effacer les données du site depuis Chrome efface ces choix ; les activités et le calendrier, eux, vivent dans intervals.icu et se relisent.
La page porte une balise noindex : elle n’est pas indexée par les moteurs de
recherche. Un robots.txt ne conviendrait pas ici, il n’est lu qu’à la racine
du domaine, qui dépend d’un autre dépôt.
Saisir ensuite l’identifiant athlète et la clé API intervals.icu, puis Tester la connexion. Les identifiants restent dans le stockage local du téléphone et ne sont envoyés qu’à intervals.icu.
Pour vérifier le mode hors-ligne : activer le mode avion, puis relancer l’app depuis l’écran d’accueil. Elle doit démarrer normalement.
npm install
npm run dev # serveur local, service worker actif
npm run build # vérification des types + build de production dans dist/
npm run preview # sert dist/ comme en production
npm run typecheck # types seuls
npm run icons # régénère les icônes PNG depuis scripts/generate-icons.mjs
npm run dev écoute sur toutes les interfaces (--host) : depuis un téléphone
sur le même réseau Wi-Fi, l’URL est http://<ip-de-la-machine>:5173/Makigawa/.
Attention, en HTTP simple le navigateur bloque le GPS et le service worker —
seul le site déployé en HTTPS permet de tout tester.
Chaque push sur main ou claude/mobile-execution-m4j7mk déclenche
.github/workflows/deploy.yml, qui construit le site et le publie sur GitHub
Pages.
Réglage à faire une seule fois : dans Settings → Pages du dépôt, choisir Source : GitHub Actions. Tant que ce n’est pas fait, le workflow échoue à l’étape « Configurer Pages » — le jeton d’un workflow n’a pas le droit de créer le site Pages lui-même, seul le propriétaire du dépôt peut l’activer.
Deux contraintes propres aux dépôts privés :
Si aucune des deux ne convient, les alternatives qui déploient un dépôt privé
sans le rendre public sont Vercel, Netlify et Cloudflare Pages (niveaux
gratuits) : il suffit alors de remplacer ce workflow et de construire avec
VITE_BASE=/.
L’horodatage du build est affiché en haut de l’app : il permet de confirmer d’un coup d’œil que le téléphone a bien reçu la dernière version. Quand une nouvelle version est déployée, l’app affiche une bannière « Mettre à jour » plutôt que de se recharger toute seule — utile pour ne pas perdre l’écran en pleine sortie.
Le site est servi sous /Makigawa/, d’où base: '/Makigawa/' dans
vite.config.ts. Pour un domaine personnalisé ou un déploiement à la racine,
construire avec VITE_BASE=/ npm run build.
.github/workflows/deploy.yml Build + déploiement GitHub Pages
docs/ La spécification des règles, qui fait foi
scripts/generate-icons.mjs Génération des icônes PNG (sans dépendance)
public/ Icônes, favicon — copiés tels quels
src/api/ Lecture d’intervals.icu (et la seule suppression)
src/rules/ Le moteur : l’échelle de charge, la question du
E.2, la reprise, la décharge, la vitesse de montée
src/workouts/ Les familles de séances, leur composition, les
niveaux par zone, la routine de souplesse
src/storage/ Ce que le téléphone retient, et rien de plus
src/components/ L’interface
vite.config.ts Build + manifest de la PWA
Le moteur est une fonction pure : il ne connaît pas le réseau, ne touche à rien, et produit des propositions. C’est ce qui le rend testable — 250 tests environ, dont plusieurs gardent des décisions de fond plutôt que du code (aucune intensité en watts, aucune charge inventée, aucune écriture depuis l’interface).