# X (Twitter) Algorithm Update October 2026: What Changed in the Code

> xAI syncs the live X (Twitter) algorithm to GitHub daily. We diffed October’s deployments: likes up 32%, clicks nerfed, and every ranking weight creators should know.

Published October 27, 2026 · 28 min read

In August 2026, xAI published the code that decides what two hundred million people see every time they open X. The [xai-org/x-algorithm](https://github.com/xai-org/x-algorithm) repository is not a summary, a blog post, or a sanitized diagram. It is the production source: the Rust services that assemble the For You feed, the exact engagement weights, every filter that can silently remove your post, and the machine-learning model that predicts whether a given reader will reply, repost, or hit "not interested."

Better still, it updates. The repository receives near-daily syncs from production (the latest on October 27, 2026), which turns its git history into something creators have never had before: a dated changelog of the live algorithm. We cloned the repository, read it end to end (roughly 2,300 files across the feed mixer, the candidate pipeline, the ranking models, and the trust-and-safety stack), and diffed the recent deployments to see what changed this month.

This is the complete creator's guide to what we found: how a post travels from the compose box to someone's feed, the exact value of every action a reader can take, the filters that decide whether you are even in the running, and what all of it means for how you should post. Everything is cited to a real file in the repository, so you can check our work.

- **20x** Weight of a copy-link share. The single strongest positive signal, vs 0.66 for a like
- **-234** Weight of a report. One predicted report outweighs hundreds of predicted likes
- **48h** Maximum post age in For You. After two days your post is filtered out, no matter how good
- **#16** The small-creator slot. One post per feed load can be lifted to position 16

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

Before we go deep, you can play with the headline numbers interactively. This demo is built on the same weight table this article documents:

Interactive demo: [What the X algorithm rewards](https://xpert.so/#algorithm)

## What changed in the latest deployments (October 2026)

The repository is not a one-time dump. It receives a sync from production almost every weekday (the most recent landed October 27), and because every sync is a git commit, the diff between deployments is a public changelog of the live algorithm. Here is what actually moved in the last month, straight from the commit history:

**Weight changes shipped in the last month. Diffs of home-mixer/params/param.rs between production syncs, Sep 29 to Oct 27, 2026**

| Signal | Before | Now | Shipped | Reading |
| --- | --- | --- | --- | --- |
| Like | 0.5 | 0.66 | Oct 13 + Oct 14 | Raised twice in two days, up 32% |
| Continuous dwell time | 0 | 0.01 | October | Holding attention pays 50% more |
| Not interested | -47.5 | -52.3 | October | The penalty got 10% harsher |
| Click | 0.4 | 0.3 | Sep 29 | Clickbait clicks pay 25% less |
| Video open | 0.07 | 0.02 | October | Opening a video now near-worthless alone |
| Post unexplored | 0.02 | 0.02 | October | Small exploration signal trimmed |

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

The direction of the October tuning is coherent: raw attention signals got more valuable (likes up twice in two days, dwell time up 50%), shallow interaction signals got cheaper (clicks down, video opens slashed), and the reader's explicit displeasure got more expensive. If your strategy leaned on curiosity-gap clicks, October made it measurably worse; if your posts hold attention and earn likes, October was a buff.

### The latest sync: per-reader calibration is being wired in

The October 24 to 27 deployments are the most interesting of the month. They ship an entire per-user debiasing pipeline: a new `vm-ranker/scoring/debias.rs`, a store for per-user calibration artifacts (`user_debias_store.rs`), and, in the very latest sync, home-mixer flipped `VMRankerSendDebiasInputs` to `true`, meaning production is now feeding per-user baselines to the ranker even though the final knob (`UserDebiasEnabled`) is still off. When it turns on, predictions will be re-centered against each viewer's personal baseline: a like from a stingy liker will count for more than a like from someone who likes everything. Easy engagement from easy audiences is about to be marked down.

Also visible in the recent syncs, staged behind off-by-default flags and experiments:

-   **A second new ranking model in shadow testing.** The shadow-traffic config added `Experiment19Fou` at 30% alongside Experiment18, meaning a next-generation Phoenix variant is being evaluated on live traffic right now.
-   **Semantic-ID retrieval** (`EnableSidSource`, with a new `sid_retrieval_client.rs`): a staged candidate source that retrieves by semantic post IDs, up to 800 candidates from 50 seed posts. Content meaning, not just engagement lookalikes, is becoming a retrieval path.
-   **History topics** (`HistoryTopicsEnabled`, 28-day window): the ranker is being prepared to see a month of your topic history, which would sharpen both topical consistency rewards and fatigue effects.
-   **Out-of-network replies may return:** new `EnablePhoenixOonReplies` and `PhoenixOonRepliesRootOnly` flags landed, both off. The no-replies-to-strangers rule documented below is current production behavior, but xAI built the switch to change it.
-   **A zero-like author experiment** (`zero_fav_codivert_filter.rs`): authors whose posts retrieve with zero favorites are being split into treatment and control buckets, a live experiment on how much reach brand-new or low-engagement authors should get.
-   **New author brand-safety and post-engagers clients**, a 170-line fair-share filter guaranteeing each candidate source a proportional slice of scoring capacity, and a retrieval pipe widened from 200 to 100,000 Kafka candidates.

> **How to read dated numbers in this article:** Every weight below is the production default as of the October 26 sync (the repo stamps the sync time at the top of param.rs). The week-to-week changes are real but mostly tuning-sized; the structure (what is rewarded, what is filtered, what is punished) has been stable since the repo opened in August. Where a number has moved during October, we say so.

## How a post becomes a For You feed: the architecture

The For You feed is assembled by a service called **home-mixer**, which runs a pipeline framework (`candidate-pipeline/`) with six stage types: sources, hydrators, filters, scorers, selectors, and side effects. Every time you pull to refresh, home-mixer runs the whole pipeline and returns 35 posts (`RESULT_SIZE` in `home-mixer/params/config.rs`).

The pipeline starts by hydrating the query: who you are. It loads your most recent actions (up to 1,024 of them), who you follow, who you have blocked or muted, your muted keywords, which posts you have already seen or been served, and your topic interests. Your feed is a function of your own behavior before a single candidate post is considered.

### Where candidate posts come from

Four sources run in parallel, each with a cap on how many posts it may contribute:

-   **Thunder** (in-network): an in-memory store of recent posts from accounts you follow, returning up to 1,200 posts, newest first. Thunder caps each author at 50 original posts, 30 replies, and 100 videos per fetch (`thunder/config.rs`).
-   **Phoenix retrieval** (out-of-network): a two-tower embedding model that matches your interest vector against an index of recent posts, returning up to 1,000 candidates.
-   **SimClusters** (out-of-network): community clustering that groups accounts and posts by who engages with what, surfacing posts popular in communities you belong to.
-   **Popular posts**: a shared list of up to 500 posts from roughly the top 0.005% of accounts by follower count that posted in the last 7 days, ranked by projected views with an 8-hour half-life and refreshed every 60 seconds (`home-mixer/util/popular_authors.rs`).

That is as many as a few thousand candidates competing for 35 slots. A fair-share filter caps what reaches scoring at 2,800 candidates, split proportionally across source types (`PhoenixScoresResultSize`), and then the real ranking begins.

### The scoring chain

Candidates flow through three scorers in order. First, **Phoenix**, a JAX transformer, predicts the probability of 27 different user actions for every candidate: will this specific viewer like it, reply, repost, share it via DM, expand the photo, dwell on it, mute the author, report it, and so on. A notable design choice called candidate isolation means each post is scored against you and your history only, never against the other candidates, which keeps scores cacheable and stable.

Second, an immersive-video scorer adjusts video candidates. Third, **vm-ranker** recomputes the final value score: it multiplies each predicted probability by a weight, sums the results, applies an out-of-network discount, an author-diversity decay, and a small-author exploration lift, and finally runs a diversity pass over the top of the ranking. The top 50 survive selection (`TOP_K_CANDIDATES_TO_SELECT`), visibility rules run once more, ads and the Who to Follow module are blended in (Who to Follow sits at position 6), and you get your 35 posts.

Every number in that chain is in the open. Let us start with the one creators ask about most: the weights.

## The value model: what every action is worth

The core formula is one line in `xai-value-model/scoring.rs`: a post's score is the sum over all actions of __weight × predicted probability__. The weights live in `home-mixer/params/param.rs`. Here is the full positive table, verbatim:

**What the X algorithm rewards. Weight applied to the predicted probability of each action (home-mixer production defaults)** (bar chart)

|  | Weight |
| --- | --- |
| Share via copy link | 20 |
| Reply from a mutual | 20 |
| Reply | 5 |
| Quote | 5 |
| Share via DM | 5 |
| Follow author | 4 |
| Share | 2 |
| Retweet | 1 |
| Like | 0.66 |
| Click | 0.3 |
| Open link | 0.2 |
| Dwell | 0.05 |

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

Three things jump out immediately.

**First, the like is almost worthless.** At 0.66, a like is worth about an eighth of a reply and a thirtieth of a copy-link share. The algorithm treats a like as a low-effort, low-information signal. An account optimized for likes is optimizing the wrong column.

**Second, the copy-link share is king.** At 20, it is the heaviest positive weight in the system. Think about what the action means: someone found your post valuable enough to carry it off the platform, into a group chat, a Slack, an email. X reads that as the strongest possible endorsement. Posts that people want to send to a specific person (useful references, sharp takes worth discussing, resources) have a structural advantage over posts people merely enjoy.

**Third, conversation outweighs amplification.** A reply (5) is worth five retweets (1). A quote (5) likewise. The feed is tuned to reward posts that start exchanges, not posts that get silently passed along.

### The full weight table

Here is everything, including the signals most people have never heard of:

**Every weight in the For You value model. home-mixer/params/param.rs, production defaults synced 2026-10-26**

| Signal | Weight | Note |
| --- | --- | --- |
| Share via copy link | 20 | Strongest positive signal |
| Reply (mutual follow) | 20 | 5 base + 15 bidirectional boost |
| Reply | 5 | Base weight |
| Quote | 5 |  |
| Share via DM | 5 |  |
| Follow author from post | 4 |  |
| Share (generic) | 2 |  |
| Retweet | 1 |  |
| Like | 0.66 | An eighth of a reply |
| Continuous click dwell | 0.4 | Time spent after clicking in |
| Click | 0.3 |  |
| Open link | 0.2 |  |
| Dwell (probability) | 0.05 | Pausing on the post in feed |
| Photo expand | 0.05 |  |
| Quoted click | 0.05 |  |
| Video open | 0.02 |  |
| Post unexplored | 0.02 | In-network only |
| Continuous dwell time | 0.01 | Per unit of feed dwell |
| Bookmark | 0 | No weight in the value model |
| Profile click | 0 | No weight |
| Video quality view | 0 | No weight |
| Not dwelled (scrolled past) | -0.02 | Small but real penalty |
| Block author | -31.2 |  |
| Not interested | -52.3 |  |
| Mute author | -58.8 | Worse than a block |
| Report | -234 | The nuclear signal |

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

> **Weights multiply probabilities, not counts:** The repository is explicit about this: the model predicts the probability that a given viewer takes each action, and the weight scales that probability. One actual report does not equal 468 actual likes, because a report is more than a thousand times rarer than a like. The weights tell you what the algorithm values, not an exchange rate between realized engagements. And only engagement on posts served in the Home timeline trains ranking at all: sending people directly to a post's URL does nothing for its For You distribution.

### The surprises in the zeros

The zero-weight rows deserve a second look, because they kill some popular folk theories.

**Bookmarks do not move the For You score.** For years, growth threads have claimed bookmarks are a secret heavy signal. In the published value model there is no bookmark weight at all. The model does predict bookmark probability internally (it is one of the heads used for per-user calibration in `vm-ranker/scoring/debias.rs`), but zero weight means it contributes nothing to the ranking sum. "Bookmark this" CTAs are optimizing a counter that the feed does not pay for.

**Profile clicks are worth nothing.** The "make them curious enough to click your profile" play has no direct ranking payoff either.

**Video quality views carry zero weight**, and the small video-open weight (0.02) only applies at all to videos of at least 10 seconds (`MinVideoDurationMs = 10000`). Video still earns through dwell and continuation time, but a raw "3-second view" is not the currency.

### Dwell: the silent currency

The attention weights look tiny next to a reply's 5, but they apply to every single viewer, not just the minority who act. Dwell probability is 0.05, continuous dwell time is 0.006 per unit, and there is a -0.02 penalty head for being scrolled straight past. Across thousands of impressions, the gap between a post that stops thumbs and a post that gets flicked past adds up to real score, before anyone has engaged at all. This is the quantified case for formatting: a strong first line, line breaks that create a reading rhythm, and an image worth a pause are all dwell plays. It also explains why walls of unbroken text underperform even when the ideas are good.

Video has its own economics. The headline weights are small (video open 0.02, video quality view 0.00), but click dwell time carries 0.4 and video continuation seconds is a dedicated prediction head. The system does not reward a video existing; it rewards a video being watched. A 40-second video that holds viewers beats a 3-minute video people abandon, and the 10-second minimum duration for quality-view eligibility (`MinVideoDurationMs`) makes sub-10-second clips a dead category for that head entirely.

### Estimate a post's weighted value

To get an intuition for how lopsided the weights are, try a few scenarios. This calculator applies the production weights to engagement counts. It is an illustration (remember, the real model weights probabilities per viewer, not totals), but the ratios are faithful:

**Weighted engagement value** Production For You weights applied to engagement counts. Watch how few copy-link shares it takes to outweigh hundreds of likes.

- Weighted value = Likes × 0.66 + Replies × 5 + Replies from mutuals × 20 + Reposts × 1 + Quotes × 5 + Copy-link shares × 20
- Like-equivalents = (Likes × 0.66 + Replies × 5 + Replies from mutuals × 20 + Reposts × 1 + Quotes × 5 + Copy-link shares × 20) / 0.66

Example inputs: Likes 200, Replies 12, Replies from mutuals 3, Reposts 15, Quotes 2, Copy-link shares 4.

## The negative signals: how posts die

The punishment side of the ledger is far steeper than the reward side, and it is where most reach quietly goes to die.

**What the X algorithm punishes. Negative weights in the For You value model** (bar chart)

|  | Weight |
| --- | --- |
| Report | -234 |
| Mute author | -58.8 |
| Not interested | -52.3 |
| Block author | -31.2 |
| Scrolled past | -0.02 |

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

A report at -234 is worth minus 354 likes of damage per unit of probability. A mute (-58.8) is nearly twice as bad as a block (-31.2), which makes behavioral sense: muting is what people do to accounts that annoy them but that they feel obliged to keep following, and the model treats that quiet annoyance as a stronger quality signal than an angry block.

There is also a structural cliff built into the arithmetic. In `xai-value-model/scoring.rs`, any post whose weighted sum comes out negative is squashed into the tiny range between 0 and 0.001 (`NEGATIVE_SCORES_OFFSET`). In practice: a post with net-negative predicted value ranks below every net-positive post in the candidate pool, no matter how much raw engagement it has. Rage-bait that farms replies but also farms mutes and "not interested" clicks is not playing a clever margin game; one step over the line and it falls off a cliff.

The practical reading: the model is per-viewer. It is not asking "did this post get reports in general," it is asking "will __this reader__ mute you for this." Posting that performs well with your core audience but irritates the broader out-of-network pool will see out-of-network distribution dry up first, which is exactly the pattern creators describe as a shadowban. Often it is just this arithmetic.

> **The AI slop penalty is real, specific, and severe:** The enforcement rules in abuse-enforcement-service contain a label literally called llm_slop_user. An account flagged by the slop classifier gets a SpamHighRecall label for 7 days, and SpamHighRecall is on the drop list for out-of-network recommendations. In plain terms: post like an AI content farm and X removes you from non-followers' For You feeds for a week. Grok-based classifiers score every original post at publish time, including a dedicated slop_score. Generic AI output is not just ineffective on X in 2026, it is formally penalized.

## The mutual-follow boost: replies are not all equal

One of the most consequential recent changes is documented in `docs/BIDIRECTIONAL_BOOST_CHANGE.md` with its own A/B history: when the viewer and the author follow each other, the reply weight gets a +15 boost on top of the base 5. The boost launched at +20 in mid-July 2026 and was tuned down to +15 two weeks later.

That means a reply from a mutual is worth 20, the same as a copy-link share, and roughly 30 likes. The algorithm is explicitly buying conversations between people with established two-way relationships. This is the quantified version of "X is a networking app wearing a broadcast app's clothes."

Two implications follow. First, your mutual graph is a ranking asset: every genuine mutual you add is a reader whose replies are worth quadruple a stranger's. Converting one-way followers into mutuals (by following back the accounts that consistently engage) literally raises the ceiling on your posts' scores. Second, spending fifteen minutes replying to your mutuals after you post is not just community hygiene; their replies back are the heaviest engagement your post can collect in its critical first window.

> **The first-hour playbook, from the code:** Posts enter For You through sources that favor recency (Thunder serves newest first, and the cold-start lift below requires the post to be under 2 hours old). Stack the heavy signals early: post when your mutuals are online, reply to every substantive reply within the first hour (each exchange invites another weighted-5 or weighted-20 action), and write posts worth sending to a friend, since each copy-link is weight 20. The window is real and it is short.

## The filters: fifteen ways to be removed before ranking

Scoring only matters if your post survives the filters. The For You pipeline in `phoenix_candidate_pipeline.rs` runs a long gauntlet of pre-scoring filters, in a fixed order. These are the ones that matter to creators:

**Pre-scoring filters in the For You pipeline. Run in order on every candidate before ranking (phoenix_candidate_pipeline.rs)**

| Filter | What it removes |
| --- | --- |
| AgeFilter | Any post older than 48 hours |
| OONRetweetReplyFilter | Replies and retweets from accounts the viewer does not follow |
| SelfReplyChainFilter | Reply chains where the viewer follows nobody above you in the thread |
| PreviouslySeenPostsFilter | Posts the viewer has already seen |
| PreviouslyServedPostsFilter | Posts already served, even if not seen |
| ViewerMutedKeywordFilter | Posts matching the viewer's muted keywords |
| AuthorSocialgraphFilter | Posts from authors the viewer blocked or muted |
| OONNsfwSimclustersFilter | NSFW-flagged authors shown to non-followers |
| RetweetDeduplicationFilter | Multiple retweets of the same post |
| DedupConversationFilter | Every post in a conversation except the highest-scoring one |
| FairShareRankingFilter | Candidates beyond 2,800, split fairly across sources |

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

Three of these deserve a closer look.

### The 48-hour lifespan

`MAX_POST_AGE` is 48 hours, computed from the post ID itself. After two days, a post is categorically ineligible for For You, regardless of how well it is performing. Combined with the popular-posts source's 8-hour view half-life, the message is unambiguous: X distribution is a daily game. Your library of old bangers earns nothing; the feed only pays for what you shipped this week. (Search and profile visits still find old posts, but the recommendation engine does not.)

### Your replies do not travel

The `OONRetweetReplyFilter` drops out-of-network replies and retweets outright, and Phoenix's out-of-network reply retrieval is disabled by default (`EnablePhoenixOonReplies = false`). Translation: your brilliant reply under a big account is seen by people browsing that thread and by your own followers, but it is not recommended into strangers' For You feeds. Reply-guy strategies earn visibility within the thread and new followers from thread readers, not direct feed distribution. The post types that travel to strangers are originals and quotes.

There is a subtle extra rule for in-network reply chains (`SelfReplyChainFilter`): a reply only survives if the first non-self account above it in the thread is someone the viewer follows. Even your followers mostly see your replies only when they also follow the person you are replying to or the thread is yours.

### One post per conversation

`DedupConversationFilter` keeps only the highest-scoring post from any one conversation. Your 12-part thread is competing against itself: one tweet from it, usually the strongest, represents the whole thread in a given feed. Front-load threads so the hook tweet is the one that wins.

## Author diversity: the case against posting floods

vm-ranker applies a per-author decay to consecutive posts from the same account in one ranking pass (`vm-ranker/params.rs`: decay 0.5, floor 0.25). Your best post keeps its full score; your second-best is multiplied by 0.625, your third by about 0.44, and everything after converges to a quarter of its score.

**Score multiplier by author post rank. Same feed load, same author: each additional post keeps less of its score (decay 0.5, floor 0.25)** (bar chart)

|  | Multiplier |
| --- | --- |
| 1st post | 1x |
| 2nd | 0.63x |
| 3rd | 0.44x |
| 4th | 0.34x |
| 5th+ | 0.27x |

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

On top of that, a determinantal point process (`vm-ranker/dpp.rs`, on by default, θ = 0.65) runs over the top 150 ranked posts and prunes near-duplicate __content__ using embedding similarity, so five people posting the same news screenshot collapse to roughly one slot. And remember Thunder's per-author caps (50 originals, 30 replies per in-network fetch).

The combined lesson: volume has sharply diminishing returns inside any single feed session. Five posts a day spread across the hours your audience is online will outperform five posts in one burst, and one great post beats three good ones fighting each other for the same decayed slots.

## The small-creator lottery: slot 16

The most creator-friendly machinery in the whole repository is the author cold-start scorer (`home-mixer/scorers/author_cold_start.rs`). On each feed load, the system may pick exactly one eligible low-visibility post and lift it to position 16 in the ranking. Eligibility is strict and entirely mechanical:

- **≤50K** Author follower cap. ColdStartFollowerCap: this lane exists only for smaller accounts
- **<2h** Maximum post age. ColdStartMaxPostAgeSecs = 7200
- **<200** Home impressions so far. The lift is for posts the feed has not yet tested
- **1 post** Lifted per feed load. To position 16, chosen by Thompson sampling on like rate

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

The post must also be an original (not a reply or retweet) and already scoring in the top 97% of non-zero candidates. Selection uses Thompson sampling on the post's like-per-view rate with a prior of roughly 1.5%: the system samples from a Beta distribution over each eligible post's observed like rate, takes the top two samples, and promotes the one with the higher model score. The lift only ever raises a score to the rank-15 level; it never demotes anything.

What this means in practice: if you are under 50,000 followers, every original post gets entered into a recurring lottery during its first two hours, and the ticket multiplier is your like-per-impression rate on the small early sample. A post that converts its first 100 impressions at 3% like rate samples dramatically better than the 1.5% prior and keeps winning lifts, each of which brings fresh impressions, which (if the post is good) compound. This is the codified mechanism behind "small accounts can go viral from nothing," and it is why your first two hours, and the strength of your hook for cold audiences, matter more than anything else you control.

## Inside Phoenix: the model that predicts you

It is worth pausing on what the ranking model actually is, because its design explains behavior that confuses creators daily.

Phoenix is a transformer written in JAX. Its input is not your post; it is the viewer: a sequence of up to 1,024 of their most recent actions (`MaxSeqLengthScoring`), their follow graph, and embeddings of candidate posts. For each candidate it outputs 27 probabilities, one per action head, from "will favorite" through "will open the photo" to "will report." Those 27 numbers, multiplied by the weights above and summed, are your post's score for that one viewer.

The 27 heads break down like this:

-   **Engagement heads (7):** favorite, reply, retweet, quote, share, share via DM, share via copy link.
-   **Click heads (8):** click, open link, photo expand, video open, profile click, quoted click, video quality view, quoted video quality view.
-   **Attention heads (6):** dwell, dwell time, click dwell time, video continuation seconds, profile visit seconds, post unexplored.
-   **Relationship heads (2):** follow author, react with video.
-   **Negative heads (5):** not interested, block author, mute author, report, not dwelled.

Two architectural details matter for strategy. First, **candidate isolation**: each post is scored against the viewer alone, never against the other posts in the batch. Your post does not get a worse model score because a bigger account posted at the same minute; competition happens later, in selection and the diversity passes, not inside the model. Second, the model is **retrained continuously on served impressions**. Every For You session is training data, which is why the system adapts within days when your content (or your audience's taste) shifts, and why engagement earned off-feed teaches it nothing about you.

Retrieval, the other half of Phoenix, is a two-tower model: one tower embeds the viewer, the other embeds posts, and candidates are fetched by nearest-neighbor search over the index that `phoenix-rankall/` maintains. The practical upshot of two-tower retrieval is that your post travels to strangers whose embedding looks like your engagers' embeddings. The audience that engages with your first few hours literally defines which strangers see it next; early engagement from the wrong crowd steers retrieval somewhere your content will underperform.

Downstream of the model, vm-ranker can apply per-user **debiasing** (`vm-ranker/scoring/debias.rs`): re-centering predicted logits per viewer across 14 heads so chronically generous likers and chronically stingy ones do not distort ranking. It ships disabled by default (`UserDebiasEnabled = false`), but the plumbing tells you where the system is heading: toward scoring posts on lift relative to each viewer's baseline, not raw probability. Content that only harvests easy engagement from easy audiences is the kind this machinery exists to deflate.

### Thunder: the in-network fast lane

Your followers' feeds are fed by Thunder (`thunder/`), and it behaves differently from everything else. Thunder is an in-memory store, written to by Kafka consumers as posts are created, that returns followed accounts' posts newest first, up to 1,200 per request. There is no clever selection at the source: recency is the ordering, and the value model sorts the rest. That is why your followers reliably see your post within minutes while out-of-network reach ramps over hours.

Thunder's reply rules are strict and worth knowing: an in-network reply is served only if it replies to an original post, or if it replies to a reply in a conversation and is directed at someone the viewer follows. Retweets of the viewer's own posts are excluded (nobody needs to be shown their own post again), and the per-author caps (50 originals, 30 replies, 100 videos per fetch) only bite genuinely hyperactive accounts.

## The 48-hour life of a post, step by step

Put the whole system together and a post's life looks like this:

1.  **Minute 0: publish-time classification.** Grok-based classifiers read the post: topic tags, embeddings, a slop score, safety scores. The post enters Thunder's in-memory store and becomes retrievable by Phoenix's index within moments.
2.  **Minutes 0 to 60: the in-network test.** Followers pulling to refresh get the post via Thunder, newest first. The model has little post-specific evidence yet, so predictions lean on your account's track record with each viewer. Early replies (especially from mutuals at weight 20) and copy-link shares (20) rapidly raise predicted value for everyone who follows.
3.  **Hours 0 to 2: the lottery window.** If you are under 50K followers, the post is cold-start eligible while it has under 200 home impressions. A strong like-per-view rate on the first impressions wins slot-16 lifts, each buying another batch of fresh eyeballs.
4.  **Hours 1 to 8: crossing the network boundary.** With real engagement evidence accumulated, the post starts winning out-of-network auctions despite the 0.75 discount. Two-tower retrieval surfaces it to strangers who resemble its engagers; the popular-posts list (8-hour view half-life) can pick it up if views are compounding.
5.  **Hours 8 to 48: the long middle.** Distribution continues wherever predicted value stays high, pruned by seen-post filters (nobody is shown it twice) and the DPP if similar content saturates. Performance here is pure model confidence: dwell, continued shares, and the absence of mutes.
6.  **Hour 48: the cliff.** The AgeFilter removes the post from all For You candidacy. Whatever momentum remains lives in search, profile visits, and external links, none of which train ranking.

## Out-of-network reach, trust systems, and what is NOT in the code

### The 25% stranger tax

There is no fixed ratio of in-network to out-of-network posts in your feed; everything is ranked in one pool. But out-of-network candidates carry a flat ×0.75 multiplier (`OonWeightFactor`), and topic-based candidates carry ×0.5. To reach strangers, your post has to beat followed accounts' posts by a third more on predicted value. Strong early engagement from your own followers and mutuals is what buys a post past that threshold, which is another reason the first-hour, in-network game decides out-of-network reach.

### Publish-time AI review

Every original post passes through Grok-based classifiers at publish time (the `grox/` flows): a "banger" initial screen on original posts, generating a description, topic tags, a `slop_score`, and a minor-safety score. Account-level systems run alongside: `agatha/` labels accounts by the rate of blocks, mutes, and spam reports they attract relative to favorites over a rolling 30-day history, `bdsm/` detects inauthentic action sequences (engagement pods, bot rings), and `user-cred-v2/` computes a PageRank-style credibility score from the follow graph. Buying engagement or coordinating pods leaves exactly the action-sequence fingerprints these systems exist to catch.

### The visibility rulebook

Separate from scoring, the `visibility-filtering/` service decides whether a post may be recommended at all. For the Home recommendations surface, these author-level labels remove an account's posts from out-of-network distribution entirely:

**Author labels that block out-of-network recommendation. visibility-filtering/rules/levels.rs, TIMELINE_HOME_RECOMMENDATIONS**

| Label | Typical cause |
| --- | --- |
| SpamHighRecall | Spam patterns, including the 7-day llm_slop_user label |
| NsfwHighRecall / HighPrecision / NearPerfect | Adult content, including NSFW avatar or banner |
| DoNotAmplify | Manual or automated deamplification |
| AbusiveHighRecall | Abusive conduct patterns |
| Compromised | Account appears taken over |
| ImpersonationHighPrecision | Impersonating another account |
| ReadOnly | Account in a punishment state |

Source: github.com/xai-org/x-algorithm, synced 2026-10-26

These labels are what people actually mean by a shadowban, and the inputs that earn them are mostly rate-based. `agatha/` computes account labels from the rate of blocks, reports, and spam reports you attract __relative to the favorites you attract__, over a rolling 30-day history. A growing account collecting plenty of likes absorbs occasional reports fine; an account whose negative actions outpace its favorites drifts toward a label. The 30-day window also means recovery is possible and roughly month-shaped: stop the behavior that generates mutes and reports, and the ratios that drive labels reset.

### Myths the code quietly kills

-   **No Premium ranking boost.** We searched home-mixer, vm-ranker, and the value model: there is no verified or Premium weight anywhere in scoring. Premium appears in ads logging. The blue check buys features and visibility surfaces, not For You ranking points.
-   **No hashtag machinery.** Nothing in the ranking path reads hashtags. Topics are inferred by classifiers and embeddings.
-   **External links are not hard-penalized in the weights.** Opening a link is a small positive (0.2). The honest caveat: link posts can still underperform via the behavior the model predicts (readers who click away do not reply), but there is no explicit link penalty constant.
-   **Direct traffic does not train the feed.** Only engagement on posts served in the Home timeline counts for ranking, per the comments in param.rs. Blasting a post's URL to your newsletter boosts its counters, not its For You score.

**Poll:** Which finding changes how you will post?

- Copy-link shares at weight 20
- Mutual replies worth 20 vs 0.66 for a like
- The 48-hour post lifespan
- The slot-16 small-creator lottery
- Bookmarks worth exactly zero

## The algorithm is a moving target: recent changes on the record

One underrated feature of the open repository is that changes now arrive with receipts. A few from the recent record that shifted strategy:

-   **July 13, 2026: the bidirectional reply boost ships at +20**, then is tuned to +15 on July 24 after A/B measurement (`docs/BIDIRECTIONAL_BOOST_CHANGE.md`). Mutual-graph quality became a first-class ranking input overnight.
-   **August 2026: the repository goes public**, with a README changelog that has been updated through September, including documentation of how weights work and election-related filtering.
-   **October 26, 2026: the last parameter sync** recorded in `home-mixer/params/param.rs`, the source of every weight in this article.

Some things are deliberately withheld: certain enforcement rules in `botmaker-rules/` ship redacted to prevent gaming, the Grok classifier prompts are not included, and the published thresholds in the credibility-based rule exemptions are mock values. The scoring math, though, is complete, and it is the part that should change how you post.

## The playbook: ten changes the code justifies

Everything above compresses into a short list of behaviors with direct support in the source:

1.  **Write posts people send to someone.** The copy-link share is weight 20. Useful references, sharp contrarian takes, and "my friend needs to see this" content structurally outrank merely likeable content.
2.  **Engineer conversations, not applause.** Replies (5) and quotes (5) are the volume signals that matter. End posts with a genuine opening for disagreement or addition. Reply to replies: every exchange is another weighted event.
3.  **Invest in mutuals.** A mutual's reply is worth 20. Follow back your consistent repliers, and show up in their threads; the boost works in both directions.
4.  **Treat the first two hours as the whole game.** The cold-start lottery requires under 2 hours and under 200 impressions; Thunder serves newest first; the popular list decays on an 8-hour half-life. Post when your people are online, then stay for the conversation.
5.  **Space your posts out.** Author diversity decay (0.5, floor 0.25) and conversation dedup mean a burst of posts cannibalizes itself. Hours apart beats minutes apart.
6.  **Front-load threads.** Only one post per conversation survives dedup; make sure it is your hook.
7.  **Stop optimizing bookmarks and profile clicks.** Both are weight zero in the For You value model.
8.  **Audit yourself for mute-bait.** Mute is -58.8 and "not interested" is -52.27, and a net-negative post ranks below everything. Engagement-bait formats that annoy the marginal reader cost more than they earn.
9.  **Sound like a person.** The slop classifier runs on every post and the llm\_slop\_user label removes you from strangers' feeds for 7 days. Generic AI output is now a formal distribution risk.
10.  **Ship fresh originals daily rather than recycling.** The 48-hour age filter plus the DPP's near-duplicate pruning mean reposted and copied content has nowhere to go.

One honest note on all of the above: the weights apply to __predicted probabilities for each individual viewer__, produced by a transformer looking at that viewer's last 1,024 actions. You cannot game a prediction of genuine behavior for long; the only durable strategy the code leaves open is making things specific audiences genuinely reply to, share, and come back for. The algorithm is, in the end, a very expensive lie detector.

## FAQ

**Is this really the live X algorithm?**

The repository is published by xAI and states its parameters were last synced from production on October 26, 2026. Per-user feature switches and running experiments can override defaults, and some enforcement rules are withheld to prevent gaming, but the weights, filters, and pipeline documented here are the production defaults in the published source.

**Do likes matter at all anymore?**

Yes, twice over. Directly, a like is worth 0.66, small but positive. Indirectly, the small-creator cold-start lift selects posts by like-per-view rate, so for accounts under 50K followers the early like rate is the lottery ticket that earns extra impressions.

**Why did my post stop getting impressions after two days?**

The AgeFilter removes any post older than 48 hours from For You candidacy, computed from the post ID. That cliff is universal and has nothing to do with your account.

**Do bookmarks help my reach?**

Not in the For You value model: the bookmark weight does not exist in the scoring table. The model tracks bookmark probability internally for calibration, but it adds nothing to a post's ranking score.

**Does X Premium boost my posts in the algorithm?**

We found no verified or Premium weight anywhere in home-mixer, vm-ranker, or the shared value model. Premium appears in the ads code. Whatever Premium buys, it is not ranking points in For You.

**Why do my replies to big accounts not show up in For You?**

Out-of-network replies are filtered from For You outright, and even in-network replies only surface when the viewer follows someone above you in the thread. Replies earn visibility inside the thread itself, not feed distribution. Originals and quotes are what travel.

**Is there an actual penalty for AI-generated content?**

Yes. Grok-based classifiers score every original post at publish time, including a dedicated slop score, and the llm_slop_user enforcement label applies SpamHighRecall for 7 days, which removes the account from out-of-network recommendations. Distinctly human writing is now a measurable ranking asset.

**How does a small account actually go viral under this system?**

The written path: post an original with a strong hook, convert your first couple hundred impressions at a high like rate, win the slot-16 cold-start lift repeatedly during the first two hours, let mutual replies and copy-link shares push the predicted value high enough to beat the 0.75 out-of-network discount, and the Phoenix retrieval tower starts surfacing you to lookalike audiences. Every stage of that path is in the code above.

## Posting into a known game

For most of X's history, creators argued about an invisible machine. Now the machine is public, versioned, and updated: the weights are in `param.rs`, the filters are in the pipeline, the lottery is in the cold-start scorer. The creators who win from here are the ones who internalize the actual rules: conversation over applause, mutuals over masses, the first two hours over the archive, and a human voice over slop, because the system now checks.

Xpert is built directly on this repository: our scoring engine mirrors these production weights, our drafts are tuned to the signals that carry weight (and screened against the ones that get you muted), and our scheduler targets your proven first-hour windows. If you would rather act on the algorithm than memorize it, [start free](https://xpert.so/) and let it watch the repo for you.

Interactive demo: [The hit meter](https://xpert.so/#tour)

---

Source: https://xpert.so/blog/x-algorithm-update-october-2026-what-changed-in-the-cod-56424
