atrium Research note
xai-org/x-algorithm @ a389166f6cf5da70a286b568c87695d4dcdce3a1a389166f Full-repository audit · 2026-08-13

Inside X's For You algorithm

X open-sourced its recommendation stack. Read as code rather than as folklore, it describes a system that predicts the value of showing one specific post to one specific viewer — then enforces eligibility, safety, freshness, social-graph, repetition and diversity constraints on top. It is not a single engagement counter, and it is not a points table you can farm.

Tracked files audited
2,053
Published coefficients
23
Findings
8
Proven by the code
11
Unknowable from it
11
Runs end-to-end
Phoenix only
1.25%

of the candidates that reach the ranker survive to a viewer's screen — at most 35 of up to 2,800.

−234.0

the coefficient on a predicted report. The largest positive coefficient in the table is +20.0.

48h

hard post-age eligibility ceiling. The code proves the ceiling — and no golden hour.

0.25×

the floor your own repeated posts decay toward inside a single slate. The system competes with you.

1
of eight

The objective is a weighted sum of predicted actions — not an engagement count

RankingScorer multiplies each published coefficient by a model-predicted probability for that viewer/post pair and sums the terms. Phoenix trains the action heads with independent sigmoid losses, not one softmax — so a single post can be predicted likely to draw several different actions at once. The weighted sum is then mutated by a fixed chain of adjustments before anything is selected.

score = Σi  wi ·  P( actioni | viewer, post )
w — published, constant, auditable All 23 coefficients are checked into the repository. They are mirrored production defaults, not a promise that every viewer gets them.
P — learned, per-viewer, undisclosed Produced by a transformer trained on data and checkpoints that were not released. No source-only analysis can compute a real post's score.
base
Weighted sum
Σ wᵢ·Pᵢ across all heads
then +
Cold-start lift
At most one small-author original, raised to slot 16
then ×
Same-author decay
×1.0 → 0.625 → 0.4375 → 0.34375 → floor 0.25
then ×
Out-of-network discount
×0.75, or ×0.5 for topic OON
The adjustment order is fixed in the checked default path. Non-negative scores then receive a +0.001 offset; a net-negative score is normalised into a narrow band below 0.001 rather than left negative — so bad candidates sort behind every ordinary positive one without large negative sort values distorting the scale.
2
of eight

Eligibility runs before optimisation, and the survivors are never replaced

Hard filters delete candidates before a single probability is predicted. A filtered post gets no benefit from a great score, because it never gets a score. At the other end, Home Mixer takes a stable descending Top 50, applies visibility and conversation filters, then truncates to 35 — and does not refill the holes from the candidates it discarded below rank 50.

From candidate pool to delivered feed Linear scale · one axis
Candidates sent to the Phoenix rankerup to 2,800
Top 50 survives selection — 1.8% of the pool
1,000 — the ceiling on Phoenix retrieval's contribution
2,800 max
The last 50, at 56× the scale aboveone square = one slot
35 slots delivered, at most 15 dropped by the truncation cap — plus anything visibility or conversation dedup removed, which is not backfilled
Because filtered holes are not refilled, the delivered count can fall below 35 even when hundreds of scored candidates remain available. Default active retrieval sources are Thunder (in-network), Phoenix retrieval and SimClusters; Tweet Mixer and Phoenix MOE ship present but disabled in the checked-in defaults.
What is deleted before scoring begins Pre-score hard filters
  • Duplicate candidates
  • Posts older than the 48-hour ceiling
  • Missing or unhydratable posts
  • The viewer's own posts
  • Out-of-network replies
  • Out-of-network reposts
  • Inaccessible subscriber-only posts
  • Already seen or already served material
  • Muted keywords
  • Social-graph exclusions (blocks, mutes)
  • Video and topic exclusions
  • Experimental holdouts

A second policy pass runs after selection: visibility filtering returns allow, interstitial or drop per viewer, and a dropped reply ancestor, quoted post or repost source invalidates the whole candidate. Conversation dedup then keeps only the single best candidate per conversation.

3
of eight

Only originals and quotes can reach strangers. Replies and reposts cannot.

This is the single most consequential line in the published filter set, and it is a deterministic code path rather than an inference. In the default out-of-network route, replies and reposts are removed before ranking. Everything that survives is then discounted simply for being out-of-network.

Post format In-network
shown to your followers
Out-of-network
shown to strangers
Standalone originalThe only unconditional discovery primitive in the published path. Eligible Eligible
Quote postEligible — but a visibility drop on the quoted source removes the entire candidate. Eligible Conditional
ThreadOnly the root carries discovery value; conversation dedup keeps one candidate per conversation, so branches do not buy extra slots. Eligible Root only
ReplyValuable for followers, relationships and interest signal — but filtered out of stranger recommendation. Eligible Filtered
RepostUseful in-network curation. Repost-source duplicates are additionally collapsed. Eligible Filtered
×0.75
Out-of-network multiplier
Applied to surviving OON candidates after scoring
×0.50
Topic out-of-network multiplier
A steeper discount on topic-sourced candidates
also
In-network replies and reposts
Receive the OON rescore by default even inside your own network
4
of eight

Your post is read as meaning, not as text

Seven distinct content channels are compressed upstream into semantic IDs before the ranker ever sees them. Raw text, pixels and video frames are not passed into the checked Home ranking preset — the model consumes hashed identity, locale and device context, viewer-local hour, post age, semantic IDs, recent actions and normalised dwell history. Retrieval and the diversity layer both operate on those representations, which is why a coherent subject area is a retrieval property rather than a branding preference.

Seven channels into one representation Content understanding
Seven content channels — post text, media, video frames, speech transcript, links and articles, quoted context and author context — converge into semantic IDs, which feed Phoenix retrieval and DPP diversity reranking. Post text Media Video frames Speech transcript Links & articles Quoted context Author context semantic IDs Phoenix retrieval DPP diversity reranking two-tower dot product over the corpus multimodal embeddings, θ = 0.65 requested
Grox builds the multimodal representation asynchronously off the request path and writes it to Strato/Manhattan and Kafka. Its prompts are deliberately withheld from the release, so the plumbing is inspectable while the semantics are not.
Disclosed production model configuration Ranking transformer Retrieval tower
Transformer layers 8 8
Embedding width 2,560 1,024
Query attention heads 20 not disclosed
Key / value heads 4 not disclosed
Viewer history events consumed 1,022
Candidates per forward pass 64
Candidates are placed in separate attention segments, so one candidate's raw prediction is invariant to the others in its batch. That buys stable batching and cacheability — and it means diversity cannot be learned inside the transformer. It has to be imposed afterwards, which is exactly what finding 6 describes.
5
of eight

The published value system is overwhelmingly defensive

All 23 coefficients on one linear axis, sorted. Seventeen positive terms occupy a narrow band near zero; four negative terms sweep an order of magnitude further left. The system's stated priority is not to find you something delightful — it is to avoid showing you something you would report.

Default coefficients in home-mixer/params/param.rs One linear axis · −250 to +25
+43.30

The sum of every positive coefficient in the table — all sixteen non-zero ones combined, excluding the per-second dwell term.

−43.20

A single predicted “not interested” tap. One negative head very nearly cancels the entire positive vocabulary.

8.5×

The four negative coefficients total −367.2 — eight and a half times the whole positive side of the ledger.

What this chart does not say. Every coefficient multiplies a predicted probability, and those probabilities differ by orders of magnitude between heads. A report is astronomically rarer than a favourite, so a −234 weight does not mean a report costs 468 favourites. Coefficients are a statement about what the system values, never an exchange rate between observed actions.
The mutual-follow reply term is drawn as an outline because it is conditional: it applies only to an eligible standalone original between mutual follows, stacking on the +5.0 base to reach +20.0. Profile click and the binary dwell head carry a published weight of exactly zero — they still enter history and retrieval, but contribute nothing directly to this sum.
Table view — all 23 coefficients
Predicted outcome Default coefficient
6
of eight

Five separate mechanisms exist to stop you appearing twice

Because candidates cannot see each other inside the transformer, repetition has to be suppressed by explicit machinery afterwards — and there are five independent layers of it. The most direct is same-author decay: within one slate, each additional post from the same author is multiplied by a factor that halves its distance to a 0.25 floor.

Same-author score multiplier decay 0.5 · floor 0.25
Same-author score multiplier by position within one slate: 1.0, then 0.625, 0.4375 and 0.34375, decaying toward a floor of 0.25. floor 0.25 1.00 0.75 0.50 0.25 1.0 0.625 0.4375 0.34375 1st post 2nd 3rd 4th Position of your post within a single viewer's slate
Four disclosed multipliers, plotted. The pale continuation is the arithmetic implication of the stated 0.5 decay, not a separately published value. By your fourth post in one slate you keep about a third of your own score.
All five repetition controls
Same-author decayMultiplies each additional post by the same author within a slate.
0.5 → 0.25
Conversation dedupOnly the best candidate from a conversation survives post-selection.
1 per thread
Repost-source collapseDuplicate reposts of the same underlying post are collapsed.
1 per source
Seen / served suppressionBloom filters over impression state. “Seen” does not mean read — client impression state is enough.
bloom filter
DPP semantic diversityGreedy subset selection over multimodal embeddings. Unselected posts are zeroed, not reordered.
θ = 0.65
Home Mixer requests DPP with θ = 0.65 — but the exported VM Ranker service defaults DPP off at the CLI and its production launch arguments were not released. Requested is not the same as enabled; this is one of the release's genuine blind spots.
7
of eight

A mutual follow is worth more than any single action

The largest conditional in the entire parameter file is not a content lever. When an eligible standalone original is shown between mutual follows, an additional +15.0 stacks onto the reply coefficient — taking it from +5.0 to +20.0 and tying the single largest positive term in the table. Relationships are structural: they change candidate supply, safety treatment and the arithmetic itself.

Reply coefficient, by relationship Shared axis · 0 to +20
Any eligible postBase reply coefficient
+5.0
Mutual-follow standalone originalBase +5.0, plus the conditional +15.0
+20.0
For reference: share via copy linkThe joint-largest positive coefficient
+20.0
The outlined segment is the conditional +15.0, drawn the same way it is in finding 5. The conditions are strict and conjunctive — eligible, mutual follow, standalone original. A reply, a repost, or a one-way follow does not qualify.
The small-author cold-start path Every gate must hold · at most one candidate
≤ 1,000
followers on the author account
< 1,000
views on the post so far
top 85%
the original must already rank inside the non-zero-score pool
slot 16
exactly one candidate is lifted, to the score at zero-based index 15

This is limited exploration, not free reach. It lifts one already-competitive post from one small account to a mid-feed position — and the 24-hour freshness check that circulates alongside it applies to the MOE treatment arm, not to every ordinary cold-start candidate.

8
of eight

Time is a hard ceiling, not a golden hour

The code proves exactly one temporal rule: a 48-hour post-age eligibility cutoff, applied as a pre-score hard filter. Post age and viewer-local hour are learned model inputs. What the repository does not contain is a decay curve, a velocity formula, a posting-cadence rule, or anything resembling a universal best time to post.

Post-age eligibility window Hard pre-score filter
Eligible for candidate retrieval — no published decay curve within this window
Hard cutoff
Freshness still matters — Thunder's in-network store is recency-ordered and retention-bounded, and RankAll maintains separate retrieval corpora for fresh posts and for posts crossing 1 and 32 favourites. That is how early engagement helps: it can change index membership, not the additive score. Qualifying video views require more than 10 seconds of playback.
Twelve claims the published source does not support Myth audit
Circulating claim Verdict from the code
“A reply is worth ten likes.” False framingCoefficients multiply different predicted probabilities; later adjustments and reranking also move the order.
“Replies and reposts are the stranger-reach hack.” ContradictedBoth are removed by the out-of-network filter before scoring.
“Stuff hashtags for reach.” UnsupportedNo direct hashtag-count scoring term appears anywhere in Home scoring.
“All external links are suppressed.” UnsupportedLink-open propensity carries a positive +0.2 coefficient. Harmful URLs face policy systems, not a blanket penalty.
“Video always gets boosted.” UnsupportedThe qualifying-video-view contribution is +0.05, conditional on 10+ seconds, and viewers can exclude video outright.
“Post at the golden hour.” Not establishedA 48-hour ceiling and learned age/time inputs — no universal decay curve.
“Post more to occupy more slots.” Usually self-defeatingAuthor decay, conversation dedup, repost collapse, served history and semantic diversity all make your posts compete with each other.
“Bookmarks directly add ranking points.” No direct termNo non-zero weighted term is visible — but bookmarks do enter history and seed SimClusters retrieval.
“Verified status boosts every post.” UnsupportedNo simple Home score multiplier. Reputation affects safety and anti-abuse contexts, which is a different system.
“Follower count always boosts rank.” UnsupportedNo universal multiplier. The one disclosed follower-sensitive path favours smaller accounts.
“Seen means the viewer read it.” FalseSeen/served suppression can fire on client impression state with no meaningful dwell.
“These defaults are the algorithm, for everyone.” FalseThey are periodically mirrored production defaults, subject to live experiments and per-viewer configuration.
Register

Eleven things the code proves. Eleven it cannot.

The release is a transparency slice, not a reproducible product dump. Only Phoenix ships with enough manifests to run end-to-end. Home Mixer, Thunder, Grox and the safety services all depend on generated code, internal libraries, live feature switches and credentials that were not published — and Grox's prompts and some Botmaker rules were withheld deliberately, to limit gaming.

11High confidence — deterministic in the source
  • Request and pipeline execution order
  • The role of each candidate source
  • Published filter order
  • All 23 default coefficients
  • The score-combination arithmetic
  • Same-author diversity adjustment
  • Conversation and repost deduplication
  • The 48-hour default age cutoff
  • DPP implementation and the parameters Home requests
  • In-network vs out-of-network reply/repost handling
  • Major visibility-policy mappings
11Not knowable from this release
  • Learned feature importance and calibration
  • Current viewer-level experiment assignment
  • The real training data distribution
  • Checkpoint weights
  • Training cadence
  • Feedback latency
  • Any universal posting-time curve
  • The full semantic prompt set
  • Complete safety and anti-abuse thresholds
  • VM Ranker service launch flags
  • Exact production availability and failure behaviour
Between those columns sits the only honest answer to “how much does this tactic help?” — the direction follows the disclosed system; the effect size does not. It depends on Phoenix's learned predictions, the candidate pool, the audience, the live experiment set and the downstream policy layers, none of which were released.

This audit was written by Jonny Asmar, who builds atrium — a persistent, programmable workspace for real CLI coding agents. Launch them, resume them, steer them, and let them coordinate in a room that survives crashes and reboots.

getatrium.dev →