Metri
App móvil de fitness offline-first para registrar entrenamiento y métricas corporales, con la UI dirigida directamente por SQLite.
Contexto
Metri es una app móvil de fitness pensada para quienes entrenan en serio y necesitan sus datos rápido, privados y siempre disponibles —incluso en el gimnasio sin conexión—. La app corre por completo en el dispositivo y es totalmente usable sin iniciar sesión, priorizando la privacidad y la propiedad de los datos del usuario. El código es open-source bajo licencia MIT.
Arquitectura
La decisión central es que la base de datos dirige la UI: no hay Zustand, Redux ni TanStack Query. SQLite (con Drizzle ORM) es la única fuente de verdad y su useLiveQuery reacciona directamente a las escrituras, eliminando bugs de sincronización de estado. MMKV cubre las lecturas síncronas de la ruta caliente (tema, unidades, sesión, onboarding) sin reemplazar al store relacional. Drizzle Kit genera y aplica las migraciones SQL automáticamente en cada arranque.
Stack
- Expo (SDK 56) + React Native con TypeScript estricto.
- Expo Router (enrutamiento por archivos con rutas tipadas).
- SQLite + Drizzle ORM como fuente de verdad offline-first.
- MMKV para almacenamiento clave-valor síncrono.
- NativeWind v4 (Tailwind para React Native) con tokens de diseño.
expo-notifications,expo-cryptoyexpo-file-system.
Características
- Autenticación local cifrada (sal + key-stretching con
expo-crypto). - Perfiles con métricas corporales y cálculo de BMR/TDEE (Harris–Benedict).
- Recordatorios diarios/semanales con notificaciones del sistema.
- Galería de fotos de progreso (imagen completa + miniatura en disco).
- Base de conocimiento bilingüe (EN/ES) y temas claro/oscuro/sistema.
Retos técnicos
- Diseñar un motor de fórmulas puro y síncrono, seguro de llamar en cada pulsación sin parpadeo de UI.
- Sistema de tokens de diseño que intercambia valores por esquema claro/oscuro sin hardcodear colores.
Resultado
Una base sólida en desarrollo activo (repositorio público) que demuestra una arquitectura offline-first poco común: UI reactiva dirigida por la base de datos, almacenamiento dual y migraciones automáticas.