
Tech Contra Bolsonaro: SEO técnico e LGPD em 18 dias
Trabalho voluntário de SEO, AEO e privacidade num hub em Next.js feito em 18 dias pro segundo turno de 2026. Os cliques orgânicos foram de 2 pra 67 por dia na eleição.
Em 7 de outubro de 2026, um grupo de trabalhadores de tecnologia começou a construir um site com um prazo que não ia mudar de jeito nenhum: o segundo turno da eleição presidencial, 18 dias depois. Dali saiu o Tech Contra Bolsonaro, um hub com ferramentas interativas de mobilização, um manifesto aberto pra assinaturas, um feed moderado de fotos e vídeos enviados pela comunidade e um blog editorial.
Eu era um dos cerca de dez voluntários. Peguei a parte de busca (SEO, AEO e GEO) e acabei ficando também com privacidade e segurança. O coletivo fala sempre como grupo, e eu nunca fui porta-voz dele. Dentro do time, defini a ordem do trabalho de SEO, escrevi a política de privacidade que o coletivo assina e tomei várias das decisões em que o padrão "seguro" era a escolha errada pra esse site. Também escrevi boa parte do código, e continuo ajudando a manter a infraestrutura do projeto.
O site que o Google via
A engenharia por baixo era cuidadosa. O navegador nunca escrevia direto no banco: todo envio passava por uma Edge Function no Supabase que conferia o token do Cloudflare Turnstile, os campos, o tipo e o tamanho do arquivo, e o conteúdo novo ficava pendente até alguém aprovar. O CI aplicava as migrations antes de liberar o deploy de produção, e um ambiente em Docker Compose com dados de seed deixava qualquer pessoa rodar tudo na própria máquina.
O Google via outra coisa. O catálogo de ferramentas só existia depois que o JavaScript rodava, página inexistente respondia com status 200 e um H1 dizia "Carregando...".
Pra um robô de busca, o site estava quase vazio.
Quem decidiu a ordem foi o calendário
Auditei o site e separei o que encontrei em 28 issues, cada uma com severidade, estimativa de esforço, ganho esperado, dependências e critérios de aceite. Uma página que o Google encontra no dia 16 faz muito pouco por um voto no dia 18, então tudo o que travava o rastreamento veio primeiro. Essas correções entraram em 10 e 11 de outubro: 404 de verdade, a lista de ferramentas renderizada no servidor, o H1 "Carregando..." fora do ar, noindex nas páginas de envio e og:image em toda página interna, pra que o link compartilhado tivesse uma prévia decente.
Com umas dez pessoas contribuindo no tempo livre, a lista de issues fez um segundo trabalho. Qualquer pessoa pegava um item e sabia o que contava como "pronto" sem precisar me perguntar antes.
Explicando pras máquinas o que cada página é
Com o rastreamento resolvido, faltava o Google entender o que encontrava. Criei JSON-LD da organização e do site, um WebApplication pra cada ferramenta interativa, ItemList pro catálogo, breadcrumbs, WebPage e ImageObject com creditText, pra que a foto da comunidade leve o crédito que o autor escolheu. O sitemap ganhou datas lastmod reais e URLs estáveis pras mídias. Página com menos de 40 palavras de texto recebe noindex automático, e assim envio de uma linha só não dilui as páginas que importam.
Teve encanamento também. Migrei o domínio canônico com redirecionamentos 301 que preservam o caminho, criei os campos seo_title e seo_description pra quem edita escrever o texto de busca sem mexer em código, e modelei um template pras páginas completas de ferramenta.
Pros buscadores com IA, o site publica um llms.txt e uma linha Content-Signal no robots.txt: search=yes, ai-input=yes, ai-train=no. Ela diz que buscadores e respostas de IA podem usar o conteúdo do coletivo e que treinar modelo com ele não pode. Cada robô decide se respeita ou não, mas a preferência fica registrada. Já escrevi sobre por que entidades e dados estruturados pesam tanto hoje no cenário de SEO em 2026.
Assinatura é opinião política
Quem assina um manifesto político revela uma opinião política. A LGPD coloca opinião política entre os dados pessoais sensíveis (art. 5º, II) e restringe como esses dados podem ser tratados (art. 11). Num site político, com adversário motivado do outro lado, cada campo de formulário vira risco.
Escrevi a política de privacidade: bases legais, operadores, transferência internacional, prazos de retenção e os direitos do titular do art. 18. O coletivo assina como grupo, sem nomes. O telefone virou opcional, o formulário de envio passou a avisar que o crédito é público (e sugere usar pseudônimo), e a política diz quem é o responsável legal pelos dados e como falar com ele.
Depois vieram os uploads. Foto de celular tirada num ato de rua pode carregar as coordenadas de GPS de onde foi feita e o modelo do aparelho. Escrevi a remoção de metadados direto nos bytes do arquivo, sem reencodar nada, pra JPEG (inclusive progressivo e MPF), PNG, WebP, GIF e MP4. Cada formato usa uma lista de permissão, que mantém só o que o arquivo precisa pra ser exibido e joga fora todo o resto. Sai o GPS, sai o XMP, saem os boxes específicos de fabricante, e sai junto o que algum celular novo inventar de gravar no ano que vem. Os pixels decodificados e o framemd5 de cada vídeo ficaram idênticos aos originais.
Sai também o C2PA, o dado de procedência que pode provar que uma foto é autêntica. Em foto de gente num protesto, escolhi a privacidade das pessoas.
O mesmo trabalho pegou um problema maior: o CI nem publicava a Edge Function de envio.
A correção dos metadados ia passar em todos os testes e nunca chegar à produção.
Duas decisões de segurança
Endureci a Content Security Policy: tirei o unsafe-eval, restringi connect-src e frame-src, defini object-src 'none' e mantive o cache ISR da home funcionando no meio disso tudo.
O HSTS ficou sem preload, de propósito. Tirar um domínio da lista de preload dos navegadores leva meses, e o preload exige includeSubDomains, então a regra prenderia todos os subdomínios junto. A duas semanas de uma eleição, com a infraestrutura mudando todo dia, eu não queria que o site fizesse uma promessa que não dava pra desfazer. Qualquer scanner vai apontar a falta do preload, e pra esse site tudo bem.
Todo PR meu passou pela suíte completa de testes, lint, tsc, build e uma verificação num build de produção local. A suíte foi de cerca de 368 pra mais de 390 testes no caminho.
O que os números dizem, e o que não dizem
| Tech Contra Bolsonaro | techcontrabolsonaro.dev |
|---|---|
| Período | 7 a 25 de outubro de 2026, até o dia da votação |
| Equipe | Cerca de 10 voluntários, 127 pull requests e 108 issues no total |
| Minha parte | 25 pull requests, todos mergeados (cerca de 20% do total), e 33 issues, o segundo maior volume |
| Stack | Next.js 16, React 19, TypeScript, Supabase (Postgres com RLS, Storage, Edge Functions), Cloudflare Turnstile, Vercel |
| Testes | Vitest, Testing Library e Playwright |
| Cliques orgânicos do Google | De cerca de 2 pra 67 por dia, de 9 a 29 de outubro (Search Console) |
O número de cliques precisa de contexto. Em 9 de outubro o projeto tinha dois dias, e as semanas seguintes tiveram muita busca ligada à eleição. O salto mistura um site novo sendo indexado, a demanda eleitoral e o trabalho de SEO, e o Search Console não separa uma coisa da outra. O que o SEO pode reivindicar é mais estreito: quando as pessoas buscaram, as páginas podiam ser rastreadas e indexadas, e o Google e as respostas de IA recebiam uma descrição certa de cada uma.
A maioria das auditorias que eu faço vem com meses pra resolver a lista. Essa teve 18 dias, com as correções de rastreamento prontas no quarto. Nas mesmas semanas também contribuí com o Radar da Virada, e no fim do mês construí o Voto Livre.
Se a data do seu lançamento também não pode mudar, o que o Google enxerga no terceiro dia?