Skip to content
← Blog

What X’s open-source algorithm actually rewards

The weights are published. A reply is worth 27 likes, a report costs 738, and there is a slop score in the code.

Start hereSources read 2026-09-084 min read

X publishes the code that ranks its For You feed, which makes it the only large social platform where the shape of a post that does well is a fact rather than an opinion. Most writing about it is second-hand and the numbers disagree between articles. The numbers below are read from the repository itself, and the file paths are named so you can check them.

The heavy ranker is a neural network that predicts the probability of each engagement a post might get, then multiplies each probability by a weight and adds them up. The weights are the interesting part, because they are the platform stating what it wants. As published in the recap README of the-algorithm-ml, with the values dated 5 April 2023: a like scores 0.5, a retweet 1.0, a reply 13.5, a profile click that leads somewhere 12.0, a link click 11.0, and a reply that the author then engages with 75.0. Fifty percent of a video watched is worth 0.005.

Read those two ways round. A reply is worth twenty-seven likes. A reply you answer is worth a hundred and fifty likes. That single ratio is the most actionable fact any platform has published about itself, and it inverts how most people write: a post engineered to be agreeable collects the cheapest signal on the platform, and a post that leaves somebody with something to say collects the most expensive one. It also means the highest-value ten minutes of your day is not writing the next post, it is answering the replies to the last one.

The negative weights are larger than anybody expects. Negative feedback scores -74 and a report scores -369. A report therefore costs the equivalent of seven hundred and thirty-eight likes, and negative feedback a hundred and forty-eight. This is the arithmetic that makes engagement bait irrational rather than merely tacky: you are fishing for a signal worth 13.5 while risking one worth -369, at odds you do not control. The same arithmetic explains why one genuinely annoying post can flatten an account for weeks.

The repository has moved on since 2023, and the newer parameters are more revealing than the weights. `ScoredTweetsParam.scala` in home-mixer now carries an author diversity decay factor of 0.5 with a floor of 0.25, which means each additional post from the same author in one ranking pass is scored at half the last one until it bottoms out at a quarter. Posting six times in an afternoon does not multiply reach by six. Out-of-network posts are scaled by 0.75, and replies by 0.75, both before any of the weights above apply.

The parameter worth reading twice is `GrokSlopScoreDecayValueParam`. The feature list in `HomeFeatures.scala` names `GrokSlopScoreFeature`, `GrokIsLowQualityFeature`, `GrokIsSpamFeature` and `GrokIsOcrFeature`, alongside `SlopAuthorFeature` and `SlopAuthorScoreFeature`. Read plainly: X runs a model over every candidate post that scores how much it looks like slop, notices when the text is an image of text, and keeps a slop score against the author as well as the post. The per-author one is the part that should change behaviour, because it means the cost of publishing filler is not paid by that post alone.

None of this makes the platform a puzzle to solve. The weights are adjusted, the README says so, and the transformer layers sitting in front of the ranker are not in the public repository at all. What the code gives you is the direction of the incentives, and the direction has been stable: conversation over approval, one good post over six, and anything that reads as machine-made scored down by a machine that is looking for exactly that.

The practical version is short. Write something a specific person would answer, and answer them when they do. Post less often than you think, because the diversity decay is steeper than the gain from volume. Never bait, because the downside weight is an order of magnitude past the upside. And assume the slop classifier is reading everything you publish, because the feature list says it is.

More of this kind