Strautomator
Strava 활동을 자동화해 주는 Strautomator는 IFTTT와 비슷하지만 Strava 전용이다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.