Um painel que lê os arquivos públicos do TSE, confere as contas e mostra cada estado se preenchendo a cada 15 segundos.

O INEMA Eleições 2026 é um painel aberto para acompanhar a apuração do 2º turno para Presidente com os dados oficiais do TSE (Tribunal Superior Eleitoral). Serve para quem quer ver o resultado do Brasil e de cada estado num mapa, sem números inventados. Um coletor busca os arquivos públicos do TSE a cada 15 segundos, confere as contas e publica arquivos prontos; o site só lê esses arquivos. Para acompanhar, basta abrir eleicoes.inema.club; para rodar o seu, você só precisa de Python 3.
A coleta lê o TSE e grava arquivos; o contrato define o formato desses arquivos; o painel só lê os arquivos e desenha a tela. A coleta não sabe nada de tela, e o painel nunca fala com o TSE.
Baixa só o estado que mudou. Antes de publicar, confere: votos dos candidatos = válidos; válidos + brancos + nulos = total; seções nunca diminuem. Se algo não fecha, aquele estado não é publicado e fica o último valor válido.
Central, com mapa real do Brasil que se preenche estado por estado, e Clássica, com 4 estilos (noite, papel, telejornal e alto contraste). Clique num estado e abre o painel dele.
Botão Simulação no menu: a apuração vai de 0% a 100% em cerca de um minuto, com nomes fictícios e com eleitorado, comparecimento, brancos e nulos de cada estado tirados do 1º turno.
Quem visita o site só baixa arquivos prontos. O único que conversa com o TSE é o coletor, uma vez a cada 15 segundos. O manifesto (latest.json) é a lista do que está valendo agora; ele é sempre o último arquivo publicado, para nunca apontar para um arquivo que ainda não chegou.
O coletor pede o índice com etiqueta de versão (ETag). Sem novidade, o TSE responde "não mudou" e nada é baixado.
Percentuais vêm do próprio TSE. O que é conta do painel (diferença entre os dois, por exemplo) aparece marcado como calculado.
Cada número publicado traz a hora oficial do TSE, a hora da coleta, a versão e a impressão digital (sha256) do arquivo original.
Para só acompanhar a apuração: nada, é abrir o site. Para rodar o seu painel:
Versão 3.8 ou mais nova. O coletor e o servidor de teste usam só a biblioteca padrão: não precisa instalar pacote. Os comandos são para Linux ou macOS (bash); no Windows, use o WSL.
python3 --versionPara baixar o projeto.
git --versionSó se quiser publicar na internet. Precisa de Node.js e do wrangler logado na sua conta.
npx wrangler loginComandos reais do repositório, na ordem. Rode a partir da pasta do projeto.
Clona o repositório público.
git clone https://github.com/inematds/eleicoes2026 cd eleicoes2026
Sobe o servidor de teste em segundo plano (o & no fim) e abre o painel no modo simulação acelerada. Não precisa do TSE nem de dados. O servidor não mostra nada na tela; ele fica rodando até você parar.
python3 coleta/servidor_local.py --pasta site --porta 8470 & # abra no navegador: http://localhost:8470/?sim=1 # não pare ainda: o passo 4 usa este servidor. Para parar no fim: pkill -f "porta 8470"
Lê os dados finais do 1º turno (eleição 6257, 12 candidatos), confere tudo e publica em saida/teste1t/data. Rodando de novo, o TSE responde "não mudou".
python3 coleta/coletor.py --saida saida/teste1t --eleicao 6257 --turno 1 --pleito 3220 --n-cand 0 --uma-vez
No TSE, o pleito é a votação de um dia (3220 = 04/10/2026) e cada pleito tem as suas eleições (6257 = Presidente no 1º turno); --n-cand 0 desliga a conferência da quantidade de candidatos (no 1º turno são 12) e --uma-vez roda um ciclo só. Os passos 3, 4 e 5 precisam de internet: os dois primeiros acessam resultados.tse.jus.br e o 5 baixa de lá os dados do 1º turno que servem de base à simulação.
Fica vigiando o TSE a cada 15 segundos (eleição 6258, Presidente). Depois aponte o site para os dados oficiais.
python3 coleta/coletor.py --saida saida/oficial --intervalo 15 & ln -sfn ../saida/oficial/data site/data # o site passa a ler os dados oficiais sleep 20; cat saida/oficial/status.json # último ok, erros, bloqueios
O & no fim da primeira linha deixa o coletor rodando em segundo plano, junto com o servidor do passo 2; o sleep 20 espera o 1º ciclo antes de mostrar o status. Abra http://localhost:8470/ (sem ?sim=1): os dados aparecem depois do 1º ciclo, uns 15 segundos. Até a apuração começar (25/10, por volta das 17h), o painel mostra "Aguardando apuração" com tudo zerado: é o normal. Para parar o coletor: pkill -f "saida/oficial".
Um servidor local imita o TSE com problemas de propósito: arquivo corrompido, seções diminuindo, índice e arquivos fora de ordem. O coletor tem de passar por tudo sem publicar nada errado.
mkdir -p saida/tsefalso python3 coleta/servidor_local.py --pasta saida/tsefalso --porta 8471 & python3 coleta/simular.py --saida saida/simlixo/data --intervalo 6 --uma-vez --modo-tse saida/tsefalso & timeout 240 python3 coleta/coletor.py --saida saida/testemock --base http://127.0.0.1:8471/ --intervalo 3
O coletor para sozinho em 4 minutos (timeout 240), tempo para a simulação ir de 0% a 100%. Deu certo se saida/testemock/status.json mostrar pendentes e bloqueios vazios e grep BLOQUEIO saida/testemock/coleta.jsonl mostrar um bloqueio de SP (arquivo corrompido) e outro de RJ (seções diminuíram); BLOQUEIO é o nome do evento no log. O simulador termina sozinho; depois pare o servidor falso: pkill -f "porta 8471". Antes de começar, o simulador baixa uns 29 arquivos do TSE; com internet lenta, aumente o timeout.
Troque o domínio em ferramentas/cloudflare/wrangler.toml pelo seu e rode o publicador: ele envia ao Cloudflare a cada mudança dos dados.
python3 ferramentas/publicar_cf.py --laco 20
O wrangler é a ferramenta de linha de comando do Cloudflare; o publicador roda npx --yes wrangler@4 deploy, por isso o npx wrangler login dos pré-requisitos é obrigatório. Ele envia saida/oficial/data para a raiz do site e, se existir, a simulação em saida/simficticio/data para /simulacao/; então o coletor do passo 4 precisa estar rodando. Para publicar também a simulação, gere antes: python3 coleta/simular.py --saida saida/simficticio/data --intervalo 60 --ficticio &. O publicador fica rodando e vigiando; para parar, Ctrl+C. O domínio tem de estar numa zona da sua conta Cloudflare (zona = um domínio administrado nela).
Em municipios.inema.club cada estado aparece com os seus municípios desenhados. A cidade começa cinza e fica vermelha ou azul, na cor de quem lidera nela; quanto mais forte a cor, mais seções já foram apuradas. No painel, o item Municípios do menu e o botão Ver os municípios no quadro do estado levam direto para lá.
Escolha o estado nos botões de cima. Passe o mouse ou o dedo numa cidade para ver os números; clique para abrir o quadro completo dela. Tem zoom e busca pelo nome.
Barra com o total de cada candidato no estado (soma das cidades já apuradas, marcada como cálculo do INEMA) e gráfico da evolução ao longo da noite.
Lista das 10 cidades em três ordens: maiores (mais eleitores), mais apuradas e 100% apuradas.
Coletor, arquivos e site próprios. O coletor lê os 27 índices por estado do TSE e baixa só as cidades que mudaram, as que esperam há mais tempo primeiro. Se ele parar, o painel principal não é afetado.
Cada cidade passa pelas mesmas regras do painel. Uma cidade com conta que não fecha fica com o último valor bom; o resto do estado segue.
Desenho dos 5.570 municípios vindo da malha oficial do IBGE, ligado ao TSE pelo código IBGE de cada cidade.
Depois do passo 1 do guia (projeto baixado). Comandos reais do repositório, a partir da pasta do projeto.
# 1. (opcional) o desenho já vem no repositório; isto o refaz a partir da malha do IBGE python3 municipios/gerar_malhas.py # 2. coletor do 2º turno (fica rodando; a cada 15 s) python3 municipios/coletor_mun.py --saida saida/municipios & # 3. site local ln -sfn ../../saida/municipios/data municipios/site/data python3 coleta/servidor_local.py --pasta municipios/site --porta 8471 & # abra: http://localhost:8471/ # ou a simulação: http://localhost:8471/?sim=1
Detalhes, testes com o 1º turno e limites conhecidos: municipios/README.md.
Em eleicoes.inema.club/projecao.html (item Projeção do menu) o INEMA estima o resultado final a partir dos votos já apurados. O número parcial engana porque as cidades pequenas e algumas regiões fecham antes; a projeção corrige isso. É estimativa, sempre marcada como tal: quem vence é quem o TSE declarar eleito.
Nas cidades que já encerraram, comparamos o 1º e o 2º turno e estimamos para onde foi cada grupo (eleitores de cada candidato, brancos e nulos, quem não votou), por região, estado, porte e perfil da cidade. Depois aplicamos isso no 1º turno das cidades que faltam.
Cada número vem com uma faixa provável. Testamos com a eleição real de 2022 e com a simulação: com 5% das cidades encerradas o erro médio foi de 0,3 ponto, contra 4,7 do número parcial, e a faixa conteve o resultado final em 98,7% dos 224 cenários.
O botão Ver por estado mostra cada estado numa linha, com barra, faixa e o apurado do TSE. Estado com pouca apuração aparece como “instável”. Nos testes, a faixa dos estados acertou em 95,5% dos casos.
Quantos votos válidos ainda faltam e que fatia deles o candidato que está atrás precisaria para virar, comparado com o que a projeção indica.
Cada projeção publicada fica guardada, sem ser reescrita, e vira um gráfico comparando a projeção com o apurado do TSE. Dá para conferir depois onde acertou e onde errou.
Só aparece com pelo menos 250 cidades encerradas, 15 em cada região, 3 em cada um de 20 estados e 1% do eleitorado. Não usa pesquisa de opinião, só votos oficiais do TSE. Na simulação, não aparece.
No painel, a seção Fonte e auditoria mostra o dado da tela com o link para o arquivo oficial do TSE, os horários (totalização, geração, coleta), a versão e a impressão digital (sha256), além de como buscamos, o que conferimos e como qualquer pessoa pode conferir. O botão Compartilhar abre o menu do celular ou copia o link, sem servidor e sem custo.
# teste com a eleição de 2022 (dados abertos do TSE em saida/backtest2022/bruto) python3 projecao/backtest_2022.py saida/backtest2022/bruto # medição da faixa (vários cenários, em paralelo) python3 projecao/calibracao.py saida/backtest2022/bruto 14 # serviço: recalcula quando os dados mudam e grava saida/oficial/data/projecao.json python3 projecao/projetar.py --laco 60
Código e detalhes: projecao/. Precisa de numpy e scipy.
Com o resultado final do TSE, o painel ganhou páginas que comparam o 1º e o 2º turno cidade a cidade, sempre separando o que é fato (conta sobre os números do TSE) do que é estimativa (modelo da Projeção). Todas estão no menu do painel.
O que mudou do 1º para o 2º turno em cada cidade e estado, cidades que viraram, senado e governador comparados com presidente.
De onde veio a diferença, onde ela se concentrou e o papel do comparecimento.
Brasil = soma dos estados + exterior, cada estado = soma das cidades, integridade dos arquivos baixados e o exterior seção a seção pelos boletins de urna.
Aliados eleitos de cada lado, onde o voto se dividiu e as explicações possíveis, rotuladas como hipótese.
Como Lula ganhou 10,4 milhões de votos do 1º para o 2º turno: a conta que sempre fecha, a "coincidência" que não prova nada e a checagem dos gráficos que circularam.
Chat grande à direita de todas as páginas: uma IA (Claude) responde só com os números do site e diz de qual página eles vêm. As conversas são gravadas de forma anônima para análise.
Por que o painel aguenta milhões de pessoas sem derrubar servidor, quanto custa, a VPS de reserva e as técnicas usadas: página Como foi feito e ARQUITETURA.md.
Imagens da simulação (nomes fictícios). No dia da eleição, os mesmos painéis mostram os dados oficiais.


A primeira versão foi feita para o 2º turno de 25/10/2026.