App de entrenamiento y nutrición personal — planifica rutinas, registra cada serie en tiempo real y lleva el control de tu alimentación. Funciona como PWA instalable en el teléfono para usarla en el gimnasio sin conexión.
| Capa | Tecnología |
|---|---|
| Frontend | React 18 + TypeScript + Vite |
| Estilos | Tailwind CSS v4 |
| Estado | Zustand (con persistencia en localStorage) |
| Backend | Supabase (PostgreSQL + Auth + RLS) |
| PWA | vite-plugin-pwa (Service Worker + Manifest) |
| Tests | Vitest + Testing Library |
.
├── frontend/ # App React + Vite
│ ├── src/
│ │ ├── components/ # Componentes React
│ │ ├── pages/ # Páginas (rutas)
│ │ ├── stores/ # Stores Zustand
│ │ ├── test/ # Tests
│ │ └── utils/ # Hooks y utilidades
│ └── public/ # Assets estáticos + iconos PWA
├── backend/supabase/ # Migraciones y seeds de Supabase
├── plantilla-estatica/ # Referencia visual de diseño
├── issues/ # Issues activas y PRD
└── issues/done/ # Issues completadas
- Node.js >= 18
- npm >= 9
- Una cuenta de Supabase (gratuita)
- Git
git clone https://github.com/ropall/Gymbro.git
cd GymbroCrea un proyecto en supabase.com. Luego ejecuta las migraciones desde el SQL Editor de Supabase o con la CLI:
# Opción A: Copia y pega cada archivo .sql de backend/supabase/migrations/
# en el SQL Editor de Supabase en orden (001, 002, 003...)
# Opción B: Con Supabase CLI local
cd backend
supabase link --project-ref <tu-project-ref>
supabase db pushLas migraciones crean las tablas (profiles, blocks, cycles, nutrition_menus, nutrition_meals, etc.) y configuran Row Level Security para que cada usuario solo vea sus datos.
cp .env.example frontend/.envEdita frontend/.env con tus credenciales de Supabase:
VITE_SUPABASE_URL=https://tu-proyecto.supabase.co
VITE_SUPABASE_ANON_KEY=tu-anon-keyAmbos valores están en Supabase Dashboard → Settings → API.
En Supabase Dashboard → Authentication → Providers → Google:
- Habilita Google como provider
- Configura el Client ID y Client Secret de Google Cloud Console
- Añade
https://<tu-proyecto>.supabase.co/auth/v1/callbackcomo redirect URI en Google Cloud Console
cd frontend
npm install
npm run dev # Dev server en http://localhost:5173npm run test # Tests unitarios y de integración
npm run typecheck # Verificación de tipos TypeScript- Registro de sexo, altura y fecha de nacimiento
- Historial de peso con detección de duplicados por semana
- Medidas corporales (pecho, cintura, cadera, bíceps, muslo)
- Cálculo automático de IMC y TMB
- Galería de fotos de progreso
- Catálogo de ~100 ejercicios organizados por grupo muscular
- Creación de bloques de entrenamiento personalizados
- Ciclos de 7 días con avance automático
- Días de descanso configurables
- Interfaz optimizada para el gimnasio (mobile-first)
- Registro de peso y RPE por serie
- Cronómetro de descanso entre series
- Avance automático al siguiente ejercicio
- Pantalla de celebración al completar
- Checklist de recuperación (energía + suplementos)
- Registro de todas las sesiones completadas
- Vista detallada de cada sesión
- Gráficos de progreso por ejercicio (carga máxima, volumen)
- Menús diarios editables con comidas (pre-gimnasio, post-entreno, almuerzo, merienda, cena)
- Macros editables inline (calorías, proteínas, carbohidratos, grasas)
- Presupuesto mensual de comida
- Reorden de comidas (subir/bajar)
La app es una Progressive Web App instalable. Funciona sin conexión durante el entrenamiento.
Ciclo offline:
- Al iniciar un entrenamiento activo, el bloque se carga desde Supabase y se persiste en localStorage
- Durante el entrenamiento todas las operaciones (pesos, RPE, timer) operan sobre el estado local — no se requiere internet
- Al finalizar con conexión: la sesión se guarda directamente en Supabase
- Al finalizar sin conexión: la sesión se guarda en localStorage como pendiente
- Al reconectar, las sesiones pendientes se sincronizan automáticamente
- Un badge en el header indica estado "Sin conexión" o "Pendiente"
La app debe estar desplegada en un servidor con HTTPS (requisito obligatorio para PWA).
- Abre Chrome y navega a la URL de la app desplegada
- Inicia sesión con Google
- Chrome mostrará un banner "Agregar a la pantalla principal" (o usa el menú ⋮ → Agregar a inicio)
- Confirma la instalación — el icono de Gymbro aparecerá en tu pantalla de inicio
- Abre la app desde el icono (se ejecuta en modo standalone, sin barra de navegación)
- Abre Safari y navega a la URL de la app
- Toca el botón Compartir (📤)
- Desplázate y selecciona "Agregar a la pantalla de inicio"
- Nombra la app y toca "Agregar"
- El Service Worker cachea el shell de la app (HTML, CSS, JS, fuentes)
- Las llamadas a la API de Supabase usan estrategia NetworkFirst (si hay red la usa, si no usa cache)
- Importante: Para usar el modo entrenamiento offline, asegúrate de iniciar el entrenamiento mientras tengas conexión (el bloque se carga desde Supabase en ese momento). Una vez iniciado, puedes quedarte sin conexión.
| Operación | ¿Requiere internet? |
|---|---|
| Registrar series/peso/RPE | No |
| Cronómetro de descanso | No |
| Avanzar ejercicios | No |
| Checklist de recuperación | No |
| Finalizar entrenamiento | No (se guarda local) |
| Ver historial | Sí (datos en Supabase) |
- Importa el repo en vercel.com
- Configura el proyecto:
- Framework: Vite
- Root Directory:
frontend - Build Command:
npm run build - Output Directory:
dist
- Añade las variables de entorno en Settings → Environment Variables:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Crea un archivo
frontend/vercel.jsonpara SPA routing:
{
"rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
}- Deploya. Vercel asigna un dominio
*.vercel.appcon HTTPS automático.
- Importa el repo en Cloudflare Pages
- Configura:
- Build command:
npm run build - Build output directory:
frontend/dist - Root directory:
frontend
- Build command:
- Añade las variables de entorno (
VITE_SUPABASE_URL,VITE_SUPABASE_ANON_KEY) - Cloudflare Pages provee HTTPS automático y soporte nativo para SPA routing
El backend de Supabase ya incluye:
- Base de datos PostgreSQL con esquema completo y RLS
- Autenticación (Google OAuth)
- API REST autogenerada para todas las tablas
No necesitas deployar nada adicional del backend — Supabase lo gestiona.
cd frontend
npm run dev # Dev server (http://localhost:5173)
npm run build # Build de producción
npm run preview # Previsualizar build local
npm run test # Tests unitarios (vitest)
npm run test:watch # Tests en modo watch
npm run typecheck # TypeScript type checking
npm run lint # ESLint| Variable | Descripción |
|---|---|
VITE_SUPABASE_URL |
URL del proyecto Supabase |
VITE_SUPABASE_ANON_KEY |
Clave anónima/pública de Supabase |
Privado — uso personal.