The X algorithm in May 2026

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

The home-mixer applies two diversity passes that no creator-facing article has explained. First, author_diversity_scorer.rs sorts candidates by weighted score, then walks the list applying an exponential decay multiplier per author occurrence: (1 - floor) * decay^position + floor. The first post from a creator gets the full score; the second gets decay; the third gets decay²; fast approaching floor. Second, vm_ranker.rs applies a Determinantal Point Process rerank at the top of feed when theta > 0, explicitly maximizing diversity-adjusted score across the visible top-max_selected_rank slots. Combined: a creator who posts 10 times a day has 7 of those posts hard-capped near the diversity floor. This article quantifies the decay curve, explains DPP in plain language, and rewrites the "how often to post" question into the right shape: post fewer times, with higher per-post voice distinctiveness.

May 26, 2026 · 12 min read · VoiceMoat team

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 on the recency window and to A1'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

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

Source: illustrative decay curve, specific decay constant redacted

1007550250Post 1Post 2Post 3Post 5Post 8relative score multiplier
With diversity decay appliedWithout diversity decay (counterfactual)

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:

  1. Candidates from twelve sources hydrated.
  2. Pre-scoring filters applied (including the hard-kill filters from A5).
  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

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

Post rank-positionPhoenix score (notional)Diversity multiplier (notional)Final candidate score
10.841.000.84
20.840.680.57
30.840.460.39
40.840.320.27
50.840.220.18
80.840.100.08
100.840.070.06

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/

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

FilterWhat it removes
dedup_conversation_filter.rs documentedcandidates from the same conversation tree, retaining one representative per conversation
retweet_deduplication_filter.rs documentedduplicate retweet candidates (same original post retweeted by different accounts)

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 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), 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) opened with the structural argument; this article closes the cadence loop. The competitor comparison in A10 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.

AI disclosure

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