How the X Algorithm Actually Works in 2026 — and What That Means for Growth
Rapport interne de teardown du release open-source xai-org/x-algorithm (15 mai 2026) — l'algorithme For You feed de X (ex-Twitter) en 2026, avec quatre pistes de recommandations growth audience-tunées (personal/founder, brand/company, framework généralisé, livrable client/consulting). Thèse-pivot : « The famous 2023 weight table — replies count more than likes by a big multiplier — describes a system that no longer exists in this form. » L'algorithme 2026 est un transformeur (Phoenix, dérivé Grok-1) qui apprend les poids depuis ton historique d'engagement, scoré contre une surface multi-actions à 19 dimensions, gatée par un service offline de content understanding (Grox). La forme du scoring importe désormais beaucoup plus que les nombres — et les nombres eux-mêmes ne sont pas dans le release public. Architecture en 4 composants : (1) Home Mixer (Rust, orchestrateur request-time, hydrate → source → filter → score → select → filter) ; (2) Thunder (Rust, in-memory store Kafka-fed des posts récents, lookups sub-ms des candidats in-network) ; (3) Phoenix (JAX ML, retrieval two-tower + ranking transformeur, ~Grok-1 dérivé) ; (4) Grox (offline, classifieurs spam/safety/PTOS/banger + embedder multimodal v5). Les 19 actions prédites par Phoenix (changement-clé vs 2023) : favorite, reply, repost, photo_expand, click, profile_click, vqv (video quality view gated by min duration), share, share_via_dm, share_via_copy_link, dwell, quote, quoted_click, follow_author, not_interested, block_author, mute_author, report, dwell_time (continuous). Score final = Σ (weight × P(action)) modifié par 3 multiplicateurs structurels : (a) OON_WEIGHT_FACTOR < 1 (pénalité out-of-network), (b) author diversity decay(1-floor) × decay_factor^position + floor (atténuation exponentielle des posts répétés du même auteur dans un même render), (c) video duration gate (vqv ne contribue que si video_duration_ms > MIN_VIDEO_DURATION_MS). Caveat capital : aucune valeur numérique des poids (FAVORITE_WEIGHT, OON_WEIGHT_FACTOR, AUTHOR_DIVERSITY_DECAY, MIN_VIDEO_DURATION_MS...) n'est dans le release — tout est crate::params::, géré par un feature-switch service interne X pour A/B testing. « Anyone telling you 'replies are worth N.N× more than likes in 2026' is fabricating a number that is not derivable from the OSS release. »Différences-clés vs 2023 : (1) suppression de toute feature hand-engineered (« We have eliminated every single hand-engineered feature and most heuristics from the system »*) ; (2) un seul modèle prédisant 19 actions vs plusieurs modèles 1 action chacun ; (3) Grox sépare content understanding et ranking ; (4) nouveaux signaux first-class (dwell continu, vqv gated, follow_author, 3 variantes de share) ; (5) two-tower OON retrieval (vs SimClusters+heuristics) avec embeddings multimodaux text+image+ASR-video. Three layers of reach (framework généralisé) : Eligibility (binary, Grox+filtres) → Retrieval (probabilistic, two-tower ANN) → Ranking (continuous, weighted-sum + multipliers). Two laws of mechanical growth : (1) In-network is multiplicative, OON is additive ; (2) The model's job is to predict you, not reward you. Boundary d'honnêteté assumée : checkpoint Phoenix released = mini (2 layers, 4 heads, 256-dim, corpus 537K posts sports), pas le modèle prod ; intégrations Thrift stubbées (panic!("Not implemented") dans candidate_features.rs) ; brand-safety lists, topic ID mappings, language penalties, ad-blending rules absents du public.
Le 15 mai 2026, xAI publie en open-source xai-org/x-algorithm, l'algorithme For You feed de X. Ce rapport interne en fait un teardown technique en deux parties : (1) un démontage du système avec citations file:line, et (2) quatre pistes de recommandations growth segmentées par audience (personal/founder, brand, framework généralisé, livrable consulting).
Thèse-pivot : la fameuse « table de poids 2023 » ("replies count more than likes by a big multiplier") décrit un système qui n'existe plus. L'algorithme 2026 est un transformeur (Phoenix, dérivé Grok-1) qui apprend les pondérations depuis l'historique d'engagement personnel et score chaque candidat contre une surface de 19 actions distinctes, gatée par un service offline (Grox). La forme du scoring importe plus que les nombres — et les nombres ne sont pas dans le release.
The famous 2023 weight table — replies count more than likes by a big multiplier — describes a system that no longer exists in this form.
— Rapport interne **non signé** , raw.githack.com
Architecture en 4 composants : Home Mixer (Rust, orchestrateur), Thunder (Rust, in-memory store Kafka-fed, candidats in-network sub-ms), Phoenix (JAX, retrieval two-tower + ranking transformeur), Grox (offline, classifieurs et embedder multimodal v5 text+image+ASR-video).
Les 19 actions prédites par Phoenix combinent positifs (favorite, reply, repost, click, profile_click, vqv gated, share, share_via_dm, share_via_copy_link, dwell, quote, quoted_click, follow_author, dwell_time continuous) et négatifs (not_interested, block, mute, report). Score final = Σ (weight × P(action)) modifié par 3 multiplicateurs structurels : OON_WEIGHT_FACTOR < 1 (pénalité out-of-network), author diversity decay(1-floor) × decay_factor^position + floor, et video duration gate (vqv contribue uniquement si video > MIN_VIDEO_DURATION_MS).
Caveat capital : aucune valeur numérique des poids n'est dans le release (tout est crate::params::, pas de params.rs). « Anyone telling you 'replies are worth N.N× more than likes in 2026' is fabricating a number. »* Seules les directions (signe, gate vs soft adjustment, présence) sont citables.
Three layers of reach : Eligibility (binary, Grox) → Retrieval (probabilistic, two-tower) → Ranking (continuous, weighted sum). Two laws of mechanical growth : (1) In-network est multiplicatif, OON est additif ; (2) Le job du modèle est de te prédire, pas de te récompenser.
Différences vs 2023 : suppression des features hand-engineered, un modèle pour 19 actions vs plusieurs modèles, Grox sépare understanding et ranking, nouveaux signaux first-class (dwell continu, vqv gated, follow_author, 3 variantes de share), two-tower OON retrieval avec embeddings multimodaux. Eligibility-time exclusion is the silent killer : borderline content n'est plus démoté, il disparaît du pool de candidats sans signal au créateur.
Honesty boundary : checkpoint released = mini (2 layers, 4 heads, 256-dim, corpus 537K posts sports), Thrift stubs (panic!("Not implemented")), policy data absent. Le rapport doit être traité comme modèle structurel, pas prédicteur quantitatif.
À retenir
Source primaire. release open-source xai-org/x-algorithm du 15 mai 2026. Le rapport date du 2026-05-16 (probable J+1 du release). Date d'ajout dossier veille : 2026-05-16 (= aujourd'hui).
Thunder. (x-algorithm/thunder/) — Rust in-memory store Kafka-fed des posts récents, lookups sub-millisecond pour candidats in-network. Fichiers clés : thunder/main.rs, thunder/post_store.rs, thunder/kafka_utils.rs.
Phoenix. (x-algorithm/phoenix/) — service JAX ML, deux rôles : (1) retrieval two-tower pour OON, (2) ranking transformeur dérivé Grok-1 prédisant 19 actions.
Grox. (x-algorithm/grox/) — service offline de content understanding, classifieurs (spam, safety, PTOS, banger, reply ranking) + embedder multimodal v5. Ne sit pas dans le hot path ; écrit au feature store, Home Mixer hydrate les signaux.
Pipeline Home Mixer (architecture quoted from README). 1. Query hydration (User Action Sequence + User Features) 2. Candidate sources (Thunder in-network + Phoenix retrieval OON + ads + who-to-follow + topics + MoE + prompts) 3. Hydration (core metadata, author info, media, engagement counts) 4. Filtering pre-scoring (dedupe, age, self, blocks, mutes, paywall, already-seen) 5. Scoring (Phoenix Scorer P(action) for each of 19 actions → Weighted Scorer Σ(weight × P) → Author Diversity → OON Scorer) 6. Selection (sort by final score, select top K) 7. Post-selection filters (VFFilter for deletes/spam/violence/gore, conversation dedup)
Les 19 actions prédites par Phoenix. (phoenix/runners.py:233-252, home-mixer/candidate_pipeline/candidate.rs:30-51PhoenixScores) :
Nouveaux signaux first-class vs 2023. continuous dwell_time (et pas seulement binaire), vqv_score (gated by MIN_VIDEO_DURATION_MS), follow_author_score (Phoenix prédit "ce post fera-t-il gagner un follower à son auteur"), 3 variantes de share (share, share_via_dm, share_via_copy_link).
Formule de score. (home-mixer/scorers/weighted_scorer.rs:44-91) : ` score = Σ_i (weight_i × P(action_i)) × OON_WEIGHT_FACTOR (if OON, else 1) × diversity_multiplier(position) + offset_score() (keeps negative aggregates well-ordered) ` où vqv_weight est remplacé par 0 si video_duration_ms ≤ MIN_VIDEO_DURATION_MS.
Caveat CAPITAL — les poids ne sont pas dans le release.
FAVORITE_WEIGHT, REPLY_WEIGHT, RETWEET_WEIGHT, OON_WEIGHT_FACTOR, NEW_USER_OON_WEIGHT_FACTOR, AUTHOR_DIVERSITY_DECAY, AUTHOR_DIVERSITY_FLOOR, MIN_VIDEO_DURATION_MS, NEGATIVE_SCORES_OFFSET, WEIGHTS_SUM, NEGATIVE_WEIGHTS_SUM sont tous référencés comme crate::params::*.
Aucun params.rs n'existe dans le repo. (vérifié par grep -rn exhaustif).
Géré par un feature-switch / parameter service interne X pour A/B testing et tuning sans code change.
Implication. seules les directions (positif vs négatif, gate vs soft adjustment, présence vs absence d'un multiplicateur) sont citables. Les magnitudes sont fabriquées.
OON penalty. (oon_scorer.rs:20-23) : score = base_score × OON_WEIGHT_FACTOR if OON else base_score. Comment de la ligne 7 : « Prioritize in-network candidates over out-of-network candidates ». Codification de "followers matter".
New-user OON exception. (ranking_scorer.rs:220-239) : si compte < NewUserAgeThresholdSecs ET follows ≥ NEW_USER_MIN_FOLLOWING, la pénalité OON est remplacée par NEW_USER_OON_WEIGHT_FACTOR. Biais structurel sur ce que voient les nouveaux comptes (et donc ce que les nouveaux comptes peuvent atteindre).
Author diversity decay. (author_diversity_scorer.rs:29-31) : multiplier(position) = (1 - floor) × decay_factor^position + floor. Position = nombre de posts du même auteur déjà apparus plus haut dans la liste triée. Le meilleur post d'un auteur garde son score, chaque suivant est atténué exponentiellement sans descendre sous floor. Implication cadence : structurelle, pas heuristique.
Video duration gate. (weighted_scorer.rs:72-81) : vqv_score n'entre dans la somme pondérée que si video_duration_ms > MIN_VIDEO_DURATION_MS. Hard gate, pas soft penalty : les clips trop courts ne reçoivent simplement pas la contribution VQV.
What never enters the ranker. (reach perdue invisible) :
Pre-scoring filters.DropDuplicatesFilter, CoreDataHydrationFilter, AgeFilter, SelfpostFilter, RepostDeduplicationFilter, IneligibleSubscriptionFilter (paywall), PreviouslySeenPostsFilter, PreviouslyServedPostsFilter, MutedKeywordFilter, AuthorSocialgraphFilter (block dans les deux sens, y compris l'auteur cité d'un quote tweet).
Grox offline gates. (eligibility, pas modificateurs de score) : task_spam_detection.py / classifiers/content/spam.py, task_post_safety_screen_deluxe.py, task_safety_ptos_policy.py, task_banger_screen.py (positif), task_reply_ranking.py.
Point architectural fondamental.« Borderline content doesn't get 'demoted' in the 2026 system. It gets disqualified at hydration time and never reaches scoring. This is materially different from the 2023 system's reduced-reach / visibility-filtering model. »
What Phoenix actually learns from.
L'input le plus conséquent = la séquence d'actions de l'utilisateur. (user_action_seq_query_hydrator.rs), pas le candidat post.
Candidate-isolation attention. (phoenix/recsys_model.py) : les candidats peuvent attendre la séquence d'actions de l'utilisateur, mais pas entre eux → scores per-user per-post, batch-independent, cacheables.
Pas de single "this post is good" global."the same post predicted to earn a like from User A at probability p₁ is predicted at p₂ for User B".
Going viral. = outcome population-level de prédictions personnelles indépendantes, pas une métrique optimisée.
Hand-engineered features supprimées. (README ligne 55) : "We have eliminated every single hand-engineered feature and most heuristics from the system."
Deux signaux explicitement hydratés. quand même : mutual_follow_jaccard_hydrator.rs (Jaccard followers viewer ∩ followers auteur candidat), following_replied_users_hydrator.rs (un follow du viewer a répondu au candidat).
OON retrieval (two-tower). ton historique d'action → embedding user, posts candidats → embeddings post (depuis grox/embedder/multimodal_post_embedder_v5.py qui encode text+images+ASR transcript du vidéo en 1024-dim normalisé). Ta discoverability par des strangers est fonction de la proximité d'embedding entre tes posts et ceux que ton audience cible engage déjà.
Pillar 2. nommer une action cible par post (reply, follow, dwell, share). "When you can't articulate which action you're aiming at, the post is unlikely to score well for any of them."
Pillar 3. trigger high-weight actions perso :
Reply : questions à réponse défendable (pas "what do you think?").
Dwell time : threads et long-form (continuous dwell signal index 18).
Profile click : stranger qui veut savoir qui tu es (bio-relevant signaling).
Follow-author : "here is my premise and I will defend it across many future posts".
Pillar 4.publier ton meilleur post en premier (le 1er garde le score plein, le 2e est atténué). Ne pas stacker, espacer.
Pillar 5. éviter mute/block des followers chauds (négatif cumulatif sur tous tes posts futurs pour cet utilisateur).
VQV. (index 6) = vidéos qui clear MIN_VIDEO_DURATION_MS. "Cutting a video too short kills the contribution entirely."
Share via DM. (index 8) + share via copy-link (index 9) = pricing teardowns, product comparisons, controversy forwarded privately.
Follow-author (index 13) = un post/semaine follow magnet.
Pillar 4.« A 'drumbeat' of four posts spaced 30 minutes apart underperforms the single best one of them, alone ». Coordonner brand + CEO + employés (auteurs distincts) bat brand seul posting 2x.
Pillar 5.home-mixer/ads/ module ajouté 15 mai 2026 = brand-safety tracking. Organic posts près de sensitive content → risque adjacency.
Pillar 6.topical consistency over weeks (embedding dilué si trop de sujets), multimodal posts, subtitle videos for the ASR path.
Pillar 7.task_spam_detection.py keye sur low-follower / low-quality reply patterns → brands qui répliquent lourdement sur big posts peuvent être flaggés. Reply substantively or not at all. ### Framework généralisé (Part 2.C)
Three layers of reach. 1. Eligibility (Grox + filtres) — binary, in/out, no optimization beyond not being excluded. 2. Retrieval (two-tower OON) — probabilistic, optimisé par quoi tu postes (topic, embedding, multimodal). 3. Ranking (weighted sum + multipliers) — continuous, optimisé par comment tu postes (action triggered, cadence).
Action surface as product question. 19 actions = 4 catégories (social: like/reply/quote/share ; private: DM-share, copy-link, dwell, photo expand ; identity: follow, profile click ; rejection: not-interested/block/mute/report). Un post qui ne cible aucune relation = prédit ~0 partout.
Transformer as fairness mechanism. per-user probabilities → "good content" n'est pas une propriété globale. Probabilistic targeting, not deterministic quality.
Author-diversity decay as structural feature.« publishing more posts per day past a threshold reduces, not increases, total reach ». Cadence optimale non-monotone en post count.
Negative signals as one-shot vetoes. un mute coûte le post ET tous les suivants à cet utilisateur (entry permanente dans sa action sequence).
Eligibility-time exclusion = silent killer. pas de signal au créateur quand un Grox classifier exclut. Diagnostic = analyse comparative de reach.
Two laws.
Law 1.In-network is multiplicative, OON is additive. Followers compound on every future post.
Law 2.The model's job is to predict you, not reward you. Begging engagement / manufactured controversy → dégrade ta prédictabilité → downgrade des posts futurs. ### Livrable Consulting (Part 2.D) — points-clés
Executive summary. prêt cover page.
Evidence table. 14 claims principaux, chacun avec file:line.
Limitations and honest disclosures (mandatory). weights non dérivables, mini checkpoint (2 layers, 4 heads, 256-dim), Thrift stubs (panic!("Not implemented")), brand-safety lists / topic ID mappings / language penalties / ad blending rules absents. « The client should treat this report as a structural model, not a quantitative predictor. » ### Honesty boundary (Appendix A.3) — ce qu'on ne peut PAS savoir
Valeurs numériques des poids. (toutes externes, pas de params.rs).
Comportement modèle production. checkpoint released = 2 layers, 4 heads, 256-dim, 537K-post sports corpus, prod Phoenix est plus gros et continuously trained.
Stub intégrations.panic!("Not implemented: to_thrift for ...") dans candidate_features.rs et user_features.rs. Le public code ne tourne pas end-to-end contre les services internes X.
Continuous retraining cadence. OSS = static snapshot, prod = continuously updated. ### Liens avec les fiches existantes
Convergence avec [[wallace-wells-nyt-magazine-ai-populism-altman-backlash-no-one-ready-2026-05-08]]. le rapport documente factuellement la mécanique structurelle d'un algorithme qui façonne l'information politique à l'échelle de masse, là où Wallace-Wells documente la réception populaire / backlash des oligarques tech (incluant Musk). Le rapport montre que "who reaches whom" est désormais déterminé par des transformers entraînés sur des sequences d'action personnelles — et que la silent exclusion (eligibility-time, sans signal) est un mode d'opération assumé.
Convergence avec [[ng-the-batch-352-no-ai-jobpocalypse-2026-05-08]]. même posture épistémique anti-narrative, discipline de "ce qui est dérivable des faits vs ce qui est fabriqué". Ng démantèle le narratif jobpocalypse ; ce rapport démantèle les narratifs de growth-hack basés sur des poids fabriqués.
Convergence implicite avec [[mensch-mistral-commission-enquete-vulnerabilites-numeriques-souverainete-ia-2026-05-13]]. Mensch parle de dépendance aux services numériques étrangers comme risque de vassalisation. Le release d'algorithme xai-org/x-algorithm est un précédent ambigu — opensource partiel d'un système qui régit la conversation publique, mais avec les paramètres opérationnels (les weights) intentionnellement absents.
Anti-narrative growth-hack. ce rapport est la réponse documentaire à l'industrie des "X algorithm secrets / 5 tactics to game the For You feed". Discipline de la citation file:line vs anecdote.
Pattern Anthropic-vs-X transparency. ce rapport peut servir de point de comparaison méthodologique pour évaluer la transparence relative des releases d'algorithmes des grands labs (Anthropic Mythos, OpenAI evals, xAI grok-1, xai-org/x-algorithm). Forme de la transparence : assez de code pour décrire l'architecture, pas assez de paramètres pour reproduire le comportement.
Affirmations attribuées
params.rs (valeurs des poids) est absent du release open-source
— rapport interne
quiconque cite des magnitudes de poids 2026 fabrique des chiffres
— rapport interne
l'exclusion eligibility-time est silencieuse pour le créateur (no signal)
— rapport interne
in-network is multiplicative, OON is additive
— rapport interne
the model's job is to predict you, not reward you
— rapport interne
Le graphe de connaissance extrait de cette fiche — 38 entités, 51 relations.