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.
of the candidates that reach the ranker survive to a viewer's screen — at most 35 of up to 2,800.
the coefficient on a predicted report. The largest positive coefficient in the table is +20.0.
hard post-age eligibility ceiling. The code proves the ceiling — and no golden hour.
the floor your own repeated posts decay toward inside a single slate. The system competes with you.
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.
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.
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.
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 |
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.
| 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 | — |
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.
home-mixer/params/param.rs
One linear axis · −250 to +25
The sum of every positive coefficient in the table — all sixteen non-zero ones combined, excluding the per-second dwell term.
A single predicted “not interested” tap. One negative head very nearly cancels the entire positive vocabulary.
The four negative coefficients total −367.2 — eight and a half times the whole positive side of the ledger.
| Predicted outcome | Default coefficient |
|---|
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.
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.
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.
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.
| 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. |
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.
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 →