Markdown · llms.txt

Shadowban on X: what the code actually filters

Last updated 2026-10-11. Commit cb45b55 does not use the word shadowban. People use it for “my post is not showing.” The repository splits that outcome into two mechanisms, and it does not tell you which one applied to a given account.

Ranking is not visibility

The README states the split. Ranking sets order. Whether a post can be shown at all is visibility-filtering/, from the viewer’s own blocks and mutes and from labels other systems attach. VFFilter and AncillaryVFFilter drop a candidate when visibility-filtering answered drop, including when a parent, quote, or repost target was dropped.

visibility-filtering/rules/registry.rs evaluates rules into verdicts. The actions in that file include:

  • ActionSpec::Drop — withheld as a drop.
  • ActionSpec::Tombstone — withheld as a tombstone.
  • ActionSpec::Appealable — the post can still be shown with a notice.
  • ActionSpec::LimitedEngagement — engagement on the post is limited.
  • ActionSpec::MediaRestriction — media is restricted while the post can remain.

The README’s short version of the same service is: show a post, drop it, or show it behind an interstitial. A further set of rules applies only when the post is a recommendation from an account the viewer does not follow, and those rules can only drop. The same post can be allowed to a follower. Both sets are listed in registry.rs.

protected_author in visibility-filtering/rules/author_rules.rs drops the post when the author is protected and the viewer does not follow them.

Labels come from Grox, media models, Agatha, BDSM, Scarecrow, and botmaker. Grox PTOS categories in grox/flows/ptos/state.py include spam, with subtypes such as SpamEngagementFarming, SpamHashTagAbuse, SpamScamLinks, and SpamPlatformManipulation. The classifier prompts are not in the repo. The playbook is explicit that the numeric rule turning slop_score or a safety label into a visibility decision is not published. This page cannot say “score above N means you are filtered.”

The README describes an “Under the Hood” view that reports aggregate label statistics on an account and its posts, including legal withholding by country. That tool is not this website. Matching a label you can see there to registry.rs is the path the README suggests. This page does not have your labels.

Filters that remove a post before a score exists

These are not visibility-filtering. They run in home-mixer/filters/ and never produce a rank:

FilterWhat it drops
AgeFilterOlder than 48 hours
OONRetweetReplyFilterReplies and reposts from accounts the viewer does not follow (EnablePhoenixOonReplies defaults false)
AuthorSocialgraphFilterAuthor the viewer blocked or muted
PreviouslySeenPostsFilterAlready impressed or served
MutedKeywordFilterThe viewer’s muted keywords, including hashtags
IneligibleSubscriptionFilterSubscriber-only posts the viewer cannot access
Brazil2026ElectionFilterAccounts reported to Brazil’s electoral court, unless the viewer follows them
SelfTweetFilterYour own posts, in your own For You

A post that loses here is absent from that viewer’s For You. Followers can still be eligible when the rule is the out-of-network reply filter or the protected-author rule. That is a narrower outcome than “nobody can see it,” and the code does not collapse those cases into one word.

What a missing post is not

It is not, by itself, evidence of a reputation multiplier. UserCredV2 is not read by home-mixer or by visibility-filtering in this commit. See What is TweepCred. It is also not the 0.75 out-of-network factor. That factor discounts a score. It does not drop the post. The drop list is the table above plus visibility-filtering.

tweet-factory does not query visibility for your account. The draft scorer at tweetfactory.sh/score scores wording against published weights. It does not tell you whether a label withheld a post.

FAQ

Am I shadowbanned on X?

This repository cannot say. It does not define shadowban. It can drop a post in visibility-filtering, tombstone it, limit engagement, or remove it before scoring for age, blocks, mutes, seen-state, keywords, subscription, or the Brazil election list. Which rule fired is not in the public request logs this site can see.

Is a shadowban the same as a low For You score?

No. A low score is still a ranked candidate. A drop in VFFilter or in AgeFilter never receives that score for that viewer. Out-of-network posts that remain are multiplied by 0.75. That is a discount, not a ban.

There is no such rule in the ranking sum. open_link is +0.2. Hashtags are not a counter. SpamScamLinks and SpamHashTagAbuse are safety labels whose prompts and thresholds are unpublished, so a spam label can still affect visibility without a percentage published here. See the myths page.