What does X know about you before ranking a single post?
Before any post is scored, a set of "query hydrators" load context about you, the viewer, into the ranking request. The released code names them: your followed, blocked, muted, and subscribed user IDs; your muted keywords; your recent impressions and served history; your follow-graph overlaps; your IP and country; and — behind feature flags — your demographics and an inferred-gender label. This is the context every post is then ranked against. Your feed is shaped as much by what the system loaded about you as by the posts themselves.
Ranking is personalized, which means before the first post is scored, the system assembles a profile of you — the viewer — to rank against. The released code calls these "query hydrators," and reading their names is the clearest answer to "what does the algorithm know about me."
The viewer profile
The core viewer features are a compact struct — and half of them are exclusion lists:
7pub struct UserFeatures { 8 pub muted_keywords: Vec<String>, 9 pub blocked_user_ids: Vec<i64>, 10 pub muted_user_ids: Vec<i64>, 11 pub followed_user_ids: Vec<i64>, 12 pub subscribed_user_ids: Vec<i64>, 13 pub follower_count: Option<i64>, 14 }
The per-viewer feature struct consumed by ranking contains six fields: muted_keywords, blocked_user_ids, muted_user_ids, followed_user_ids, subscribed_user_ids, and follower_count \— the viewer's muted keywords and block/mute lists are first-class ranking inputs.
The full hydrator set
Beyond that core struct, the release includes a whole family of query hydrators, each loading one kind of context:
| hydrator | what it loads |
|---|---|
| followed / blocked / muted / subscribed user IDs | Your social graph and exclusion lists |
| muted keywords | Words that filter posts out of your feed |
| impressed / served history | What you've already been shown, so it isn't repeated |
| mutual-follow overlap | Graph closeness between you and candidate authors |
| IP / country / language | Locale context for the request |
| demographics / inferred gender | Loaded only behind feature flags — see the dedicated page |
The demographic and inferred-gender hydrators are gated and deserve their own careful treatment;
they get it on the demographics page.
The rest load as standard ranking context.
The home mixer includes a family of query hydrators that load viewer context before ranking: followed/blocked/muted/subscribed user IDs, muted keywords, impressed and served history, mutual-follow overlap, IP/country, and (gated) demographics and inferred gender.
Why it matters
Two things follow. First, your own actions shape your feed: every account you mute or block, every keyword you mute, becomes a permanent input. Second, the same machinery runs on the author side — when you post, the viewer's hydrated profile (their mutes, their blocks, their history) decides whether you're eligible to reach them. Your reach is partly a function of other people's loaded context, which you can't see.
What the code doesn't say
The weight each context feature carries downstream, and which optional hydrators are active in
production. The hydrators show what's loaded; how heavily each shapes ranking lives in
the withheld scoring parameters. The inputs are code-current; their exact influence is not.
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
Curate your own inputs — your mutes and blocks tune your feed permanently — and remember that on the publishing side, you're being ranked against context you can't observe. The controllable half is your content and your reputation signals, which is exactly what xDoctor measures from your archive.