個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
App multiplataforma (iOS, Android y Web) de UDECA (by Luis Tena / luistenafit) para que el entrenador gestione a sus clientes, rutinas, entrenamientos y progreso desde un único lugar, y para que cada cliente acceda a su plan personalizado. Construida con Expo (React Native + React Native Web) y Firebase (autenticación + Firestore).檢視完整 README ↗
App multiplataforma (iOS, Android y Web) de CALICO (by Luis Tena / luistenafit) para que el entrenador gestione a sus clientes, rutinas, entrenamientos y progreso desde un único lugar, y para que cada cliente acceda a su plan personalizado.
Construida con Expo (React Native + React Native Web) y Firebase (autenticación + Firestore).
web/ y se despliega aparte; ver docs/WEB.md.acceso/).docs/COBROS.md.docs/DISENO.md.docs/CICLOS.md..github/workflows/deploy.yml.
No hay despliegues manuales.public/sw.js) cachea la aplicación
para carga instantánea y uso sin conexión (los datos de Firebase
siempre van a red).Implementado hasta ahora:
Fase 1 (MVP)
Fase 2
components/LineChart.tsx) usado tanto para el peso como para las
medidas corporales.Fase 3
npx eas init)
para que se genere el projectId en app.json — sin él, la app sigue
funcionando con normalidad pero no se registran tokens push.expo-print y compartido con
expo-sharing. En web abre el diálogo de impresión del navegador.Fase 4 — Identidad CALICO y experiencia élite
Ve a la consola de Firebase y crea un proyecto nuevo (gratis, plan Spark es suficiente para empezar).
Dentro del proyecto, ve a Compilación → Authentication → Comenzar y activa el proveedor Correo electrónico/contraseña.
Ve a Compilación → Firestore Database → Crear base de datos (modo producción, elige la región más cercana a tus clientes).
Ve a Configuración del proyecto (icono de engranaje) → pestaña
General → sección "Tus apps" → pulsa el icono </> para registrar una
app web (sirve para las tres plataformas, ya que React Native Web
reutiliza la misma configuración).
Copia los valores de firebaseConfig que te muestra Firebase.
En la raíz de este proyecto, copia .env.example como .env:
cp .env.example .env
Rellena .env con los valores copiados en el paso 5 (todas las
variables empiezan por EXPO_PUBLIC_, así Expo las incluye en el
bundle de la app).
Sube las reglas de seguridad de Firestore (firestore.rules) a tu
proyecto. Puedes hacerlo de dos formas:
firestore.rules y publica.npx firebase-tools login y luego
npx firebase-tools deploy --only firestore:rules.Sin este paso, cualquier usuario autenticado podría leer o escribir datos de otros usuarios.
npm install
npm run web # navegador (ordenador / tablet)
npm run ios # simulador iOS (requiere macOS)
npm run android # emulador / dispositivo Android
Si .env no existe o le faltan variables, la app mostrará una pantalla
avisando de que falta configurar Firebase en lugar de fallar.
Las notificaciones push (rutina asignada, mensajes de chat, recordatorios) usan el servicio gratuito de Expo Push Notifications y no requieren servidor propio, pero sí necesitan un proyecto EAS:
npx eas login # crea una cuenta gratuita en expo.dev si no tienes una
npx eas init
Esto añade automáticamente un extra.eas.projectId a app.json. A partir
de ahí, cada usuario que abra la app en un dispositivo físico (no
simulador) y conceda permiso de notificaciones quedará registrado. Sin
este paso, la app funciona igual pero no se enviarán notificaciones.
No hay panel de administración para crear usuarios: cada persona se registra ella misma.
El número lo reparte el servidor al procesar el alta de 1 €, y solo si la
campaña está abierta (config/fundadores.abierta === true). Las cuentas
anteriores a la campaña no lo reciben nunca: ese código solo corre durante un
pago. Y las reglas de Firestore prohíben escribirlo desde la app a propósito —
un distintivo que cualquiera pudiera ponerse no valdría nada.
Para darlo a mano (la cuenta del fundador, un caso especial): Actions → Número de fundador → Run workflow, con el correo, el número y en qué número quieres dejar el contador para la siguiente alta. No hace falta descargar nada ni manejar la clave privada: GitHub ya la tiene como secreto.
El script se niega a pisar un número ya repartido y a repetir uno que otra cuenta tenga: dos "fundador nº 1" no es un fallo cosmético, es la campaña entera perdiendo el sentido.
app/ Pantallas (expo-router, navegación por archivos)
(auth)/ Login y registro
(trainer)/ Área del entrenador (tabs: inicio, clientes, ejercicios, perfil)
(client)/ Área del cliente (tabs: inicio, entreno, nutrición, progreso, social, perfil)
components/ Componentes de UI reutilizables
lib/
firebase.ts Inicialización de Firebase (auth + Firestore)
auth-context.tsx Contexto de autenticación y perfil de usuario
types.ts Tipos de datos (Firestore)
theme.ts Colores, tipografía y espaciados
fechas.ts Fechas escritas en español (mayúscula solo la inicial)
notifications.ts Registro y envío de notificaciones push (Expo)
report.ts Generación del HTML del informe PDF de cliente
firestore/ Funciones de acceso a datos por colección
firestore.rules Reglas de seguridad de Firestore
| Colección | Descripción |
|---|---|
users | Perfiles de entrenador y cliente (role, trainerId, etc.) |
trainerCodes | Mapa público código → trainerId para el registro de clientes |
exercises | Biblioteca de ejercicios de cada entrenador |
routines | Rutinas asignadas a cada cliente (días, ejercicios, series) |
workoutLogs | Entrenamientos registrados por cada cliente |
weightLogs | Registros de peso de cada cliente |
bodyMeasurements | Medidas corporales de cada cliente (pecho, cintura, cadera...) |
nutritionPlans | Planes nutricionales asignados a cada cliente |
mealLogs | Comidas registradas por cada cliente |
socialStats | Métricas públicas por miembro para el ranking social (no sensibles) |
courses | Cursos en vídeo (secciones y lecciones); publicados = visibles para alumnos |
progressPhotos | Fotos de progreso (frente/perfil/espalda), privadas alumno+entrenador |
announcements | Anuncios del entrenador para su grupo |
habits | Hábitos diarios asignados por el entrenador a cada alumno |
habitLogs | Registro diario de hábitos cumplidos (creado por el alumno) |
challenges | Retos del grupo (uno activo por entrenador; ranking en Social) |
courseProgress | Lecciones vistas por cada alumno (doc id = su uid; solo él escribe) |
Por ahora la app usa los iconos de ejemplo que genera Expo por defecto. Para
poner el logo real de CALICO, sustituye estos archivos en assets/ por el
tuyo (mismo nombre, mismas dimensiones — puedes exportarlos con cualquier
editor de imagen o herramienta online tipo Canva/Figma):
| Archivo | Tamaño | Uso |
|---|---|---|
assets/icon.png | 1024×1024 | Icono de la app (iOS, Android, web) |
assets/splash-icon.png | 1024×1024 | Pantalla de carga (fondo negro) |
assets/android-icon-foreground.png | 512×512 | Icono adaptable de Android (primer plano, fondo transparente) |
assets/android-icon-background.png | 512×512 | Icono adaptable de Android (fondo, ya en negro) |
assets/android-icon-monochrome.png | 432×432 | Versión monocromo (Android 13+) |
assets/favicon.png | 48×48 | Icono de pestaña en el navegador web |
Recomendación: usa tu logo del tridente en plata/blanco sobre fondo negro
para que combine con el resto de la app. Después de reemplazar los
archivos, reinicia el servidor (npm start) para que se regeneren los
iconos.
npx expo export --platform web genera una build estática en
dist/, lista para desplegar en cualquier hosting estático (Firebase
Hosting, Vercel, Netlify...).npx eas build) para generar los binarios de las tiendas.