OpenTrailPaper
Open-source bike computer firmware for the LilyGO T5S3 4.7" E-Paper PRO, with offline maps, GPX routes, FIT recording and Bluetooth sensors.
Un plan hecho para ti y alguien que lo mira cada semana. Piloto abierto en Lima.
Translation pending
Sports & fitnessTypeScript · CSSGitHub @ikolab-makerOnlineOwner 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
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.Cada domingo a las 4 pm de Lima (cron de Vercel, vercel.json) el agente principal analiza la semana que cierra de cada atleta y arma la siguiente. Si el Guardián no encuentra problemas, la carga sola en el plan del atleta; si encuentra, queda pendiente en la ficha del atleta (sección "Agente principal") para que el coach la apruebe, la edite o la descarte. Antes de las 4 pm el coach puede dejar una nota para la próxima semana de cada atleta, y el atleta sus avisos (viajes, días sin entrenar); el agente lee ambos. El coach también puede pedir la semana en el momento con "Generar la semana siguiente ahora", que siempre queda para aprobar.
src/lib/agent/metrics.ts (Análisis): cumplimiento, km, RPE y alertas, en código.src/lib/agent/methodology.ts (Ciencia): la metodología vigente que sigue el modelo (versión 2: principios publicados de Daniels y reglas de seguridad con estudios; detalle en 09-metodologia-agente-ciencia.md).src/lib/agent/fitness.ts (Ciencia): índice de forma, equivalencias y ritmos por atleta con las ecuaciones de Daniels y Gilbert, a partir del tiempo de referencia que el coach guarda en la ficha (sección "Forma actual").src/lib/agent/headCoach.ts: llama a la Claude API (salida JSON con esquema) y corrige hasta 3 veces si el Guardián encuentra problemas.src/lib/agent/guardrails.ts (Guardián): reglas duras sobre la propuesta: tope de +20 % de km por semana (+30 % sobre hace dos), ninguna salida más de 10 % sobre la más larga de 30 días, fondo hasta 150 min, topes por tipo de sesión, días duros, taper, días suaves tras una carrera, descarga, dolor, enfermedad y formato. En un ajuste puntual las reglas de estructura quedan como avisos.proposals/{uid}/weeks/{semana}, athleteMemory/{uid} (ficha, tiempo de referencia, meta de tiempo e historial) y agentRuns/{id} (registro con tokens y costo). Solo servidor; las reglas de Firestore ya los niegan al cliente.ANTHROPIC_API_KEY (clave de la Claude API) y CRON_SECRET (cualquier texto largo; Vercel lo envía al cron).RESEND_API_KEY: sin ella no se envía ningún correo y todo lo demás funciona igual (/api/health muestra email).EMAIL_FROM (opcional, por defecto Training Please <[email protected]>): remitente de un dominio verificado en Resend.RESEND_SEGMENT_BOLETIN y RESEND_SEGMENT_ATLETAS (opcionales): ids de segmentos de Resend./#boletin) guarda newsletter/{correo} con su consentimiento y suma el contacto al segmento del boletín. El boletín y los comunicados se escriben y envían desde Broadcasts en Resend, que agrega la baja./coach/blog (posts en posts/{slug}, con versión en inglés opcional y marca «Solo atletas»). "Enviar a los atletas" manda un correo a cada atleta con consentimiento, en su idioma; "Enviar al boletín" crea y envía un broadcast al segmento RESEND_SEGMENT_BOLETIN (solo posts públicos). Los me gusta pasan por /api/blog/like: uno por cuenta o por navegador, y como máximo 5 anónimos por post desde una misma conexión (la IP se guarda solo como hash con LIKE_SALT, o CRON_SECRET si no existe).08-arquitectura-agentes-ia.md en los documentos del proyecto.