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.
Source: illustrative decay curve, specific decay constant redacted
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:
- Candidates from twelve sources hydrated.
- Pre-scoring filters applied (including the hard-kill filters from A5).
- Phoenix scores each candidate against the viewer's history sequence.
weighted_scorer.rslinearly combines the 19 action probabilities.author_diversity_scorer.rswalks the sorted list and applies the decay multiplier per author occurrence.oon_scorer.rsappliesOON_WEIGHT_FACTORto out-of-network candidates.vm_ranker.rsoptionally applies DPP rerank at the top of feed.- 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.
Source: author_diversity_scorer.rs formula applied to a 10-post-day creator
| 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 |
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.
Source: home-mixer/filters/dedup_conversation_filter.rs + retweet_deduplication_filter.rs
| 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) |
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.