```html
Product Launch · Xiaohu Explains

X Open-Sources the For You Algorithm: Likes Are Worth 0.5 Points, Copy-Link Shares 20 Points

The real values of all 21 weights, the three gates that decide exposure, and a posting playbook derived directly from the parameters
60-Second Summary
  • 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.
⚑ Source material comes from X's own open-source repository and official announcements. All weights and thresholds in this article are taken from the production defaults in the repo; some users may be in a test group and see different numbers.
What's New This Time

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.

New 01
Real Weight Values
The full set of weights that blend predicted action values into a single post score, now public.
New 02
Filtering & Labeling System
The entire codebase that decides whether a post gets filtered out of For You, including labeling rules and models.
New 03
Real Training Code
Replaces the demo model from before, with a synthetic data generator. A single GPU can run a full training pass. One disclosed difference: the optimizer is standard AdamW, not the internally tuned production version.
The three additions compared to previous open-source releases

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.

The Skeleton

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.

All Candidate Posts Gate 1 · Candidate Pool Gate 2 · Scoring & Ranking Gate 3 · Visibility
Gate 1Candidates come from two sources: recent posts from people you follow, plus two out-of-network retrieval systems; then 17 pre-scoring filters
Gate 2Weighted sum → four adjustments → top K
Gate 3Per-post, per-user decision: show / show behind a warning / drop
Three gates, each one narrowing the pipe; the side arrows are posts dropped at each stage

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.

Gate 1 · Candidate Pool

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.

Passed
Your original posts
Enter the candidate pool normally and proceed to scoring. This is the only path to being seen by out-of-networkThis means the author is someone the reader doesn't follow. The For You feed mixes posts from people you follow and people you don't; the latter are out-of-network. readers.
Blocked
Your replies / reposts
If the reader doesn't follow you, the whole thing is thrown out before it even gets to scoring.
Two types of content from the same account diverge at the first gate

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.

Put together: to get seen by people who don't follow you, original posts are the only way. No matter how good your comments are on someone else's post, only your own followers will see them in For You.
Gate 2 · Scoring

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.

One Candidate Post
Copy link P = ?
Reply P = ?
Like P = ?
Follow author P = ?
Report P = ?
Σ weight × probabilityOne Post Score
The model only produces probabilities; "how much a reply is worth vs. a like" is decided in a separate step

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.

Gate 2 · The Weight Table

Likes are worth 0.5, copy-link shares 20

21 positive weights and 5 negative weights, all listed below.

Positive WeightsTotal 43.324
Copy link share
20.0
Reply
5.0
Quote
5.0
DM share
5.0
Follow author
4.0
Share
2.0
Repost
1.0
Like
0.5
Click
0.4
Open link
0.2
Expand image
0.05
Open video
0.05
Video watch time
0.05
Quote post click
0.05
Unexplored post
0.02
Dwell time
0.004
Dwell · Profile click · 3 others
0.0
Negative WeightsSeparate Scale
Report
−234
Mute author
−58.8
Not interested
−43.2
Block author
−31.2
Scrolled past
−0.02
Bar length equals the weight itself. Positive and negative groups are on different scales — the longest negative is 234, the longest positive is 20

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.

How to read this table

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 video item has two extra conditions: the video must be longer than 10 seconds to count; and when the reader has 10,000 or more followers, this weight drops to zero entirely.
Gate 2 · Four Adjustments

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.

① Happens during summation · Modifies a weight
Mutual-follow boost +15
Reply weight 5.0 → 20.0
If you and this reader follow each other, the weight on "predicted reply to you" gets +15, going from 5.0 to 20.0. Replies were already the second-highest weight; now it's tied with copy-link shares.

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.

② Multiplied against total · First one
Out-of-network discount ×0.75
Topic pages are harsher: ×0.5
If the reader doesn't follow you, your post's score gets a 25% discount. On topic pages, it's cut in half.

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."

③ Multiplied against total · Second one
Same-author decay
coefficient = 0.75 × 0.5ⁿ + 0.25
Within a single refresh, the nth post from the same author gets a smaller and smaller multiplier: 1st post ×1.0, 2nd ×0.625, 3rd ×0.44, 4th ×0.34, down to the floor of 0.25 where it stops.

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%.

④ Multiplied against total · Third one
New-author boost
Raised to the score of positions 15–16
There's a dedicated lane for small accounts that artificially lifts one post to the #15–16 slot. But only one post is boosted per request, chosen as the highest-scoring among all eligible posts.

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.

After the adjustments and ranking, there's one more step: a separate reranking service computes vectors for the candidate posts and trades a bit of score for diversity — so adjacent posts don't look too similar. It operates on the top 150 positions. That's why content on the same topic gets deliberately scattered rather than clumped together.
Gate 3 · Visibility

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.

Same post · Same rules · Different reader
Gate 1
Candidate pool
✓ Passed
Gate 2
Scoring & ranking
✓ Score high enough
Gate 3
Visibility check
✕ Drop✓ Shown
This post simply won't appear in their For You feed, and you'd never notice anything wrong, because you're scrolling your own followed circle. This post appears normally in their For You feed. Same post, same label — it doesn't apply 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.

Tool · Check Yourself

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.

Adult content related 6 labels
NsfwHighRecall
Auto system suspects adult content
NsfwHighPrecision
Auto system strongly suspects adult content
NsfwNearPerfect
Same, another confidence tier
NsfwAdmin
Manually judged, based on reports, primarily adult or violent content
NsfwAvatarImage
Avatar judged inappropriate — applies even if your posts are clean
NsfwBannerImage
Banner image judged inappropriate — counted separately from avatar
Authenticity related 3 labels
SpamHighRecall
Judged likely spam
ImpersonationHighPrecision
Judged likely impersonating someone
AbusiveHighRecall
Triggers an extra security check
Unrelated to what you post 3 labels
Compromised
Account judged stolen; password reset required
ReadOnly
Policy-violating posts not removed; account locked to read-only
DoNotAmplify
Suspected ToS violation; pending further review

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.

🧰 Getting Started · Under the Hood Label Check
CostFree
EligibilityAccount 1+ years old, 10+ posts in the past month, randomly selected into the test group — all three required
Epilogue · Parameters Change

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.

0–20
7/10
A/B test starts, most users at 0
20
7/13
Rolled out to most users
15
7/24
Pulled back after feedback
Three weeks in the life of the mutual-follow boost. On July 10, most users were at 0 — effectively no boost

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.

Takeaway · Playbook & Quick Reference

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:

Seen by Strangers
=
In the candidate pool
×
Score high enough
×
Not shadowbanned
The three factors are multiplicative — any one at zero and the result is zero
First, what this table is

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.

Gate 1First, get into the candidate pool
ActionRationaleImpact
Only count on original posts to reach strangersReplies and reposts to non-followers are thrown out before scoringElimination
Post time-sensitive content the same dayPast 48 hours, thrown out of the candidate pool — hardcoded constantElimination
Be selective about who you reply toFor a reply to survive, the replied-to person must also be followed by this readerElimination
Replying to your own thread is exemptWhen all ancestors are the author's own posts, this filter passes it through
Gate 2Then, make the score higher
ActionRationaleImpact
Make things worth copy-linking and sharingWeight 20.0, nearly half of the total positive weights of 43.324Highest single
Mutually follow your core readersMutual-follow boost +15, reply weight 5.0 → 20.04× increase
But the boost only applies to original postsReplies or reposts don't qualify — three conditions hardcoded
Write things that draw repliesReply weight 5.0, ten times the like weight of 0.510× like
Give people a reason to followFollow-author weight 4.0, eight times the like weight8× like
Avoid posting in bursts within one refreshSame author: 2nd post ×0.625, 3rd ×0.44, floor at 0.2562.5% from 2nd
Under 1K followers: post originalsNew-author lane requires ≤1000 followers, post impressions <1000, original post; "within 24 hrs" rule is test-group onlyBoost to #15–16
Gate 3Finally, don't get shadowbanned
ActionRationaleImpact
Check your labels firstHit any of the 27 rules and you're completely invisible to all strangersPrerequisite
Avatar & banner images are judged separatelyNsfwAvatarImage and NsfwBannerImage are two independent account labelsAccount-level
Don't post with suspicious linksSuspicious link is a post-level label; effect is non-recommendation to non-followersPost-level
Rage-bait costs the most, by the numbersReport −234, Mute −58.8, Not interested −43.2, Block −31.2 — while all positive weights total just 43.324Heaviest
Don't BotherThree things not worth your effort
Don'tRationale
Don't buy Premium to boost reachSearched 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 weightVideo 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 clicksDwell weight 0.0, profile click weight 0.0 — completely excluded from scoring
The card below can be checked item by item and exported as a quick-reference sheet. Every item carries the parameter it's based on, so when numbers change you can re-verify against the repo yourself.
✅ Post by the numbers · 17-point quick reference
Source
X For You Feed Algorithmxai-org·GitHub Repo·2026-08-13
About this site
All charts on this page were created by us. Weights, thresholds, filtering rules, and label lists are taken from the repository source code and official announcements; the "how to adjust your posting" section is derived from these parameters — X has never published posting advice.