BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
As de Québec M17 AAA — App d'entraîneur Application web pour gérer l'équipe : semaine actuelle avec vue du jour (alignement, horaire, meetings individuels, pratique), résultats, calendrier, rapport quotidien cumulé, réunions individuelles/collectives (avec rappels), cumulatif des combinaisons de trios/paires les plus efficaces, et export d'une image du jour à caster sur un téléviseur. 1. Installer Node.js (si pas déjà fait) Télécharge la version LTS sur https://nodejs.org (ou brew install node sur Mac). 2. Créer le projet Supabase (base de données + authentification)查看完整 README ↗
Application web pour gérer l'équipe : semaine actuelle avec vue du jour (alignement, horaire, meetings individuels, pratique), résultats, calendrier, rapport quotidien cumulé, réunions individuelles/collectives (avec rappels), cumulatif des combinaisons de trios/paires les plus efficaces, et export d'une image du jour à caster sur un téléviseur.
Télécharge la version LTS sur https://nodejs.org (ou brew install node sur Mac).
Project URL → NEXT_PUBLIC_SUPABASE_URLanon public key → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role key → SUPABASE_SERVICE_ROLE_KEY (garde-le secret, jamais dans le frontend)supabase/schema.sql et exécute-le.
Ça crée toutes les tables (entraîneurs, joueurs, horaire, alignements, matchs, réunions, rapports
quotidiens, gabarit de pratique) avec des politiques RLS qui exigent d'être connecté.
3bis. (Optionnel) Colle ensuite le contenu de supabase/seed_calendar.sql
et exécute-le — ça pré-remplit l'horaire et les matchs de la saison 2026-2027 à partir du Google
Sheets de planification. Vérifie d'abord le récapitulatif envoyé en chat (matchs à l'écriture
ambiguë comme « M17 AAA : 15h30 Saguenay » n'ont pas été ajoutés automatiquement aux Résultats —
ajoute-les toi-même si besoin). Les noms d'adversaires viennent des abréviations du Sheets (SSF,
COR, TR, SAG, etc.) — renomme-les dans l'onglet Résultats si tu veux les noms complets.L'app n'a pas d'inscription publique (les données concernent des mineurs). Le tout premier compte doit être créé manuellement :
insert into coach_profiles (id, full_name, role)
values ('COLLE-L-UUID-ICI', 'Ton nom', 'head_coach');
cp .env.local.example .env.local
Remplis .env.local avec :
CRON_SECRET : une chaîne aléatoire longue (ex: générée avec openssl rand -hex 32) — protège
l'appel automatique hebdomadaire des rappels.RESEND_API_KEY, et configure COACH_EMAIL (déjà pré-rempli avec ton
courriel) et REMINDER_FROM_EMAIL.cd as-quebec-m17
npm install
npm run dev
Ouvre http://localhost:3000 — tu devrais voir l'écran de connexion (courriel + mot de passe), puis la semaine actuelle.
.env.local (mêmes noms).https://ton-app.vercel.app/definir-mot-de-passe) sinon les liens
d'invitation par courriel ne fonctionneront pas en production.vercel.json configure déjà une tâche automatique (Vercel Cron) qui
appelle /api/reminders chaque lundi à 9h (heure de l'Est) pour vérifier les joueurs sans
rencontre individuelle depuis 3 semaines et t'envoyer un courriel. Vercel ajoute automatiquement
l'en-tête Authorization: Bearer $CRON_SECRET à cet appel — assure-toi que CRON_SECRET est
bien défini dans les variables d'environnement Vercel./jour/[date]) :
/jour/[date]/tv) : affichage plein écran noir/or à ouvrir sur un navigateur de
téléviseur, avec un bouton pour exporter la page en image PNG./jour/[date]/alignement) : reproduit la structure des feuilles
d'alignement du club (deux groupes de couleur « Gris »/« Jaune », lignes de joueurs). Glisse un
chandail (ou tape-le puis tape la case cible — fonctionne aussi au toucher) pour l'assigner.
Bouton « Répliquer le dernier alignement » pour copier la dernière composition utilisée.auth.role() = 'authenticated' — un utilisateur non connecté ne peut rien lire ni écrire.service_role key) et
n'ajoute pas d'inscription publique à l'app.