# Shadowban on X: what the code actually filters

**Last updated 2026-10-11.** Commit [`cb45b55`](https://github.com/xai-org/x-algorithm/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/`](https://github.com/xai-org/x-algorithm/tree/cb45b55/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:

| Filter | What it drops |
|---|---|
| `AgeFilter` | Older than 48 hours |
| `OONRetweetReplyFilter` | Replies and reposts from accounts the viewer does not follow (`EnablePhoenixOonReplies` defaults false) |
| `AuthorSocialgraphFilter` | Author the viewer blocked or muted |
| `PreviouslySeenPostsFilter` | Already impressed or served |
| `MutedKeywordFilter` | The viewer’s muted keywords, including hashtags |
| `IneligibleSubscriptionFilter` | Subscriber-only posts the viewer cannot access |
| `Brazil2026ElectionFilter` | Accounts reported to Brazil’s electoral court, unless the viewer follows them |
| `SelfTweetFilter` | Your 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](what-is-tweepcred.md). 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](https://tweetfactory.sh/score/) scores wording against published weights. It does not tell you whether a label withheld a post.

## Related

- [How the X (Twitter) algorithm works](how-the-x-algorithm-works.md)
- [X algorithm changes in 2026](x-algorithm-changes-2026.md)
- [Myths: links, hashtags, bookmarks, Premium](x-algorithm-myths.md)

## 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.

### Do links or hashtags trigger a shadowban in this code?

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](x-algorithm-myths.md).
