
Radar da Virada: um bot de Telegram pra monitor eleitoral
O que construí como voluntário num monitor da eleição de 2026: bot de Telegram, correção de segurança no Markdown pra IA, auditoria de SEO, e o que virou cada um.
De 9 a 16 de outubro de 2026, na reta final antes do segundo turno, escrevi código pro projeto de outra pessoa. Parte dele continua rodando no site. Outra parte foi entregue, funcionou e foi desligada mesmo assim.
O que é o Radar da Virada?
Um monitor do que as pessoas estavam comentando no segundo turno. De hora em hora, ele lê páginas e feeds públicos do X, do Google, do TikTok, do Kwai e do YouTube, dos dois lados, e transforma isso numa página feita pro celular: assuntos em alta, palavras que dispararam, temas medidos em pesquisa registrada e cards prontos pra mandar no zap.
A stack é pequena de propósito. HTML, CSS e JavaScript puros, sem framework e sem build, um pipeline em Python com scripts numerados rodando de hora em hora no GitHub Actions, e Cloudflare Pages Functions com KV pra cache e D1 pra contagem agregada de acessos. Ele só lê fonte pública, então não tem login nem API paga. Uma stack assim é fácil de ler e fácil de quebrar, porque não tem build nem framework entre um erro e a página que as pessoas abrem no celular.
O site já estava no ar quando entrei, então tudo o que eu acrescentasse tinha que entrar sem quebrar o que já funcionava.
O que eu construí?
A primeira peça foi um bot de Telegram pros "Temas que viram voto", a seção dos assuntos com efeito medido em pesquisa. Ele posta quando aparece um tema novo ou quando a pesquisa de um tema muda (o número, o instituto, a data ou o link) e usa o mesmo texto pronto que o site oferece pro WhatsApp, então o canal e a página dizem sempre a mesma coisa. Ele rodava fora do site, dentro do workflow de hora em hora do GitHub Actions, lendo só o JSON público e com permissão só de leitura. O que ele já tinha avisado ia pra um arquivo de estado gravado de forma atômica, então uma rodada que morresse no meio não postava a mesma pesquisa duas vezes. Na primeira rodada, ele só registrava a base e não postava nada, pra um canal novo não receber todos os temas de uma vez. O token nunca apareceu em log. Foi com testes próprios e um README de configuração, e eu rodei o bot num canal real antes de abrir o pull request.
Depois veio uma correção de segurança. A home entrega Markdown pros agentes de IA que pedem com Accept: text/markdown, e uma revisão achou que essa resposta saía sem os cabeçalhos de segurança do site. Coloquei os cabeçalhos de volta e mudei a negociação pra que o HTML ganhe sempre que o cliente aceitar os dois formatos com o mesmo peso. Este site faz a mesma coisa com uma edge function na Netlify e copia os cabeçalhos pelo mesmo motivo: a resposta em Markdown parece certa em qualquer teste que só olha o conteúdo.
A auditoria de SEO foi quase toda subtração. Uma ferramenta automática gerou uma lista enorme. Conferi cada achado no código e no site no ar, joguei fora os falsos positivos e ordenei o resto por retorno, com 14 dias pra eleição, e cada achado que sobreviveu virou uma issue pronta pra alguém pegar. Essa conferência mostrou que o site no ar estava à frente do código versionado, e corrigir qualquer coisa a partir do repositório podia publicar por cima de mudanças que já estavam em produção. Abri uma issue pra sincronizar os dois antes de qualquer correção de SEO.
Também escrevi duas regras sobre quem e o que aparece. Só aparece com nome conta verificada, de imprensa ou com 100 mil seguidores ou mais, e perfil comum aparece sem @, sem link e sem imagem. Toda pesquisa citada mostra o registro no TSE e a ficha, inclusive no texto que as pessoas encaminham. Em grupo de família, pesquisa sem número de registro é boato com porcentagem.
Pra fechar, escrevi o AGENTS.md do projeto: uma branch por issue, pull request escrito em português e o que testar antes de abrir. O mesmo arquivo orienta voluntários e agentes de código. Fiz a maior parte desse trabalho com o Claude Code, então escrever as regras pros agentes foi escrever as regras pra mim, coisa que conto nas dicas de fluxo de trabalho com Claude Code.
Fora o que entrou no projeto, construí uma API de dados abertos, só de leitura, sobre os dados do monitor, e um servidor MCP em cima dela, pra que um assistente de IA pudesse perguntar ao Radar o que estava em alta em vez de raspar a página.
Os dois funcionaram.
Alguma coisa ainda está rodando?
A correção do Markdown está no ar: peça a home em text/markdown hoje e a resposta volta com todos os cabeçalhos de segurança. A regra de quem aparece com nome e o registro no TSE em toda pesquisa também estão no site.
O bot foi entregue e funcionou, e depois quem mantém o projeto decidiu não continuar com ele. A API e o servidor MCP tiveram o mesmo destino. A decisão foi seguir operando o projeto sozinho, por segurança, mantendo algumas das minhas implementações.
Por que essa decisão faz sentido
Em eleição, quem mantém um projeto sozinho está mantendo um alvo. Cada integração que eu acrescentei vinha com algo pra vigiar: um token de bot, um workflow com permissões próprias, uma API que alguém precisa manter de pé. Menos peças e menos gente com acesso é uma postura de segurança que dá pra defender, e é o que eu diria a um cliente com uma pessoa só cuidando da produção.
Se fosse fazer de novo, perguntaria antes o que quem mantém o projeto topava operar, e só depois construiria. A duas semanas de uma votação, propor mais infraestrutura é pedir demais, por mais testada que ela esteja.
Nas mesmas semanas trabalhei no SEO e na privacidade do Tech Contra Bolsonaro, e no fim do mês construí o Voto Livre.
Código escrito pro projeto de outra pessoa é uma proposta. Quem mantém decide o que roda.