[

[

x algorithm series

]

]

Why X feeds reject your third post of the day: author diversity and DPP

·

·

12 min read

By Prateek Singh, founder of VoiceMoat

By Prateek Singh, founder of VoiceMoat

Summarize with AIClaudeChatGPTPerplexityShareShare

Two questions creators ask more than any others on X. First: how often should I post? Second: why are my recent posts performing worse than my older posts, even when the content is similar? The 2026 ranker code has direct answers to both, and they are not the answers the "post-more-often" growth advice provides. home-mixer/scorers/author_diversity_scorer.rs walks the candidate list after scoring and multiplies repeated-author scores by an exponential decay factor. home-mixer/scorers/vm_ranker.rs applies a Determinantal Point Process rerank at the top of the feed when its theta parameter is non-zero. Two dedup filters (home-mixer/filters/dedup_conversation_filter.rs, home-mixer/filters/retweet_deduplication_filter.rs) remove additional same-conversation and same-retweet candidates from the pool. This article quantifies the diversity decay, explains DPP in plain language, and rewrites the "how often to post" question into the right shape. Companion to A9: 48 hours in Thunder on the recency window and to A1: the May 2026 X algorithm's cornerstone framing.

The diversity exponential, in one formula

The author-diversity scorer applies an exponential decay multiplier to each candidate's score based on how many times that author has already appeared in the candidate list. The structure of the multiplier, per home-mixer/scorers/author_diversity_scorer.rs:

multiplier(n) = (1 - floor) * decay^n + floor
multiplier(n) = (1 - floor) * decay^n + floor
multiplier(n) = (1 - floor) * decay^n + floor

Where n is the candidate's rank-position among posts from the same author in the scored candidate list, decay is a constant between 0 and 1 (specific value redacted), and floor is the asymptotic lower bound the multiplier approaches as n grows. Numeric values are not in the public source. The structural property is clear: the first candidate from a given author gets the multiplier at n = 0, which equals (1 - floor) * 1 + floor = 1. The second candidate from that author gets the multiplier at n = 1, which equals (1 - floor) * decay + floor. The third gets decay²-weighted. The curve drops quickly at first, then asymptotes to floor.

The intuition: the first post from a creator in a viewer's feed pass gets full weight. Each subsequent post from the same creator in the same feed pass gets progressively de-weighted, until the multiplier sits near the floor regardless of how many additional posts there are.

Author-diversity multiplier by post rank-position within a single feed pass: Post 1: With diversity decay applied 100, Without diversity decay (counterfactual) 100 relative score multiplier; Post 2: With diversity decay applied 68, Without diversity decay (counterfactual) 100 relative score multiplier; Post 3: With diversity decay applied 46, Without diversity decay (counterfactual) 100 relative score multiplier; Post 5: With diversity decay applied 26, Without diversity decay (counterfactual) 100 relative score multiplier; Post 8: With diversity decay applied 14, Without diversity decay (counterfactual) 100 relative score multiplier

Author-diversity multiplier by post rank-position within a single feed pass

The chart sketches the qualitative shape. Specific numbers depend on the redacted decay and floor constants; the curve is illustrative, not production telemetry. What is preserved across any plausible parameter choice: a creator with five posts in any one viewer's feed pass keeps full weight on the first, materially less on the third, and near-floor weight on the fifth.

Where the decay applies

The decay applies after Phoenix has scored all candidates in the weighted scorer. Order of operations in the home-mixer pipeline, from A1, the May 2026 X algorithm:

  1. Candidates from twelve sources hydrated.

  2. Pre-scoring filters applied (including the hard-kill filters from A5: the negative-signal economy).

  3. Phoenix scores each candidate against the viewer's history sequence.

  4. weighted_scorer.rs linearly combines the 19 action probabilities.

  5. author_diversity_scorer.rs walks the sorted list and applies the decay multiplier per author occurrence.

  6. oon_scorer.rs applies OON_WEIGHT_FACTOR to out-of-network candidates.

  7. vm_ranker.rs optionally applies DPP rerank at the top of feed.

  8. Post-selection filters run (visibility, dedup).

The diversity decay sits between Phoenix scoring and the OON rescale, which means it operates on the final per-candidate score from weighted_scorer.rs. A high Phoenix score still gets decayed by the multiplier if the author has earlier-ranked posts in the same pass. The reverse is also true: a moderate Phoenix score for an author's first post in the pass gets the full multiplier (1.0), while a higher Phoenix score for the same author's fifth post gets multiplied by roughly floor.

DPP at the top of the feed

home-mixer/scorers/vm_ranker.rs includes a Determinantal Point Process reranker that runs at the top of feed when its theta parameter is non-zero. The DPP block exposes two parameters: theta (the diversity weighting) and max_selected_rank (how many top slots the DPP rerank applies to).

DPP, in plain language, is an algorithm for selecting a subset of items from a candidate pool that balances per-item quality with overall subset diversity. A pure top-K rerank picks the K highest-scoring candidates regardless of similarity to each other; DPP picks K candidates that collectively maximise a quality-times-diversity score. The mathematical mechanism is the determinant of a kernel matrix built from item-item similarities. The intuition: DPP penalises subsets that include items very similar to other already-selected items.

In context: DPP at the top of an X feed means the visible top-N slots (where N equals max_selected_rank) are not just the N highest-scoring candidates. They are the N candidates that collectively produce the most diversity-weighted aggregate score. Two visually-similar posts from the same author do not coexist in the top slots even if both score high individually.

The interaction with author_diversity_scorer is multiplicative. The diversity scorer applies its exponential decay to all candidates in the post-Phoenix list. DPP then runs on the top-of-feed subset and applies a second diversity-aware selection. Both layers push in the same direction.

A numeric walkthrough for ten posts per day

Take a creator shipping ten posts in a 24-hour period to an audience of 8,000 followers. The 48-hour Thunder window means all ten posts can be in the in-network candidate pool simultaneously for some follower making a feed request during the window. The per-author cap inside Thunder (specific value redacted) bounds how many actually sit in any one follower's per-user store; assume that cap is large enough that most of the ten are eligible during the window.

When a follower opens the app and the home-mixer assembles candidates, the ten posts arrive at the scoring stage. Phoenix scores each independently against the viewer's history. Suppose all ten score similarly on Phoenix because the creator's voice is consistent. The weighted scorer's linear combination produces ten roughly-equal scores.

Now author_diversity_scorer walks the list. Post 1 keeps its full score. Post 2 gets (1 - floor) * decay + floor. Post 5 gets (1 - floor) * decay^4 + floor. Post 10 gets (1 - floor) * decay^9 + floor, which is near floor for any plausible decay value.

Same Phoenix score, different post rank-position, illustrative outcomes

Post rank-position

Phoenix score (notional)

Diversity multiplier (notional)

Final candidate score

1

0.84

1.00

0.84

2

0.84

0.68

0.57

3

0.84

0.46

0.39

4

0.84

0.32

0.27

5

0.84

0.22

0.18

8

0.84

0.10

0.08

10

0.84

0.07

0.06

Source: author_diversity_scorer.rs formula applied to a 10-post-day creator

The table sketches the structural effect. The first three posts deliver roughly 60 percent of the aggregate ten-post score; the remaining seven posts together contribute the other 40 percent. From the eighth post on, contribution per post is in the single-digit-percent range.

The compounding implication: when DPP also runs for top-of-feed slots, post rank 8 and 10 are unlikely to even reach the visible top slots, because the diversity decay has dropped their candidate score below the threshold for top-slot eligibility. Those posts are not invisible on the feed; they may appear lower down or in non-top slots. They are invisible in the high-attention positions.

Dedup filters: more diversity, different mechanism

Beyond the score-multiplier and DPP-reranker layers, two filter files remove specific same-source candidates from the pool entirely.

The two dedup filters in home-mixer/filters/

Filter

What it removes

dedup_conversation_filter.rs (documented)

candidates from the same conversation tree, retaining one representative per conversation

retweet_deduplication_filter.rs (documented)

duplicate retweet candidates (same original post retweeted by different accounts)

Source: home-mixer/filters/dedup_conversation_filter.rs + retweet_deduplication_filter.rs

The conversation-dedup filter is the one creators occasionally encounter as "my thread reply did not surface." When a creator's conversation already has another candidate representing it in the candidate pool, the filter retains only one. The retained one is typically the original or the most-scored reply in the conversation; sibling replies are dropped.

The retweet-dedup filter prevents the feed from showing the same post multiple times via different retweet candidates. Each unique original post is represented at most once across all retweet candidates from different accounts. This is the structural reason "viral retweets" do not stack on a single viewer's feed even when many people in the viewer's network retweet the same thing.

The "post fewer" reframe

The two architectural layers (author-diversity decay and DPP) plus the two dedup filters plus the the per-author Thunder caps from A9 collectively produce a saturation curve for posts per day. Adding the eleventh post to a ten-post day yields almost no marginal impression delivery; it adds to a pool where the multiplier for that post is near floor and the dedup filters may remove it entirely if it shares a conversation with another candidate.

The reframe is mechanical. Cadence past the saturation point does not add measurable reach. What does add reach: each individual post firing more of the engagement heads (walked in A2), having stronger embedding similarity to the viewer's history pattern, and sitting in a sparser region of the embedding space so that the candidate clears DPP's similarity check at the top of feed.

The operational rule: three to five posts per day is the architecturally supported cadence in 2026. Past that, additional posts produce diminishing returns. The lever to move past saturation is not more posts; it is higher-quality posts that the diversity decay is multiplying by a larger constant (because their per-post Phoenix score is higher to begin with).

How follower-size composition affects the math

A subtle property of the diversity decay is that it operates per-feed-pass, not per-impression. The decay applies when home-mixer builds the candidate list for one specific viewer's feed request. A creator's post going through diversity decay in viewer A's feed has no relationship to the same post's decay in viewer B's feed; both are independent passes.

For creators with smaller follower bases, this property is mostly abstract: most followers see your posts one at a time as they arrive in Thunder, and the second-or-later occurrence-from-same-author edge case happens infrequently. For creators with larger or more high-velocity follower bases, multiple posts in a 24-hour window may all be eligible in a single follower's feed pass at the same time, which is when the decay multiplies in earnest.

The architectural takeaway: posting frequency interacts with audience attention pattern. An audience that opens X infrequently encounters each of a creator's posts in separate passes, where decay does not apply. An audience that opens X frequently encounters multiple of the creator's recent posts in the same pass, where decay applies aggressively. The "right cadence" depends on this interaction, and the generic answer ("post N times per day") ignores it.

The operational implication: creators whose audience reads X continuously throughout the day benefit less from raw cadence and more from per-post quality. Creators whose audience checks X sporadically benefit more from spread-over-time cadence because each post can land in a fresh feed pass without competing with the creator's other recent posts.

Thread strategy under diversity decay

Threads are a special case because they enter the candidate pool as a sequence of posts from the same author. Each post in the thread contributes a separate candidate to the pool. The diversity decay treats each as one of the author's recent posts, applying the multiplier sequentially.

Two consequences. First, a five-post thread is, from the diversity-scorer's perspective, five posts that all get diversity-decayed. The first post gets full multiplier; post five gets near-floor multiplier. Threads are not penalised relative to single posts on Phoenix scoring, but they are penalised on the multiple-posts-from-same-author count in any one feed pass.

Second, the conversation-dedup filter applies to threads. If a viewer's feed already has one of the thread's posts as a candidate, the filter may retain that one and drop the others, depending on the conversation representation logic.

The strategic implication: threads work when each post in the thread is independently strong enough to survive the diversity decay and to provide value to a viewer who might only see one of the posts. "Six-tweet threads where post one is the hook and the rest are deliveries" run into both the diversity decay and the conversation-dedup filter. "Six-tweet threads where each post is its own coherent thought, any of which could be encountered standalone" survive both layers because the per-post Phoenix score stays high enough that even multiplied by the decay constant the candidate is still competitive.

A useful corollary: the optimal thread length under the diversity decay is shorter than most thread-style growth advice prescribes. A three-post thread of independently-strong posts often outperforms a ten-post thread where most posts are setup. The diversity decay multiplies posts five through ten by near-floor constants in the same feed pass, so the marginal impression value of post six or post ten is much lower than the marginal impression value of post one or post two of a tightly-constructed three-post thread.

This is a structural argument, not a stylistic preference. The decay is in the source. Longer threads pay an exponential penalty per additional post in the same author's same-pass candidate set. Shorter threads pay less of that penalty per post and concentrate the score on the most-likely-surfaced positions.

What this means for the cadence question

The "how often should I post on X" question, recast in 2026-ranker terms: post as often as you can produce posts that fire multiple heads, sit in your historical voice cluster, and contribute embedding-distinctness to your follower base. Past that, additional posts saturate against the per-author cap, the diversity decay, and the impression-bloom filters simultaneously. The architectural ceiling is around three to five high-quality posts per day for most creators.

Volume-based growth tools that automate posting at higher cadences are optimising for an architecture that no longer exists. The 2020-era ranker rewarded more posts because the recency multiplier and the absence of a diversity layer made every additional post contribute roughly linearly to total reach. The 2026 ranker has no recency multiplier (A9: 48 hours in Thunder), applies the diversity decay walked above, and runs DPP at the top of feed. Each of these three pulls in the same direction: fewer, higher- quality, embedding-distinct posts.

The cornerstone of this series (A1: the May 2026 X algorithm) opened with the structural argument; this article closes the cadence loop. The competitor comparison in A10: VoiceMoat vs Tweet Hunter, Typefully, Hypefury scores the four major writing tools against six 2026-algorithm criteria, with cadence-saturation one of the implicit ones; tools built around volume automation rank poorly there by construction.

Frequently asked questions

Frequently asked questions

Why does X reject my third post of the day?

author_diversity_scorer.rs applies an exponential decay per repeated author: multiplier(n) = (1 - floor) x decay^n + floor. Your first post in a feed pass gets full score, the second gets decay, the third gets decay squared, quickly approaching a floor. Post 10 times and roughly 7 are capped near that floor.

What is DPP in the X algorithm?

A Determinantal Point Process rerank in vm_ranker.rs, applied at the top of feed when theta is above zero. Mathematically it is the determinant of a similarity kernel; it selects a top set that maximises quality times diversity, penalising similar items appearing together. It is a second diversity pass on top of the author-decay multiplier.

Do long threads or short threads perform better on X?

Shorter threads of three to five posts tend to outperform long ones of eight to ten under diversity decay, because the per-post multiplier drops exponentially with same-pass position. Length itself is penalised when the posts compete in one viewer's feed pass. This is inferred from the documented decay.

Does posting frequency hurt if my audiences don't overlap?

Diversity decay operates per feed pass, not per impression. Multiple posts only compete with each other when they reach the same viewer's same feed pass, so the penalty is about concentration in one feed, not your raw daily count.

AI disclosure

AI disclosure

This article was drafted with AI assistance and human-edited by Prateek Singh. All technical claims are sourced to the xai-org/x-algorithm repository; file paths are cited inline.

More in the series

X Algorithm

The May 2026 X algorithm: why voice wins when the ranker becomes a transformer

In May 2026, X.AI open-sourced the next-generation recommendation algorithm under the xai-org/x-algorithm repository. It is not a re-host of the 2023 Twitter release. It is a complete rewrite. The 2023 stack of hand-engineered features, MaskNet heavy-ranker, SimClusters embeddings, TwHIN graph signals, and RealGraph follow-affinity scoring has been retired. In its place: a single Grok-derived transformer named Phoenix that predicts 19 separate engagement actions per candidate, conditioned on the viewer's history sequence, with a candidate-isolation attention mask. The implications for creators are structural, not tactical. Voice consistency now compounds at the ranker level because every candidate from a creator is independently scored against the viewer's per-creator history pattern. Voice drift collapses scoring across the entire follower base, not just the post that drifted. This cornerstone walks the architectural change, the new scoring math, and what it means for anyone choosing how to write on X in 2026.

13 min read

·

·

X Algorithm

How Phoenix ranks every post: a creator's guide to the 19 engagement heads

X.AI's open-sourced Phoenix model does not score posts on a single "engagement" number. It predicts 19 separate user actions in parallel, each paired with a WEIGHT constant in home-mixer/scorers/weighted_scorer.rs (FAVORITE_WEIGHT, REPLY_WEIGHT, and 17 more): favorites, replies, quotes, reposts, photo expands, clicks, profile clicks, video quality views, three share variants, two dwell variants, follow-author, plus four negative actions and an implicit not-dwelled signal. A final weighted sum decides feed position. This article walks each head from the phoenix/run_pipeline.py source: which UI gesture trains it, which weight it pairs with, and what content patterns light it up. By the end, a creator understands why a post that gets 500 likes can rank below one with 80 likes and a 12-second dwell. We close with a quick framework for designing posts that fire multiple heads, not one.

16 min read

·

·

X Algorithm

The negative-signal economy: how one mute outweighs 50 likes on X

NEGATIVE_SCORES_OFFSET and NOT_INTERESTED_WEIGHT are why the 2026 X ranker's math is subtractive, not additive. Net-negative posts get pushed through a separate score-offset branch in weighted_scorer.rs where the combined score is rescaled as (combined + NEGATIVE_WEIGHTS_SUM) / WEIGHTS_SUM × NEGATIVE_SCORES_OFFSET, so one predicted mute or not-interested overwhelms dozens of predicted likes. This article traces every negative signal: the four explicit weight terms, the implicit not_dwelled_score, the four hard-kill filters that run upstream of any scoring, and the off-voice-drift to mute pipeline. We close with a creator-specific section: what content patterns trigger followers to mute, why voice drift is the single biggest negative-signal driver, and how to detect drift before publish.

13 min read

·

·

X Algorithm

Dwell time is the new like: the 4 dwell heads ranking your posts

The 2023 ranker had one weighted dwell-related term. The 2026 ranker has four. dwell_score is the discrete recap-dwell head (CLIENT_TWEET_RECAP_DWELLED, index 11). dwell_time is its continuous-regression sibling. click_dwell_time is dwell-after-click, a far stronger trust signal than the click itself. not_dwelled_score is the implicit penalty for scroll-past. Video has its own quality-view head (vqv_score, index 13) gated by MIN_VIDEO_DURATION_MS. This article unpacks each, explains why dwell is harder to game than likes (it is conditioned on history, not on social proof), and gives a writing playbook for posts that halt scroll: hook density, line-break rhythm, and the "second-line payoff" pattern. Voice tools that optimize headline-only metrics will systematically underperform on dwell.

13 min read

·

·

X Algorithm

48 hours in Thunder: why X recency is a window, not a boost

"Recency boost" is a myth that survived from 2020 Twitter advice into 2026. The 2026 algorithm has no recency multiplier in weighted_scorer.rs. What it has is a recency window: Thunder's post_store.rs retains posts for a default of 2 days, after which they fall out of the in-network candidate pool entirely. tweet_mixer_source.rs applies a similar age cutoff via MAX_POST_AGE. After that, posts can still surface via OON Phoenix retrieval but only if their embedding is strong enough. Combined with the three-layer impression bloom (previously-seen, previously-served, previously-seen-backup), recency in 2026 is binary: in the window or out of it. This article kills the multiplier myth, explains the window architecture, and gives a posting-cadence playbook that respects the 48-hour reality and the diversity scorer's per-author caps simultaneously.

12 min read

·

·

X Algorithm

The 5 ways X steals your feed slots before organic content gets ranked

Creators chase top-10 placement assuming there are 10 slots. There are not. Every rendered For You feed includes a who-to-follow module of up to 3 users, one or more ads spaced by MIN_POSTS_FOR_ADS, optional full-cover or half-cover prompts that take the top slot, optional push-to-home heroes if the user arrived from a notification, and cached-posts continuation slots from the prior session. By the time organic candidates are placed, the visible top-10 is often top-6 organic. This article inventories every non-organic source in home-mixer/sources/, the slot quotas where documented, and the safe-gap blending math from home-mixer/ads/safe_gap_blender.rs. We finish with a session-strategy section: when followers see your post, how much of the surrounding feed is theirs and not X's.

11 min read

·

·

The whole series

The X algorithm in May 2026: all ten articles

Read ›

Read ›

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 · Cancel anytime · Your writing stays private

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 · Cancel anytime · Your writing stays private

[

ready to start?

]

Create more.
Stay unmistakably you.
Grow from there.

3-day trial from $1 · Cancel anytime · Your writing stays private