Em agosto de 2026, o X (antigo Twitter) fez algo raro entre as redes sociais: publicou o código que decide o que aparece no seu "Para Você". Qualquer pessoa pode baixar e ler. E, no meio de milhares de arquivos que ordenam posts por curtidas, tempo e afinidade, existe um que não fala de matemática de engajamento. Fala de política. Fala de eleição. E fala do Brasil — pelo nome.
O arquivo se chama brazil_2026_election_filter.rs. São 1.573 linhas. Nenhum outro país do planeta tem um arquivo assim no algoritmo do X. Não há um usa_2026, um france_2027, um india_filter. Só o Brasil. Este texto explica, em linguagem simples, o que esse código faz, quem ele atinge, de onde veio a ordem para escrevê-lo — e por que ele diz muito sobre o país em que vivemos.
01A agulha no palheiro
Imagine uma biblioteca com dez mil livros de receitas, todos sobre como equilibrar sabores. Aí, no meio, você encontra um único livro que ensina a esconder um ingrediente específico do prato — e só naquela cidade. É essa a sensação de quem abre o repositório do X e tropeça no filtro brasileiro.
Todo o resto do algoritmo é genérico: mede o que engaja, o que é recente, do que você gosta. O brazil_2026_election_filter.rs é a exceção absoluta. Ele não pergunta se o post é bom, verdadeiro ou popular. Ele pergunta uma coisa só: quem escreveu isso está na lista? Se estiver, o post desaparece do seu "Para Você".
E há um requinte de ironia no calendário. O código foi ao ar em 13 de agosto de 2026 — exatamente três dias antes de 16 de agosto, a data em que a lei brasileira permite o início da propaganda eleitoral. Ou seja: a máquina de esconder candidatos foi ligada quase no minuto em que a corrida começou.
Não é preciso ser programador para sentir o peso disso. Veja como o arquivo se abre — cru, sem rodeios. São as suas 30 primeiras linhas, exatamente como estão no repositório público:
1use rustc_hash::FxHashSet;2use std::sync::LazyLock;3 4use crate::models::candidate::PostCandidate;5use crate::models::query::ScoredPostsQuery;6use xai_candidate_pipeline::filter::{Filter, FilterResult};7 8// Brazil 2026 election filter9 10// Application providers that use a recommendation system for users must exclude from the11// results the channels and profiles reported to the Electoral Court under the terms of12// § 1º of this article and, except in cases of paid boosting, the content posted on them.13 14// https://dadosabertos.tse.jus.br/dataset/candidatos-202615 16// User ids below are obfuscated; usernames are included for transparency.17 18// OmarAzizSenador deleted his account at the time this code was written.19 20/// User ids reported to the Electoral Court for the Brazil 2026 election.21static BRAZIL_2026_ELECTION_USER_IDS: LazyLock<FxHashSet<u64>> = LazyLock::new(|| {22 FxHashSet::from_iter([23 // @renildo24 14160928,25 // @renatoroseno26 14492205,27 // @pedro_lupion28 15022409,29 // @Sen_Cristovam30 20242549,
02Como o corte funciona — e por que ele é cego
O mecanismo é de uma simplicidade brutal. O código carrega uma lista fixa de identificadores e, para cada post que poderia entrar no seu "Para Você", faz uma sequência curta de perguntas. Não há nota, não há gradação, não há "reduzir um pouco o alcance". É tudo ou nada: o post passa inteiro ou some por completo.
Isso não é interpretação nossa: está escrito, em texto aberto, no próprio arquivo. Abaixo, o código real — o cabeçalho, onde a empresa cita a base legal e a fonte do TSE, e a função que decide o corte. É este o trecho que circulou pela internet:
8// Brazil 2026 election filter9 10// Application providers that use a recommendation system for users must exclude from the11// results the channels and profiles reported to the Electoral Court under the terms of12// § 1º of this article and, except in cases of paid boosting, the content posted on them.13 14// https://dadosabertos.tse.jus.br/dataset/candidatos-202615 16// User ids below are obfuscated; usernames are included for transparency.17 18// OmarAzizSenador deleted his account at the time this code was written.19 20/// User ids reported to the Electoral Court for the Brazil 2026 election.21static BRAZIL_2026_ELECTION_USER_IDS: LazyLock<FxHashSet<u64>> = LazyLock::new(|| {22 FxHashSet::from_iter([23 // @renildo24 14160928,47 // @ManuelaDavila48 25858078,53 // @cirogomes54 33374761,75 // @FlavioBolsonaro76 40053694, ⋮ // … 665 perfis no total …1359 fn is_excluded_author(user_id: u64, followed_user_ids: &FxHashSet<u64>) -> bool {1360 BRAZIL_2026_ELECTION_USER_IDS.contains(&user_id) && !followed_user_ids.contains(&user_id)1361 }1363 fn should_remove(candidate: &PostCandidate, followed_user_ids: &FxHashSet<u64>) -> bool {1364 let is_excluded = |user_id: u64| Self::is_excluded_author(user_id, followed_user_ids);1365 if is_excluded(candidate.author_id) { return true; }1368 if candidate.retweeted_user_id.is_some_and(is_excluded) { return true; }1371 if candidate.quoted_user_id.is_some_and(is_excluded) { return true; }1376 candidate.ancestor_users.iter().copied().any(is_excluded)1377 }
Repare no que não está ali. Não há "se o post for mentira". Não há "se violar as regras". Não há "se for muito compartilhado". A condição é puramente de identidade: ser candidato. Um mecanismo assim não modera conteúdo — modera pessoas.
03Quem está na lista — e o que os dados revelam
Aqui vem a primeira surpresa contraintuitiva. Ao ver "lista de perfis removidos", quase todo mundo imagina uma lista de punidos — gente que aprontou e foi para o índex. Não é isso. Os 665 identificadores saem do dataset público do próprio TSE (candidatos-2026): estar ali é consequência de ter se candidatado, não castigo.
Mas há um detalhe que muda a leitura — e que salta aos olhos de quem conhece os números da eleição brasileira: 665 é pouquíssima gente. Só para deputado federal, o Brasil registrou mais de 10 mil candidatos em 2022; somando todos os cargos, são dezenas de milhares de candidaturas. Ou seja, o filtro não pega "todos" — pega os 665 perfis que foram efetivamente informados à Justiça Eleitoral e casados a uma conta no X. Na prática, é a nata: os nomes com presença digital que realmente pesa.
Por isso, quando cruzamos os nomes que aparecem em comentário no código, o retrato que emerge não tem lado. Está lá o espectro inteiro, do PT ao PL, da esquerda à direita, do governo à oposição:
Esse é o achado que desarma qualquer leitura de "censura contra a direita" ou "censura contra a esquerda". O filtro é simétrico: pega Lula e Flávio, Alckmin e Moro, com exatamente o mesmo corte — ainda que seja uma seleção (665 nomes), não a lista inteira de candidaturas. A questão, como veremos, não é quem ele silencia — é o que ele desliga: a própria capacidade de um candidato ser descoberto por quem ainda não o segue.
Dois detalhes finais dão o tom da coisa. Primeiro: os números que identificam cada perfil estão ofuscados no código, mas os @ vêm escritos, linha a linha, em comentário — "para transparência". Segundo, e quase cômico: há uma nota editorial dentro do programa registrando que @OmarAzizSenador apagou a conta antes de o código ir ao ar. O senador saiu do X, mas seu lugar na lista ficou lá, documentado.
04De onde vem a ordem: uma resolução, não uma lei
O X não inventou esse filtro por conta própria. Ele está cumprindo uma norma brasileira — e aqui entra o ponto que merece atenção de quem se preocupa com o poder do Judiciário eleitoral. A base não é uma lei aprovada pelo Congresso. É uma resolução do TSE.
O código cita, em inglês, a fonte: o artigo 28, § 1º-A da Resolução TSE nº 23.610/2019, na redação dada pela Resolução nº 23.732, de fevereiro de 2024. O texto determina que os provedores que usam sistema de recomendação deverão excluir dos resultados os canais e perfis informados à Justiça Eleitoral — e o conteúdo que eles postam.
"Os provedores de aplicação que utilizarem sistema de recomendação (…) deverão excluir dos resultados os canais e perfis informados à Justiça Eleitoral (…) e, com exceção das hipóteses legais de impulsionamento pago, os conteúdos neles postados." — Art. 28, § 1º-A, Res. TSE 23.610/2019, incluído pela Res. 23.732/2024
Leia de novo a parte em destaque. A norma manda apagar a descoberta orgânica — aquela que acontece de graça, quando um post viraliza e chega a quem não seguia o candidato — mas preserva o impulsionamento pago. É a própria regra que abre a exceção. E é aí que mora a distorção mais séria da história.
05De onde vieram os 665? Eles mesmos entregaram
A norma manda excluir os "perfis informados à Justiça Eleitoral". Mas informados por quem? Aqui está a parte que quase ninguém percebe: pelo próprio candidato. Pelo art. 28 da mesma resolução, ao dar entrada no registro de candidatura (o RRC), ele é obrigado a declarar os endereços das redes sociais onde pretende fazer propaganda — sob pena de multa. E o TSE despeja isso tudo num dataset público chamado, sem rodeios, "Redes sociais dos candidatos".
A consequência é irônica ao ponto de parecer piada: ninguém escolheu os 665 a dedo. Cada um deles, ao escrever "vou fazer campanha neste meu X" na papelada do registro, se colocou na lista que o apaga da descoberta orgânica. Quem declarou o X, se auto-listou. Quem não declarou — ou só pôs o Instagram — escapou do filtro.
Isso não é teoria: dá para conferir na fonte. Baixamos o dataset oficial do TSE (rede_social_candidato_2026) e cruzamos, um a um, com os 665 @ do código. O resultado é quase um laudo:
E note o descompasso: o TSE já contava 1.809 perfis de X declarados, mas o código travou em 665. A explicação reforça a impressão de que essa lista chumbada no programa é uma fotografia, não um filme: o arquivo foi publicado em 13 de agosto, e o registro de candidaturas seguiu correndo até o prazo, dias depois. Uma lista fixa não acompanha um cadastro que ainda está sendo preenchido — por isso ela já nasce incompleta e envelhecendo. É mais um sinal de que o filtro parece um gesto de conformidade (e de recado público) do que uma engrenagem robusta de produção.
06O paradoxo: quem tem dinheiro, aparece; quem viraliza, não
Pense no que essa combinação produz. De um lado, o alcance gratuito está proibido: um candidato pequeno, sem estrutura, que faz um vídeo genial e "estoura" espontaneamente, não chega mais a quem não o segue. De outro, o anúncio pago continua liberado: quem tem caixa de campanha compra alcance e aparece na tela de todo mundo.
Traduzindo: a norma que promete "equilibrar" o jogo, na prática, troca o mérito do conteúdo pelo tamanho do bolso. O Instituto Sivis já havia apontado esse efeito estrutural meses antes. Não é uma teoria conspiratória — é a leitura direta do que o texto manda e do que o código faz.
07O furo que esvazia tudo: basta seguir
Se a regra é tão dura, por que ela pode ser, ao mesmo tempo, quase inofensiva? Por causa da exceção que o próprio código carrega: se você segue a conta, o post passa. Foi a primeiríssima observação dos programadores que leram o arquivo (no Hacker News, o fórum técnico de referência).
Ou seja: quem quiser continuar vendo os 665 candidatos — todos eles — só precisa clicar em "seguir". A partir daí, o filtro nunca mais toca naquele perfil para você. A norma que pretende blindar o eleitor da "influência algorítmica" é contornada com um único toque no dedo. Ela pesa, na verdade, sobre uma pessoa específica: a que ainda não conhece o candidato — justamente aquela que a descoberta orgânica serviria para informar.
08O mundo faz o contrário
"Mas isso não é normal em democracias sérias?" É a pergunta certa. E a resposta é reveladora: não só não é a norma — em várias democracias, o que o Brasil obriga é literalmente proibido.
O contraste é quase perfeito. Nos Estados Unidos, o debate legislativo dos últimos anos foi para impedir que a plataforma reduza o alcance de um político — tratando isso como censura privada. No Brasil, a Justiça Eleitoral fez o inverso: determinou a redução de alcance como regra geral. Dois países, o mesmo problema, decisões espelhadas.
09O que a "transparência" ainda não mostra
É preciso ser justo com o outro lado. Abrir o código é, em si, um ganho: dá para ver a regra, medir seu tamanho e discutir seus efeitos — algo impossível quando o algoritmo é uma caixa-preta. E, sobre o Judiciário, é honesto registrar: não existe no repositório nenhuma regra brasileira "hardcoded" para o STF, para ordens do ministro Alexandre de Moraes ou para bloqueios por decisão judicial.
O que existe é um mecanismo genérico, num outro arquivo (tes_rules.rs): duas regras, DropLegalTakendownPostRule e DropLocalLawsTakendownPostRule, que escondem um post para leitores no país onde ele foi alvo de ordem legal. O autor continua vendo o próprio post; quem está no país da ordem, não vê. Quais ordens brasileiras alimentam esse sistema, porém, o código não diz — isso é dado de produção, que roda em tempo real e não aparece no repositório.
28pub struct DropLegalTakendownPostRule;30impl Rule for DropLegalTakendownPostRule {35 fn evaluate(&self, context: &RuleContext<'_>) -> VfAction {36 if viewer_in_withheld_country(context, legal_takedown_country) {37 return VfAction::Drop(FilteredReason::UnspecifiedReason);38 }39 VfAction::Allow40 } ⋮ // DropLocalLawsTakendownPostRule é idêntico, para "leis locais"73fn viewer_in_withheld_country(74 context: &RuleContext<'_>,75 extractor: impl Fn(&TakedownReason) -> Option<&str>,76) -> bool {79 if context.is_author_viewer() { return false; }82 let Some(viewer_country) = &viewer.country_code else { return false; };85 candidate.tweet_features.takedown.reasons90 .filter_map(extractor)91 .any(|c| c.eq_ignore_ascii_case(viewer_country))92}
10O que isso faz com a eleição
Junte as peças. Uma resolução — não uma lei — manda desligar a descoberta espontânea de todos os candidatos numa das maiores praças públicas digitais do país. Mantém aberto o caminho de quem paga. É contornável por quem já está engajado. E pesa sobre quem ainda não decidiu o voto — o eleitor que a propaganda deveria justamente alcançar.
Não é preciso enxergar má-fé para achar o desenho preocupante. Uma democracia madura discute o poder de um algoritmo em público, com transparência — e é isso que o código aberto do X permite fazer. O incômodo não está em olhar a engrenagem. Está no que se vê ao olhar: o Brasil sendo, mais uma vez, a exceção do mundo — o único país cuja loucura regulatória virou, literalmente, uma linha de programação com nosso nome.
Reportagem de Laudelino de Oliveira Lima · Baseada em fontes primárias públicas · Agosto de 2026