OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證App de gestion del Infantil B - Cultural y Deportiva Leonesa
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Infantil B — Cultural y Deportiva Leonesa App de gestión para el cuerpo técnico del Infantil B (temporada 2026-2027): asistencia a entrenamientos, convocatorias y alineaciones de partidos, valoraciones y estadísticas. Sustituye al Excel actual. Uso principal desde iPhone/iPad — diseño mobile-first. Ver CLAUDE.md para el contexto completo de producto, modelo de datos y fases de desarrollo.檢視完整 README ↗
App de gestión para el cuerpo técnico del Infantil B (temporada 2026-2027): asistencia a entrenamientos, convocatorias y alineaciones de partidos, valoraciones y estadísticas. Sustituye al Excel actual. Uso principal desde iPhone/iPad — diseño mobile-first.
Ver CLAUDE.md para el contexto completo de producto, modelo de datos y fases de desarrollo.
Estado actual: Fase 1 — Scaffold. Autenticación, flujo de solicitud/aprobación de acceso, esquema de base de datos con RLS, y navegación base con las 5 secciones vacías. La lógica de cada módulo se irá añadiendo en fases sucesivas.
npm install
Crea un proyecto nuevo en supabase.com.
En Project Settings → API, copia la Project URL, la anon public key y la service_role key.
Copia .env.example a .env.local y rellena esas tres variables, más NEXT_PUBLIC_SITE_URL=http://localhost:3000:
cp .env.example .env.local
Los archivos están en supabase/migrations/, en orden:
0001_schema.sql — todas las tablas.0002_rls.sql — Row Level Security (activado en todas las tablas) y sus políticas.0003_seed_estados.sql — estados iniciales (SI, IA, VACACIONES, LESIÓN, AMISTOSO).Puedes aplicarlas pegando el contenido de cada archivo, en orden, en el SQL Editor del dashboard de Supabase; o con la Supabase CLI:
npx supabase login
npx supabase link --project-ref <tu-project-ref>
npx supabase db push
El registro no es abierto: el primer usuario admin hay que crearlo a mano una vez, para poder aprobar el resto de solicitudes desde la app.
id = el UUID de ese usuario (columna id en Authentication → Users), tu nombre, tu email y rol = 'admin'./login con ese usuario y aprobar el resto de solicitudes desde Ajustes.En Authentication → URL Configuration, añade a Redirect URLs:
http://localhost:3000/auth/set-password (desarrollo)https://<tu-dominio-de-vercel>/auth/set-password (producción, una vez desplegado)Esto es necesario para que los enlaces de invitación y de "olvidé mi contraseña" funcionen. El
redirectTo de esos dos flujos apunta directamente a /auth/set-password (página cliente): el
token de sesión llega en el fragmento de la URL (#access_token=...), que solo el navegador
puede leer, así que no puede pasar por un Route Handler de servidor intermedio — el cliente de
Supabase lo detecta y procesa automáticamente al cargar la página.
src/lib/types/database.types.ts está escrito a mano, reflejando el esquema de las migraciones. En cuanto el proyecto esté enlazado, regenéralo desde el esquema real:
npx supabase gen types typescript --project-id <tu-project-ref> --schema public > src/lib/types/database.types.ts
npm run dev
Abre http://localhost:3000.
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY (marca la variable como sensitive: solo se usa server-side, en los Route Handlers de aprobación de solicitudes)NEXT_PUBLIC_SITE_URL — la URL de producción, p. ej. https://infantil-b.vercel.app/auth/set-password a las Redirect URLs de Supabase Auth (paso 5 de arriba).La app está pensada para desplegarse una vez por club (cada uno con su propio proyecto de Vercel + Supabase, siguiendo los pasos de arriba). Para adaptar el nombre, el escudo y los colores sin tocar código, añade estas variables de entorno (opcionales — sin ninguna, se usan los valores del Infantil B):
| Variable | Ejemplo | Por defecto |
|---|---|---|
NEXT_PUBLIC_CLUB_NOMBRE | Real Club Deportivo | Cultural y Deportiva Leonesa |
NEXT_PUBLIC_EQUIPO_NOMBRE | Cadete A | Infantil B |
NEXT_PUBLIC_ESCUDO_INICIALES | CA | IB |
NEXT_PUBLIC_COLOR_PRIMARIO | #1d4ed8 | #8a1b24 |
NEXT_PUBLIC_COLOR_SECUNDARIO | #f59e0b | #9c7328 |
NEXT_PUBLIC_LUGAR_ENTRENO_DEFECTO | Ciudad Deportiva | Área Deportiva de Puente Castro |
Ver src/lib/club-config.ts para el detalle. Dos cosas que sí hay que cambiar a mano por cada club, porque son archivos binarios:
public/icon-192.png, public/icon-512.png, public/apple-touch-icon.png) — sustitúyelos por el escudo real del club si lo tienen, o genera unos nuevos a partir del escudo genérico con los colores/iniciales de arriba.src/app/globals.css (:root y .dark) siguen fijos en CSS — las variables de entorno solo cambian el escudo genérico y los textos; para un rediseño de color completo de la interfaz hay que editar ese archivo.npm run dev # servidor de desarrollo
npm run build # build de producción
npm run start # servir el build de producción
npm run lint # ESLint
usuarios (rol = 'admin' | 'staff' y activo = true) pueden leer/escribir datos del equipo.SUPABASE_SERVICE_ROLE_KEY nunca se expone al cliente: solo se usa en src/lib/supabase/admin.ts, importado exclusivamente desde Route Handlers server-side (el flujo de aprobación de solicitudes, que necesita invitar usuarios por email).