🏠 Home ← Artigos LaudelinoRJ
Código aberto · Investigação
Investigação · O algoritmo do X & o TSE

O único filtro eleitoral do mundo escrito num algoritmo é sobre o Brasil

O X abriu o código do "Para Você". Entre milhares de arquivos, só um trata de política — e leva o nome do nosso país. São 665 perfis de candidatos, uma ordem do TSE, e um detalhe que muda tudo: quem paga, continua aparecendo.

Publicado em 15 de agosto de 2026 · Apuração sobre o repositório aberto xai-org/x-algorithm, a Resolução TSE 23.610/2019 (com a redação de 2024) e o direito comparado · Todas as afirmações técnicas são verificáveis no código público.
Montagem: o ministro Alexandre de Moraes à esquerda, o logotipo do X (Twitter) ao centro e Elon Musk à direita.
De um lado, o TSE — que determinou a regra. Do outro, o X de Elon Musk — que a escreveu no código e a tornou pública. No meio, 665 candidatos e a descoberta orgânica desligada às vésperas da eleição.

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.

Topo do X mostrando a aba 'Para você' destacada, com uma seta vermelha apontando para ela, ao lado da aba 'Seguindo'.
É desta aba que a matéria trata. O "Para você" é a vitrine automática do X — a que mostra posts de quem você não segue. É exatamente aqui que o filtro brasileiro age: ele não apaga nada da aba "Seguindo" nem do perfil do candidato, mas remove os 665 perfis desta descoberta orgânica.

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.

1
país no mundo com filtro eleitoral nomeado no código do X — o Brasil
665
perfis de candidatos embutidos, um a um, no programa
1.573
linhas de código só para essa regra (39,9 KB)
3 dias
entre a publicação (13/8) e o início legal da propaganda (16/8)
0
exceções por relevância, engajamento ou tipo de conteúdo
1 furo
basta seguir a conta para a regra deixar de valer

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:

xai-org / x-algorithm / … / brazil_2026_election_filter.rs Rust · linhas 1–30
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,
As 30 primeiras linhas, verbatim. Antes mesmo de qualquer lógica, o arquivo já entrega tudo: a norma traduzida (linhas 10–12, com a ressalva do impulsionamento pago em destaque), a fonte no TSE (14), o aviso de que os IDs são ofuscados mas os @ ficam "para transparência" (16), a nota sobre a conta apagada (18, em destaque) e o início da lista dos 665 — em ordem de ID, das contas mais antigas para as mais novas.

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.

Um post candidato ao seu "Para Você" O autor — ou um RT, citação ou fio da conversa — tem alguém dos 665? NÃO Aparece normalmente SIM Você segue essa conta? (a única exceção do código) SIM Aparece NÃO SOME do "Para Você" corte binário, sem meio-termo
A árvore de decisão do filtro. O post é removido se o autor está na lista, se é um retweet ou uma citação de alguém da lista, ou se responde a um fio que contenha alguém da lista. A única forma de o post sobreviver é você já seguir a conta. Não seguiu? Nunca mais vê aquilo por descoberta orgânica.

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:

xai-org / x-algorithm / home-mixer / filters / brazil_2026_election_filter.rs Rust
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    }
O código real, reproduzido fielmente (com linhas omitidas por espaço, marcadas por ). O cabeçalho cita a norma — "exceto nos casos de impulsionamento pago" — e a fonte no TSE. A função should_remove remove o post se o autor, o retweet, a citação ou um antecessor do fio estiver na lista. Confira em github.com/xai-org/x-algorithm.

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.

+10 mil
candidatos só a deputado federal (2022) — referência de escala
665
perfis no filtro do X — os informados e com conta identificada
~2%
é a fatia que 665 representa perto do universo de candidaturas

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:

Campo da esquerda
@LulaOficial@geraldoalckmin@costa_rui@cirogomes@JoaoCampos@ManuelaDavila@natbonavides@requiaooficial@RenanSantosMBL
Centro / centrão
@eduardopaes@HugoMottaPB@raquellyra@OmarAzizSenador@delegadowaldir@ciro_nogueira
Campo da direita
@FlavioBolsonaro@CarlosBolsonaro@tarcisiogdf@SF_Moro@RomeuZema@MarcosRogerio@CarolDeToni@GeneralGirao
Amostra dos perfis confirmados no arquivo, por campo político. É o que dá para ler nos comentários do código — a lista tem 665 nomes, uma fração dos mais de 20 mil que disputam uma eleição geral. O padrão importa nos dois sentidos: não é perseguição a um grupo (os dois campos estão lá), mas também não é "todo mundo" — é a seleção dos perfis com alcance real no X. Classificação por espectro público; siglas mudam, o campo é aproximado.

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.

Dezembro de 2019
TSE edita a Resolução 23.610/2019, sobre propaganda eleitoral e internet.
27 de fevereiro de 2024
Resolução 23.732/2024 acrescenta o § 1º-A: plataformas com recomendação devem excluir perfis informados à Justiça Eleitoral — mas mantêm o impulsionamento pago.
13 de agosto de 2026
X publica o brazil_2026_election_filter.rs no repositório aberto, com os 665 IDs.
16 de agosto de 2026
Começa oficialmente a propaganda eleitoral — com a descoberta orgânica de candidatos já desligada.

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:

De onde saem os 665 perfis do código cruzando com o que os candidatos declararam ao TSE 529 114 22 79,5% — X autodeclarado (casou exato) 17,1% — mesmo @ declarado em outra rede 3,3% — sem rastro (conta apagada / registro tardio / typo)
96,7% dos 665 são rastreáveis à autodeclaração do candidato. Cruzamento feito por nós entre os @ do código e o dataset oficial rede_social_candidato_2026 do TSE (47.197 endereços declarados). Os 3,3% sem rastro batem com o esperado: contas apagadas (o caso @OmarAzizSenador, e também @bolsonaro__jr), registros de última hora ou erros de digitação.
47.197
endereços de redes sociais declarados por candidatos ao TSE
1.809
perfis de X/Twitter distintos declarados — bem mais que os 665 do filtro
96,7%
dos 665 do código têm rastro na autodeclaração oficial

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.

Como fizemos o cruzamento. Extraímos os 665 @ dos comentários do código e os comparamos com os handles de twitter.com/x.com presentes no dataset aberto rede_social_candidato_2026 do TSE (arquivo BRASIL, gerado em 15/08/2026). "Casou exato" = o mesmo handle aparece declarado como X. "Outra rede" = o mesmo @ aparece declarado em outra plataforma (o candidato existe e declarou redes; reusa o apelido). Qualquer pessoa pode refazer a conta com os dois arquivos públicos.

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.

Dois caminhos de um candidato até a sua tela Viralização orgânica (grátis) 🚫 O post bom que "estoura" sozinho NÃO alcança quem não segue. BLOQUEADO pela regra Impulsionamento pago (R$) Quem tem caixa de campanha compra alcance e aparece. LIBERADO pela regra
O efeito que a norma desenha. Ao desligar a descoberta gratuita e manter o anúncio pago, a regra desequilibra a favor de quem tem dinheiro — o oposto do que uma norma de "igualdade" deveria buscar.

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.

O resumo do paradoxo. A regra é severa no papel (corte binário, todos os candidatos, sem meio-termo), fácil de contornar para o já engajado (é só seguir) e eficaz só contra o desinformado (quem não segue ninguém). Ela não protege o debate — apenas o empobrece para quem chega de fora.

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.

Brasil
OBRIGA a esconder candidatos
Res. do TSE manda excluir perfis da recomendação. Único país com filtro nomeado no algoritmo do X.
União Europeia
Exige transparência, não remoção
O DSA pede que a plataforma explique e avalie riscos do algoritmo — mas não manda apagar candidatos.
EUA (FL e TX)
PROÍBE esconder candidatos
Leis da Flórida e do Texas vedam "deplatform" e shadowban de candidatos — exatamente o que o TSE exige.
O mesmo tema, três respostas opostas. Onde os EUA veem uma liberdade a proteger (não silenciar candidato), o Brasil vê uma obrigação a impor (silenciar todos por padrão). A Europa fica no meio: quer o algoritmo auditável, não censor. O Brasil é o único que transformou "esconder candidato" em código.

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.

xai-org / x-algorithm / visibility-filtering / rules / tes_rules.rs Rust
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}
O mecanismo genérico de bloqueio judicial (trecho real, com linhas condensadas). Repare no que ele é e no que não é: a regra só derruba o post se o leitor está no país que emitiu a ordem (linha 91) — e nunca para o próprio autor (linha 79, em destaque). Em nenhum lugar aparece "Brasil", "STF" ou o nome de um ministro: quais ordens entram aqui é dado de produção, invisível no código. Ver a engrenagem não é ver o que ela tritura.
O limite real da transparência. O código aberto mostra o mecanismo (a máquina que aplica bloqueios judiciais por país), mas não a lista (quais decisões brasileiras estão nela, agora). A parte mais sensível — o alcance concreto das ordens judiciais — permanece invisível. Ver a engrenagem não é o mesmo que ver o que ela está triturando.

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.

Ponto de cautela, para não exagerar. O repositório é um retrato publicado do algoritmo, não a prova de que o binário rodando em produção seja idêntico. E o próprio X anunciou a mudança publicamente. Nada aqui é vazamento ou pegadinha: é a leitura de um código que a empresa colocou, de propósito, à vista de todos. Se os fatos evoluírem, este texto será atualizado.
Compartilhe esta reportagem

Reportagem de Laudelino de Oliveira Lima · Baseada em fontes primárias públicas · Agosto de 2026