Bangermeter is a free Chrome extension. It puts a 0 to 100 score on every post in your X feed, and on your draft while you write it, using the real production weights X published on August 13, 2026, re-checked against X's source as of September 18, 2026. Every factor is cited to the line of source code. No folklore, no data collection, no server.
Add to Chrome · Free Read the code
Weights shown are X's, as of September 18, 2026.
As you scroll x.com, each post gets a badge with up to two 0 to 100 scores (50 = a typical median post). C is Content Appeal: what the algorithm would predict from the content alone. E is Earned Engagement: how X's weights value what the post actually earned per view. A ~ marks low-view posts where rates are statistically smoothed.
Big score chips, human explanations, detected content signals with ▲/▼ direction, rescoring factors, freshness decay, and a collapsible "Show the math" with the full weight × probability table.
The compose box gets a meter that scores your draft in real time with ▲/▼ hints: asks a question ▲, three or more hashtags ▼, "like if" bait ▼.
Every head with X's published value, its param.rs key, and whether Bangermeter measures it or estimates it. The same table as further down this page, one click away while you browse.
Community-Noted posts (score suppressed ×0.5, per three causal studies), visibility-limited posts flagged qualitatively, and quote-tweets handled correctly: embedded media is not counted as the quoting post's own.
Scores the post as if the viewer mutually follows the author, which lifts the reply coefficient from 5 to 20 (as of September 18, 2026). It is the most interesting switch in the popup, and it shows how much of the algorithm is about who is reading. Plus badge, draft-meter and out-of-network toggles. Settings sync through Chrome's own storage. That is the only permission it wants.
Every weight below is X's, read from home-mixer/params/param.rs, as of September 18, 2026 (upstream sync stamp 2026-09-18T16:21:20Z). A weight is a coefficient on a predicted probability, so a big number usually means a rare action. The eight that matter most:
| Action | Weight | What it means | In Bangermeter |
|---|---|---|---|
| Share via copy link | 20 | The largest positive coefficient X publishes. Also one of the rarest actions. | Estimated |
| Reply | 5 | Becomes 20 when you mutually follow the author of an original post. | Measured |
| Quote | 5 | Matches the reply coefficient. | Estimated |
| Follow author | 4 | A new follower earned from the post. | Estimated |
| Like | 0.5 | Small coefficient, by far the most common action. More expected score on a median post than anything above it. | Measured |
| Profile click | 0.0 | Zeroed by X. The 2023 table paid 12 for this. | Zeroed by X |
| Mute author | −58.8 | Nearly twice the coefficient of a block (−31.2). | Estimated |
| Report | −234 | The heaviest coefficient in the system. It pushes a post beneath every positive-scoring post in the feed. | Estimated |
| Action | Weight | What it means | In Bangermeter |
|---|---|---|---|
| Report | −234 | The heaviest coefficient in the system, in either direction. | Estimated |
| Mute author | −58.8 | Muting carries nearly twice the coefficient of blocking. Most people assume the reverse. | Estimated |
| Not interested | −43.2 | The "show less often" menu item, in X's own words. | Estimated |
| Block author | −31.2 | Milder than a mute, and milder than most people expect. | Estimated |
| Share via copy link | 20 | The largest positive coefficient X publishes. Also one of the rarest actions, so read the trap below before converting it. | Estimated |
| Reply | 5 | Rises to 20 on an original post from someone you mutually follow. | Measured |
| Quote | 5 | The same coefficient as a reply. | Estimated |
| Share via DM | 5 | Forwarding to a friend. | Estimated |
| Follow author | 4 | Gaining a follower off the post. | Estimated |
| Share | 2 | Opening the share sheet and sharing. | Estimated |
| Repost | 1 | Twice the coefficient of a like, and about as common. | Measured |
| Like | 0.5 | Small coefficient, by far the most common action. It carries more expected score on a median post than anything above it. | Measured |
| Post click | 0.4 | Opening the post itself. | Estimated |
| Open link | 0.2 | Links ARE rewarded. Small, and the "link penalty" story is wrong. | Estimated |
| Video open | 0.07 | Starting the video. X raised it from 0.05 on August 25, 2026. | Estimated |
| Photo expand | 0.05 | Tapping an image to full size. | Estimated |
| Dwell (binary) | 0.05 | X turned it on August 25, 2026 (it was 0.0). It fires only when the viewer engaged and stayed at least 10 seconds. | Estimated |
| Quoted-post click | 0.05 | Clicking through to the post being quoted. | Estimated |
| Post unexplored | 0.02 | A novelty term, in-network posts only. | Viewer-specific |
| Not dwelled | −0.02 | The largest term on an ordinary post. Tiny coefficient, and it fires on most impressions. | Estimated |
| Dwell time | 0.004 | Paid per second of dwell. One of the largest terms an ordinary post earns. | Estimated |
| Profile click | 0.0 | Zeroed by X. The 2023 table paid 12 for this. It is now worth nothing. | Zeroed by X |
| Video quality view | 0.0 | Zeroed by X on August 25, 2026. It was 0.05. Its gate measures the clip's own length (over 10 seconds). Watch time does not enter it. | Zeroed by X |
| Quoted video quality view | 0.0 | Zeroed by X. | Zeroed by X |
| Click dwell time | 0.0 | Zeroed by X. | Zeroed by X |
| Active seconds (5m residual) | 0.0 | Zeroed by X. | Zeroed by X |
All 26 scoring heads, sorted by absolute weight. Every value is X's, read from home-mixer/params/param.rs as of September 18, 2026, and each one is asserted individually by the engine's 255 self-tests. Measured means Bangermeter reads the real count off the post. Estimated means the weight is X's and the probability is ours.
What happens after the weighted sum (all figures as of September 18, 2026). A mutual-follow reply adds +15, on original posts only, never on replies or reposts. Out-of-network multiplies by ×0.75, applied exactly once, including to in-network replies and reposts. Author diversity applies (1 − 0.25) × 0.5k + 0.25 for the k-th post from the same author. The second post from an author keeps 62.5% of its score. The third keeps 43.75%.
How the scale is built. The scorer adds an offset of 0.001 (as of September 18, 2026) to the weighted sum, then runs offset_score(), which compresses any net-negative combined score into a band strictly below every net-positive post. Sum the published constants as of September 18, 2026 and the positives come to 43.34 against 367.22 of negatives, a total range of 410.56. Those three totals are my arithmetic on X's constants. The offset and the compression step live in the scorer (ranking_scorer.rs), not in param.rs.
That is the real cost of a report. A reported post falls beneath every positive-scoring post in the feed, whatever else it earned.
Until that morning the only ranking weights anyone had were a snapshot from March 2023, and roughly a third of the ranking heads had never been given a number at all. Then X published the live production values.
They are not a leak and not a snapshot. X's own README says it plainly:
The header of param.rs carries the sync stamp: last sync 2026-08-12T04:09:22Z.
One qualifier most coverage will drop. Every constant is declared as a feature-switch default, like param!(FavoriteWeight, f64, "rust_home_mixer_favorite_weight", 0.5);. X calls these the primary production values. A feature switch exists so some users can be served something else, so a reader inside an experiment bucket may have a different number applied to their feed. Read the file as the default configuration, captured on August 13.
The catch most of the internet is about to get wrong: every weight is a coefficient on a predicted probability. A report does not cost "minus 234 points." It contributes −234 × the model's predicted probability that a viewer reports the post. X's own code comment says the values are that large partly because the actions are rare.
Bangermeter sits on four research passes, all documented in the repo's RESEARCH.md:
And the punchline that aged well: those viral Grok "algorithm reveal" screenshots were confabulations by construction. The weights were redacted from everything Grok could read. Now they aren't, and you can check every one yourself.
X changes this repository most weekdays, so every figure this page takes from X's code carries the date it was read. On August 25, 2026, X changed three weights in commit 0d3cdd8. There was no announcement, and the commit carries the same message as nearly every commit in that repository, so nothing in it said a weight had moved. The full account is in X changed three ranking weights and said nothing.
| Head | Before August 25 | As of September 18, 2026 |
|---|---|---|
| Video quality view | 0.05 | 0.0 |
| Dwell (binary) | 0.0 | 0.05 |
| Video open | 0.05 | 0.07 |
X's reference code (phoenix/reference/world.py, which generates synthetic training data) marks a post dwelled, as of September 18, 2026, only when the viewer took an action on it and stayed at least 10 seconds. It marks not dwelled when the viewer took no action at all. A viewer who acts and leaves inside 10 seconds fires neither. Separately, MinVideoDurationMs is also 10,000, as of September 18, 2026. It measures the length of the clip itself, and watch time does not enter it. That head now carries a weight of 0.0, so the gate decides whether to add nothing. The two rules share a number and measure different things.
EnableViewerColdStart ships on. On each For You request, at most one post gets its score raised to the 16th-highest score in the ranked list (index 15, counting from zero), if one qualifies: author at 1,000 followers or fewer, an original post (not a reply, not a repost), under 48 hours old, under 1,000 Home impressions, and already inside the top 85% of candidates with a nonzero score. These rules are as of September 18, 2026. The age limit rose from 24 to 48 hours on September 17. The lift sets a floor under the score. A post already scoring higher gains nothing, and later scorers can still move it. The pick happens on X's servers, so Bangermeter cannot tell whether your post was the one lifted, and it does not claim to.
X now publishes what the ranker receives about a post's content, as of September 18, 2026: has_video, max_video_duration_ms, has_photo, media_count, weighted_text_len, newline_count, has_url. A URL counts as 23 characters whatever its length, and CJK characters and emoji count 2 (as of September 18, 2026). A media attachment's own t.co link is subtracted first, so posting an image does not make your post "have a link." newline_count is the first published evidence that post shape, as well as length, reaches the ranker. X publishes no coefficient for any of the seven, so Bangermeter lists them and does not score them.
There is no bookmark weight. No coefficient multiplies a predicted bookmark, so a bookmark cannot turn into score the way a like or a reply can. The model still sees bookmarks: bookmark_count goes to Phoenix as a model input, in home-mixer/models/candidate.rs (as of September 18, 2026). The value model has no term to pay them with. "Bookmarks are 20× a like" is still folklore.
In version 0.10.2 the breakdown panel docks to the bottom-right corner at full height, so it no longer covers the post it explains. Click the badge of an open post to close the panel. Click a different post's badge to switch the panel to that post. Both work from the keyboard.
Copy link is 20.0. A like is 0.5. Divide them and you get 40, and the sentence writes itself: a copy-link is worth forty likes.
I wrote that sentence, shipped it on this page, and my own red-team pass took it apart. Here is the correction, because it is the most useful thing on this page.
A weight is a coefficient. What a post earns from a head is weight × P(action), and X's code comment says the coefficient is partly a function of how rare the action is. Copying a link is far rarer than tapping like. Multiply each coefficient by its own probability and the order can flip.
Worked example, using Bangermeter's own estimated rates for a median post. On 10,000 impressions: about 50 likes and about half a copy-link.
Likes: 50 × 0.5 = 25.0
Copy links: 0.5 × 20.0 = 10.0
The like column wins by 2.5×. The probabilities in that example are ours, and they are estimates. The weights are X's.
"A copy-link is worth 40 likes" is the same sentence as "a reply is worth 27 likes," which is the folklore this release kills. Same arithmetic error, newer numbers.
The published weights tell you what X values per event. They do not tell you what to chase, because the probability half of the product lives in a model nobody outside X can run.
The largest single term on an ordinary post is not in the top of the table at all. NotDwelledWeight is −0.02 (as of September 18, 2026), near the bottom by coefficient, and it fires on most impressions you get. In X's reference code, which generates synthetic training data, a post leaves that term only when the viewer takes an action on it. A pause without an action still counts as not dwelled.
Every figure in these cards is X's, as of September 18, 2026.
Who want to understand why posts perform instead of chasing folklore.
Who will open "Show the math" and check the weight table themselves.
The "I reverse-engineered the algorithm" ones. Now with a source you can check.
Same tool, single file, for people who don't install extensions: extension/bangermeter.user.js in the repo.
Clone the repo, open chrome://extensions, enable Developer mode, Load unpacked, pick the extension/ folder. Read the code before you run it. That's the point of it being open.
Free Chrome extension. MIT. Runs locally on x.com. Not affiliated with X Corp or xAI.
Bangermeter is an independent open-source project. Not affiliated with, endorsed by, or sponsored by X Corp or xAI. Scores are relative estimates: the weights are X's published production defaults, the probabilities they multiply are Bangermeter's own estimates. They are not predictions of reach.
Built by Ryan Lenk. More projects on the Side Projects page.