OSSDevelopment

Metri

Offline-first fitness mobile app for logging training and body metrics, with the UI driven directly by 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-crypto y expo-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.

Let's talk?