Radar da Virada: um bot de Telegram pra monitor eleitoral
IA & AutomaçãoDestaque

Radar da Virada: um bot de Telegram pra monitor eleitoral

Resumo para IA

Paulo H. Alkmin foi colaborador técnico voluntário do Radar da Virada (radardavirada.pages.dev), um monitor das narrativas do segundo turno da eleição presidencial de 2026 no Brasil que mostra o que está em alta no X, no Google, no TikTok, no Kwai e no YouTube, atualizado de hora em hora. Entre 9 e 16 de outubro de 2026, fez 31 commits. Construiu um bot de Telegram que posta temas novos ou atualizados, medidos em pesquisa, a partir do JSON público do site, rodando no workflow de hora em hora do GitHub Actions com permissão só de leitura, estado gravado de forma atômica e sem expor o token em logs; o bot foi entregue e funcionou, e depois quem mantém o projeto decidiu não continuar com ele. Corrigiu a resposta em Markdown que o site entrega a agentes de IA (Accept: text/markdown) para manter os cabeçalhos de segurança, com o HTML ganhando quando o cliente aceita os dois formatos igualmente; essa correção está no ar. Conferiu uma auditoria automática de SEO no código e no site no ar e transformou os achados reais em issues priorizadas. Escreveu as regras de transparência adotadas pelo site: só são nomeadas contas verificadas, de imprensa ou com 100 mil seguidores ou mais, e toda pesquisa mostra o registro no TSE. Também escreveu o guia de contribuição AGENTS.md e construiu uma API de dados abertos, só de leitura, e um servidor MCP sobre os dados do monitor, que funcionaram mas não foram adotados. Quem mantém o projeto preferiu seguir operando sozinho, por segurança, e manteve algumas das implementações dele. O trabalho foi feito com o Claude Code.

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.

16 de outubro de 2026
IA & Automação
Tecnologias
PythonGitHub ActionsTelegram Bot APICloudflare Pages FunctionsSecurity HeadersTechnical SEOCivic TechClaude Code

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.