| name | x-algo-pipeline |
| description | Explain the complete X recommendation algorithm pipeline. Use when users ask how posts are ranked, how the algorithm works, or want an overview of the recommendation system. |
X Algorithm Pipeline
The X recommendation algorithm processes posts through an 8-stage pipeline to generate the "For You" feed. Each stage transforms, filters, or scores the candidate posts.
Pipeline Overview
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ X RECOMMENDATION PIPELINE โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ User Request โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ โ
โ โ 1. Query โ Hydrate user features, action history, socialgraph โ
โ โ Hydration โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ Thunder (in-network) + Phoenix (out-of-network) โ
โ โ 2. Sources โ In-network: Posts from followed accounts โ
โ โ โ Out-of-network: ML retrieval from all posts โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ โ
โ โ 3. Candidateโ Fetch tweet text, author data, visibility status โ
โ โ Hydration โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ โ
โ โ 4. Pre-Scoreโ Age, duplicates, safety, blocked authors โ
โ โ Filtering โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ Phoenix ML โ WeightedScorer โ AuthorDiversity โ OON โ
โ โ 5. Scoring โ Each scorer adds/adjusts candidate.score โ
โ โ โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ โ
โ โ 6. Selectionโ TopKScoreSelector: Keep top N by final score โ
โ โ โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ โ
โ โ 7. Post- โ Conversation dedup, previously seen, keywords โ
โ โ Filtering โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโ โ
โ โ 8. Side โ Logging, analytics, impression tracking โ
โ โ Effects โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โผ โ
โ Feed Response โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Stage Details
1. Query Hydration
Enriches the request with user context:
- User features (followed users, blocked users, muted users)
- User action sequence (engagement history for ML)
- Muted keywords
- Subscription status
- Bloom filters for seen posts
2. Sources
Two candidate sources provide posts:
Thunder Source (In-Network)
served_type: Some(pb::ServedType::ForYouInNetwork)
- Queries Thunder service with user's following list
- Returns recent posts from followed accounts
- Includes conversation context (ancestors, reply chains)
Phoenix Source (Out-of-Network)
fn enable(&self, query: &ScoredPostsQuery) -> bool {
!query.in_network_only
}
served_type: Some(pb::ServedType::ForYouPhoenixRetrieval)
- ML-based retrieval using user embedding
- Finds relevant posts from the entire corpus
- Enabled for "For You", disabled for "Following"
3. Candidate Hydration
Fetches full post data:
- Tweet text content
- Author information
- Media metadata (video duration)
- Visibility filtering results
- Subscription requirements
4. Pre-Score Filtering
Removes ineligible candidates before expensive ML scoring:
AgeFilter - Too old
DropDuplicatesFilter - Duplicate IDs
VFFilter - Safety violations
AuthorSocialgraphFilter - Blocked/muted authors
CoreDataHydrationFilter - Missing data
IneligibleSubscriptionFilter - Subscription required
5. Scoring (4 Stages)
a) PhoenixScorer
Produces phoenix_scores with 18 action probabilities.
b) WeightedScorer
weighted_score = ฮฃ(weight ร P(action))
Produces weighted_score from action predictions.
c) AuthorDiversityScorer
multiplier = (1 - floor) ร decay^position + floor
Adjusts scores to promote variety.
d) OONScorer
if !in_network: score *= OON_WEIGHT_FACTOR
Balances in-network vs out-of-network content.
6. Selection
pub struct TopKScoreSelector;
impl Selector<ScoredPostsQuery, PostCandidate> for TopKScoreSelector {
fn score(&self, candidate: &PostCandidate) -> f64 {
candidate.score.unwrap_or(f64::NEG_INFINITY)
}
fn size(&self) -> Option<usize> {
Some(params::TOP_K_CANDIDATES_TO_SELECT)
}
}
Keeps top K posts by final score.
7. Post-Score Filtering
Fine-grained filtering after selection:
DedupConversationFilter - One post per conversation
RetweetDeduplicationFilter - One version per underlying post
PreviouslySeenPostsFilter - Remove seen posts
PreviouslyServedPostsFilter - Remove from current session
MutedKeywordFilter - User keyword mutes
SelfTweetFilter - Remove own posts
8. Side Effects
Non-blocking operations after response:
- Impression logging
- Analytics events
- Cache updates
Data Flow Summary
Candidates start with:
โโโ tweet_id, author_id (from Sources)
โโโ tweet_text, metadata (from Hydration)
โโโ phoenix_scores (from PhoenixScorer)
โโโ weighted_score (from WeightedScorer)
โโโ score (from AuthorDiversity + OON)
โโโ Final ranking by score
PostCandidate Structure
pub struct PostCandidate {
pub tweet_id: i64,
pub author_id: u64,
pub tweet_text: String,
pub in_reply_to_tweet_id: Option<u64>,
pub retweeted_tweet_id: Option<u64>,
pub retweeted_user_id: Option<u64>,
pub phoenix_scores: PhoenixScores,
pub weighted_score: Option<f64>,
pub score: Option<f64>,
pub served_type: Option<ServedType>,
pub in_network: Option<bool>,
pub ancestors: Vec<u64>,
pub video_duration_ms: Option<i32>,
pub visibility_reason: Option<FilteredReason>,
pub subscription_author_id: Option<u64>,
}
Source Configuration
| Tab | Thunder (In-Network) | Phoenix (Out-of-Network) |
|---|
| For You | Enabled | Enabled |
| Following | Enabled | Disabled |
Related Skills
/x-algo-scoring - Detailed scoring formula
/x-algo-filters - All filter implementations
/x-algo-engagement - Action types and signals
/x-algo-ml - Phoenix ML model architecture