PrimoDev/ apps

Votos

Live count of Brazil's 2026 runoff election, with official TSE data

  • Web
  • PWA
  • Free
  • Open source

What is Votos?

Votos is a site that follows the count of Brazil's 2026 presidential runoff in real time, with official TSE (Superior Electoral Court) data refreshed every 15 seconds. Beyond the scoreboard, it shows a projection of the final result, how many votes are left, a map of Brazil by state and the count curve with lead changes marked.

It's free, with no ads and no sign-up, and the code is on GitHub. The site is static HTML that fetches the JSON files straight from the TSE CDN; projections are estimates, not official results.

What it does

  1. 01Sticky scoreboard with a projection of the final result
  2. 02Votes left to count and how many each candidate needs to take the lead
  3. 03Map of Brazil by state: who leads, swing vs. the first round and % counted
  4. 04Count curve with every lead change marked
  5. 05Eve-of-election polls vs. the ballots, by region and for every state
  6. 06Governor runoffs and an explorer for any office and state
  7. 07Installable PWA with lead-change and milestone alerts (web push and sound)

FAQ

Where does the data come from?
Straight from the TSE's official results CDN (resultados.tse.jus.br). Each browser fetches the files every 15 seconds and ignores older copies, so the numbers never go backwards.
Is the projection the official result?
No. It's an estimate based on what's been counted in each state. The official result is the TSE's.
Can I get notified of a lead change?
Yes. Install the site as an app (PWA) and turn on alerts: it sends a web push when the lead changes and at count milestones.

Documentation

README from the lucianodiisouza/votos repository, refreshed on every deploy.

Apuração em tempo real do 2º turno das Eleições 2026 com os dados oficiais do TSE: https://votos.oprimo.dev

  • Placar fixo, projeção do resultado final, votos que faltam e quanto cada um precisa pra virar
  • Mapa do Brasil por UF (quem lidera, swing vs 1º turno, % apurado)
  • Curva de evolução da apuração com as viradas marcadas
  • Pesquisas da véspera × urnas, por região e tabela de todas as UFs
  • Governadores no 2º turno e explorador de qualquer cargo/UF (combobox pesquisável)
  • PWA com alertas de virada e marcos da apuração (web push + som no navegador)

Como funciona

O site é estático (um index.html, sem build) e roda na Vercel. Cada navegador busca os JSONs direto do CDN do TSE (resultados.tse.jus.br, CORS liberado) a cada 15s, revalidando por ETag: quando nada mudou o TSE responde 304. Os estados só são baixados quando o resumo indica mudança, e arquivos mais antigos vindos do CDN são ignorados pra os números nunca andarem pra trás.

static.js traz a malha das UFs (IBGE) já projetada em SVG e o resultado final do 1º turno por UF, gerado por scripts/build-static.py.

api/ é um serviço Node pequeno (rodando no Coolify) que grava o histórico da apuração pra curva e dispara os web pushes. Veja api/README.md.

Deploy

./deploy.sh

Carimba um build id em index.html, sw.js e version.json. Quem está com a página aberta recarrega sozinho no próximo ciclo.

Projeções são estimativas, não resultado oficial.