Fitofan
Plataforma deportiva: web, apps móviles y el backend que hay detrás
Una plataforma para atletas, entrenadores, clubes y aficionados: una web app en 11 idiomas, apps para iOS y Android y un único backend del que me ocupo de principio a fin.
- Rol
- Senior Full-Stack & Mobile Engineer
- Periodo
- 2024 – 2026


Contexto
Fitofan atiende a atletas, entrenadores, padres, clubes y ligas con una web app en Next.js, apps Flutter para iOS y Android y un backend en NestJS. Soy responsable de la entrega en todo el stack: arquitectura, APIs, datos, infraestructura y lanzamientos, y desde 2026 mantengo la app móvil por mi cuenta.
El reto
Mantener un producto coherente entre tres bases de código y 11 idiomas mientras se añaden datos deportivos en vivo, pagos, publicación social y funciones de IA sin frenar los lanzamientos.
Construido en todas las capas
- Web app en Next.js 16 sobre Feature-Sliced Design: más de 140 páginas, 11 locales, unas 10 000 claves de traducción con paridad verificada en CI
- Backend en NestJS con más de 90 módulos, PostgreSQL y más de 290 migraciones, Swagger y comprobaciones de estado
- Sincronización orientada a eventos sobre RabbitMQ con consumidores idempotentes, una cola de mensajes fallidos e ids de correlación
- Caché en Redis con invalidación por decoradores; gateways Socket.IO para comentarios y sesiones en vivo
- Partidos, resultados y cuotas en vivo desde Sportmonks y API-Football; publicación social en Meta, TikTok, LinkedIn y YouTube
- Suscripciones con Finix más verificadores de pago para Stripe, Square, PayPal, LiqPay, Mercado Pago, GCash y Monopay
- Asistente OpenAI con llamadas a herramientas, transcripción con Whisper y generación de imágenes con Replicate
- App Flutter: BLoC, caché offline con Hive, Socket.IO, notificaciones push, AdMob, Live Activities de iOS, 12 locales, más de 360 tests
- CI/CD: gates de lint e i18n, Jest, Docker multietapa, registro de contenedores, despliegue por SSH; web en Vercel
- Paquetes compartidos de registro y creación de clubes reutilizados por GymTeam mediante un contrato de host inyectable
- I+D de IA y visión en el mismo ecosistema: una app de evaluación deportiva infantil con estimación de pose en el dispositivo en Flutter y suscripciones in-app, y un análisis de técnica de taekwondo en el navegador con MediaPipe y TensorFlow.js
Puntos de ingeniería
- Consumidores de eventos idempotentes: cada mensaje se registra antes de confirmarse, así que los reintentos y las repeticiones nunca se aplican dos veces
- Arquitectura impuesta por las herramientas: reglas de capas, una línea base de lint congelada que solo puede reducirse, comprobación de ciclos de dependencias y paridad de i18n en cada pull request
- Live Activities nativas de iOS controladas desde Flutter a través de un puente de method channel
- Un único flujo de registro empaquetado tras un contrato de host y consumido por dos productos
Qué hace posible
Las funciones se lanzan en web, móvil y backend en un solo cambio, y la plataforma intercambia datos de clubes con GymTeam en tiempo real.