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.
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.
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:
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)) }) });
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'.
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.
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.
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 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.
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.
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.