DEV Community

ash the coder
ash the coder

Posted on

A viral "how X ranks your posts" thread, checked against X's actual open-source code

A thread has been going around promising a breakdown of "the new X algorithm update": exact multipliers for every reaction. A reply is worth 7.6 likes! A copied link is 30! A report is -355!

X publishes the code that ranks the For You feed at xai-org/x-algorithm, and it is genuinely readable. This post checks each claim in the thread against it.

One caveat up front: everything below is the default values in the published code, pinned to a specific commit (2f25214, checked 27 Oct 2026). X's production config can override any of it. Treat this as the published design, not a live config dump.

The short version: the numbers are real. The obvious reading of them is wrong. And one claim is out of date.

Where the numbers come from

The ranking weights live in home-mixer/params/param.rs. Current defaults:

Action Weight in the code
Copy link +20.0
Reply from a mutual, on an original post +5.0 with a +15.0 boost
Reply +5.0
Quote +5.0
Share via DM +5.0
Follow author +4.0
Share +2.0
Repost +1.0
Like +0.66
Block author -31.2
"Not interested" -52.272
Mute author -58.8
Report -234.0

Positive ranking weights in X's open-source code

Divide everything by the like weight (0.66) and you get the thread's numbers: 20 ÷ 0.66 ≈ 30, 5 ÷ 0.66 ≈ 7.6, -234 ÷ 0.66 ≈ -355. The thread re-normalized the weights so a like equals 1. So yes: real numbers, real code.

Bookmarks are the funny one. The thread says a bookmark counts as 0. The truth is stronger: there is no bookmark score in the code at all. The model doesn't even predict one.

The part that's easy to get wrong

Reading this table as "one reply equals 7.6 likes" is exactly the mistake the code's own comments warn against. From param.rs, verbatim:

"it'd be incorrect to see that a report has 468 times higher weight than a like and conclude that e.g. '1 report cancels out 468 likes'. The weights are a multiple on your own predicted probability of Liking, Reporting, etc."

The formula is not a count of what happened. It is:

score = Σ (weight × P(action))

where P(action) is the probability that you, the specific viewer, will take that action, predicted by a transformer model (Phoenix) from your engagement history. The same post gets a different score for every single person who might see it. There is no universal "this post is worth N points."

How the For You feed scores a post

Two consequences the comments spell out:

  • Mass-reporting doesn't sink a post globally. "Recommendations are personalized, so reports from bad actors will primarily affect recommendations for users who are similar to the bad actors." Also, a report is over 1,000x rarer than a like, which is why its weight is so large - a rare action needs a big weight to matter in the sum at all.
  • Engagement from a group chat link does nothing. "Directly navigating to a post (i.e., coordinating via groupchat) has no ranking impact." Only engagement from a post that was actually served in the Home feed counts.

Negative ranking weights in X's open-source code

The small-account boost: the thread nailed the numbers

The most practically useful claims in the thread check out exactly, from the cold-start params:

  • ColdStartFollowerCap = 50,000 followers
  • ColdStartMaxPostAgeSecs = 7,200 (2 hours)
  • ColdStartImpressionThreshold = 200 impressions
  • ColdStartSlotMin / ColdStartSlotMax = 15-16

X's cold-start boost parameters

Read this as eligibility, not a guarantee: under these defaults, an original post from an account under 50K followers, under two hours old, with under 200 impressions, is eligible to be lifted toward slot 15-16 in a feed. Whether production runs exactly these defaults, and whether any given post gets the lift, is not something the code can tell us.

Also confirmed: posts from accounts you don't follow get multiplied by 0.75 (OonWeightFactor in vm-ranker/params.rs), and replies and reposts from accounts you do follow get rescaled too (EnableOonRescoreForInNetworkRepliesRetweets = true).

What the thread gets stale

The thread says that when your posts compete for one feed, the second keeps 62.5% of its score and the third keeps 43.75%. Current defaults: AuthorDiversityDecay = 0.5 with AuthorDiversityFloor = 0.25. So the second post keeps 50%, and later posts bottom out at 25% - not 43.75%. Those viral numbers may match an older commit; they are not what's published now.

And "after 48 hours X stops putting your post in feeds" overstates one constant. What exists is SimclustersMaxCandidateAgeHours = 48: out-of-network discovery candidates older than 48 hours get dropped. That is not a global kill switch. Posts from accounts people follow live in a different pipeline (thunder), with no 48-hour cutoff published.

What I'd take from this (judgment, not hacks)

None of this is a cheat code, because the score is personal and the weights multiply probabilities. With that said, the shape of the defaults suggests a few boring things:

  • Write things people want to reply to, quote, or copy the link of. Those actions carry the biggest positive weights. (Copy link is the largest single weight at +20; the +15 is additive on top of a reply's +5, and neither is a promise - a weight times a near-zero probability is still near zero.)
  • Make originals easy for your mutuals to reply to. The +15 boost applies when someone you mutually follow replies to your original post. You can't manufacture that, but questions and genuine invitations make it likelier.
  • If the defaults hold, a post's first two hours are when the small-account boost can apply - so posting when you're around to talk back is sensible.
  • Don't fire off five posts in a row. After your first post in someone's feed, each extra one from you is multiplied by 0.5, down to a floor of 0.25 - bursts shrink fast, though never to zero.
  • "Not interested", mutes and reports carry the biggest negative weights. But their effect still depends on the viewer's predicted probabilities - these weights are large, not absolute.

Sources

All values checked against commit 2f25214 on 27 Oct 2026. The file changes often - if you're reading this months from now, open param.rs again before quoting any of it.

Top comments (0)