ThunderIn-network
Thunder supplies recent posts from accounts the viewer follows.
A compact map of the open-source system — from candidate retrieval to ranking and final visibility checks. Every number links back to the exact code revision we audited.
Snapshot, not a promise about every live feed
This guide reflects the public repository at the audited commit below. Feature switches and A/B tests can override defaults for individual viewers or authors.
THE ONE IDEA TO GET RIGHT
“Copy link +20” does not mean one copy adds 20 points.
Phoenix predicts how likely this viewer is to copy this post's link. Ranking multiplies that predicted probability by 20. The same rule applies to likes, replies, reports, and the other action signals.
01 / Overview
The feed is rebuilt for each request. Accounts you follow, discovery systems, and a shared popular-posts list contribute candidates; the same model then predicts your likely actions for every candidate.
ThunderThunder supplies recent posts from accounts the viewer follows.
Phoenix + SimClusters + Popular postsPhoenix retrieval, SimClusters, and the popular-posts list surface posts from accounts the viewer does not follow. Out-of-network replies and reposts are dropped by default.
xai-value-model + vm-rankerPhoenix outputs predicted actions for this viewer; xai-value-model blends them, vm-ranker applies adjustments and diversity, and later stages filter the list.
02 / Pipeline
Ranking is only one stage. A post can fail before scoring or disappear after selection.
Load recent viewer actions, follows, blocks, mutes, keywords, seen posts, and other context.
home-mixer/query_hydratorsQuery Thunder, Phoenix retrieval, SimClusters, and the popular-posts list.
home-mixer/sourcesAttach post text, media, author data, labels, language, and engagement metadata.
home-mixer/candidate_hydratorsRemove duplicates, old posts, blocked or muted authors, seen posts, inaccessible subscriber posts, and more.
home-mixer/filtersPhoenix predicts likely viewer actions. The shared value model fuses them into a weighted score; vm-ranker recomputes it and applies author and network adjustments.
xai-value-model/scoring.rs:69-140vm-ranker's DPP step zeroes unselected posts, then the top K by score are kept. If the vm-ranker call fails, local scores are served without these adjustments.
vm-ranker/scoring/mod.rs:40-94Visibility filtering and conversation deduplication can still remove posts after their order is fixed.
home-mixer/filters/vf_filter.rs03 / Weights
Search the defaults mirrored in home-mixer/params/param.rs. Values multiply predictions, not counts; zero means the term adds nothing by default. The shared library has 3 more terms fixed at zero here, and vm-ranker/params.rs holds different static defaults for 5 weights: production values cannot be settled from public code alone.
Like
FavoriteWeightReply
ReplyWeightRepost
RetweetWeightExpand photo
PhotoExpandWeightOpen video
VideoOpenWeightOpen post detail
ClickWeightOpen external link
OpenLinkWeightOpen author profile
ProfileClickWeightQuality video view (VQV)
VqvWeightPress share
ShareWeightSend by DM
ShareViaDmWeightCopy link
ShareViaCopyLinkWeightDwell (binary)
DwellWeightQuote post
QuoteWeightOpen quoted post
QuotedClickWeightQuality-view quoted video
QuotedVqvWeightDwell time per second
ContDwellTimeWeightPost-click dwell time per second
ContClickDwellTimeWeightFollow author
FollowAuthorWeightNot interested
NotInterestedWeightBlock author
BlockAuthorWeightMute author
MuteAuthorWeightReport post
ReportWeightScroll past without dwelling
NotDwelledWeightUnexplored post
PostUnexploredWeightPost a video
PostVideoWeightMutual-follow reply boost
BidirectionalFollowReplyWeightBoostMutual-follow dwell boost
BidirectionalFollowDwellWeightBoostA zero default does not remove the model output. It only makes its direct contribution zero in the standard configuration.
Conditional boosts are separate from the 26 weights and only apply when their code conditions are met.
04 / Guardrails
Retrieval eligibility, filters, labels, and post-selection checks are separate from the weighted score. They can cap reach or remove a post entirely.
For You candidates are deduplicated, and posts older than 48 hours are excluded. This applies to For You scoring candidates, not every surface on X.
home-mixer/filtersBlocks, mutes, muted keywords, already-seen items, and subscription access are applied before scoring.
home-mixer/filtersRepeated posts from the same author are progressively discounted to avoid a single-author feed.
xai-value-model/scoring.rs:183-204Posts from accounts the viewer does not follow can receive a separate multiplier.
xai-value-model/scoring.rs:206-215Account and post labels feed visibility rules that can drop content or place it behind an interstitial.
visibility-filteringVisibility filtering runs after ranking too, so score order alone cannot explain every displayed result.
home-mixer/filters/vf_filter.rsOne report cancels 468 likes.
False. X says so in its code comments and README: both weights multiply this viewer's predicted probabilities, not action counts. (The ratio is also about 355 now that the like weight is 0.66.)
External links are directly penalized.
No direct “link penalty” exists among the 26 weights. Open-link prediction has a small positive weight. Links could still affect other predictions; the weights alone cannot show that.
Replies can never reach non-followers.
By public default, out-of-network replies are dropped before scoring. But dedicated reply indexes and a flag (EnablePhoenixOonReplies) now exist, so this cannot be stated for experiments.
Updated from commit c65aa17 to 7fef3ba. 893 files changed between them; these are the changes that matter most to readers.
ranking_scorer.rs was removed. The arithmetic now lives in the shared xai-value-model library and is recomputed in vm-ranker.
xai-value-model/scoring.rs:69-140Like 0.5→0.66, binary dwell 0→0.05, dwell time 0.004→0.006, post-click dwell 0→0.4, click 0.4→0.3, video open 0.05→0.02, VQV 0.05→0, unexplored 0.02→0.015, not interested −43.2→−52.272. Copy link stays 20; repost stays 1.
home-mixer/params/param.rs:396-514A popular-posts source is on by default (up to 500). Registered filters went from 21 to 26; the Brazil election filter was removed, and new ones include FairShareRanking (on) and FavHoldout (off).
home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:420-444Followers ≤50,000 (was 1,000), under 200 home impressions (was 1,000), posted within 2 hours, chosen with Thompson sampling.
home-mixer/params/param.rs:589-662The public training config now feeds log-scaled like, reply, repost, quote, and view counts to the model. Weights still multiply per-viewer predictions.
phoenix/xrex/configs/xrecsys.py:316We no longer say 48 hours applies to “all routes”, that replies are absent from every index, or that 10-second video earns VQV points by default.
home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:42705 / Sources
This guide separates source-confirmed implementation from assumptions about the live service.
Confirmed: the public code and defaults at this commit, read for the core For You path; all files were inventoried by script, not every line read. Not confirmed: private services, undisclosed rules, Grox prompts, live experiment assignments, and the exact configuration served to any account.
Independent code analysis by Akira Papa. This is not an official statement from X.