Disecting X's Algorithm - A Like Is Worth 0.5. A Report Is Worth Minus 234.

X has open-sourced the actual constants that rank its For You feed — not the architecture this time, the numbers. Read them closely and they describe a platform that stopped caring about likes a long time ago.
On line 282 of a Rust file called param.rs sits the number 0.5. It is what X's ranking system pays for the probability that you will like a post.
One hundred and sixty lines further down sits −234.0. That is what it charges for the probability that you will report one.
Between those two constants lies the entire attention economy of one of the world's most closely watched feeds, and until Thursday, both were secret.
What actually changed
On August 13, 2026, xAI pushed a release to github.com/xai-org/x-algorithm, the public repository holding the code behind X's For You timeline. The company had opened parts of that code before, a partial dump in 2023, a substantial rewrite in January 2026, an expansion in May. Each time, one thing stayed behind the curtain: the weights. Analysts could see the shape of the formula. They could not see the coefficients, and a formula without coefficients is a sentence without verbs.
This release ships the coefficients. It also ships the safety layer that decides whether a post is eligible to be seen at all, the offline systems that label accounts and content, and the training code for Phoenix, the transformer that scores every candidate post. X's VP of Product, Keith Coleman, told TechCrunch ahead of the announcement that people would be fairly shocked at the scope of what was going out. TechCrunch reported the codebase is now roughly ten to fifteen times its previous size, published under the Apache 2.0 licence.
The claims below were checked against the published source, file by file. Line numbers and file paths are given so any reader can do the same.
Three thousand in, thirty-five out
Every time you pull to refresh, X assembles a feed from scratch.
A Rust service called home-mixer fans out in parallel to three retrieval systems. Thunder holds recent posts from accounts you follow in memory and returns up to 1,200. Phoenix retrieval, a two-tower neural model, returns up to 1,000 posts from accounts you don't follow. SimClusters, an older community-detection system that sorts accounts and posts into roughly 145,000 engagement-derived clusters, returns up to 800 more.
That is about 3,000 candidates. Nothing older than 48 hours survives, a hard cutoff in config.rs. Seventeen filters then run in a fixed order, stripping duplicates, your own posts, muted keywords, blocked accounts, posts you have already seen.
What is left gets scored. The top 50 are kept. The response is capped at 47 slots, 35 posts, 4 module slots, 8 frame slots.
Three thousand in. Thirty-five out. That is the compression ratio of a modern feed.
The economy of a single post
Phoenix predicts roughly two dozen probabilities for every viewer-post pair: that you'll reply, quote, share, follow the author, expand a photo, dwell, mute, block, report. RankingScorer then collapses them into one number by simple multiplication and addition, Final = Σ (weightᵢ × P(actionᵢ)).
Here is what each prediction is worth.
What the model thinks you'll do | Weight |
|---|---|
Share via copy link | 20.0 |
Reply (from a mutual follow, original post) | 20.0 |
Reply · Quote · Share via DM | 5.0 |
Follow the author | 4.0 |
Share | 2.0 |
Repost | 1.0 |
Favourite (like) | 0.5 |
Click | 0.4 |
Open a link | 0.2 |
Photo expand · Video open · Video quality view | 0.05 |
Dwell time (per second) | 0.004 |
Profile click · Binary dwell | 0.0 |
Not interested | −43.2 |
Mute the author | −58.8 |
Block the author | −31.2 |
Report | −234.0 |
Source: home-mixer/params/param.rs, defaults synced from production configuration on 2026-08-12.
The like is the least valuable social action in the system. A predicted copy-link share, someone grabbing your URL to paste into a group chat, a Slack, a WhatsApp thread, somewhere X cannot see, is worth forty likes. A reply is worth ten. A profile click, long treated by growth advisors as a premium signal, is currently worth nothing at all: its weight is zero, as are binary dwell and quoted video views. The model computes those heads and ships them to the reranker, where they contribute exactly zero to the score.
The strategic reading is blunt. X is not optimising for approval. It is optimising for conversation and for evidence that a post travelled off the platform.
Why the negative numbers are so enormous
The instinct on seeing −234 is to conclude that X weights a report 468 times more heavily than a like. That reading is wrong, and the code says so in a comment sitting directly above the weights: the values reflect both how much an action is valued and how common it is across the network, with negative feedback described as overall rare.

This is inverse-propensity scaling. Reports are vanishingly rare events, so the model's predicted probability of one is a tiny number, and the weight has to be large for the term to register at all. The −234 is a unit conversion as much as a judgement.
But the practical consequence survives the caveat. Add the negatives and you get 367.2. Add the positives and you get 43.3 , an 8.5-to-1 ratio. In a system where a near-certain like contributes 0.5, a one-percent predicted chance of a report contributes −2.34. The floor is far more powerful than the ceiling.
Three thousand candidates in. Thirty-five posts out. Nothing in the feed is older than forty-eight hours.
Nothing is deleted. It is pushed into the basement.
The most elegant piece of machinery in the file is fourteen lines long, at ranking_scorer.rs:525.
If a post's weighted score comes out positive, it gets a hair added to it: score + 0.001.
If it comes out negative, something stranger happens. The score is rescaled into the interval between zero and 0.001 , squeezed into a band a thousand times thinner than the gap between the two lowest positive posts.
Nothing is removed. Every predicted-negative post keeps its relative order against every other predicted-negative post. They are simply compressed into a stratum that sits underneath the entire positive population, permanently. If you have ever wondered what "reduced reach" looks like when it is written down as arithmetic rather than accusation, this is a candidate: not deletion, not a flag, just a floor you fall through and cannot climb back out of within a single request.
The World Cup dial
The repository contains one document that does more to explain algorithmic power than any architecture diagram: docs/BIDIRECTIONAL_BOOST_CHANGE.md, a dated account of a single number being turned.
The number is the bidirectional follow boost. When a post is an original, not a reply, not a repost, and its author mutually follows you, the reply weight jumps from 5.0 to as much as 25.0. Nothing else in the file moves a weight that far.
The timeline, as X tells it:
- July 10, 2026 , an A/B test begins. A slice of users is randomly assigned boost values of 5, 10, 15 or 20. Most users sit at 0.
- July 13, 2026 , after strong early results, a value of 20 rolls out broadly.
- July 24, 2026 , X dials it back to 15. The stated reason: the World Cup was on, and users complained they weren't seeing enough of the tournament, because much of the conversation was coming from accounts they didn't follow.
That is the whole mechanism of modern media power in three bullet points. One integer, changed twice in a fortnight by a handful of engineers, measurably changed how much of a global sporting event millions of people saw. The current production default is 15.0 , verifiable in the file today.
Followers and strangers
Ranking decides order. A separate service, visibility-filtering, decides eligibility, returning one of three verdicts per post and viewer: Allow, Interstitial, or Drop.
It runs two different policies.
Posts from accounts you follow are judged against 28 rules , suspended and deactivated authors, your own blocks and mutes, legal takedowns, country-specific removals, age gating, and four rules that hide graphic or adult media behind a tap-through screen.
Posts recommended from accounts you don't follow face those 28 rules plus 26 more, and all 26 can only drop. Spam caught at high recall. Malicious URLs. Accounts flagged as compromised, impersonating, or do-not-amplify. Fifty-four rules in total.
The asymmetry is not incidental, it is asserted in the test suite. The repository contains unit tests with names like spam_high_recall_drops_oon_but_allows_in_network and abusive_high_recall_drops_oon_non_follower_but_allows_in_network. The identical post is dropped when recommended to a stranger and permitted when shown to a follower.
The engineering logic is defensible: these are deliberately over-triggering classifiers, tuned to catch a lot and tolerate false positives. Acceptable for declining to amplify. Not acceptable for censoring a feed someone opted into. But it means "reach" on X is not one quantity. It is two, governed by different law.
Two more asymmetries are pinned down by tests: authors always see their own posts, whatever labels are attached; and two rules that used to drop content, one for egregious adult material, one a recommendations blacklist, now have tests asserting they no longer drop anything on either surface.
The reputation shield
user-cred-v2 runs PageRank over the follow and engagement graphs and maps the result onto a 0–100 score through a logarithm: score = 165.2 + 7.07 × ln(mass), clamped. Because it is logarithmic, an account needs roughly 15% more PageRank mass for every additional point.
What that score buys is not a ranking boost. There is no multiplier for it anywhere in home-mixer. What it buys is exemption.
In the automated enforcement rules, the YAML that decides whether to label, challenge or suspend an account based on model scores, a skip condition fires when an account's credibility score is at or above 50. The same rule appears in both the user-level and post-level rule files. Score above the line and the automated abuse pipeline steps over you.
There are qualifications. A post-level scorer can force evaluation past the shield with an override flag, and X notes that a neighbouring follower-count threshold in the same file is deliberately mocked in the public release to limit gaming, so the 50.0 figure may differ in production. But the architecture is unambiguous: reputation on X functions as armour, not as amplification.
The boost for new voices is one post
X's "new-author boost" sounds like structural support for small accounts. The code is narrower than the name.
Per request, exactly one post is boosted. It must be an original, from an author with 1,000 or fewer followers, with fewer than 1,000 views. The mechanism lifts that single post's score to match the 16th-highest score in the candidate pool, the configured range of 15 to 16 collapses to a single value, making the target deterministic rather than random.
One post, per refresh, to roughly slot 16, if one qualifies. Real, but small.
And it is applied before the other adjustments, so a boosted post is then subject to the repeated-author decay (which drops an author's second post to 0.625× and asymptotes at 0.25×) and, if the author is a stranger to you, the out-of-network discount of 0.75×.
That discount has a sting most creators will not expect: it applies not only to strangers, but to replies and reposts from accounts you already follow. A parameter enabling exactly that is on by default. Original posts are privileged over amplification, even from people you chose.
There is a harder structural fact underneath. One filter removes any reply whose parent post is missing from the candidate, and only Thunder, the in-network source, attaches parent posts. Phoenix and SimClusters do not. The consequence, confirmed by reading all three source files: replies from accounts you don't follow essentially cannot reach your For You feed at all. Not discounted. Removed.
What is still behind the curtain
X is explicit about the omissions, and they matter.
The Grok prompt templates used for content classification are withheld, along with some labelling rules, to reduce gaming. Production model checkpoints are not published, the training code and architecture are real, but the trained weights are replaced by synthetic data generators. Deployment and infrastructure code is largely absent.
The most important caveat is the subtlest. The weights in param.rs are not constants; they are mirrored defaults. The file's own header records a sync timestamp of 2026-08-12. A cron job copies primary production values into the repository. Live values can differ by user, by experiment bucket, by data centre, and X's stated commitment covers only experiments running at a notable share of traffic, around 10% or more. What you read is the main setting at the moment it was photographed.
Why this lands beyond X
The release arrives into a regulatory environment that has been circling exactly this question.
In December 2025, the European Commission fined X €120 million , the first non-compliance decision issued under the Digital Services Act. Among the findings: X had failed to give researchers adequate access to public data needed to study systemic risks, including algorithmic amplification. The Commission has since accepted an action plan from X on transparency and researcher access. Musk responded to the original fine with sweeping criticism of the EU itself.
Read against that backdrop, publishing the ranking constants is a substantial move, whatever prompted it. No other major platform has disclosed the coefficients of its production ranking function. Meta, TikTok and YouTube publish explanations; X has published arithmetic, which can be argued with.
Alongside the code, X is piloting a transparency tool at an Under the Hood page in account settings. Per TechCrunch, users who have posted at least ten times in the past month can download a JSON file of aggregate statistics showing which visibility-affecting labels were applied to their account and posts over the previous calendar month. The pilot is limited initially to a test group of accounts at least a year old. The suggested workflow for non-technical users is telling about the moment we are in: download the file, hand it to a chatbot along with the GitHub repository, and ask what it means.
The gap between publishing code and being understood is now itself an AI problem.
How this was verified
Every number in this article was checked against the published source rather than taken from secondary coverage.
The twenty-six ranking weights, the out-of-network factor, the diversity decay and floor, and the cold-start thresholds were read from home-mixer/params/param.rs. Feed size constants and the 48-hour cutoff came from home-mixer/params/config.rs. The score-offset arithmetic and the order of the three adjustments came from home-mixer/scorers/ranking_scorer.rs. Rule counts of 28 and 54 were obtained by counting the entries in visibility-filtering/rules/registry.rs, and the follower-versus-stranger asymmetry was confirmed from the test function names in that file. The reputation formula is in user-cred-v2/UserCredV2.scala. The July timeline is in docs/BIDIRECTIONAL_BOOST_CHANGE.md. Model dimensions came from phoenix/README.md. The reply-removal finding was confirmed by reading oon_retweet_reply_filter.rs alongside all three candidate source files.
Derived ratios, 40×, 8.5-to-1, the 367.2 negative sum, were recomputed independently rather than reproduced.
One correction to the widely-circulated framing: the −234 report weight is not a statement that X detests reports 468 times more than it enjoys likes. It is a rarity adjustment, and the code says so. The effect on your feed is real regardless.
The repository is at github.com/xai-org/x-algorithm under Apache 2.0. Anyone can check this work.