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.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Panel de coach y plan semanal de cada atleta. Next.js en Vercel, login con Google (Firebase Auth), datos en Firestore y Firebase Admin SDK en rutas API privadas. Proyecto hecho desde cero con Claude Code. El diseño respeta el de la web original del plan de Claudia (rosa, celeste, amarillo y menta; Oswald y Nunito Sans; tarjetas por día con check y cuenta regresiva), con tres temas a elegir: rosa, azul y oscuro.
/ es el sitio informativo de Training Please (propósito, cómo funciona, piloto y "Crece con nosotros"). Contenido editable en src/lib/site.ts (testimonios, pasos y pilares); estilos en src/app/site.css./entrar es el login de la app. Las páginas privadas redirigen ahí si no hay sesión.pilotRequests/{correo} vía /api/solicitudes. El coach la ve en Panel coach › Solicitudes del piloto: Aprobar crea el alta (igual que el alta manual) y Descartar la cierra./api/bootstrap comprueba el correo (lista ADMIN_EMAILS o alta del coach), crea users/{uid} y pone el rol como custom claim. Un correo no registrado no entra.LEGAL_VERSION en src/lib/legal.ts). Puede revocarlo desde Ajustes › Privacidad; desde ese momento el coach deja de ver sus registros.| Ruta | Qué guarda | Quién escribe |
|---|---|---|
users/{uid} | rol, nombre, correo, tema, carrera objetivo, perfil, consentimiento vigente | servidor al crear; el atleta edita tema, perfil, carrera y consentimiento |
allowlist/{correo} | altas manuales pendientes o usadas | solo servidor |
pilotRequests/{correo} | solicitudes del sitio: datos de contacto, nivel, carrera, autorización y estado (pending, approved, dismissed) | solo servidor; el coach lee |
investorContacts/{id} | mensajes de "Crece con nosotros" | solo servidor; el coach lee |
consents/{uid}/events/{id} | evidencia: versión, finalidades, fecha, navegador, otorgado o revocado | atleta (solo agrega) |
plans/{uid}/weeks/{semanaISO} | título, fase, objetivo, notas, marca de IA | coach |
plans/{uid}/weeks/{semanaISO}/sessions/{id} | fecha, deporte, título, duración, distancia, RPE objetivo, instrucciones | coach |
logs/{uid}/entries/{sessionId} | realizada, RPE real, comentario | atleta |
"No realizada" no se guarda: se calcula al leer. Una sesión sin marcar queda pendiente hasta el final del día siguiente y luego no realizada. El cumplimiento cuenta solo las sesiones principales (las extra y el descanso no).
trainingplease, ya creado): activar Authentication › Google y Firestore (región sugerida southamerica-east1 o us-east1). En Authentication › Settings › Authorized domains, agregar el dominio de Vercel.npx firebase deploy --only firestore:rules --project <id>..env.example):
NEXT_PUBLIC_FIREBASE_*: opcionales; la configuración web del proyecto trainingplease ya está en src/lib/firebase.ts.FIREBASE_SERVICE_ACCOUNT: el JSON de la cuenta de servicio (Configuración del proyecto › Cuentas de servicio › Generar nueva clave), pegado en una línea. Nunca subirlo al repo.ADMIN_EMAILS: correos de Google de la coach y admins, separados por coma.npm run seed:plan -- [email protected] data/claudia-plan.json y la cuenta de servicio.data/claudia-plan.json (semanas y sesiones) y data/claudia-meta.json (fases, mes a mes, "lo mejor de mí y mi reto", niveles de meta) guardan el contenido de la web estática de Claudia, que se retiró del repo. Sirven para cargar su plan y para construir más adelante las vistas "La meta" y "Lo mejor de mí".
npm install
npm run lint # tipos
npm test # fechas, estados y cumplimiento
npm run test:rules # reglas de Firestore en el emulador (requiere Java)
cp .env.emulators.example .env.local && npm run dev:emu # app completa con emuladores
Con emuladores, en la consola del navegador __tpSignIn('[email protected]') inicia sesión sin la ventana de Google.
En la ficha de cada atleta (panel coach) hay dos paneles:
scripts/seed-plan.mjs ([{ id, week, sessions }]) o un archivo exportado. Muestra una vista previa y lo guarda por /api/admin/plan con el mismo comportamiento que el script: fusiona la semana y crea o reemplaza sus sesiones, sin borrar otras.This is the beginning of the README. Read the rest at the original. Read the full README ↗