Voltar para o Blog

Algoritmo do X Aberto em 2026: Copiar o Link Vale 40 Curtidas

Olá HaWkers, o repositório xai-org/x-algorithm no GitHub tem um arquivo de configuração chamado params.rs, dentro da pasta vm-ranker, que virou assunto nesta semana. Nele estão, em texto puro, os pesos que o X usa para decidir o que aparece no feed "Para você". E os números são bem diferentes do que a maioria das pessoas imagina: copiar o link de um post pesa 20.0, uma resposta pesa 5.0 e uma curtida pesa só 0.5. Visitar o perfil do autor pesa exatamente 0.0.

Faça a conta: copiar o link vale 40 curtidas. E uma denúncia pesa -234.0, o equivalente a apagar 468 curtidas de uma vez.

Se você publica no X, seja para divulgar projeto, buscar vaga ou só conversar sobre tecnologia, a pergunta é direta: você está otimizando para a métrica que o algoritmo realmente valoriza? Neste artigo eu vou mostrar o que o código diz, como a nota final é calculada, o que esses pesos não significam (tem muita leitura errada circulando) e como simular a pontuação em JavaScript para entender o efeito de cada sinal.

O Que o X Abriu, e Quando

Essa não é a primeira vez que a rede abre o código de recomendação. Em 31 de março de 2023, ainda como Twitter, a empresa publicou o repositório twitter/the-algorithm. Na época, o README do modelo de ranqueamento trazia uma tabela de pesos famosa: resposta com 13.5, curtida com 0.5 e denúncia com -369.0.

A versão atual é outro projeto, com outra arquitetura. Segundo o histórico do repositório xai-org/x-algorithm:

  • 20 de janeiro de 2026: primeira publicação, com o código do Home Mixer, do Thunder e do Phoenix, sob licença Apache 2.0.
  • 15 de maio de 2026: segunda leva, com pipeline de inferência e uma versão reduzida do modelo Phoenix.
  • 13 de agosto de 2026: a grande atualização, que trouxe os pesos de pontuação, os filtros de visibilidade e o código treinável do Phoenix.
  • Outubro de 2026: o README registra ajustes como a melhora na previsão de tempo gasto lendo (8 de outubro) e o treino da recuperação com posts que as pessoas leram até o fim (13 de outubro).

Um ponto importante: os pesos treinados do modelo de produção não foram publicados. O que está aberto é o código, a configuração e um modelo de demonstração. Então dá para entender a lógica, mas não dá para rodar o feed do X na sua máquina.

Como a Nota Final de Um Post É Calculada

A parte mais mal interpretada de toda essa história está aqui. O README do repositório descreve a fórmula assim:

Nota Final = Σ (peso_i × P(ação_i))

O modelo Phoenix, um transformer de ranqueamento baseado no Grok, recebe o seu histórico e um post candidato e prevê a probabilidade de você fazer cada ação: curtir, responder, compartilhar, denunciar e assim por diante. Os pesos multiplicam essas probabilidades, não a contagem bruta de curtidas que o post já tem.

Isso muda tudo. O peso 20.0 do "copiar link" não significa que cada link copiado no seu post vale 20 pontos para sempre. Significa que, quando o modelo acha provável que aquela pessoa copie o link daquele post, o post sobe muito na fila dela.

O próprio repositório avisa contra a leitura ingênua: não é correto olhar que a denúncia pesa centenas de vezes mais que a curtida e concluir que uma denúncia cancela centenas de curtidas. A probabilidade de alguém denunciar um post comum é minúscula, então o termo negativo costuma ser pequeno na soma.

A Tabela Completa dos Pesos Positivos

Estes são os valores do arquivo vm-ranker/params.rs, na versão que circulou nesta semana:

Ação Parâmetro Peso
Compartilhar copiando o link ShareViaCopyLinkWeight 20.0
Responder ReplyWeight 5.0
Compartilhar por DM ShareViaDmWeight 5.0
Citar (quote) QuoteWeight 5.0
Seguir o autor FollowAuthorWeight 4.0
Compartilhar (genérico) ShareWeight 2.0
Repostar RetweetWeight 1.0
Curtir FavoriteWeight 0.5
Tempo lendo após clicar ContClickDwellTimeWeight 0.4
Clicar no post ClickWeight 0.3
Abrir link externo OpenLinkWeight 0.2
Abrir vídeo VideoOpenWeight 0.07
Expandir foto PhotoExpandWeight 0.05
Clicar no perfil ProfileClickWeight 0.0

Três leituras saltam aos olhos:

  1. Compartilhar fora da plataforma é rei. Copiar o link é o sinal mais forte de todos. Faz sentido do ponto de vista do produto: quem copia um link está levando o post para o WhatsApp, para o Slack, para um grupo. É a prova mais forte de que o conteúdo tem valor fora da bolha.
  2. Conversa vale mais que aplauso. Resposta, citação e DM pesam 10 vezes mais que a curtida.
  3. Repost vale pouco. Com 1.0, o repost está bem abaixo da resposta. O algoritmo prefere o post que gera conversa ao post que só é replicado.

Os Sinais Negativos

Do outro lado da balança, o arquivo traz os pesos que derrubam um post:

Ação Parâmetro Peso
Denunciar ReportWeight -234.0
Silenciar o autor MuteAuthorWeight -58.8
"Não tenho interesse" NotInterestedWeight -47.52
Bloquear o autor BlockAuthorWeight -31.2
Passar direto sem ler NotDwelledWeight -0.02

Repare que silenciar pesa quase o dobro de bloquear. Uma leitura possível: quem silencia continua seguindo, mas diz claramente "não quero ver isso", enquanto o bloqueio muitas vezes é sobre a pessoa, não sobre o conteúdo. O código não traz comentários explicando a escolha, então trate isso como hipótese.

Em comparação com a tabela de 2023, a denúncia ficou menos punitiva (de -369.0 para -234.0) e a resposta perdeu força (de 13.5 para 5.0). O grande vencedor da mudança é o compartilhamento por link, que nem aparecia com destaque na versão antiga.

Simulando a Nota em JavaScript

Para sentir o efeito dos pesos, nada melhor que código. O exemplo abaixo usa os valores reais do params.rs e probabilidades inventadas para dois posts hipotéticos. As probabilidades são ilustrativas: no X, quem as calcula é o Phoenix.

// Pesos copiados do vm-ranker/params.rs (xai-org/x-algorithm)
const PESOS = {
  favorite: 0.5,
  reply: 5.0,
  retweet: 1.0,
  quote: 5.0,
  shareViaDm: 5.0,
  shareViaCopyLink: 20.0,
  followAuthor: 4.0,
  click: 0.3,
  profileClick: 0.0,
  notInterested: -47.52,
  muteAuthor: -58.8,
  blockAuthor: -31.2,
  report: -234.0,
};

// Nota = soma de peso × probabilidade prevista de cada ação
function calcularNota(probabilidades) {
  return Object.entries(probabilidades).reduce((soma, [acao, p]) => {
    const peso = PESOS[acao] ?? 0;
    return soma + peso * p;
  }, 0);
}

// Post "lacrador": muita curtida prevista, mas gera irritação
const postPolemico = {
  favorite: 0.12,
  reply: 0.03,
  retweet: 0.02,
  notInterested: 0.01,
  muteAuthor: 0.004,
  report: 0.001,
};

// Post útil: pouca curtida, mas as pessoas guardam e mandam o link
const postUtil = {
  favorite: 0.04,
  reply: 0.01,
  shareViaCopyLink: 0.015,
  followAuthor: 0.005,
};

console.log('Polêmico:', calcularNota(postPolemico).toFixed(4));
console.log('Útil:', calcularNota(postUtil).toFixed(4));

Rodando no Node.js, o post polêmico fica em torno de -0.71 e o útil em 0.39. O primeiro tem três vezes mais curtidas previstas e mesmo assim perde, porque uma chance de 1% de "não tenho interesse" já custa quase 0.48 pontos, a chance de silenciar tira mais 0.24 e a pequena chance de denúncia leva outros 0.23. O segundo ganha porque 1,5% de chance de alguém copiar o link soma 0.3 sozinho.

Diversidade de Autor e o Fator Fora da Rede

A nota bruta não é o fim da história. Depois do Phoenix, o Home Mixer aplica ajustes que também aparecem no params.rs:

  • AuthorDiversityDecay = 0.5 e AuthorDiversityFloor = 0.25: cada post seguinte do mesmo autor na mesma leva é multiplicado por um fator que decai, com piso. Publicar em rajada não multiplica o seu alcance.
  • OonWeightFactor = 0.75: posts de contas que a pessoa não segue ("out of network") têm a nota multiplicada por 0.75. Há ainda o TopicOonWeightFactor = 0.5 para o caso de tópicos.
  • DppEnabled = true com DppTheta = 0.65: o vm-ranker reordena o feed com um processo de ponto determinantal sobre os embeddings dos posts. Em português claro: ele troca um pouco de nota por menos repetição entre posts vizinhos.

Dá para modelar o decaimento de autor assim:

const DECAIMENTO = 0.5; // AuthorDiversityDecay
const PISO = 0.25; // AuthorDiversityFloor
const FATOR_FORA_DA_REDE = 0.75; // OonWeightFactor

// Aplica os multiplicadores na ordem em que os posts aparecem
function ajustarFeed(candidatos, segue) {
  const vistosPorAutor = new Map();

  return candidatos
    .sort((a, b) => b.nota - a.nota)
    .map(post => {
      const ocorrencias = vistosPorAutor.get(post.autor) ?? 0;
      vistosPorAutor.set(post.autor, ocorrencias + 1);

      // Primeiro post do autor: fator 1. Depois: 0.5, 0.25, 0.25...
      const diversidade = Math.max(DECAIMENTO ** ocorrencias, PISO);
      const rede = segue.has(post.autor) ? 1 : FATOR_FORA_DA_REDE;

      return { ...post, notaAjustada: post.nota * diversidade * rede };
    })
    .sort((a, b) => b.notaAjustada - a.notaAjustada);
}

const feed = ajustarFeed(
  [
    { id: 1, autor: 'ana', nota: 0.9 },
    { id: 2, autor: 'ana', nota: 0.85 },
    { id: 3, autor: 'bruno', nota: 0.7 },
    { id: 4, autor: 'ana', nota: 0.8 },
  ],
  new Set(['ana']) // a pessoa só segue a Ana
);

console.table(feed);

O resultado mostra o post do Bruno, que tinha a terceira maior nota bruta, passando o segundo e o terceiro posts da Ana. Mesmo com o desconto de quem está fora da rede (0.7 × 0.75 = 0.525), ele vence 0.85 × 0.5 = 0.425 e 0.8 × 0.25 = 0.2. Esse é o mecanismo que impede uma única conta de dominar o seu feed.

A implementação real é mais sutil (o exato ponto em que o decaimento é aplicado depende do pipeline), mas a intuição é essa.

O Que Isso Significa Para Quem Publica

Agora a parte prática. Se você usa o X para divulgar trabalho técnico, os pesos sugerem algumas mudanças de hábito:

Escreva para ser guardado e repassado

Um fio com um passo a passo, um trecho de código que resolve um problema chato, uma tabela comparativa: esse é o tipo de conteúdo que as pessoas copiam o link e mandam para o time. É exatamente o sinal mais forte da tabela.

Provoque conversa, não briga

Resposta vale 5.0, mas "não tenho interesse" custa -47.52 e silenciar custa -58.8. Uma pergunta honesta no fim do post gera respostas; uma provocação gratuita gera respostas e silenciamentos. A conta fica negativa rápido, como a simulação mostrou.

Não conte com visita ao perfil

O ProfileClickWeight está em 0.0. A estratégia de "post misterioso para a pessoa clicar no perfil" não ganha nada no ranqueamento. Já seguir o autor pesa 4.0, então o que conta é o conteúdo convencer a pessoa a apertar o botão.

Espalhe as publicações

Com decaimento de 0.5 por post do mesmo autor, cinco posts seguidos competem entre si. Melhor um post forte que cinco médios em sequência.

Esse assunto conversa com uma mudança que já tinha aparecido aqui no blog, quando o X passou a usar IA para organizar o feed. Se quiser o contexto, vale ler como o Grok passou a organizar as postagens do X.

Um Exercício Para Devs: Ranqueamento Ponderado no Seu Produto

A lógica de "soma ponderada de probabilidades" não é exclusiva de rede social. Qualquer produto com feed, busca ou lista de recomendações pode usar a mesma estrutura. O trecho abaixo mostra um ranqueador genérico, com pesos configuráveis e uma penalidade de diversidade, que você pode adaptar para um marketplace ou um blog:

// Configuração separada do código, como o params.rs do X
const config = {
  pesos: { clique: 0.3, salvar: 4.0, compartilhar: 10.0, ocultar: -30.0 },
  decaimentoPorCategoria: 0.6,
  pisoDiversidade: 0.3,
};

function ranquear(itens, preverProbabilidades, cfg = config) {
  const pontuados = itens.map(item => {
    const probs = preverProbabilidades(item);
    // Soma ponderada: o mesmo princípio da fórmula do X
    const nota = Object.entries(cfg.pesos).reduce(
      (acc, [acao, peso]) => acc + peso * (probs[acao] ?? 0),
      0
    );
    return { ...item, nota };
  });

  // Penaliza repetição de categoria para o feed não ficar monotemático
  const vistos = new Map();
  return pontuados
    .sort((a, b) => b.nota - a.nota)
    .map(item => {
      const n = vistos.get(item.categoria) ?? 0;
      vistos.set(item.categoria, n + 1);
      const fator = Math.max(cfg.decaimentoPorCategoria ** n, cfg.pisoDiversidade);
      return { ...item, nota: item.nota * fator };
    })
    .sort((a, b) => b.nota - a.nota);
}

A lição de engenharia mais valiosa do repositório do X talvez seja essa: pesos em um arquivo de configuração, separados do modelo. Isso permite ajustar o comportamento do produto (dar mais valor a compartilhamento, punir mais o "ocultar") sem treinar nada de novo, e permite testar variações em A/B. O params.rs tem até um parâmetro WeightPerturbationSigma, hoje em 0.0, que sugere a possibilidade de perturbar pesos para experimentos.

Os Limites do Que Foi Aberto

Antes de transformar a tabela em dogma, vale lembrar do que não está no repositório:

  • Os pesos treinados do Phoenix. As probabilidades que entram na fórmula vêm de um modelo que continua fechado. Saber que copiar link pesa 20.0 não diz quando o modelo vai prever que alguém copia o link.
  • Os experimentos ativos. O código mostra a configuração padrão, mas o próprio repositório registra mapas de sobrescrita de experimentos. Duas pessoas podem estar sob pesos diferentes no mesmo dia.
  • A camada de visibilidade. Filtros de segurança de marca, spam e moderação rodam antes e depois do ranqueamento. Um post pode ter ótima nota e nunca chegar ao feed.

Ainda assim, poucas plataformas grandes deixam esse nível de detalhe à vista. Para quem estuda sistemas de recomendação, o repositório é um material de estudo raro, com código em Rust de um sistema que roda em escala real.

Perspectivas: Transparência ou Manual de Instruções?

A abertura dos pesos tem dois efeitos que puxam para lados opostos. Por um lado, pesquisadores e usuários conseguem auditar o que a plataforma premia, algo que defensores de transparência pedem há anos. Por outro, todo criador de conteúdo agora tem um manual de otimização, e a tendência é ver uma enxurrada de posts pedindo "copie o link e mande para um amigo".

Se isso acontecer em massa, o X provavelmente vai ajustar os pesos de novo, como já fez entre 2023 e 2026. Os números da tabela são uma fotografia, não uma lei. O que deve se manter é o princípio: conteúdo que as pessoas levam para fora da plataforma e que gera conversa sem irritação tende a ganhar. E isso, curiosamente, é uma boa regra para escrever sobre tecnologia em qualquer lugar.

Bora pra cima! 🦅

📚 Quer Acompanhar o Que Vem Por Aí?

Este artigo cobriu os pesos do algoritmo do X e como a nota de um post é calculada, mas o ecossistema muda toda semana e nem tudo vira artigo aqui.

No X eu compartilho o que estou testando, os bastidores dos projetos e as novidades que aparecem antes de virarem post.

Me Segue Lá

👉 Seguir @jeffbruchado no X

💡 Conteúdo diário sobre desenvolvimento, carreira e as ferramentas que eu realmente uso

Comentários (0)

Esse artigo ainda não possui comentários 😢. Seja o primeiro! 🚀🦅

Adicionar comentário