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.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Application personnelle d'entraînement adaptatif. Elle n'est pas un carnet de musculation générique : elle est conçue pour un utilisateur, et son objectif est d'adapter chaque séance à son état du jour, à la salle où il se trouve, au matériel réellement disponible sur place et à son historique de performances. • Next.js 16 (App Router, React 19). Le middleware suit la nouvelle convention src/proxy.ts. • Postgres via Supabase, Drizzle ORM (src/db/schema.ts). • Supabase Auth (`@sREADME 전문 보기 ↗
Application personnelle d'entraînement adaptatif. Elle n'est pas un carnet de musculation générique : elle est conçue pour un utilisateur, et son objectif est d'adapter chaque séance à son état du jour, à la salle où il se trouve, au matériel réellement disponible sur place et à son historique de performances.
| Notion | Ce que ça veut dire |
|---|---|
| Pilier | Patron de mouvement : P1_poussee, P2_tirage, P3_squat, P4_hanche, puis epaules, bras_biceps, bras_triceps, jambes_iso, core. Axe structurant du programme. |
| Profil de tension | stretch / mi_range / contract — région de la courbe force-longueur où l'exercice charge le muscle. Critère de substitution. |
| Catégorie de rôle | pilier / substitut / accessoire. Détermine ce qu'on protège et ce qu'on coupe quand le volume doit baisser. |
| Feu biologique | État de la journée : vert / orange / rouge. Un feu du jour (sommeil, énergie, courbatures) et un feu de tendance (évolution du 1RM des piliers sur 3 séances). |
| Exercise instance | Un exercice sur une machine précise d'une salle précise, avec sa convention de charge et ses incréments réels. C'est la pièce maîtresse du modèle. |
| Catalogue | 120 exercices curatés depuis la bibliothèque workout-guide, avec muscles principaux et secondaires, type de matériel et illustrations. Voir src/lib/referentiels/catalogue.ts. |
| Séance du jour | La prescription du jour, entre le template (prévu il y a des semaines) et le log (ce qui a été fait) : exercices résolus vers la salle du jour, séries ajustées et charge suggérée. Table session_plan_items. |
| SOS | Quatre secours en séance : machine occupée, douleur, chute d'énergie, temps dépassé. |
src/proxy.ts.src/db/schema.ts).@supabase/ssr).npm install
cp .env.example .env.local # puis renseigner les variables ci-dessous
npm run seed # données de développement
npm run dev
| Variable | Rôle |
|---|---|
DATABASE_URL | Connexion Postgres directe (Drizzle). |
NEXT_PUBLIC_SUPABASE_URL | Projet Supabase. |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Clé publique Supabase. |
SEED_USER_ID | UUID du compte à seeder. Doit correspondre à un utilisateur Supabase réel. |
SEED_USER_EMAIL | Email du compte seedé (défaut sacha@local). |
CRON_SECRET | Protège les routes /api/cron/*. |
OPENCODE_API_KEY | Clé OpenCode Go du Coach. Sans clé, l'application fonctionne et seul le Coach répond 503. |
LLM_CHAINE_COURANTE | Chaîne des modèles du chat, par défaut opencode:deepseek-v4.1-flash. |
LLM_CHAINE_LOURDE | Chaîne des analyses structurantes, par défaut opencode:deepseek-v4.1-flash. |
| Commande | Effet |
|---|---|
npm run dev | Serveur de développement. |
npm run build | Build de production. |
npm run lint | ESLint. Doit rester à zéro erreur. |
npm run seed | Destructif : TRUNCATE puis réinsertion des données de développement. |
npx tsc --noEmit | Vérification de types. Doit rester à zéro erreur. |
Les migrations vivent dans src/db/migrations/ et sont générées par
npx drizzle-kit generate.
0000_baseline.sql décrit le schéma tel qu'il existait déjà — il a été produit
après coup, à partir d'un schéma appliqué en drizzle-kit push. Sur une base déjà
en service, ne le rejoue pas : marque-le comme appliqué. Sur une base vierge, il crée
tout le schéma.
Les politiques RLS sont dans supabase/migrations/ et s'appliquent à la main dans
l'éditeur SQL de Supabase.
Attention : l'application se connecte à Postgres avec
DATABASE_URL, un rôle qui contourne la RLS. La sécurité repose donc sur le filtrageuserIdexplicite dans chaque route API, pas sur les politiques. Toute nouvelle route doit scoper ses requêtes.
Trois vocabulaires font autorité et doivent être utilisés partout :
| Référentiel | Fichier | Rôle |
|---|---|---|
| Muscles | src/lib/referentiels/muscles.ts | 15 muscles canoniques. versMuscle() convertit toute valeur externe ; elle renvoie null sur l'inconnu. |
| Équipements | src/lib/referentiels/equipements.ts | 7 types de matériel requis. |
| Catalogue | src/lib/referentiels/catalogue.ts | 120 exercices, avec pilier et profil de tension attribués à la main. |
Les illustrations sont dans public/exercices/<slug>/frame-<n>.svg, copiées verbatim
depuis la bibliothèque source. Elles sont monochromes : le composant
IllustrationExercice les applique en masque CSS, ce qui les fait suivre la couleur
du thème sans qu'aucun fichier ne soit modifié.
Le système de design vit dans src/app/globals.css, section « Carnet ».
La règle qui tient tout : la couleur ne décore jamais. Tout ce qui n'est pas
un signal est encre sur papier. Cinq couleurs seulement sont autorisées —
--gain, --perte, et les trois feux du jour.
Deux conséquences pour le code :
+2,5), une
régression aussi (−5,0), une stagnation un =. Le composant <Delta> s'en charge.−0,4 kg est un
gain. D'où sensInverse sur <Delta>.Deux composants concentrent les décisions de couleur, là où quatre mappings
coexistaient auparavant (dont deux dans le même fichier) : <Delta> et <Feu>.
Tout chiffre susceptible de changer porte la classe .chiffres
(tabular-nums) : sans elle, la charge saute latéralement à chaque appui
sur +/− et on rate le bouton.
Une exception à la règle : les séries de graphique. Un histogramme empilé à
huit piliers a besoin de huit marques distinguables — c'est le seul endroit où la
couleur catégorise. Les tokens --serie-1 à --serie-8 sont dans un ordre fixe,
jamais recyclé, et les deux palettes (claire et sombre) ont été validées : bande
de clarté, plancher de chroma, séparation daltonisme sur chaque paire voisine
(ΔE ≥ 10) et contraste ≥ 3:1 sur le fond. La palette sombre est choisie, pas
une inversion de la claire.
Thème clair / sombre. L'application forçait class="dark" sur <html> : le
thème clair était inatteignable. next-themes, installé mais inutilisé, pilote
désormais le réglage, et les tokens répondent à .dark comme à
prefers-color-scheme.
Le Coach passe par OpenCode Zen. GLM‑5.3 Flash traite les échanges courants ;
GLM‑5.3 est préféré pour les arbitrages et constructions plus exigeants. Les deux
utilisent la même boucle d'outils et la même clé OPENCODE_API_KEY.
Le coach n'est pas un simple prompt : il dispose de sept outils
(src/lib/coach/tools.ts) qui lui donnent accès à l'historique d'un exercice, au
résumé hebdomadaire, aux substituts disponibles et à la suggestion de charge. La
boucle d'exécution tourne côté serveur, sur quatre tours au maximum.
Sur les offres gratuites : elles réutilisent généralement les échanges pour entraîner les modèles. Les données envoyées ici sont des noms d'exercices, des charges et un état de forme — à savoir avant de brancher une clé.
L'application est en cours de reprise. Ce qui ne fonctionne pas aujourd'hui :
precalc-session — écrit un contenu fixe en base, ce n'est pas une
génération réelle.docs/phase-1.md à docs/phase-5.md sont une archive d'intention : elles décrivent
ce qui était prévu à chaque phase, pas ce qui fonctionne. Le code est la source de vérité.
Les illustrations d'exercices proviennent de workout-guide par Bryl Lim, d'après Everkinetic, sous licence CC BY-SA 4.0.