The Twitter algorithm is the ranking system that decides the order of posts in a reader's For You feed on X. Since 13 August 2026 its engagement weights have been public: a model predicts how likely you are to take each action on a candidate post, each prediction is multiplied by a fixed published constant, and the sum of those products is the score the feed sorts by. A favourite is weighted 0.5. Copying the link is weighted 20.0. A profile click is weighted 0.0.
The 40-second answer
X open-sourced the code that orders your feed, and since 13 August 2026 that code includes the engagement weights. A favourite is 0.5. A reply is 5.0. Copying your link is 20.0, the largest positive weight in the file. A profile click is 0.0. The weights multiply predicted probabilities rather than counts, so the popular reading that one copy link equals forty likes is an error X names in its own source comments. Write posts people move, not posts people like.
X publishes the code that ranks your posts. Not a summary of it, not a blog post about it, the actual file with the actual numbers, kept in sync with production by a cron and pushed to a public repository that is still being worked on. On 13 August 2026 that repository gained home-mixer/params/param.rs, and with it the engagement weights that turn a set of predictions into the order of your feed.
Almost nothing written about the Twitter algorithm reflects that. We measured page one for the query on 9 September 2026 and found that of the eight results we could read, zero linked the repository the weights live in, and zero used the words param.rs, weighted_scorer or Phoenix. Five of the eight linked a different repository that stopped receiving commits on 3 September 2025.
This piece is the file, read carefully, turned into six changes to how you post. It sits underneath our guide to how to grow on Twitter in 2026, which covers the system around the posting rather than the scorer beneath it. It is deliberately not a list of tips. Every number in it comes from a named file at a pinned commit, and where the popular reading of a number is wrong, we say so and quote X contradicting it in its own source comments.
Engineering
@Engineering
We have open-sourced our new X algorithm, powered by the same transformer architecture as xAI's Grok model. Check it out here: https://github.com/xai-org/x-algorithm
What actually changed, and when
The history matters here because most of the confusion is a date problem rather than a knowledge problem. People are describing three different systems as though they were one. We wrote about the Grok-ranked feed when the October 2025 statement landed, and the section below on what the code does not say is the correction to it.
How the X ranking stack actually got here
TIMELINE01
31 March 2023
Twitter open-sources the-algorithm and states it is NOT releasing training data or model weights.
02
3 September 2025
That repository takes its last commit. It is still unarchived and still described as source for the X recommendation algorithm.
03
17 October 2025
Musk posts that the company is aiming to delete all heuristics in four to six weeks and that Grok will read every post. A stated goal, widely repeated since as fact.
04
20 January 2026
xai-org/x-algorithm appears. Rust, Apache 2.0, the serving path but no weights file.
05
13 August 2026
The release that adds home-mixer/params/param.rs, the visibility filtering service and the Phoenix training code. The weights become public.
06
14 August 2026
X adds comments to param.rs naming the count-equivalence misreading directly, one day after publishing the numbers.
07
8 September 2026
Latest commit at the time of writing. The repository now carries 2,067 files, from 24 commits across 18 distinct days since January.
In March 2023, Twitter published twitter/the-algorithm, a large Scala codebase, and said plainly in the announcement that it was not releasing training data or model weights. That repository is the one with 73,893 stars. It is the one everybody bookmarked. It received a single substantive refresh on 3 September 2025, commit c54bec0d4, and its default branch has had no commit since.
In October 2025 Elon Musk posted that the company was aiming to delete all heuristics within four to six weeks and that Grok would read every post. That sentence is the origin of a great deal of writing that now presents it as an accomplished fact. It was a stated goal, and the code that shipped afterwards does not match it.
In January 2026 a new repository appeared, xai-org/x-algorithm, written in Rust and licensed Apache 2.0. It carried the serving path but no weights file. A second release followed in May. On 13 August 2026 the third release added home-mixer/params/param.rs, the visibility filtering service, and the Phoenix training code. The day after, X added comments to that same file pre-empting a specific misreading that was already circulating. The repository has taken 24 commits across 18 distinct days between 20 January and 8 September 2026, five of them in the first eight days of September, most recently on 8 September 2026, and now carries 2,067 files, with 32,948 stars and 5,400 forks against the frozen repository's 73,893. The release was covered at the time as the moment users could check their own visibility state.
The famous repository and the live one are different codebases, and the famous one does not say so
twitter/the-algorithm carries 73,893 stars, is written in Scala, took its last commit on 3 September 2025, and is still unarchived and still described as source for the X recommendation algorithm. The code that ranks posts today is xai-org/x-algorithm, written in Rust, which took a commit on 8 September 2026 and carries 2,067 files. A search across the frozen repository for any reference to its successor returns one hit, and that hit is a false positive on an unrelated path fragment. Anyone who bookmarked the 2023 release and returns to it gets no signal that they are reading retired code.
Source: github.com/twitter/the-algorithm and github.com/xai-org/x-algorithm, both read 9 September 2026
The frozen repository against the live one
twitter/the-algorithm
xai-org/x-algorithm
Still receiving commits
Carries the engagement weights
Written in Rust
Names Phoenix as the ranker
Points the reader at the other one
Linked by page-one results
Both repositories read through the GitHub API on 9 September 2026. Star counts move constantly. The frozen one last took a commit on its default branch on 3 September 2025 (c54bec0d4) and is NOT archived, so it still presents as current. The final row is our own measurement of the eight readable page-one results.
So there are two repositories with almost the same name, one frozen and famous, one live and comparatively unknown, and the frozen one contains no pointer to its successor. We checked: a search across twitter/the-algorithm for any reference to the newer repository returns one hit, and that hit is a false positive on an unrelated path fragment called post-nux-algorithm. A reader who lands on the well-known repository gets no signal that they are looking at retired code.
Operator noteCheck the org before the repo name. Two repositories, one frozen since September 2025., FORKOFF X growth practice, 2026
What is actually in the file X published?
The X ranking scorer is a linear blend: a model predicts the probability that a reader takes each of a set of actions on your post, each probability is multiplied by a fixed published weight, and the products are summed into the single number the feed sorts by. That is the whole mechanism, and every practical consequence below follows from its shape.
The scoring model is stated in one line in the repository README, and it is worth reading slowly because every practical consequence in this article follows from its shape.
Final Score = the sum over actions of weight times the predicted probability of that action.
The scoring model is described in the repository README. A model called Phoenix, a purpose-built recommendation transformer with 8 layers, an embedding size of 2560 and a user history window of 1,022 items, looks at a candidate post and predicts a probability for each of a set of actions. Will you favourite it. Will you reply. Will you share it via direct message. Will you report it. Each of those predicted probabilities is then multiplied by a fixed weight, and the products are added together. The result is one number, and posts are ordered by it.
How one post becomes one number
The weights are the part X made public. They are ordinary constants in a Rust file, declared one per line, and they look like this.
Positive engagement weights in the published scorer
| Action | Constant | Weight | Times a favourite | Source |
|---|---|---|---|---|
| Copy the link and share it | ShareViaCopyLinkWeight | 20.0 | 40x | published |
| Reply | ReplyWeight | 5.0 | 10x | published |
| Quote | QuoteWeight | 5.0 | 10x | published |
| Share via direct message | ShareViaDmWeight | 5.0 | 10x | published |
| Follow the author from the post | FollowAuthorWeight | 4.0 | 8x | published |
| Share button | ShareWeight | 2.0 | 4x | published |
| Repost | RetweetWeight | 1.0 | 2x | published |
| Favourite | FavoriteWeight | 0.5 | 1x | published |
| Click | ClickWeight | 0.4 | 0.8x | published |
| Open link | OpenLinkWeight | 0.2 | 0.4x | published |
| Video open | VideoOpenWeight | 0.07 | 0.14x | published |
| Dwell | DwellWeight | 0.05 | 0.1x | published |
| Photo expand | PhotoExpandWeight | 0.05 | 0.1x | published |
| Continued dwell time | ContDwellTimeWeight | 0.004 | 0.008x | published |
| Profile click | ProfileClickWeight | 0.0 | 0x | published |
| Quality video views | VqvWeight | 0.0 | 0x | published |
as of 2026-09-08
Method: Every weight is a published default copied verbatim from the named constant in home-mixer/params/param.rs at a pinned commit, so each row is tagged published rather than measured. The fourth column is derived by dividing each weight by the 0.5 favourite weight. It describes the ratio between the weights themselves, which is arithmetic we can do, and NOT a claim that one action substitutes for a number of favourites, which is the reading X explicitly refutes in the same file.
Read from home-mixer/params/param.rs in xai-org/x-algorithm at commit 49815da2, 8 September 2026. The final column is our own arithmetic on the published weights, shown for scale only and NOT as an exchange rate between counts.
Positive engagement weights, largest to smallest
Published defaults from home-mixer/params/param.rs at commit 49815da2, 8 September 2026. These weights apply to PREDICTED PROBABILITIES, not counts, so the bars compare how much each predicted behaviour counts, not how many of one action equal another.
Two things in that table tend to stop people mid-scroll. The first is that a favourite carries a weight of 0.5, the smallest positive number in the set apart from the two that are switched off entirely. The second is that copying a link to your post carries 20.0, which is the largest positive weight by a factor of four over the next one down.
That is not an accident of tuning. A favourite is cheap. It costs a reader nothing, it happens inside the feed, and it predicts very little about whether the post was worth their time. Copying a link is expensive. It means the reader left the feed, decided the post was worth carrying somewhere else, and did the work of moving it. The weight is a statement about which behaviours are hard to fake.
Sharing to a direct message sits at 5.0, the same as a reply and the same as a quote. Following the author from the post is 4.0. The share button is 2.0. A repost is 1.0. And a profile click, which a great deal of advice still treats as the goal of a good post, is set to exactly 0.0.
Is a copy link really worth forty likes?
The most-repeated claim about the X weights is that they are an exchange rate between actions, so a copy link at 20.0 is worth forty likes at 0.5. That reading is wrong, and X refutes it in a comment inside the weights file itself, one day after publishing the numbers. The weights scale predicted probabilities, not counts.
Here is where care matters, and where we are going to disagree with the most-shared explanation of this file.
The popular reading takes the weights as an exchange rate. A copy link is 20 and a like is 0.5, therefore one copy link is worth forty likes. A report is minus 234, therefore one report cancels 468 likes. It is a satisfying way to present the numbers and it spread widely.
Dogan Ural
@doganuraldesign
copy the link and share it: +20 / reply, on an original post, and you follow each other: +20 (5 + 15 extra) / quote: +5 / reply (anyone): +5 / share via DM: +5 / follow you from the post: +4 / hit the share button: +2 / repost: +1 / like: +0.5
It is wrong, and X says so in the file itself. The comment block above the weights was added on 14 August 2026, the day after the weights went public, and it names this exact error.
One common misinterpretation is that you can read these weight ratios as count equivalences, e.g. the incorrect statement that one report cancels 468 likes. This is incorrect because the weights apply to the predicted probabilities rather than raw counts.
The weights multiply predicted probabilities, not counts. Phoenix does not know how many likes your post received. It has not been shown yet. What it produces is a set of numbers between zero and one describing how likely a particular reader is to take each action, and the weights say how much each of those likelihoods should count toward the final score.
That distinction changes what you can do with the information. You cannot compute how many likes a copy link is worth, because that sentence does not correspond to anything the system calculates. What you can read off the weights is direction and relative importance: which predicted behaviours the ranker is trying to buy, and which it is barely paying for. That is still enormously useful. It is simply a different kind of statement than an exchange rate, and presenting it as an exchange rate is how a real finding turns into a number that falls apart the first time anyone checks it.
What does page one for twitter algorithm actually tell you?
Almost none of the twitter algorithm information a searcher will actually find reflects the published weights. We measured page one for the head term on 9 September 2026 and read the eight results our tooling could fetch, then pattern-matched each for ten specific conditions with both a positive and a negative control reported alongside the counts.
We wanted to know how much of this reaches somebody who searches for the answer, so we measured it rather than guessing.
On 9 September 2026 we pulled the top ten United States organic results for the query twitter algorithm through firecrawl, then scraped each result to main-content markdown and pattern-matched it. Two of the ten dropped out for stated reasons: one is a Reddit thread, which our tooling refuses to fetch through a scraping layer on purpose and routes to a platform API instead, and one returned page navigation rather than article text, so it was excluded rather than scored as empty. That leaves eight pages, and every count below is out of eight.
What page one for the query twitter algorithm actually covers
| Does the ranking page do this | Pages | Why it matters to a reader | Source |
|---|---|---|---|
| Link the repository the weights are in | 0 of 8 | Nobody sends you to the primary source | measured |
| Name param.rs, weighted_scorer or Phoenix | 0 of 8 | The current architecture is unnamed | measured |
| Mention xAI at all | 0 of 8 | The organisation that owns the live code is absent | measured |
| Name copy-link or DM-share as a ranking signal | 0 of 8 | The largest positive weight goes unmentioned | measured |
| Quote at least one numeric engagement weight | 2 of 8 | And the two disagree with each other | measured |
| Say a reply outweighs a like | 2 of 8 | Right direction on both, wrong size on both | measured |
| Name Grok or an LLM inside ranking | 1 of 8 | The one page that does places it correctly | measured |
| Carry a dated as-of for its claims | 3 of 8 | Freshness is claimed more often than it is earned | measured |
| Link the frozen 2023 repository | 5 of 8 | Readers are sent to code that stopped moving | measured |
| Name an internal ranking component | 7 of 8 | Accurate, about the architecture since replaced | measured |
n = 8 · as of 2026-09-09
Method: Top ten United States organic results pulled live through firecrawl on 9 September 2026 and scraped to main-content markdown. Two are excluded for stated reasons, leaving eight: one is a Reddit thread our tooling routes to a platform API rather than a scraper, and one returned page navigation instead of article text. Both controls ran: a positive control on the word algorithm hit 8 of 8, a negative control on a nonsense token hit 0 of 8, and the live-repository matcher was proved to fire against that repository own page, so the zeros are measured absences.
Top ten United States organic results for the query twitter algorithm, pulled through firecrawl on 9 September 2026. Two of the ten are excluded for stated reasons, so every count is out of eight.
The zeros are the finding. Not one of the eight pages links the repository the weights are in. Not one uses the word Phoenix, or names param.rs, or mentions xAI at all. Five of the eight link the frozen 2023 repository, and one of those five is the frozen repository itself, sitting at position one.
None of the eight readable page-one results links the repository the weights are in
We pulled the top ten United States organic results for the query twitter algorithm on 9 September 2026 and read the eight we could. Zero link xai-org/x-algorithm. Zero use the words param.rs, weighted_scorer or Phoenix. Zero mention xAI. Five link the frozen 2023 repository instead, and one of those five is the frozen repository itself at position one. The matcher for the live repository was separately proved to fire against the live repository's own page, so the zero is a measured absence rather than a broken pattern.
Source: FORKOFF first-party SERP read, 9 September 2026, 8 of 10 results readable
Two of the eight do quote a numeric weight, and they disagree with each other. One states that replies are nine times more valuable than likes. The other states that replies are weighted 27 times more than likes. The published file puts the reply weight at 5.0 and the favourite weight at 0.5, so a reader who wanted the ratio would arrive at ten, and neither page is right. More to the point, both pages are computing an exchange rate that the source file says is not a meaningful operation.
Operator noteTwo pages quoted a reply-to-like ratio. One said 9, one said 27. The file says 10., FORKOFF SERP read, 9 September 2026
Reading the rest of the table, line by line
The two extremes get all the attention. The middle of the table is where the practical guidance lives, and it is worth walking through properly because several of these constants contradict advice that is still being sold.
Reply at 5.0 and quote at 5.0. These are equal, which is not obvious. A quote post is often treated as a lesser outcome than a reply, on the theory that the quoter is taking the conversation away from you. The scorer does not agree. Both are worth ten times a favourite, and a quote additionally creates a second ranked object carrying your post inside it.
Share via direct message at 5.0. The same weight as a reply, for an action nobody can see. This is the clearest signal in the file that the ranker is trying to measure private value rather than public performance. A post that gets sent around in DMs and collects almost no visible engagement is, in scoring terms, doing well.
Follow author from the post at 4.0. Eight times a favourite. This is the weight that rewards a post which makes a stranger want more of you specifically, and it is the one place where the ranker pays for something that looks like brand-building rather than like engagement.
Share button at 2.0, repost at 1.0. Both modest. The share button sits at four times a favourite and a tenth of a copy link, which is a curious ordering until you consider that the share sheet keeps the reader inside the platform's own affordances while a copy link means they went and got the URL themselves.
Click at 0.4, open link at 0.2, photo expand at 0.05, video open at 0.07. All the in-feed micro-interactions live down here, and they are collectively worth less than a single reply. A great deal of engagement-bait technique is aimed squarely at this band.
Dwell at 0.05 and continued dwell time at 0.004. Attention is paid for, and it is paid for at a rate that requires enormous volume to matter. Continued dwell time in particular is the smallest positive constant in the file.
Profile click at 0.0 and quality video views at 0.0. Two constants set to exactly zero. A weight of zero is not a small weight, it is an off switch, and it takes a deliberate decision to write it that way rather than to delete the parameter.
Set the whole table beside the advice that circulates about this platform and a pattern emerges. Almost everything commonly recommended sits in the 0.05 to 0.5 band: get likes, get profile clicks, get people to expand the image, get the dwell. Almost nothing commonly recommended sits in the 4.0 to 20.0 band: get a reply from a mutual, get a follow off the post itself, get somebody to lift the link out and carry it into a private conversation.
The pipeline the weights sit inside
A weight table is only meaningful once you know when it runs. The serving path has three broad stages, and your post can die in any of them without the scorer ever seeing it.
Candidate sourcing. The system assembles a pool of posts a given reader might be shown, from accounts they follow and from accounts they do not. Nothing about your writing quality helps here. What helps is being inside somebody's network, or being surfaced by whatever out-of-network path the sourcing layer uses. This is the stage where a brand-new account genuinely struggles, and it is why the cold-start path exists as a separate mechanism rather than as a scoring adjustment.
Filtering, before scoring. A set of ordered filters runs over the candidate pool. Age is one of them, and the 48-hour constant lives here rather than in the scorer. Visibility filtering is separate again, fed by the classifier labels the LLM pipeline produces at publish time. A post that fails a visibility filter is not scored low, it is not shown, and no amount of engagement weight changes that.
Scoring and reranking. Phoenix predicts, the weighted scorer combines, and then the post-score adjustments apply: the out-of-network discount, the author diversity decay, the cold-start slot lift. Finally a diversity reranker runs across the top 150 with a theta of 0.65, the top 50 candidates are selected, and 35 are returned.
Those last two numbers are worth sitting with. Thirty-five posts come back per request. Whatever you wrote is competing for one of thirty-five slots against everything else the sourcing layer found for that reader, and the diversity reranker exists specifically to stop any single author or topic filling them.
Why the pages that rank are all wrong in the same direction
It would be easy to read our page-one measurement as a story about lazy content shops, and that is not quite what the data says. The errors are systematic rather than careless, and the pattern is informative.
Every one of the eight pages is describing a real system. The ones naming a heavy ranker, a light ranker, candidate sourcing or SimClusters are quoting the 2023 Scala architecture accurately. Those components existed. Seven of the eight pages name at least one of them, which is a high hit rate for a technical detail.
The problem is that the architecture they are accurately describing was replaced. The current serving path is Rust, the ranker is a transformer called Phoenix, and the terms that made the 2023 write-ups feel authoritative do not appear in the live repository at all. We checked for the word Phoenix across all eight pages and found zero occurrences, against a matcher we confirmed fires by running it against the live repository page itself.
The ranking pages are accurate about an architecture that was replaced
Seven of the eight pages name an internal ranking component such as a heavy ranker, a light ranker, candidate sourcing or SimClusters. Those components were real in the 2023 Scala codebase, so the pages are not careless. The problem is that the current serving path is Rust and its ranker is a transformer called Phoenix, and none of the terms that make the older write-ups feel authoritative appear in the live repository. This is what a corpus looks like when the primary source moves and the secondary sources refresh their dates without re-reading it.
Source: FORKOFF first-party SERP read, 9 September 2026
This is what a corpus looks like when the primary source moves and the secondary sources do not. Each page updated its date, refreshed its examples, and kept its underlying model of the system. Three of the eight carry a dated freshness signal claiming a refresh inside the last two calendar years, which is true of the page and not true of its contents. That count is ours, from the same SERP read as every other figure in this section.
The lesson for anybody writing in a fast-moving space is narrow and worth taking: a refresh that updates the date without re-reading the primary source produces a page that is more misleading than the original, because it now carries a freshness signal it has not earned.
Operator noteA refresh that updates the date without re-reading the source is worse than no refresh., FORKOFF editorial practice, 2026
Why do the negative weights matter more than the positive ones?
The negative constants in the X scorer are an order of magnitude heavier than the positive ones, and they are the half most coverage omits entirely. A report weighs minus 234.0 against a favourite at 0.5, so the ranker is far more sensitive to the predicted probability of annoyance than to the predicted probability of approval.
Most coverage stops at the positive side. The negative side is where the arithmetic actually bites, because the magnitudes are an order of magnitude larger.
Negative weights, and the post-score adjustments applied around them
| Signal or adjustment | Constant | Value | What it does | Source |
|---|---|---|---|---|
| Report | ReportWeight | -234.0 | Heaviest constant in the file, either direction | published |
| Mute the author | MuteAuthorWeight | -58.8 | Roughly three times the largest positive weight | published |
| Not interested | NotInterestedWeight | -43.2 | One tap, and the cheapest negative to give | published |
| Block the author | BlockAuthorWeight | -31.2 | Heavier than any single positive action | published |
| Shown and not dwelled on | NotDwelledWeight | -0.02 | The scroll-past penalty | published |
| Out-of-network discount | OonWeightFactor | 0.75 | A quarter off the score for a non-follower | published |
| Author diversity, second post | AuthorDiversityDecay | 0.625 | Your own second post in a ranked set | derived |
| Author diversity floor | AuthorDiversityFloor | 0.25 | Where the decay bottoms out | published |
| Mutual-follow reply boost | BidirectionalFollowReplyWeightBoost | 15.0 | Added to the 5.0 base, originals only | published |
| Maximum post age | MAX_POST_AGE | 48 hours | Older posts are not candidates at all | published |
as of 2026-09-08
Method: Rows are copied from the named constants at a pinned commit and tagged published. The single derived row applies the repository's own diversity_multiplier function, which combines a decay of 0.5 and a floor of 0.25, at k equals one, giving 0.625 for an author's second post in the same ranked set.
All values read from home-mixer/params/param.rs and home-mixer/params/config.rs in xai-org/x-algorithm at commit 49815da2, 8 September 2026. The 0.625 figure is computed from the published decay and floor rather than stated as a constant.
A report carries minus 234.0. Muting the author is minus 58.8. Marking a post as not interesting is minus 43.2. Blocking the author is minus 31.2. And there is a small one at the bottom, minus 0.02, for a post that was shown and not dwelled on at all.
Remember that these multiply predicted probabilities, so the practical reading is not that one report erases some number of likes. The reading is that the ranker is extremely sensitive to the predicted probability of an annoyance response, and that a post which raises that probability even slightly pays for it against a term four hundred times heavier than the term a favourite pays into.
This is the mechanism behind a complaint that shows up constantly in founder communities, which is that a post can collect real engagement and still go nowhere. If the same post is also raising the predicted probability of a mute or a not-interested among the wider audience it gets shown to, the negative term does not need many people to act on it to dominate the score.
Walkthrough of X's algorithm that decides what you see
What happens before your post is scored at all?
The weights are only one stage. Several decisions are made before the scorer ever runs, and a few more are applied to the score afterwards. These are ordinary constants too, and three of them will change how you plan a week of posting.
Three constants that apply before or after scoring
There is a hard 48-hour cutoff. MAX_POST_AGE is set to 48 multiplied by 60 multiplied by 60 seconds. A post older than two days is not a candidate. Whatever else is true about compounding, an individual post has a two-day window as a ranked object, and everything after that is people finding it another way.
Out-of-network posts are discounted to 0.75. OonWeightFactor multiplies the score of a post from an account the reader does not follow. The same discount is applied to in-network replies and reposts. Reaching strangers is not blocked, it is taxed, and the tax is a quarter of your score.
Your second post in a session is worth 0.625 of your first. The author diversity term takes a decay of 0.5 and a floor of 0.25, and the multiplier for the second post from the same author in the same ranked set works out at 0.625. This is a direct argument against volume as a strategy. Two posts do not get you twice the score, they get you roughly 1.6 times it, and the third is worse again.
Your second post in a ranked set is worth 0.625 of your first
The author diversity term takes a decay of 0.5 and a floor of 0.25, and the repository's own diversity_multiplier function gives 0.625 for the second post from the same author in one ranked set, decaying toward the floor after that. Posting four times a day is therefore not four times the reach; the marginal post is competing with your own earlier post rather than with anybody else's. This is the single constant that most directly contradicts the volume advice sold around this platform.
Source: home-mixer/params/param.rs and the ranking scorer, commit 49815da2, 8 September 2026
There is also a cold-start path, and its numbers are unusually specific. A post qualifies if the author has under 1,000 followers, the post has under 1,000 impressions, and it is under 24 hours old. Posts that qualify are lifted into slot 15 or 16 of the ranked set, and there is a separate cap that keeps a low-impression post above 0.85 of the way down the list. So there is a real new-account boost, it is bounded, and it puts you fifteenth rather than first.
Two more numbers worth carrying. The ranker selects the top 50 candidates and returns 35 of them. And the diversity reranker uses a theta of 0.65 applied across the top 150. Those bound how much room there is for you in any single feed refresh.
What one post's score is actually made of
Predicted reply probability
0.031
Weight applied
5.0
Contribution to score
0.155
Same post, favourite term
0.061
Illustrative composite showing the SHAPE of the published scoring formula, not a reading from any real post. The probabilities are invented for the example; the weights of 5.0 and 0.5 are the published constants. X does not expose predicted probabilities to authors.
Six changes, in the order we would make them
Six specific changes follow from the published constants, and each one names the constant it follows from so you can check the reasoning rather than take our word for it. They are ordered by leverage rather than by effort, which means the first is the hardest and the third is nearly free. None of them is a trick.
Everything above is description. This section is the part you act on. Each change names the constant it follows from, so you can check the reasoning rather than take our word for it.
1. Write posts people copy the link to, not posts people like
The copy-link weight is 20.0 and the favourite weight is 0.5. Those two facts are the whole brief. A post optimised for likes is a post optimised for the cheapest possible response to it.
In practice this means writing things that have a use outside the feed. A number somebody will quote in a meeting. A checklist somebody will paste into a document. A comparison somebody will send to a colleague who is making that exact decision this week. The test we use before posting is simple: can I name the person who would send this to somebody else, and can I name why. If the answer is that people will find it agreeable, the post is aiming at the 0.5 term.
Operator noteBefore posting: name the person who would send this on, and why. If you cannot, rewrite it., FORKOFF X growth practice, 2026
The tactical corollary is that you should stop stripping the reasons to leave. Advice to keep everything in-thread and never link out was reasonable under a different ranking regime. Under this one, the action that carries the heaviest positive weight is specifically the reader taking your post somewhere else.
2. Earn replies, and understand which reply is worth four times the others
A reply carries 5.0, ten times the favourite weight. That alone justifies writing posts that leave something genuinely open rather than closing every loop.
But there is a second constant that matters more and is almost never mentioned. BidirectionalFollowReplyWeightBoost is set to 15.0, and it applies when the replier and the author follow each other, on original posts only. Added to the base reply weight of 5.0, a reply from somebody you mutually follow contributes 20.0 rather than 5.0.
X documented the history of this one in the repository. It was A/B tested at 5, 10, 15 and 20, shipped at 20 in July 2026, then cut to 15 later that month after feedback during the World Cup. That is a rare thing to see written down, and it tells you the constant is actively managed rather than set once.
The operating consequence is unglamorous and effective. A small set of accounts you genuinely follow, who genuinely follow you, who genuinely reply to your work, is the same asset that makes cold DM outreach work later, and it, is worth more per reply than a much larger set of strangers. Not because of a growth hack, because of a documented multiplier. Build that set deliberately and reply to their posts as well, since the boost is symmetric in the sense that it depends on the relationship rather than on who posted.
3. Stop optimising for the profile click
ProfileClickWeight is 0.0. So is VqvWeight. A profile click contributes nothing to the ranking score.
This is the single most common piece of advice that the file refutes outright. A large amount of X growth content is built on driving profile visits, on the theory that the algorithm reads a profile click as a strong interest signal. In the published scorer, it reads it as nothing at all.
A profile click contributes exactly nothing to the ranking score
ProfileClickWeight is 0.0, and so is VqvWeight. A weight of zero is not a small weight, it is an off switch, and writing it that way rather than deleting the parameter is deliberate. A great deal of X growth advice is built on driving profile visits on the theory that the algorithm reads them as a strong interest signal. In the published scorer it reads them as nothing. Profile clicks can still matter commercially; they do not buy ranking.
Source: home-mixer/params/param.rs, commit 49815da2, 8 September 2026
Profile clicks may still matter to you commercially, and if your funnel genuinely runs through the profile then our X lead generation playbook is the piece that covers what to do with them. If your profile converts visitors into subscribers or calls, keep doing whatever produces them. Just do not spend ranking-shaped effort on them and expect ranking-shaped returns, and do not let a dashboard that shows profile visits going up convince you that reach is about to follow.
4. Post less often than you think, and space it out
The author diversity multiplier is the constant that makes this concrete. Second post at 0.625, decaying toward a floor of 0.25.
Three or four posts a day is not three or four times the reach. Under the diversity term it is closer to two, and the marginal post is competing with your own earlier post rather than with anybody else's. If you are going to post four times, the argument for spacing them across the day is not folklore about posting windows, it is that the diversity multiplier applies within a ranked set, and a reader who refreshes hours later is being served a different set.
Operator noteFour posts a day is not four times the reach. The diversity term takes the second to 0.625., home-mixer/params/param.rs, commit 49815da2
The stronger version of this is that the effort spent on posts three and four is almost always better spent making post one worth copying a link to. One post that earns the 20.0 term beats four that earn 0.5 each, and the arithmetic is not close.
5. Give video a reason to be watched for ten seconds
MinVideoDurationMs is 10,000. A video needs at least ten seconds of duration before it can earn quality-view credit at all. VideoOpenWeight is 0.07 and DwellWeight is 0.05, both small, and ContDwellTimeWeight is 0.004.
Read together, those say something specific about video on this platform. The opening itself is worth very little. Continued dwell accrues slowly. Video is not a shortcut to a high score, it is a way to accumulate several small positive terms while avoiding the NotDwelledWeight penalty of minus 0.02 that a scrolled-past post collects.
Our own experience running short-form distribution across a network that has processed more than five billion views is that the platform-native version of this rule is stricter than the number suggests. A clip that is technically eleven seconds long and gives a viewer nothing in the first two does not accumulate dwell, it accumulates the negative term. Ten seconds is the floor for eligibility, not a target. The same discipline is what we apply across short-form clipping and video production.
What The New Open Source X Algorithm Means For Creators
Jacob C. Edmunds
A creator-side read of the August release, published the day after the weights went public.
6. Start measuring the negative signal you are earning
You cannot see your predicted probabilities. You can see the behaviours that correlate with them, and after the August release X shipped a tool alongside the code that lets an account inspect its own visibility state.
The practical version for a small team is a weekly review of three things. First, mutes and blocks, which most people never look at. Second, the ratio of favourites to everything else, because a post that earns almost only favourites is a post the scorer is paying 0.5 for. Third, the shape of the replies: are they from mutuals, which carry the 20.0 path, or from strangers, which carry 5.0 and are then discounted by the 0.75 out-of-network factor if the reader does not follow you.
The two pages that did quote a number, examined
Two of the eight ranking pages do quote a numeric engagement weight, and both deserve credit for trying while getting the number wrong in different directions. One says a reply is nine times a like, the other says twenty-seven, and the published constants put the ratio between those two weights at ten. Here is what each actually did.
We singled out two results in the measurement above, so it is only fair to look at what they actually did and give them credit where it is due. Both were trying to do the right thing.
The first is a developer-community post. It carries a section headed engagement types and their weights, and it assigns a reply multiplier of 9, a retweet signal of 1, a like signal of 1 described as the baseline, and a video engagement band of 0.01 to 0.6. It also states that replies are nine times more valuable than likes in the algorithm's training data.
Set that beside the published file. The reply weight is 5.0 and the favourite weight is 0.5, so the ratio a reader would compute is 10, not 9. That is close. The retweet claim is further off: the published repost weight is 1.0 against a favourite of 0.5, so a repost is twice a favourite rather than equal to it. And the like is not the baseline in any meaningful sense, because two constants in the file are set to exactly zero and several sit below the favourite weight.
The second is a marketing-tool resource page. It states that replies are now weighted 27 times more than likes, and gives an engagement velocity weight of 1000, an author authority weight of 50 and an engagement probability weight of 30. None of those four numbers appears in the published parameters file under any name we could match. There is no velocity constant, no authority constant and no engagement-probability constant in the weight table. What the file has instead is a set of per-action weights and a set of post-score adjustments, and neither is shaped like the list that page presents.
The two pages that do quote a weight disagree with each other and with the file
One states that replies are nine times more valuable than likes. The other states 27 times. The published constants are a reply weight of 5.0 and a favourite weight of 0.5, so the ratio between the weights is ten. Neither page is right, and more importantly both are computing an exchange rate between counts, which is the operation the source file says is not meaningful. If a page tells you a weight and cannot name the file it came from, the number is somebody's estimate wearing the clothes of a measurement.
Source: FORKOFF first-party SERP read, 9 September 2026, read against param.rs at commit 49815da2
We are not saying either page was written in bad faith. The more likely story is that both were assembled from secondary sources, and that the secondary sources were themselves assembled from readings of the 2023 architecture and from practitioner threads. This is how a number gets a life of its own: it is quoted, then quoted from the quote, and after two hops nobody can point at the file.
The practical lesson for a reader is narrow and useful. If a page tells you a weight, ask which file. If it cannot name one, the number is somebody's estimate wearing the clothes of a measurement. That test would have caught every wrong number we found, including our own first attempt at this article, which recorded zero pages quoting a numeric weight because our first pattern was too strict and missed both of these. We fixed the pattern, re-ran it, and the count went from zero to two.
What we changed in our own posting
Reading the file changed four things about how FORKOFF runs its own accounts, and it is worth saying what we actually did rather than only what we recommend. We changed what our reporting leads with, what our writer brief asks for first, how often we post, and how often we go back and re-read the source.
We run distribution for startups, so we are not a neutral observer here. It is worth saying what we actually did with this file rather than only what we recommend.
The first change was to stop counting favourites in our internal reporting. Not to hide them, to stop treating them as the headline. A post report that leads with likes is a report about the 0.5 term. Ours now leads with replies from mutuals, link copies where we can infer them, and follows attributable to a specific post, because those are the three behaviours the file pays the most for.
The second was to change how we brief writers. The old brief asked for a strong hook and a clear point of view. The new brief adds one question that has to be answered before a post is written: what is the object in this post that somebody would move. A number, a table, a rule, a name. If the answer is that the post is well-argued, it goes back, because well-argued earns the cheap term.
Operator noteOur writer brief now asks one question first: what is the object in this post somebody would move., FORKOFF content practice, 2026
The third was cadence. We cut posting frequency on two accounts and held it on a third as a comparison. It is early and we are not going to present a clean result from a sample that small, so treat this as a stated intention rather than a finding: we will publish the numbers when the window is long enough to mean something, and if the reduction does not help we will say that too.
The fourth was that we started reading the repository on a schedule. It is still being worked on, the constants move, and X documented one of those moves inside a fortnight. A number quoted from a file that changes is a perishable asset, and the only way to keep it fresh is to go back and look.
We run cron scripts that set the defaults in this repository's code to be the primary production values, for example in home-mixer/params/param.rs.
Questions this raises that the file cannot settle
Two questions survive a careful reading of the published code, and anybody who takes this seriously will hit both of them. The first is whether the published default really equals the value being served. The second is how much of your outcome the scorer decides at all, given that everything here operates on a post that already reached the scoring stage.
Two open questions are worth naming, because a reader who takes this seriously will hit both.
Does the published default equal the served value. The README says a cron sets the repository defaults to the primary production values. That is a strong claim and there is no way for an outsider to verify it. It could be true and stale by a day, it could be true for most parameters and not for a specific one under experiment, and there is no public history before the file appeared. We are taking X at its word here and flagging that we are doing so.
How much of your outcome is the scorer at all. Every constant in this article operates on a candidate that already reached the scoring stage. If the sourcing layer never puts your post in front of a given reader, the weights never run. For a small account, the honest answer is that candidate sourcing and the cold-start path probably matter more than anything in the weight table, and neither is something you write your way out of in a week.
That second point is the one we would want a founder to leave with. The weight table tells you what to aim at once you are in the room. It does not get you into the room, and a great deal of advice built on it quietly assumes you already are.
Which constant binds hardest at your account size?
The published weights are identical for every account on the platform. What changes with size is which stage of the pipeline is actually binding on you, and therefore which of the six changes above is worth doing first. A new account and an established one are constrained by different constants, and treating them the same wastes most of the effort.
The weights are identical for everybody. What changes with account size is which stage of the pipeline is actually binding on you, and therefore which of the six changes is worth doing first.
Which published constant binds hardest, by account size
| Account size | Stage that binds | Constant that matters most | First change to make | Source |
|---|---|---|---|---|
| Under 1,000 followers | Candidate sourcing | Cold-start slots 15 to 16 | Write things people move | derived |
| A few thousand | Scoring and diversity | AuthorDiversityDecay, second post at 0.625 | Post less often | derived |
| Established | Scoring and negatives | BidirectionalFollowReplyWeightBoost 15.0 | Measure the negative signal | derived |
as of 2026-09-08
Method: Each row pairs a pipeline stage named in the xai-org/x-algorithm README with the published constant that governs it, then states the change that constant implies. The constants are published values; the mapping from account size to binding stage is ours and is tagged derived rather than measured, because we did not measure a cohort of accounts to produce it.
Our reading of which published constant is the practical constraint at each account size, derived from the pipeline stages in the repository README and the constants in param.rs. An interpretation of published values, not a measurement of accounts.
Under a thousand followers
You are inside the cold-start path, and its constants are the ones that matter. Under 1,000 followers, under 1,000 impressions, under 24 hours old, lifted to slot 15 or 16. That is a real mechanism and it is bounded in a specific way: it buys you a mid-feed placement, not a top one, and only while all three conditions hold.
The practical reading is that the boost is a trial, and the 48-hour cutoff means the trial is short. What you do with the placement decides whether the scorer sees anything worth carrying forward. This is the one account size where the negative weights should worry you most, because you are being shown to people who do not know you, and a not-interested from a stranger carries minus 43.2 against a favourite's 0.5.
So the priority order inverts. Change three, stop optimising for profile clicks, is nearly free and removes wasted effort. Change one, write things people copy, is the whole game. Change two, the mutual set, is the long-run investment that has to start now because it takes months.
Operator noteUnder 1,000 followers the cold-start path puts you at slot 15, not slot 1. It is a trial, not a launch., home-mixer/params/param.rs, commit 49815da2
A few thousand followers, posting consistently
Here the out-of-network discount and the author diversity multiplier become the binding constraints. You have enough in-network reach that your posts get scored regularly, and the 0.75 out-of-network factor is what caps how far past your existing audience any single post travels.
This is the size where the volume mistake does the most damage, because it is the size where volume feels like it is working. You post more, total impressions go up because you have a real following, and the diversity multiplier quietly takes 0.375 off the second post and more off the third. The impressions rose because you shipped more objects, not because the account got stronger.
Change four, post less, is the highest-leverage move at this size, and it is the one people resist most.
Established accounts
At this size candidate sourcing is largely solved, and everything is downstream of the scorer. The mutual-follow reply boost of 15.0 is the constant to build around, because you have enough standing that genuine mutuals are available to you and enough reach that each one compounds.
The risk at this size is the negative side. A large account shown to a wide out-of-network audience accumulates mutes and not-interested responses simply as a function of scale, and those carry the heaviest constants in the file. Change six, measure the negative signal, stops being optional here. It is the difference between an account that plateaus for a reason nobody can name and one that knows which posts cost it.
At scale the negative constants are the ones that decide your ceiling
Report is -234.0, mute is -58.8, not interested is -43.2 and block is -31.2, against a favourite at 0.5 and the largest positive weight at 20.0. Because these multiply predicted probabilities, a post that merely READS as bait or as an advertisement raises the predicted probability of an annoyance response across the whole audience it is shown to, before anybody has acted. A large account shown to a wide out-of-network audience accumulates that exposure as a function of scale.
Source: home-mixer/params/param.rs, commit 49815da2, 8 September 2026
A worked example, end to end
Take a founder with 1,800 followers who posts four times a day: two opinion posts, one link to their blog, one reply-bait question. In a normal week they collect a few hundred favourites, a handful of replies, and almost nothing else.
Read that week against the file. The favourites are being paid at 0.5. The reply-bait question earns replies at 5.0, but from strangers, so those replies do not carry the 15.0 bidirectional boost and the posts themselves are discounted by 0.75 whenever they reach out-of-network. The blog link earns an open-link weight of 0.2, which is under half a favourite. Posts three and four are competing against posts one and two under the diversity multiplier. Nothing in the week is aimed at the 20.0 term, and the profile clicks the founder is watching in their analytics are scored at zero.
Now rewrite the same week. One post a day instead of four, so no diversity penalty applies. Each post carries one moveable object: on Monday a table of what three tools actually cost per seat, on Wednesday a checklist for a decision the audience makes quarterly, on Friday a number from their own operation with the method attached. Replies go to fifteen mutuals rather than to strangers. The blog link goes in a reply on the post rather than in the post, so the post itself is complete and the link is available to anyone who wants it.
Nothing there is clever. It is four fewer posts and three specific objects, and it moves the week from the 0.2-to-0.5 band into the band where the file pays 5.0 to 20.0. That is the entire argument of this article compressed into one week of a calendar.
We would not promise a multiple from that change, and anybody who does is selling something. What we would say is that the direction is not a matter of opinion any more. It is a constant in a file you can open.
How can you check the X algorithm weights yourself?
Every number in this article is checkable against a public file, and checking it takes about twenty minutes with no technical background beyond reading a page on GitHub. We would rather you verified this than trusted it, because that is the whole point of X publishing the code, and because the constants move and this article will age.
How to read the X ranking weights yourself
STEPS- 01
Open the live repository, not the famous one
Go to xai-org/x-algorithm. If the page says Scala, or its most recent commit is dated 2025, you are looking at the archive rather than the code that runs.
- 02
Open home-mixer/params/param.rs
Search the file for the string Weight. Every constant quoted in this article is one line in that block, declared with a name, a type, a string key and a default.
- 03
Read the comment above the block before the numbers
It names the count-equivalence misreading directly, which is the fastest way to inoculate yourself against most of what is written about this file.
- 04
Pin a commit rather than reading the branch tip
Quote the commit alongside the number. The bidirectional reply boost moved from 20 to 15 inside one month, so any figure without a date will be wrong on a schedule.
- 05
Compare the file against whatever you were told
Take the three most confident claims you have absorbed about X ranking and find the constant behind each. In our experience about one of the three survives.
We would rather you verified this than trusted it, and the whole point of X publishing the code is that you can. Here is the shortest path.
Open the live repository, not the famous one. The one you want is under the xai-org organisation and is named x-algorithm. If the page you are on says Scala, or its most recent commit is dated 2025, you are in the archive. The live one is Rust and has been committed to within the last few days.
Go to the params file. The path is home-mixer/params/param.rs. Every weight quoted in this article is a single line in it, declared with a name, a type, a string key and a default. Search the file for Weight and you will land in the block.
Read the comment above the block before the numbers. It is the part that survives longest, because it tells you what kind of object you are looking at. It is also where X names the count-equivalence misreading directly, which is the fastest way to inoculate yourself against most of what is written about this file.
Check the date on what you are reading. Pin a commit rather than reading the branch tip, and quote the commit when you write the number down. The weights file has existed publicly for 27 days at the time of writing. The bidirectional reply boost went 20 then 15 inside one month, and any article that quoted 20 without a date is now wrong and has no way of knowing.
Compare against whatever you were told. This is the step that changes behaviour. Take the three most confident claims you have absorbed about how X ranks posts, and go looking for the constant behind each. In our experience roughly one of the three survives, and it is rarely the one you were most sure of.
The negatives, one more time, because this is where accounts die quietly
The negative constants deserve a second pass because, in our own review of accounts that stalled without an obvious cause, they explain more cases than anything on the positive side. Report is minus 234.0, mute is minus 58.8, not interested is minus 43.2 and block is minus 31.2, against a largest positive weight of 20.0.
We want to close on the negative weights, because in our own review of accounts that stalled, this is the section that explains the most cases.
Negative weights set against the two positive ones
The four negative constants are plotted as ABSOLUTE values so their magnitudes are comparable against the two positive weights on the right. Source home-mixer/params/param.rs at commit 49815da2, 8 September 2026. Report is genuinely -234.0, not 234.0.
Report is minus 234.0. Mute is minus 58.8. Not interested is minus 43.2. Block is minus 31.2. Not dwelled is minus 0.02. Against a favourite at 0.5 and a copy link at 20.0. That is 5 negative constants against 16 positive ones, and the largest negative is 11.7 times the largest positive.
Because these multiply predicted probabilities rather than counts, the mechanism is not that a handful of reports sink you. The mechanism is subtler and worse: the model is predicting how likely each reader is to react badly, and a post that reads as bait, as outrage, as engagement farming or as an ad raises that prediction across the whole audience it is shown to, before anybody has actually done anything. The penalty is applied to the prediction, not to the event.
That is why the well-worn advice to be provocative sits so badly against this file. Provocation raises the predicted probability of exactly the responses carrying the four largest negative constants. It can still work, because provocation also raises reply probability, which is worth 5.0. We have written separately about where that trade genuinely pays, in going viral on X and about where it does not, in whether Twitter launches are a scam. The counter-case, where a genuinely strong post earns its reach, is going viral on Twitter. But you are buying a term worth five with a term worth minus forty-three in the same transaction, and you have to be very good for that trade to come out ahead.
Operator noteProvocation buys a 5.0 reply term with a -43.2 not-interested term. You have to be very good., FORKOFF X growth practice, 2026
The safest interpretation, and the one we operate on, is that the negative constants are the platform pricing annoyance so far above engagement that any strategy which routinely irritates a slice of its audience is structurally expensive. That is a design choice X made and wrote down. You can disagree with it and you cannot opt out of it.
Five things to stop doing, each with the constant behind it
A list of things to start is easy to agree with and hard to act on, because it competes for time you do not have. A list of things to STOP is where that time comes from, and each of the five below names the published constant that makes it a waste rather than a preference. Stopping is free.
A list of things to start is easy to nod at and hard to act on. A list of things to stop is where the time comes from.
Stop chasing the profile click. We covered the tooling side of this in Grok bots for marketing. ProfileClickWeight is 0.0. If your posting strategy is built on driving people to your bio, the ranking system is not rewarding any part of that. Keep it if it converts commercially. Stop calling it algorithm work.
Stop treating a like as the unit of success. FavoriteWeight is 0.5, the smallest non-zero positive constant in the file apart from dwell, and it is 1 of 16 positive terms rather than the headline one. A post with 400 likes and two replies is a post the scorer paid very little for, and reporting it as a win trains the whole team to make more of them.
Stop refusing to link out. The advice to keep readers in-thread was built for a different ranking regime. ShareViaCopyLinkWeight is 20.0, the largest positive constant, and it fires precisely when the reader takes your content away from the feed.
Almost all common X advice targets the 0.05 to 0.5 band
Get likes, get profile clicks, get the image expanded, get the dwell. Every one of those sits at or below the favourite weight of 0.5, and two of them are scored at zero. Almost nothing commonly recommended targets the 4.0 to 20.0 band: a reply from a mutual, a follow taken from the post itself, or a reader lifting the link out and carrying it into a private conversation. The gap between what is taught and what is paid for is the most useful thing in the file.
Source: home-mixer/params/param.rs, commit 49815da2, 8 September 2026
Stop posting to a volume target. The author diversity multiplier takes your second post to 0.625 and decays toward a floor of 0.25. A daily quota is a policy that guarantees you compete with yourself, and it is the easiest thing on this list to change tomorrow.
Stop quoting weight ratios as exchange rates. X names this error in the source file. Saying that a copy link is worth 40 likes is the fastest way to be publicly wrong about a subject you have otherwise done the work on, and the correction is already written, in the repository, by the people who wrote the weights.
If you are auditing somebody else's advice
A short field guide, because a lot of readers of this piece will be evaluating an agency, a course, or a contractor rather than posting themselves. If you are at that stage, we compared the three options in agency against in-house against ghostwriter, and we keep a running view of the market in the best Twitter marketing agencies.
Ask which repository. If the answer is the Twitter one with 73,893 stars, they are describing code whose default branch stopped moving on 3 September 2025. That is not disqualifying on its own, plenty of the 2023 architecture is still conceptually useful, but it tells you when they last looked.
Ask for a constant name. Anybody who has read the file can name one: ReplyWeight, OonWeightFactor, MAX_POST_AGE. Anybody who has not will describe mechanisms without naming anything, because the mechanisms are in every summary and the names are only in the file.
Ask what the weights multiply. The correct answer is predicted probabilities. The common answer is counts. This single question separates people who opened the file from people who read a thread about it.
Ask what they think a profile click is worth. If the answer is anything other than zero, they are working from a model of the system that the current code contradicts.
None of those four questions requires you to be technical. They require the other person to have opened a file that has been public since 13 August 2026 and takes twenty minutes to read.
Operator noteAsk a vendor to name one constant. ReplyWeight, OonWeightFactor, MAX_POST_AGE. Most cannot., FORKOFF vendor screening, 2026
What we think happens next
Two things happen from here, and it is worth committing to them in writing rather than hedging. The page-one corpus will update and this article's advantage will decay, probably inside a couple of quarters. And the constants themselves will keep moving, because X has already shown it will change one and document the change.
Two things, and we would rather commit to them in writing than hedge.
The first is that the page-one corpus will update, and probably within a couple of quarters. The gap we measured is large and obvious, the primary source is public and easy to read, and the incentive to be the page that quotes the real numbers is substantial. When that happens the advantage described in this article disappears, which is fine, because the underlying advice does not depend on the advantage.
The second is that the constants themselves will keep moving. X has already shown it will change one and document the change, and the repository is still taking commits, 24 of them across 18 distinct days since January. Anybody treating a weight as a fixed law of the platform is going to be wrong on a schedule. The durable reading is the ordering rather than the values: private, effortful, relationship-bearing actions at the top, cheap in-feed reactions at the bottom, and annoyance priced far above both.
Bet on the ordering, not on the values
The bidirectional reply boost was A/B tested at 5, 10, 15 and 20, shipped at 20 in July 2026 and cut to 15 later the same month, and X documented the change. Anything quoting a specific number without a date will be wrong on a schedule. What has survived a full rewrite from Scala to Rust and a change of ranker is the ORDERING: private, effortful, relationship-bearing actions at the top, cheap in-feed reactions at the bottom, and annoyance priced far above both.
Source: xai-org/x-algorithm docs/BIDIRECTIONAL_BOOST_CHANGE.md and param.rs, read 9 September 2026
That ordering is a statement about what the platform wants to be, and it has survived a full architectural rewrite from Scala to Rust and a change of ranker. It is the part we would bet on.
What the published code does not tell you
A file this specific invites over-reading, so here is the honest boundary of what you can conclude from it. We would rather lose a paragraph of confidence than have a reader build a quarter of work on something the repository does not actually support.
The trained model is not published. What is public is the linear blending layer that sits on top of Phoenix's predictions. The predictions themselves come from a model whose weights have never been released, in either the 2023 era or this one. So you can read how much each predicted action counts, and you cannot read what makes the model predict a high probability for your particular post.
Grok is in the stack, but it is not the ranker. The LLM pipeline lives in a directory called grox and runs as posts are published, producing classifier labels for categories such as spam, adult content and violent media. Those labels feed visibility filtering. X states the separation explicitly as a design decision: ranking decides the order, visibility filtering decides whether a post can be shown at all, and they are different services with different inputs and different rules. The LLM prompts themselves are the one thing X names as deliberately withheld.
Heuristics were not deleted. The October 2025 aim of removing all heuristics inside four to six weeks did not land as stated. The current stack applies named post-score adjustments for author diversity, out-of-network discounting and new-author boosting, plus a set of ordered pre-scoring filters, all of them hand-tuned constants in the same params file as the weights. If you have read that X removed its heuristics and now runs a pure model, the code disagrees.
Ranking decides the order. Visibility filtering decides whether a post can be shown at all. Different services, different inputs, different rules.
There is no public history before 13 August 2026. The README says a cron keeps the repository defaults in sync with production values, which is a strong claim about the present. It is not a claim about the past, and there is no way to check what any of these constants were on a given day before the file became public.
A constant can change tomorrow. The bidirectional reply boost moved from 20 to 15 inside a fortnight and X documented the change. Anything in this article that quotes a number is quoting commit 49815da2, dated 8 September 2026. Treat the direction as durable and the exact value as a reading taken on a date.
The 30 days we would actually run
If a founder handed us an account tomorrow and asked what to do with the published weights, the plan would take four weeks and would start with measurement rather than with posting differently. The order matters more than the content: the first week produces the number that makes anybody willing to do the other three.
If a founder handed us an account tomorrow and asked what to do with this, the plan would be short.
The order we would run the four weeks in
Week one is measurement, not posting changes. Pull the last 90 days of posts and classify each by which term it was earning. A post with a high favourite count and almost no replies, quotes or link copies was being paid 0.5 per unit of the cheapest available signal. Count how many of your posts fall in that bucket. For most accounts we look at, it is the majority, and seeing the number is what makes the rest of the plan feel obvious rather than theoretical.
Week two is the mutual set. This is the same relationship-building motion that sits under the founder funnel, applied to one channel. Identify the twenty to fifty accounts in your space where a mutual follow is genuine and plausible. Follow them, reply substantively to their work for two weeks, and do not ask for anything. The 15.0 bidirectional boost is the highest-leverage relationship-shaped constant in the file, and it takes weeks rather than days because it depends on a follow-back you cannot force.
Week three is format. Take your three best-performing posts and rewrite each as something a reader would move. A post becomes a table. An opinion becomes a checklist with the reasoning attached. A thread becomes a single post with the number in the first line. You are trying to move the predicted probability of a copy link, and the way to do that is to put something in the post that has a use somewhere else.
Week four is subtraction. Cut your posting frequency by a third and watch what happens to reach per post. Under the diversity multiplier this often shows up quickly, and it is the easiest of the six changes to test cleanly, because it is the only one where you are changing volume rather than quality and can attribute the result.
Run the measurement week first, because it is what makes the other three happen
Classifying ninety days of posts by which published term each was earning takes an afternoon and usually returns an uncomfortable number: for most accounts we look at, the majority were being paid the 0.5 favourite term. Nothing in the rest of the plan is hard, and none of it gets done without that number in front of somebody. Week four, the cadence cut, is the only one of the four that can be attributed cleanly, because it changes volume rather than quality.
Source: FORKOFF X growth practice, 2026
None of that is a growth hack, and none of it is fast. If it belongs beside a creator programme rather than a founder account, KOL marketing is the adjacent lane, and launch video is the one-off version. It is what the file says to do, translated into a month, and it is the shape of how we run X and Twitter growth for clients. The reason we would run it in that order is that the first week produces the number that makes somebody willing to do the other three.
Operator noteWeek one is measurement. The number it returns is what makes anybody do weeks two to four., FORKOFF X growth practice, 2026
Where this leaves the reader
X made an unusual decision in publishing the scorer, and the practical consequence has not caught up to it. The pages that answer this query are describing a codebase that stopped moving in September 2025, using ratios that the current codebase explicitly says are not meaningful, while the file with the real numbers is still being worked on and nobody links it.
That gap will close. Somebody will write the good version of this, the pages on our own blog and on page one will update, and the advantage of having read the file will decay. Until then, the six changes above are available to anybody willing to spend an hour with a Rust params file, and most of your competitors are still optimising for the profile click that the same file scores at zero.















