~/jonasfink.dev

← cd ..

lightMe – App de salud integral

2026 · Full-Stack Developer
ReactTypeScriptTailwind v4Node.jsExpress.jsMongoDB
lightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshotlightMe – App de salud integral — screenshot

Problema

La mayoría de las apps de salud separan el seguimiento en silos: una app para la comida, otra para el ánimo, una tercera para la actividad —y ninguna muestra cómo las tres interactúan realmente a lo largo de un programa de 12 semanas. Además, los datos nutricionales son notoriamente poco fiables: ninguna base de datos de alimentos tiene buena cobertura, los códigos de barras fallan y escalar las porciones es fácil de equivocar de forma sutil. Quería una sola app que mantuviera juntos nutrición, ánimo y actividad, lo bastante fiable como para basar en ella un programa de coaching real.

Solución

Una app en React 19 + TypeScript respaldada por una API de Express/MongoDB. Las búsquedas de alimentos van en cascada por FatSecret, USDA y OpenFoodFacts para que la cobertura se mantenga donde una sola fuente se queda corta, con un escáner de códigos de barras react-zxing y un único ayudante de escalado de porciones reutilizado en búsqueda, favoritos y escaneos —sin cálculos duplicados que se desvíen. Un panel con Recharts pone peso, medidas, ánimo, calorías y actividad en la misma línea de tiempo. La autenticación JWT usa tokens de acceso en memoria con refresco silencioso mediante cookie httpOnly, Stripe Checkout ejecuta el flujo de suscripción de cuatro niveles tras un feature flag, y un panel de administración con acceso por rol ofrece análisis por usuario, MRR/ARPU y salud de las suscripciones.

Notas técnicas

La base de código está construida en torno a puntos de deduplicación en lugar de abstracciones por sí mismas: el escalado de porciones, los tipos de comida, los niveles de plan y el marco de las secciones del panel viven cada uno en un único lugar. Cuando las páginas superaban las ~500 líneas, extraje la lógica a hooks y dividí la UI —la página del diario de comidas pasó de 991 a 278 líneas mediante cuatro hooks y cuatro componentes. El bundle de administración se separa con React.lazy para que los usuarios normales nunca paguen su coste, y los CTA de Stripe están tras un flag de entorno para que producción despliegue un estado limpio de «próximamente» sin romper el build.

© 2026 Jonas Fink