X Open-Sources the For You Algorithm: Likes Are Worth 0.5 Points, Copy-Link Shares 20 Points
- In this algorithm, a like carries a weight of 0.5, while a "copy link and share" is worth 20. These are plaintext values in the config file, not guesses.
- Shadowbanning now has a concrete shape: your followers see you as usual, but you simply don't exist in the timelines of people who don't follow you.
- The table at the end breaks all three gates into actionable items, each tagged with the specific number it's based on.
The weights being published are the ones running in production
X has open-sourced the algorithm code behind the For You timeline and launched a page where you can check whether you've been shadowbanned. For anyone who relies on X to grow an audience, drive traffic, or land clients, this is a price list: what a like and a "copy link share" are actually worth internally, now hardcoded in the config file. No more guessing.
The previous open-source release only showed the structure. You knew there was a scoring step, but not what each action was worth. Even the model part was just a sample adapted from Grok-1. This release fills in three gaps.
Why should you trust these numbers? X's answer is a cron script that periodically syncs the production values back into the repository's defaults — the README explicitly names the weight file as being maintained this way. Two more safeguards: experiments running on 10% of traffic or more are expected to show up in the repo, and third-party recommender-system experts reviewed and stress-tested the code before release. X's stated goal for this release is just one sentence: let people answer for themselves whether the platform is throttling them.
A post has to pass three gates to reach a reader
The full pipeline has seven steps, but for anyone writing, only three gates matter. These three are in a multiplicative relationship — fail any one, and the result is zero, no matter how well you do on the other two.
Ranking and visibility are two separate systems. The former decides order, the latter decides whether something appears at all — two services, two inputs, two sets of rules. X lists this as an explicit design decision, and understanding shadowbanning starts with understanding this split.
Your replies can't reach strangers' timelines
Before scoring, there are 17 filters. Most are common sense — your own posts, people you've blocked or muted, posts you've already seen, things matching your muted keywords. But three of them directly decide whether strangers can see your posts, and the first one is especially counterintuitive.
The other two: 48 hours is a hard cutoff — past that, a post is thrown out of the candidate pool. This is a hardcoded constant in the config, not a tunable parameter. Then there's a rule about replies: for a reply to survive, the person being replied to must also be followed by this reader. Replying to your own thread is exempt — if all ancestors are the author's own posts, this filter passes it straight through.
The model predicts which actions you'll take
Older recommender systems assigned each piece of content a "relevance score." This one takes a different approach: the model doesn't guess whether you'll like something — it separately predicts the probability of each specific action you might take on a post. Will you like it? Reply? Copy the link and share it? Report it? Then a separate step blends those probabilities into a single number.
X lists this "blend into one number" step as a separate design decision, and the point is this: prediction belongs to the model, valuation belongs to humans. What this open-source release gives you is precisely the human-decided part.
Two details explain why some accounts seem naturally easier to push. First, a post's likes, replies, reposts, quotes, views, and age are bucketed and fed directly into the model as input features. The model sees these numbers, so early traction genuinely does self-reinforce. Second, each post is compressed into a semantic IDA post's text and images get compressed into a code representing "what this post is about": 6 levels, each selecting one of 256 codes. Posts on the same topic share the same leading levels, like a library call number — books in the same subject area share a prefix. — posts on the same topic share encoding prefixes, so a brand-new post with zero engagement can still be retrieved, as long as its topic matches what this reader regularly consumes. Also, the production retrieval model doesn't store a dedicated embedding vector for each user. Aside from coarse profiles like country and language, a reader is just the sum of what they've interacted with.
Likes are worth 0.5, copy-link shares 20
21 positive weights and 5 negative weights, all listed below.
Two facts jump out immediately: all positive weights add up to 43.324, and "copy link share" alone accounts for nearly half. Meanwhile, a single report has an absolute value more than 5 times the sum of all positive weights combined.
Don't do direct division with these numbers. These values are a mix of "how valuable this action is" and "how rare this action is across the network." Negative feedback almost never happens, so the weights have to be large enough to balance it out.
So "one report cancels out 468 likes" is the wrong reading. Reports are extremely rare — the model outputs a tiny probability for it — and the weight needs to be −234 for it to carry any weight in the weighted sum.
The right reading: this table says that even if the model's probability is very low, as long as it's not zero, multiplying it by the weight amplifies it into the total score. In practical terms: if the model senses even a hint that your post smells like it could be reported, that hint is enough to drag you down. If it senses your post is the kind someone would copy the link and share, a tiny whiff of that lifts you up.
The score gets adjusted four more times before it's final
The weighted sum is just the starting point. Four more tweaks happen before the final score is set — the first happens during the summation, modifying one specific weight; the other three are multiplied against the total score. You can click through all four steps below.
Three conditions must all be true, miss any and you don't get it: ① not a reply ② not a repost ③ the author and reader follow each other. In other words, the boost only applies to original posts.
Easy to miss: replies and reposts by people the reader does follow also take this discount. So this discount is actually targeting "secondhand content" and "stranger content," not purely "followed vs. not."
When you appear a second time in the same refresh, you're automatically at 62.5%. Third time, you're down to just over 40%.
Requirements: author has ≤1000 followers, the post has <1000 impressions, must be an original post, and it must already rank in the top 85% of valid candidates. There's also a "posted within 24 hours" rule, but that's only for the test group, not everyone. The follower cap at 1000 means accounts with any real size can't use this lane.
Shadowbanning means being invisible only to people who don't follow you
After ranking, there's one final gate that can remove your post entirely. For each post and each reader, it produces one of three answers: show it, hide it behind a warning (readers can click through), or drop it.
The key is that rules come in two sets. One set applies to everyone. The other has 27 rules, only running when "this post is being recommended to someone who doesn't follow the author," and they can only result in a drop. The same post is shown to followers.
So shadowbanning on X has a very specific shape: your followers see you normally; you simply don't exist in the timelines of anyone who doesn't follow you. You can't detect anything unusual yourself, because what you see comes from the people you follow.
12 account labels, now checkable
The page is at x.com/i/under_the_hood. It shows labels applied to your account and posts over the past month, and lets you download the data. This is a gradual rollout — three conditions must all be true: account at least a year old, at least 10 posts in the past month, and randomly selected into the test group.
These labels aren't all manually assigned. A set of offline batch jobs watches how others respond to your posts — blocks, reports, spam reports — all measured relative to your like count, and uses that to label accounts. So "how many people have blocked or reported you" is a direct input to account-level decisions, not just something about individual posts.
There are 12 account-level labels, grouped into three categories.
These last three judge account status, not your content. But the effect is the same as the other nine: not recommended to non-followers.
Post-level labels have three tiers of effect: the lightest just makes you invisible to non-followers (spam high-recall, suspicious links, adult text, etc.); the middle tier adds a content warning and hides the post from minors, users without an age, and logged-out users; the heaviest tiers stop the post from being shown on X entirely, or restrict its discoverability to the author's profile page, with a "this post is restricted" note shown to everyone.
Two things were explicitly kept closed: the large-model prompts used by the content classifier, and some of the labeling rules. The reason is in the README: to reduce the risk of people gaming the system. X's compensation is precisely this page: you don't get the rules, but you get the results. You can see what these systems output for you, see if any manual labels were applied, and take those label names back to the code to see exactly how they affect you.
Weights shift: mutual-follow boost went from 20 to 15 in three weeks
Before you use any of these numbers, one thing you need to know: they aren't carved in stone. X wrote a dedicated document using July's widely-discussed mutual-follow boost as an example, explaining how to read algorithm updates going forward.
On July 10, an A/B test started. Users were randomly assigned to 5, 10, 15, or 20, with the vast majority at 0. On July 13, early results looked good, and it was rolled out to many users at 20. On July 24, after the full experiment results and real feedback from X, the document's example: during the World Cup, people wanted more football discussion, but most of those posts came from accounts they didn't follow — so the value was pulled back from 20 to 15.
The causal chain is complete: when the boost is too large, mutually-followed content crowds out out-of-network content; when a big event like the World Cup is happening outside that circle, the user experience immediately degrades — hence the five-point pullback.
The document also includes the full code diff from the time, with the intent stated up front: all future algorithm updates will be posted to this repo, and reading the diff shows you exactly what changed. For people who depend on X for a living, when parameters shift you'll see it the same day — no more waiting a month and reverse-engineering from declining metrics.
Based on the three gates, how to adjust your posting
Numbers change, gates don't. With the current parameters, all three gates together reduce to one sentence:
These recommendations are derived from the parameters in the code — X has never published posting advice. Each item is tagged with the specific parameter and value it's based on, so you can verify it against the repo yourself. When the parameters change, this table changes.
| Action | Rationale | Impact |
|---|---|---|
| Only count on original posts to reach strangers | Replies and reposts to non-followers are thrown out before scoring | Elimination |
| Post time-sensitive content the same day | Past 48 hours, thrown out of the candidate pool — hardcoded constant | Elimination |
| Be selective about who you reply to | For a reply to survive, the replied-to person must also be followed by this reader | Elimination |
| Replying to your own thread is exempt | When all ancestors are the author's own posts, this filter passes it through | — |
| Action | Rationale | Impact |
|---|---|---|
| Make things worth copy-linking and sharing | Weight 20.0, nearly half of the total positive weights of 43.324 | Highest single |
| Mutually follow your core readers | Mutual-follow boost +15, reply weight 5.0 → 20.0 | 4× increase |
| But the boost only applies to original posts | Replies or reposts don't qualify — three conditions hardcoded | — |
| Write things that draw replies | Reply weight 5.0, ten times the like weight of 0.5 | 10× like |
| Give people a reason to follow | Follow-author weight 4.0, eight times the like weight | 8× like |
| Avoid posting in bursts within one refresh | Same author: 2nd post ×0.625, 3rd ×0.44, floor at 0.25 | 62.5% from 2nd |
| Under 1K followers: post originals | New-author lane requires ≤1000 followers, post impressions <1000, original post; "within 24 hrs" rule is test-group only | Boost to #15–16 |
| Action | Rationale | Impact |
|---|---|---|
| Check your labels first | Hit any of the 27 rules and you're completely invisible to all strangers | Prerequisite |
| Avatar & banner images are judged separately | NsfwAvatarImage and NsfwBannerImage are two independent account labels | Account-level |
| Don't post with suspicious links | Suspicious link is a post-level label; effect is non-recommendation to non-followers | Post-level |
| Rage-bait costs the most, by the numbers | Report −234, Mute −58.8, Not interested −43.2, Block −31.2 — while all positive weights total just 43.324 | Heaviest |
| Don't | Rationale |
|---|---|
| Don't buy Premium to boost reach | Searched subscription / premium / verified across scoring params, reranking service, and model features — zero hits; the candidate post data structure has no premium or verified field either, only one for subscriber-exclusive post access. There is no paid boost in this ranking code. |
| Don't expect video itself to carry weight | Video watch time weight is 0.05, and it requires video over 10 seconds; when the reader has 10K followers it goes to zero. Video's value is in dwell time and sharing, not this item |
| Don't farm dwell time and profile clicks | Dwell weight 0.0, profile click weight 0.0 — completely excluded from scoring |
X Open-Sources For You Algorithm: Likes = 0.5 Points, Copy-Link Shares = 20
X published the source code and weights behind For You exposure. Three gates decide whether strangers see a post. The whole story, with visuals, on one page.
↓ One page, including an animated diagram
X open-sourced the algorithm code behind the For You timeline and launched a page to check for shadowbanning. The new release is transparent pricing: what a like and a copy-link share are worth internally, written in the config file. No more guessing.
Had the scoring step, but not the weight values, filtering & labeling system, or real training code. The model part was just sample code.
Real weight values, the complete filtering & labeling system, and real training code — all public.
These numbers come from X's own repository: a cron script periodically syncs production weight values into the default config, and third-party recommender specialists stress-tested before the release. A few users may be in test groups with different values.
The full pipeline has seven steps, but three gates matter: candidate pool → scoring & ranking → visibility. The three are multiplicative — fail any one, and high scores elsewhere don't matter. Scoring and visibility are also two separate systems: one manages order, the other manages whether a post appears at all.
21 positive and 5 negative weights, all in the config file — readable plaintext.
After ranking, one final gate can remove a post entirely. Rules come in two sets: one applies to everyone; the other has 27 rules that only run when a post is recommended to someone who doesn't follow the author, and they can only result in a drop.
✘ People who don't follow you: hit any of the 27 rules and the post vanishes from their For You entirely
You'd never notice, because you're seeing your own followed circle. To check if you've been labeled, go to x.com/i/under_the_hood (requires account 1+ years old, 10+ posts in the past month, and selection into the test group).
see me?
the algorithm
real data
all wasted
Copy-link = 20
are the real currency
5× more than all positives combined
have any labels
some accounts may be in test groups
get all three gates to say go