Caso técnico · Mobile
NutriSport
E-commerce de nutrición deportiva para Android e iOS construido con Kotlin Multiplatform y Compose Multiplatform.
Kotlin Multiplatform · Compose Multiplatform · Firebase · Ktor · Koin · GitHub Actions

Contexto
NutriSport reúne flujos de cliente y seller/admin en una aplicación móvil multiplataforma. El reto técnico era compartir la mayor parte posible del producto sin perder las necesidades específicas de Android e iOS ni la utilidad con conectividad limitada.
Arquitectura
La solución separa hosts de Android e iOS de los módulos compartidos de UI, dominio, datos, navegación, inyección de dependencias y funcionalidades. Firestore aporta persistencia offline y Firebase Functions mantiene el checkout fuera de las escrituras directas del cliente.
Decisiones técnicas
- 01Kotlin Multiplatform y Compose Multiplatform permiten compartir UI y lógica manteniendo hosts nativos.
- 02La modularización separa dominio, datos, navegación, DI y features para limitar acoplamiento.
- 03Las lecturas offline-first combinan persistencia de Firestore, caché de imágenes y observación de conectividad por plataforma.
- 04El checkout se delega a Firebase Functions para que las escrituras finales de pedidos no dependan de la confianza en el cliente.
Reliability y seguridad
La conectividad se trata como una condición del producto: las lecturas pueden apoyarse en persistencia local, mientras que las operaciones críticas siguen un flujo controlado. El checkout gestionado desde backend reduce la superficie de manipulación de las escrituras finales.
Testing y delivery
El proyecto incluye testing y automatización de CI/CD orientada a validar y generar builds Android. La separación modular ayuda a mantener los cambios acotados entre funcionalidades compartidas y código específico de plataforma.
Trade-offs
Compartir código reduce duplicación, pero no elimina las diferencias de plataforma: conectividad, hosts y capacidades del dispositivo siguen requiriendo decisiones específicas. La arquitectura mantiene ese límite explícito en lugar de ocultarlo.