Batalha dos Barris — Reproductor de Ranking en TV
Aplicación Angular (PWA) que muestra en tiempo real, en TV/monitor, los rankings de consumo de una cervecería, alimentada con datos sincronizados directamente desde el POS del local.

Problema
Una cervecería necesitaba mostrar rankings de consumo en TV/monitor, alimentados por el PDV del local. El hardware era una TV Box Android encendida 24/7; la red caía; el PDV reiniciaba a diario. Sin intervención manual, los datos debían seguir casi en tiempo real.
Solución e impacto
Monorepo con player Angular 17 PWA, API Flask/PostgreSQL (caché + OpenAPI) y un agente Python que sincroniza ventas del MySQL del PDV vía túnel SSH, con reanudación de estado y sync incremental periódico. El resultado de ingeniería es una cadena de extremo a extremo lo bastante estable para operar sin supervisión constante.
Arquitectura y trade-offs
Separar player, API y agente aisló fallos: el front optimizado para hardware limitado no depende del MySQL legado; el agente absorbe la complejidad del túnel SSH y del ciclo de vida del PDV. La caché en la API reduce presión sobre PostgreSQL bajo el polling del player. Trade-off: sync periódico no es streaming verdadero — es near-real-time pragmático, más simple de operar que websockets en una TV Box.
Operación y observabilidad
Deploy via GitHub Actions; Cypress no player. Healthchecks do agente e alertas de lag de sync são o próximo nível — hoje a resiliência vem da retomada de estado e do intervalo periódico configurável tolerante a quedas de rede.
Desafíos técnicos
Resiliencia a caídas de red y reinicios del PDV, reanudación correcta del cursor de sync, y UX de ranking fluida en TV Box con Service Worker — además de deploy automatizado (GitHub Actions) y cobertura Cypress en el player.
Qué haría diferente
Formalizaría antes healthchecks del agente y alertas cuando el lag de sync supere un umbral. El intervalo periódico configurável y el modelo de reanudación siguen encajando; lo que reforzaría es la observabilidad operativa para un entorno 24/7.
Contexto técnico
- IncrementalSyncAgente con retomada de estado
- 3 capasArquitecturaPlayer, API y agente aislados
Stack
- Angular 17
- TypeScript
- RxJS
- Angular Service Worker
- Flask
- PostgreSQL
- psycopg
- Python
- Docker
- GitHub Actions
- Cypress