GymRat es una aplicación móvil desarrollada con React Native y Expo que permite a los usuarios gestionar sus rutinas de ejercicio, días de entrenamiento y seguimiento de progreso. La aplicación está construida siguiendo los principios de Clean Architecture para mantener el código organizado, escalable y fácil de mantener.
- GymRat - Aplicación de Entrenamiento
- Gestión de Ejercicios: Crear, editar y eliminar ejercicios personalizados
- Rutinas de Entrenamiento: Organizar ejercicios en rutinas específicas
- Días de Entrenamiento: Configurar días específicos con ejercicios y series
- Seguimiento de Entrenamientos: Registrar sets, repeticiones y pesos
- Historial de Progreso: Visualizar estadísticas y progreso a lo largo del tiempo
- Interfaz Moderna: Diseño atractivo con Tamagui y iconografía Lucide
- Almacenamiento Local: Base de datos SQLite para funcionar offline
Este proyecto implementa Clean Architecture organizada en las siguientes capas:
┌─────────────────────────────────────┐
│ Presentation │ ← UI Components, Screens, Hooks
├─────────────────────────────────────┤
│ Domain │ ← Entities, Use Cases, Repositories (Interfaces)
├─────────────────────────────────────┤
│ Infrastructure │ ← Repository Implementations, Mappers
├─────────────────────────────────────┤
│ Data │ ← Models, Database, Migrations
└─────────────────────────────────────┘
- Inversión de Dependencias: Las capas superiores no dependen de las inferiores
- Separación de Responsabilidades: Cada capa tiene una responsabilidad específica
- Testabilidad: Código fácil de testear mediante interfaces y mocks
- Escalabilidad: Estructura que permite crecer sin refactoring masivo
- React Native - Framework principal para desarrollo móvil
- Expo - Plataforma de desarrollo y despliegue
- TypeScript - Tipado estático para mayor robustez
- Tamagui - Sistema de diseño y componentes UI
- Lucide Icons - Iconografía moderna y consistente
- Expo Router - Navegación basada en archivos
- Expo SQLite - Base de datos local para almacenamiento offline
- Zustand - Gestión de estado global ligera
- Custom Hooks - Lógica reutilizable encapsulada
- Biome - Linter y formateador de código
- Metro - Bundler para React Native
- Babel - Transpilador de JavaScript
gymrat/
├── app/ # 📱 Pantallas y navegación (Expo Router)
│ ├── (tabs)/ # Navegación por pestañas
│ │ ├── (home)/ # Pestaña Home
│ │ │ ├── home/ # Pantalla principal
│ │ │ ├── routine/ # Visualización de rutinas
│ │ │ └── workout/ # Pantalla de entrenamiento
│ │ ├── (history)/ # Pestaña Historial
│ │ │ ├── history/ # Lista de historial
│ │ │ └── workout-stats/ # Estadísticas detalladas
│ │ └── (settings)/ # Pestaña Configuración
│ │ ├── exercises/ # Gestión de ejercicios
│ │ ├── routine/ # Creación de rutinas
│ │ ├── settings/ # Configuraciones
│ │ └── workout-days/ # Gestión de días
│ ├── _layout.tsx # Layout principal
│ ├── +html.tsx # Configuración web
│ └── +not-found.tsx # Página 404
│
├── domain/ # 🎯 Capa de Dominio (Clean Architecture)
│ ├── entities/ # Entidades de negocio
│ │ ├── exercise.entity.ts # Entidad Ejercicio
│ │ ├── routine.entity.ts # Entidad Rutina
│ │ ├── workout-day.entity.ts # Entidad Día de Entrenamiento
│ │ └── workout.entity.ts # Entidad Entrenamiento
│ ├── dtos/ # Data Transfer Objects
│ ├── repositories/ # Interfaces de repositorios
│ ├── datasources/ # Interfaces de fuentes de datos
│ └── use-cases/ # Casos de uso de negocio
│
├── infrastructure/ # 🔧 Capa de Infraestructura
│ ├── repositories/ # Implementaciones de repositorios
│ ├── datasources/ # Implementaciones de datasources
│ └── mappers/ # Transformadores de datos
│
├── data/ # 💾 Capa de Datos
│ ├── models/ # Modelos de base de datos
│ ├── constants.ts # Constantes de la aplicación
│ └── migrate-db.ts # Migraciones de BD
│
├── presentation/ # 🎨 Capa de Presentación
│ ├── components/ # Componentes reutilizables
│ │ ├── exercises/ # Componentes de ejercicios
│ │ ├── routines/ # Componentes de rutinas
│ │ ├── ui/ # Componentes UI base
│ │ └── workout-days/ # Componentes de días
│ └── hooks/ # Hooks personalizados
│ ├── use-database.ts # Hook de base de datos
│ └── use-exercises.ts # Hook de ejercicios
│
├── config/ # ⚙️ Configuraciones
│ └── helpers/ # Utilidades y helpers
│
└── assets/ # 🖼️ Recursos estáticos
├── fonts/ # Fuentes personalizadas
└── images/ # Imágenes y iconos
- Node.js (v18 o superior)
- npm o yarn
- Expo CLI (
npm install -g @expo/cli
) - Android Studio (para Android) o Xcode (para iOS)
-
Clonar el repositorio
git clone https://github.com/chicho69-cesar/gymrat.git cd gymrat
-
Instalar dependencias
npm install
-
Iniciar el servidor de desarrollo
npx expo start
-
Ejecutar en dispositivo/emulador
- Para Android: Presiona
a
en la terminal o escanea el QR con Expo Go - Para iOS: Presiona
i
en la terminal o escanea el QR con Expo Go - Para Web: Presiona
w
en la terminal
- Para Android: Presiona
# Desarrollo
npm start # Inicia el servidor Expo
npm run android # Ejecuta en Android
npm run ios # Ejecuta en iOS
npm run web # Ejecuta en navegador
# Construcción
npm run build # Construye la aplicación
# Calidad de Código
npm run lint # Ejecuta el linter
npm run format # Formatea el código
# Utilidades
npm run reset-project # Reinicia el proyecto
Las migraciones se gestionan en data/migrate-db.ts
y se ejecutan automáticamente al iniciar la aplicación.
La aplicación utiliza Tamagui como sistema de diseño, proporcionando:
- Tokens de diseño: Colores, espaciado, tipografía consistentes
- Componentes base: Button, Input, Text, View, Stack
- Theming: Soporte para temas claro y oscuro
- Responsive: Adaptación automática a diferentes tamaños de pantalla
La aplicación utiliza Expo Router con navegación basada en archivos:
app/
├── (tabs)/ # Tab Navigator
│ ├── (home)/ # Stack Navigator - Home
│ ├── (history)/ # Stack Navigator - History
│ └── (settings)/ # Stack Navigator - Settings
└── _layout.tsx # Root Layout
UI Component → Custom Hook → Use Case → Repository → DataSource → Database
↓ ↓ ↓ ↓ ↓ ↓
Render ← State ← Entity ← Domain ← Infrastructure ← Data
- Usuario interactúa con
ExerciseList
component - Component usa
useExercises
hook - Hook llama
ExerciseUseCases.getAll()
- Use Case usa
ExerciseRepository
interface - Repository implementa
ExerciseDataSource
- DataSource consulta SQLite database
- Datos se mapean de Model a Entity
- Entity se devuelve hasta el Component
- Component renderiza la lista actualizada
- Fork el repositorio
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad
) - Commit tus cambios (
git commit -m 'Agrega nueva funcionalidad'
) - Push a la rama (
git push origin feature/nueva-funcionalidad
) - Abre un Pull Request
- Usar TypeScript para todo el código
- Seguir Clean Architecture principles
- Usar Biome para linting y formateo
- Escribir tests para nuevas funcionalidades
- Documentar APIs públicas
- Componentes: PascalCase (ExerciseList)
- Hooks: camelCase con 'use' prefix (useExercises)
- Files: kebab-case (exercise-list.tsx)
- Variables: camelCase (exerciseData)
- Constants: UPPER_SNAKE_CASE (API_BASE_URL)
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE
para más detalles.
- Desarrollador Principal: chicho69-cesar
Para reportar bugs o solicitar nuevas características, por favor abre un issue en GitHub.
Desarrollado con ❤️ usando React Native y Clean Architecture