Why don't my followers see my posts?

Because following you makes you eligible to appear in their For You feed — it doesn't guarantee placement. Even in-network posts from accounts they follow pass through the same pipeline: filters can remove your post (they've already seen it, it matches a muted keyword, it's too old), and scoring decides where it ranks against everything else competing for their attention. A follower's feed is not a list of their follows in order; it's a ranked mix, and your post has to earn its slot even there.

The intuition that "my followers should see what I post" comes from the old chronological timeline. The For You feed doesn't work that way, and the released code shows why: being followed gets your post retrieved for that person, but retrieval is only the first of several stages it still has to survive.

Following gets you in the door — Thunder

When someone follows you, Thunder can fetch your posts for their feed via their following list. That's the in-network path, and it's real. But Thunder produces candidates, not placements — your post then goes through the same filters and scoring as everything else.

CODE-CURRENT0bfc279verified 2026-06-12
Thunder is the in-network source: it fetches posts via get_in_network_posts, keyed on the viewer's followed_user_ids — i.e. content from the accounts the viewer follows.
xai-org/x-algorithm — home-mixer/sources/thunder_source.rs, following_user_ids from followed_user_ids (L32-L37) and get_in_network_posts call (L46)as of the May 15, 2026 release

Filters can remove it before ranking

Several filters run on in-network candidates too. If your follower has already seen the post, the previously-seen filter drops it outright:

home-mixer/filters/previously_seen_posts_filter.rs · L23–L30@ 0bfc279
23let (removed, kept) = candidates.into_iter().partition(|c| {
24    get_related_post_ids(c).iter().any(|&post_id| {
25        query.seen_ids.contains(&post_id)
26            || bloom_filters.iter().any(|f| f.may_contain(post_id))
      })
  });
CODE-CURRENT0bfc279verified 2026-06-12
The PreviouslySeenPostsFilter removes candidates the viewer has already seen, using both the seen_ids sent by the client and bloom filters; matching posts are partitioned into 'removed'.
xai-org/x-algorithm — home-mixer/filters/previously_seen_posts_filter.rs, seen_ids + bloom-filter partition (L23-L30)as of the May 15, 2026 release

And if your post matches one of their muted keywords, the muted-keyword filter removes it — a follower who muted a word you used simply won't be shown that post. None of this is a penalty against you; it's the feed respecting their settings and their history.

CODE-CURRENT0bfc279verified 2026-06-12
Before scoring, Home Mixer removes: duplicates, posts that failed metadata hydration, posts older than a threshold, your own posts, repost duplicates, paywalled content you can't access, posts you've already seen or been served, posts containing your muted keywords, and posts from authors you've blocked or muted.
xai-org/x-algorithm — README.md, Filtering section (Pre-Scoring Filters table, lines 296–314)as of the May 15, 2026 release

Then it competes on rank

What survives filtering is scored against every other candidate for that feed slot — other follows, out-of-network discovery, the works. A follower with 2,000 follows has a crowded feed; your post earns its place on the scoring signals or sits below the fold. Following you raised your baseline reach to them; it didn't reserve a seat.

What the code doesn't say

▲ What the code doesn't say

What fraction of your followers a typical post reaches. That depends on how active they are, how crowded their feeds are, and the withheld scoring weights — none of which is a fixed number in the code. We can show the stages a post survives to reach a follower; we can't quote a delivery rate.

UNKNOWN0bfc279verified 2026-06-12
The numeric values of the current weights are not included in the open-source release: weighted_scorer.rs references a params module (e.g. p::FAVORITE_WEIGHT, p::REPLY_WEIGHT) whose values are not present anywhere in the published repository.
xai-org/x-algorithm (verified by direct inspection of the full repository tree at the pinned SHA) — home-mixer/scorers/weighted_scorer.rs references crate::params; no params definitions with weight values exist in the releaseabsence verified at the pinned SHA; values may be published in a future release

What to do with this

Two levers. Post things your followers actually engage with, so you score well on the in-network path — and watch your real follower engagement, not your follower count, because Thunder reach tracks the former. xDoctor's reach diagnostics separate your in-network delivery from your out-of-network discovery, so you can see which one is actually soft.

← Reach problems