JSJorge Sebastián Soriano EN

Caso · App Android publicada

ARX: la app que decide cuánto peso poner hoy

App Android de gimnasio, cardio y nutrición publicada en Google Play. Registra cada serie, detecta récords en directo y propone la carga de la siguiente sesión. La he desarrollado en solitario con asistentes de IA durante 13 meses, y la usan 14 personas.

Dónde se usa
Google Play · 14 usuarios activos
Estado
Publicada en Google Play · versión 5.15
Mi papel
Producto, dirección técnica, pruebas, publicación y mantenimiento
Tecnologías
Kotlin, Jetpack Compose, Room, Firestore, Hilt, Health Connect, Gemini
App real de ARX: serie a serie con RIR
Grabación real de la app en un Pixel 8.

La app real, en 80 segundos

Grabación real de la app en un Pixel 8: sesión serie a serie, resumen al guardar, historial, nutrición y peso corporal.

El problema

Quien entrena fuerza con constancia apunta pesos y repeticiones en una libreta, una hoja de cálculo o una app genérica. Las tres fallan en lo mismo: no te dicen qué hacer hoy. Saber si toca subir peso exige recordar la última sesión, cuántas repeticiones te sobraron y si aquello fue un récord.

Qué hace

  • Rellena cada ejercicio con la carga propuesta. Al marcar el RIR (repeticiones en reserva) la serie se completa y arranca el descanso.
  • Compara cada serie con tu historial y avisa del récord en ese momento, no al final.
  • Con el RIR de la última serie propone subir la carga (+1,25 kg en tren superior, +2,5 kg en inferior) o mantenerla.
  • Racha semanal, media móvil del peso corporal y previsión por regresión de cuándo llegarás a tu objetivo.

Los datos del usuario, a salvo

Regla que no se negocia

Si falla la sincronización incremental, se hace una completa. Es preferible gastar lecturas a perder datos.

UI ComposeViewModelsRoomfuente de verdadOrquestadororden y esperasSync por dominiocompleto o incrementalFirestoreespejo en la nube
  • Room es la fuente de verdad y Firestore el espejo. La app funciona sin cobertura, algo habitual en un gimnasio en un sótano.
  • El camino incremental nunca borra. Solo la sincronización completa reconcilia ausencias, y solo en local.
  • Upsert, nunca REPLACE, en el catálogo de alimentos: un borrado más inserción dispararía el borrado en cascada del diario de comidas.
  • Sin migraciones destructivas: si falta una migración, la app falla en lugar de borrar la base del usuario.
  • Reglas fuera de Android. Récords, progresión, racha y previsión viven en objetos puros probados en milisegundos. Por eso se pudieron portar tal cual a JavaScript para la demo.

Coste bajo control

La app funciona en el plan gratuito de Firebase. Una auditoría de cuota detectó 234.000 lecturas al mes con 14 usuarios activos: había margen, pero el consumo crecía con cada usuario. Añadí un contador de lecturas por dominio y un cursor incremental para las sesiones. Una pasada de sincronización pasó de unas 2.800 lecturas a 52.

La IA dentro del producto (analizar la foto de un plato, resumir un entrenamiento) usa Gemini mediante Firebase AI Logic, con un modelo de respaldo si el principal falla.

Qué es real y qué es demo

ParteEn la demoDetalle
Reglas de récords, progresión, racha y previsiónRealPortadas a JavaScript con las mismas constantes que la app.
Historial, perfil y pesadasSintéticoPerfil «Alex Demo» generado con semilla fija.
InterfazSintéticoRecreación inspirada en la app; no es la app Android.
Sincronización, cuentas, IA, GPS, nutrición y Health ConnectNo incluidoExisten en la app, fuera del flujo de dos minutos.

Resultados

14usuarios activosauditoría de septiembre de 2026
2.800 → 52lecturas por sincronizaciónmedido en el móvil
5/5 → 0/5fallos de arranque en fríoreproducido y verificado en release

Limitaciones y siguientes pasos

  • Sin tests de interfaz: lo visual se valida en el móvil. Siguiente paso, tests instrumentados de los flujos críticos.
  • Aún no hay un modo 100 % local sin cuenta.
  • Deuda heredada de colores y textos sin centralizar, que se va sustituyendo.

Capturas de la app real

Grabación real de la app en un Pixel 8.

Inicio: racha semanal, macros del día y último entreno
Inicio: racha semanal, macros del día y último entreno
Elegir fuerza, cardio o actividad manual
Elegir fuerza, cardio o actividad manual
Serie a serie con peso, repeticiones y RIR
Serie a serie con peso, repeticiones y RIR
Logro desbloqueado al guardar: 9,7 t levantadas
Logro desbloqueado al guardar: 9,7 t levantadas
Historial: detalle de una sesión con su RIR
Historial: detalle de una sesión con su RIR
Nutrición: calorías y macros del día
Nutrición: calorías y macros del día
Valoración de un alimento al añadirlo
Valoración de un alimento al añadirlo
Estadísticas y evolución del peso
Estadísticas y evolución del peso