Batalha dos Barris — Player de Ranking em TV
Aplicação Angular (PWA) que exibe em tempo real, em TV/monitor, os rankings de consumo de uma cervejaria, consumindo dados sincronizados diretamente do PDV do estabelecimento.

Problema
Uma cervejaria precisava exibir rankings de consumo em TV/monitor, alimentados pelo PDV do estabelecimento. O hardware era TV Box Android ligada 24/7; a rede caía; o PDV reiniciava diariamente. Sem intervenção manual, os dados tinham que permanecer quase em tempo real.
Solução e impacto
Monorepo com player Angular 17 PWA, API Flask/PostgreSQL (cache + OpenAPI) e agente Python que sincroniza vendas do MySQL do PDV via túnel SSH, com retomada de estado e sync incremental a cada ~15s. O resultado de engenharia é uma cadeia ponta a ponta estável o bastante para rodar sem babá no chão da operação.
Arquitetura e trade-offs
Separar player, API e agente isolou falhas: o front otimizado para hardware restrito não depende do MySQL legado; o agente absorve a complexidade do túnel SSH e do ciclo de vida do PDV. Cache na API reduz pressão no PostgreSQL sob polling do player. Trade-off: sync de ~15s não é streaming verdadeiro — é near-real-time pragmático, mais simples de operar do que websockets em TV Box.
Desafios técnicos
Resiliência a quedas de rede e reinícios do PDV, retomada correta do cursor de sync, e UX de ranking fluida em TV Box com Service Worker — além de deploy automatizado (GitHub Actions) e cobertura Cypress no player.
O que eu faria diferente
Eu formalizaria mais cedo healthchecks do agente e alertas quando o lag de sync passar de um limiar. O intervalo de ~15s e o modelo de retomada de estado continuam adequados; o que eu reforçaria é observabilidade operacional para o ambiente 24/7.
Stack
- Angular 17
- TypeScript
- RxJS
- Angular Service Worker
- Flask
- PostgreSQL
- psycopg
- Python
- Docker
- GitHub Actions
- Cypress