Social Algorithm Updates: X, Reddit, TikTok, Pinterest, Facebook and LinkedIn
Six platforms, one bar: official posts, primary documents and named executives only, with the invented "algorithm updates" called out as such.
Last updated: Last checked: Six platforms tracked on official sources only; no confirmed ranking change is rolling out on any of them
80M+People searching on Reddit weeklyQ4 2025 shareholder letter
36Commits in X's open-source algorithm repoGitHub API, 25th Sep 2026
19.9%ByteDance's stake in TikTok's US joint ventureClosed January 2026
16,000Lifelong user actions Pinterest's feed ranking readsTransAct V2, engineering blog
This page tracks ranking, recommendation and search changes across X, Reddit, TikTok, Pinterest, Facebook and LinkedIn.
These platforms publish no update dashboards. They confirm changes rarely and unevenly, sometimes only in SEC filings, court documents or engineering blogs.
So the bar here is strict. We need an official platform post, a primary document or a named executive on the record.
The "algorithm update" content industry invents the rest. Part of this page's job is saying plainly when a widely claimed update has no official basis.
We update within a day or two of significant confirmed changes. Every claim links to a source we have read, including the filings.
Social platforms timeline: the confirmed record
Every confirmed ranking, search and governance change across the six platforms, newest first, each meeting this page's confirmation bar. Rows link to our full coverage where it exists.
One dot per confirmed event across X, Reddit, TikTok, Pinterest, Facebook and LinkedIn, one lane per event type. Hover a dot to identify it; most dots click through to the entry below.
A thirty-first release, 87 files; a country allowlist for conversation controls; the report page in the repository; the Brazil election filter at 2,786 accounts
A thirtieth release, 63 files; the Gemma split at 250,000 and the spam floor at 100,000; the ranking scorer replaced by a shared value-model crate; an age-gating safety category
A twenty-ninth release, 92 files; the Gemma split at 225,000; a value model behind an off switch; the MoE arm cold-start only; a video key-frames safety task
A twenty-eighth release, 72 files; the spam floor 50,000 to 80,000; a 5% Kafka sample of retrieval candidates; seven new parameters; 716 lines of serving filters removed
A twenty-fifth release, 64 files; the Gemma split at 200,000 and the spam floor at 50,000; the LLM_JUDGE labels removed; a like-based holdout filter; a takedowns directory
A twenty-fourth release, 26 files; a Gemma reply-spam model above 150,000 followers; the filter boundary rises to 180,000; a ten-second dwell threshold
A twenty-third release, 17 files; ADS_WEB_CT_PURCHASE_VALUE and advertiser 28-day baselines; author and semantic-id repeat flags; coordinated-spam threshold 10,000 to 30,000
A twentieth release, 28 files; visibility filtering now carries the action per post; Grox video preview frames, off by default; watched defaults unchanged
A nineteenth release, 78 files; the ranking request now carries media, text-length and link features for each post and its quoted post; the perturbation default is 0.0.
The list moves from a legacy Scala file into a setting reread every 30 seconds; score distributions can now be recorded per experiment bucket; no ranking weight changed
Ad budget halves against safe posts only; the reply-score ratchet fails closed; ten court-reported Brazilian accounts named as not filtered; no parameter moved
Six severe labels split out of medium risk with ads still avoiding both; accounts between 80k and 100k followers move from reply ranking into spam detection
What Homefeed ranking consumes, including search activity
Pinterest rebuilds visual search on VLMs
Product
Image-first search with automated attribute decoding
Facebook cracks down on spammy content
Product
Caption and hashtag spam goes followers-only and loses monetization
Reddit Answers revealed to run on Gemini via Vertex AI
Data
Reddit's Google dependence is two-sided: traffic in, model underneath
Pinterest documents LLM-powered search relevance
Data
The primary source for what Pinterest search relevance is
Reddit's first Google-volatility admission (Q4 2024 letter)
Data
A "periodic algorithm change" moved traffic; logged-out users most affected
LinkedIn's 360Brew paper posted, later withdrawn
Data
The preprint the myth industry cites; all four versions removed from arXiv
2024
Reddit Answers launches as a US test
Product
The AI search product's starting point
2023
The first X/Twitter algorithm open-sourcing
Product
A different, Scala-era system; do not cite it as current
Latest updates
Product
X's thirty-first release rebuilds visibility filtering, publishes the Under the Hood page code and adds ten accounts to the Brazil election filter
The thirty-first release landed at 01:56 UTC on 25th Sep. It touches 87 files, adding 7,780 lines and removing 5,759.
It came about 24 hours after the thirtieth release. The repository now holds 36 commits.
The biggest change is structural. Visibility filtering's hydration layer fetches the labels, relationships and safety data the rules read.
It is rebuilt as a plan of named sources.
Three new files hold it: a 471-line plan, a 445-line source list and a 1,280-line executor. The old hydrators for social graph, conversation controls and exclusive content are deleted.
The 1,493-line golden test corpus is split into per-topic files.
One new rule is readable from the tests. A conversation control can carry allowed country codes, and a viewer outside them gets a limit named LimitRepliesCoConversationRule.
A new region table expands nine region codes into country lists. "EUR" covers 54 European codes, "SEA" eleven Southeast Asian ones.
A test case allows "EUR" and "BR" and limits a viewer in the US.
Three tombstone reasons are added for blocked viewers. They cover a read-only viewer, a viewer blocked by the author, and one blocked by the thread's root author.
The Under the Hood report gains its page code. A new jetfuel directory holds the routes that render the report.
It has sections for post labels and account labels, and a JSON download.
The page's own copy describes "Labels applied to your posts in this period that could limit post visibility", with a per-label count of posts out of the total.
The README now links the tool at x.com/i/jf/under_the_hood. It opens to a login page for a logged-out browser.
The Brazil 2026 election filter adds ten accounts, taking its list from 2,776 to 2,786.
A new comment says X believes one reported account is not the candidate's. So it is not filtered.
In the Grox safety flows, the favourite count that forces key-frame scanning of a video doubles from 512 to 1,024. Below that, a video is scanned only when an earlier check flagged adult content.
The home mixer's defaults carry a new sync stamp, 16:24 UTC on 24th Sep, with no value changed. The compute-value-model switch is still off, the mixture-of-experts caps are still 0 and the like-based holdout still defaults to off.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
Product
X's thirtieth release moves the reply-spam split to 250,000 followers and pulls the value model into a shared crate
The thirtieth release landed at 01:53 UTC on 24th Sep. It touches 63 files, adding 2,569 lines and removing 2,257.
It came about 24 hours after the twenty-ninth release. The repository now holds 35 commits.
Two printed figures move. The follower count that routes a thread to the big-account Gemma model rises from 225,000 to 250,000.
The coordinated-spam floor rises from 80,000 to 100,000 followers. It stood at 50,000 on 21st Sep.
The home mixer's 1,255-line ranking scorer is deleted. Its weighted sum moves to a new xai-value-model crate, 444 lines of scoring and 194 of weights.
Both the home mixer and the vm-ranker now call that crate. The copied weight table of a day earlier is gone.
Twenty-two parameters leave the home mixer's defaults. Author diversity, the out-of-network factor, the value-model switches and the weight perturbation salt now sit in the vm-ranker's parameters.
Their values are unchanged there: diversity on with a 0.5 decay and a 0.25 floor, the out-of-network factor 0.75. The compute-value-model switch is still off.
In the home mixer's own copy of the weight table, author diversity is now hard-coded off. On these defaults the repeated-author decay is the vm-ranker's job.
The click-dwell-on-impression switch, off since the twenty-fifth release, no longer exists anywhere in the repository. The vm-ranker cluster moves from Experiment3 to Experiment6.
The Grox safety classifier gains an age-gating category for harmful text. Its five labels are adult content, eating disorder, harmful substance, dangerous stunt and graphic description.
The prompt template for that category is referenced but not in the repository.
Visibility filtering loses a 412-line clock cache. A retweet now inherits its source post's verdict when the source is withheld.
Phoenix training gains a cold-pool filter for the retrieval dataset. By default it keeps posts under two hours old with at most eight favourites.
The scored-stats side effect now reports how much SimClusters retrieval contributes, at six cut-offs from 50 to 800. The defaults sync stamp is 16:28 UTC on 23rd Sep.
The like-based holdout still defaults to off. The mixture-of-experts caps are unchanged at 0.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
Product
X's twenty-ninth release moves the reply-spam split to 225,000 followers and gives the vm-ranker its own value model
The twenty-ninth release landed at 02:19 UTC on 23rd Sep. It touches 92 files, adding 4,993 lines and removing 3,132.
It came about 22 hours after the twenty-eighth release. The repository now holds 34 commits: 32 releases, the merged fix and its merge commit.
The follower count that routes a thread to the big-account Gemma model rises from 200,000 to 225,000. It stood at 180,000 on 16th Sep.
The vm-ranker gains a value model of its own, 191 lines behind a VMRankerComputeValueModel switch. The switch defaults to off, so the weighted sum still comes from the home mixer.
Its weight table is a copy. All 43 shared parameters carry the home mixer's values.
Favourite is 0.5 and share via copy link is 20.0.
The twenty-seventh release deleted a value-model gate from the home mixer five days earlier. This one adds a value model one service downstream.
The mixture-of-experts retrieval arm changes shape. Its general cap moves from 200 to 0 and its cold-start cap from 0 to 200.
Its cluster returns to Experiment2Memy04, four days after moving to Experiment3Memy04. On the mirrored defaults, the arm now returns candidates only through its cold-start path.
Visibility filtering gains a 310-line conversation-control hydrator. The recommendation proto gains two NSFW booleans, one for the user and one for the mode.
A tweet-level NSFW safety bit joins the existing author bit.
Grox gains a video key-frames safety task. A constant sets its unconditional favourite threshold at 512, the same figure as the adult-content check.
The Under the Hood report note becomes rich text. The sentences are the same; the four links are now link entities rather than pasted URLs.
Two more switches arrive off: debias inputs for the vm-ranker and weighted-score reuse for cached posts. The defaults sync stamp is 17:39 UTC on 22nd Sep.
The like-based holdout and the click-dwell switch still default to off. The Brazil filter is untouched.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
Product
X's twenty-eighth release raises the coordinated-spam floor to 80,000 followers and starts logging where feed candidates come from
The twenty-eighth release landed at 04:11 UTC on 22nd Sep. It touches 72 files, adding 5,588 lines and removing 2,601.
One printed figure moves. The coordinated-spam floor rises from 50,000 to 80,000 followers, the third rise in a week.
The simple reply-spam scorer is rewritten. A reply that quotes another post now goes to the full scorer.
The model's JSON answer is repaired before it is parsed.
A new side effect writes retrieval candidates to Kafka. It samples 5% of requests by default and keeps at most 200 candidates per request.
Each candidate now carries a list of the retrieval sources that produced it, with cluster, score and position. Before this release a candidate recorded one served type.
Seven parameters are new in the mirrored defaults, synced at 16:23 UTC on 21st Sep. Two value-model switches for the vm-ranker default to off.
The new-user out-of-network weight factor becomes a switch. Its value, 0.00001, was a compiled constant until this release.
SimClusters candidates gain an age cap of 48 hours. A cold-start cap for the mixture-of-experts retrieval arm arrives at 0.
Visibility filtering gains a 446-line treatment module and a verdict type. The cold-start scorer now looks each author up once rather than once per post.
Phoenix inference loses its serving-filters runner, 543 lines, and the two-tower model's serving filters, 173 lines.
The other figures this page prints stand. The reply-spam split is still 200,000 followers, and the like-based holdout and the click-dwell switch still default to off.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
Product
X's twenty-seventh release adds legal-demand withholding to Under the Hood reports and deletes a dwell-regret scoring mode
The twenty-seventh release landed at 23:55 UTC on 18th Sep. It touches 41 files, adding 2,877 lines and removing 1,828.
It came nearly 23 hours after the twenty-sixth release. The repository now holds 32 commits: 30 releases, the merged fix and its merge commit.
The README gains a "Notable Updates" note dated 18th Sep. The last such notes were dated 13th and 14th Aug.
It says Under the Hood reports now show visibility limits made "because of required compliance with law(s)".
X's example is a post "withheld from showing in a country following a legal demand". The report names the country.
The code matches the note. The daily takedown job now reads every withholding reason by name, and keeps country-scoped reasons and copyright claims.
It no longer records the two imagery reasons it used to mark as excluded.
The label for posts behind a content warning gains a sentence: "In India, this content is shown as restricted due to local law(s)."
The home mixer loses its dwell-regret scoring modes. The release deletes a 537-line value model gate, 18 parameters and 465 lines of the ranking scorer.
The mode parameter's default was "weighted", so the defaults never selected dwell regret. The weighted sum of predicted actions is what remains.
Phoenix retrieval gains a cold-start served type, ForYouPhoenixRetrievalCold, with its own stats. Its result cap defaults to 0.
The mixture-of-experts retrieval cluster default moves from Experiment2Memy04 to Experiment3Memy04.
Visibility filtering gains an evaluate-tweets endpoint and a 607-line composite tweet hydrator.
The Grox "infrared" video spam task now lets the model reason on posts with 512 or more likes.
The figures this page prints did not move. The reply-spam split is still 200,000 followers and the Brazil filter still holds 2,776 ids.
The like-based holdout and the click-dwell switch both still default to off.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
Update, 23rd Sep 2026. X confirmed the change in an X Open Source post at 00:16 UTC on 19th Sep.
It says the report is available "to all accounts that meet the basic eligibility criteria (10+ posts in prior month, account at least one year old)".
ProductX's twenty-sixth release grows the Brazil election filter by 69 accounts and adds delayed ads conversion heads
The twenty-sixth release landed at 01:07 UTC on 18th Sep. It touches 30 files, adding 1,491 lines and removing 154.
It came twenty hours after the twenty-fifth release. The repository now holds 31 commits: 29 releases, the merged fix and its merge commit.
The Brazil 2026 election filter grows from 2,707 to 2,776 account ids, per its own test. Sixty-nine ids were added and none removed.
Its "no live account found" ledger gains four handles and loses three.
The ranker's ads training changes. A head-masking option replaces the split-by-source and view-through training switches, off by default.
Ten delayed-conversion "twin" heads pair with the standard conversion heads. The code names a late-split training stream beside the fresh and early-relabel streams.
The recommendation proto gains an EngagementCounts message, used for a viewer's ads engagement counts. It also gains a SearchLexicalMatch message with a matched-word fraction and an exact-phrase flag.
Nothing in the commit writes the lexical match. The field is new, so no earlier code fills it either.
The Grox PTOS flow gains a task for media-injected adult "infrared" video spam. It has its own prompt template, plan and filter.
The abuse-enforcement service can route each Kafka topic to its own cluster and zone. A malformed producer config now disables that sink with a warning.
The Phoenix build takes its thrift dependency from crates.io instead of a git tag.
Nothing else this page watches moved, and the README did not change.
No file mentions the video preview switch, the aggregation default, the reranker tag or the perturbation sigma.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX's twenty-fifth release raises its reply-spam thresholds again and drops the search-relevance judge labels
The twenty-fifth release landed at 05:09 UTC on 17th Sep. It touches 64 files, adding 2,288 lines and removing 3,627.
Two reply-spam thresholds move again. The follower count that routes a thread to the big-account Gemma model rises from 180,000 to 200,000.
The coordinated-spam floor rises from 30,000 to 50,000 followers. Our entries for the twenty-third and twenty-fourth releases record the earlier values.
The two LLM-judge search relevance labels leave the recommendation proto. Slot 107 now carries CLIENT_TWEET_LIVE_STREAM_REPLY and slot 108 is reserved.
No producer for those labels appeared in the five days they existed. The twenty-second release had added them on 12th Sep.
The home mixer's click-dwell scoring changes shape. The low-favourite penalty, with its baseline, exponent, floor and cap, is deleted.
A switch named cdwell_on_impr replaces it. When on, it multiplies click-dwell by the click score, and it defaults to off.
A like-based holdout filter arrives, off by default. It withholds a share of posts from each viewer by like count.
The share runs from 2% above one like to 15% above 3,000 likes.
The cold-start slot loosens. Treatment-arm viewers no longer need a candidate from mixture-of-experts retrieval, the rule the eighteenth release added.
The cold-start age limit doubles from 24 to 48 hours. It now applies in every experiment arm.
The ads action list gains twenty delayed-conversion labels in two tiers, slots 214 to 233.
A takedowns directory appears, and the README gains a row for it. The tweet entity service merges a post's takedown reasons with its author's account-level ones.
A Gizmoduck filter redacts unenforced takedowns from user reads, behind a gate. Country code "xx" means worldwide and "xy" worldwide copyright.
Under the Hood gains a daily post-takedown labels job. It replays audit deltas over an observation window, one output per UTC day.
The Grox PTOS flow adds a SpamManipulatedMedia state.
Nothing else this page watches moved. No file in the commit mentions the video preview switch, the aggregation default, the reranker tag or the perturbation sigma.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX's twenty-fourth release adds a separate reply-spam model for big accounts and a ten-second click-dwell target
The twenty-fourth release landed at 01:11 UTC on 16th Sep. It touches 26 files, adding 552 lines and removing 233.
The repository now holds 29 commits: 27 releases, the merged fix and its merge commit.
In the Grox reply-spam flow, the classifier now picks its model by audience size. Threads whose root or parent author has more than 150,000 followers go to a model named oai-gemma4-26b-reply-spam.
Everything else keeps the general Gemma model. The follower count used is the larger of the thread's root post and the reply's parent.
The boundary between the two task filters moves too. The follower count that splits spam detection from reply ranking rises from 150,000 to 180,000, now one shared constant.
Our page last recorded that boundary at 100,000.
The repository moved it to 120,000 on 25th Aug and to 150,000 on 8th Sep. Our entries for those releases did not itemise it.
The ranker gains a click-dwell head.
A click counts as positive when dwell time passes ten seconds. The head trains as a binary loss, weight 1.0 in the default config.
The purchase-value signal from the twenty-third release gets its training code. It is a weighted ratio loss against the advertiser baseline, off by default at weight zero.
A home-mixer switch flips.
The mirrored default for the ads brand-safety verdict v2 experiment goes from on to off. The sync stamp is 15th Sep.
The ranker client marks its traffic as inference-critical for network priority. The Grox prompt now names a quoted post's author, and flags an author quoting their own post.
The visibility-filtering metrics changes are refactors. The abuse-enforcement service adds a score id to each decision outcome.
Nothing this page watches moved. No producer of LLM_JUDGE_RELEVANT_TO_SEARCH appears, and the README did not change.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX's twenty-third release adds an ads purchase-value signal, feed-diversity metrics and a higher spam-filter threshold
The twenty-third release landed at 01:07 UTC on 15th Sep. It touches 17 files, adding 594 lines and removing 9.
The repository now holds 28 commits: 26 releases, the merged fix and its merge commit.
The recommendation proto gains a continuous action, ADS_WEB_CT_PURCHASE_VALUE, and a PurchaseValueBaseline message.
A baseline carries an impression id and an advertiser account id. It also carries the advertiser's mean purchase value in US dollars over 28 days.
A new helper matches a request's baselines to an impression and an advertiser. The code defines the fields only; nothing in the commit says how a predicted purchase value changes ad ranking.
The home mixer now measures how varied a served feed is. A new side effect records author and semantic-id composition at three stages.
Those are the order before the diversity heuristics, the final order and the top ten.
It runs for requests in an experiment bucket, or for a random 5% of the rest. Its feature switch defaults to off.
The metrics hydrator gains new post flags.
They mark a slate where one author holds 25% or 50% of posts. Others mark 15 or fewer unique authors.
Other flags mark an author who repeats in the slate and a semantic-id prefix that repeats.
A flag also marks posts from authors the viewer neither follows nor has positively engaged with. The engagement list is built from 18 action types in the viewer's history, from likes to follows.
The flags are written into each candidate's metrics bitset. No file in the commit reads them to change a score.
In the Grox reply-spam flow, the coordinated-spam filter skips threads whose root author has fewer followers than a threshold. That threshold rises from 10,000 to 30,000, so the check now covers fewer threads.
Two training changes. The H100 attention kernel switches to the CuTe DSL implementation the GB300 config already used.
The Kafka loader exports metrics every 120 seconds instead of 30.
Nothing this page watches moved. No file in the commit mentions the video preview switch, the aggregation default, the reranker tag or the perturbation sigma.
No producer of LLM_JUDGE_RELEVANT_TO_SEARCH appears. HeaderImagePromptAdInfo is still defined in no proto file, and the README did not change.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX's twenty-second release adds LLM-judged search relevance labels and refreshes the Brazil election filter
The twenty-second release landed at 02:18 UTC on 12th Sep. It touches 24 files, adding 1,397 lines and removing 338.
The repository now holds 27 commits: 25 releases, the merged fix and its merge commit.
The recommendation proto's action list gains two labels, LLM_JUDGE_RELEVANT_TO_SEARCH and LLM_JUDGE_NOT_RELEVANT_TO_SEARCH. They sit beside the two client-reported search relevance labels already in the file.
The code shows the label names only. Nothing in the commit says which model judges or where the verdict is used.
Prediction requests can now ask for a list of logits. The response carries them as requestedActionLogits.
The Brazil 2026 election filter was refreshed. Its comments list the handles it does not filter.
The filter excludes profiles reported to the Electoral Court under Electoral Resolution 23.610.
The "no live account found" notes fall from 52 to 44. The "not the candidate's actual account" notes fall from 13 to 7, and the file grows from 5,416 to 5,708 lines.
Under the Hood gains a feature switch capping which month its report covers, off by default. Its switch roles now include "employee" beside the Birdwatch team.
The reranking service that spreads out similar posts can now pin a seed post the request names. Its tests say the seed suppresses near-duplicates without taking a top-k slot.
The home mixer's experiments side effect now logs scored candidates to Kafka. Visibility filtering packs author features into one integer and adds per-country takedown tests.
Nothing this page watches moved. No file in the commit mentions the video preview switch, the aggregation default, the reranker tag or the perturbation sigma.
HeaderImagePromptAdInfo is still defined in no proto file. The README did not change.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX's twenty-first release adds per-country account takedown data to Under the Hood and new ranking surfaces
The twenty-first release landed at 21:39 UTC on 10th Sep. It touches 33 files, adding 1,587 lines and removing 391.
The repository now holds 26 commits: 24 releases, the merged fix and its merge commit.
The Under the Hood transparency tool gains a daily account takedown job. It records, per user and per day, a withheld-account reason and a country.
The reasons are ranked: legal request first, then bystander report, then DMCA, then unspecified. Both aggregate structures the tool serves gain a list of country codes.
The recommendation proto adds two product surfaces, a Trend page and an Explore Spotlight, plus three placeholders. Placeholder 29 in the user-action aggregation list becomes IMMERSIVE_LONG_DWELL.
Ads injection logging now records which ads blender served a request. The Following tab logs as "following".
Visibility filtering was reworked for speed. Author labels become an eleven-value enum stored in one integer, and the same eleven rules apply to them.
The eleven include spam, compromised, read-only, impersonation and do-not-amplify labels, and five NSFW labels. None is new; the rules referenced the same labels before.
A new author-id fallback cache holds a million entries and is on by default. The filter also reads the gRPC deadline a caller sends.
Grox, X's safety model pipeline, samples 48 frames instead of 32 for motion reveal. Its image tools gain frame-alignment code.
Nothing this page watches moved. No file in the commit mentions the video preview switch, the aggregation default, the reranker tag or the perturbation sigma.
HeaderImagePromptAdInfo is still defined in no proto file. The README did not change.
The mirrored defaults file changed only its sync stamp, 16:21 UTC on 10th Sep.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX adds a new ad unit to its home feed code and carries the safety action through visibility filtering
The twentieth release landed at 20:46 UTC on 9th Sep, a day after the nineteenth. It touches 28 files, adding 801 lines and removing 252.
The repository now holds 25 commits: 23 releases, the merged fix and its merge commit.
The largest change is in the ad marshaller, the code that turns a served ad into a timeline entry. It gains a "header-image-prompt-ad" entry type.
The unit carries a header image, header text, optional body text, a primary button and an optional secondary button. Each button has its own landing URL and click callbacks.
The type it reads, HeaderImagePromptAdInfo, is not defined in any proto file in the repository. So the published code shows the rendering, not the ad server's side.
Visibility filtering changed shape.
Each result now carries an action (allow, drop or interstitial) alongside its reason. The hydrator stores it on the candidate.
A new reason, ViewerBlocksAuthor, was added. Ancestor, quoted and reposted posts are now dropped on the action rather than on the reason.
Grox, X's safety model pipeline, can now show its model a preview frame. It applies to videos over 30 seconds.
The switch, enable_video_preview_image, defaults to off.
The Phoenix README changed one row. The multimodal post embedding is now "off" on every registered ranking config; the previous version said v5 on one training config.
The ranking model gained an enable_day_of_week switch, on by default, for a local day-of-week feature.
Nothing this page watches moved. The aggregation default is still DENSE_WITH_LONG_DWELL, RerankerHeadTag is still zero, and WeightPerturbationSigma is still 0.0.
The mirrored defaults file changed only its sync stamp, 16:23 UTC on 9th Sep.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX feeds its ranker the shape of every post: media, text length and links, for the quoted post too
The nineteenth release landed at 19:23 UTC on 8th Sep, four days after the eighteenth. It touches 78 files, adding 10,938 lines and removing 982.
The repository now holds 24 commits: 22 releases, the merged fix and its merge commit.
The ranking request gained a ContentFeatures message. It says whether a post has video or a photo, and counts its media and its longest video.
It also carries a weighted text length, a newline count and whether the post links out.
A second copy describes the quoted post, when there is one. The quote hydrator now fetches the quoted post's text and media to fill it.
Text length follows X's own character weighting. Most Latin characters count one, other scripts count two, and every external link counts 23.
A media attachment's own link is not an external link. The unit tests say so by name.
The engagement weights gained an experiment hook. A WeightPerturbationSigma parameter scales each of 26 weights up or down per user.
The direction comes from a hash of a salt, the user id and the weight's name. The mirrored default is 0.0, so the code is inert until the switch moves.
The mirrored defaults file carries a new sync stamp, 16:24 UTC on 8th Sep. One value changed: the Phoenix retrieval experiment's inference cluster, from "Experiment1Fou" to "Experiment2Memy04".
That is the retrieval arm the eighteenth release tied the cold-start slot to.
Reposts now hydrate the original post's text in place of their own. A repost's content features therefore describe the source post.
Grox gained an adult-content check on the first ten seconds of videos 30 seconds or longer. It runs when an earlier step flagged the post, or when the post has 512 or more favourites.
A "v8 search" multimodal post-embedding flow was added, with backfill tasks. Nothing in the changed files says what reads it.
The ranker's attention kernels were rewritten, with a full backward pass and variants for newer GPUs. That is training and serving speed, not a ranking rule.
Nothing this page watches moved. The aggregation default is still DENSE_WITH_LONG_DWELL, RerankerHeadTag is still zero, and the README is unchanged.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
RegulationAustralia drafts a duty-of-care law that makes platforms offer every adult a choice of algorithmic or followed-only feed
The Prime Minister's office released the draft on 8th Sep for "targeted consultation". The feed measure is called "My Feed, My Way".
"Social media platforms will be required to send a notification to new and existing users offering them a choice over their default feed."
Users "can opt out of personally recommended content in their default feed and see the friends and creators they choose to follow". Communications Minister Anika Wells says the choice applies to "Australians over the age of 16".
Platforms must "respect that choice". Wells told the ABC people could choose "over and over" if they changed their mind.
Under-16s get no choice. The ABC reports the law would switch off personalised algorithms and endless scrolling for them.
That sits on top of the existing age ban.
Penalties run to A$109.2 million, enforced by the eSafety Commissioner. The government wants the bill in Parliament "this year".
The duty reaches beyond social media. Games, apps and AI chatbots must protect under-18s from "addictive features", and the ABC says search engines are covered too.
CNBC notes most platforms already offer a followed-only view: TikTok's Friends tab, Facebook's friends feed, Instagram's Following feed. The law is about the notification and the default, not the feature.
Instagram's head answered two days later. Adam Mosseri said a chronological feed makes "the average user experience" much worse.
The ABC notes the EU has required large platforms to offer a non-profiled feed option since 2023. Australia's version adds the mandatory prompt and the fine.
ProductX tightens its cold-start slot for the Phoenix retrieval experiment, and wires per-request overrides into the ranking call
The eighteenth release landed at 21:03 UTC on 4th Sep, twenty hours after the seventeenth. It touches 25 files, adding 480 lines and removing 179.
The repository now holds 23 commits: 21 releases, the merged fix and its merge commit.
The ranking change sits in the author cold-start scorer, which reserves a slot for posts with few impressions. Its settings were gathered into one struct read once per request.
One rule tightened. For viewers in the treatment arm of the "codivert" experiment, a cold-start candidate must now also come from Phoenix's mixture-of-experts retrieval.
The control and holdout arms already excluded such posts. So the three arms are now split by where a candidate came from.
The engagement-counts hydrator lost its cold-start gate. It now runs whenever its own flag is on, or on shadow traffic.
The Phoenix request format gained an experiment_overrides map. That is the wire for the per-request overrides parameter added a day earlier.
Slate context gained two optional fields, exact_k and exact_gap. The diff carries them through the candidate model; nothing in the changed files reads them.
Training moved to "v8" semantic-ID snapshots, from v5. Exported log-probabilities and continuous predictions are now rounded through bfloat16.
Visibility filtering's dark-traffic mirror now targets a "devel" environment as well as staging. Most of its modules became crate-private.
Encrypted checkpointing retries a failed key unwrap up to four times with backoff. The mirrored defaults file changed only its sync timestamp, 16:22 UTC on 4th Sep.
Nothing this page watches moved. The aggregation default is still DENSE_WITH_LONG_DWELL, RerankerHeadTag is still zero, and the adult-content gating list is unchanged.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX merges its first outside pull request, then ships a release that adds an LLM reply-spam classifier
Two things happened in the repository inside five hours. The first is new for this project.
X merged pull request #88 at 20:28 UTC on 3rd Sep. It is the only pull request the repository has ever merged.
The fix is two lines from an outside contributor. The home mixer's visibility-filtering hydrator was sending duplicate post ids whenever several candidates retweeted the same post.
The seventeenth release then landed at 00:37 UTC on 4th Sep. It touches 73 files, adding 1,954 lines and removing 1,926.
That took the repository to 22 commits: twenty releases, the merged fix and its merge commit.
The moderation change is the largest. Grox, the LLM moderation service, gained a "multi-step reply spam" flow.
It runs a Gemma-family model over a reply thread, up to ten posts and two images per post. It returns the post ids it judges spam and a reason.
The flow only considers replies under root posts whose author has at least 1,000 followers. The code calls the skip reason "low_blast_radius".
Replies from Grok's own accounts are skipped. Flagged posts get the existing reply-spam label, which feeds reply ranking.
The older single-reply spam filter moved the other way. Its follower threshold rose from 1,000 to 5,000.
The serving engine lost its semantic-ID lookup client, a gRPC service and 189 lines of code. Post history ids now arrive parsed in the request instead.
The home mixer gained a phoenix_experiment_overrides parameter, an empty string by default. It parses key=value pairs and sends them to Phoenix with each request, so experiments can be switched per request.
Two more court-reported handles were judged not to be the candidate's account. The comment ledger records each one.
Elsewhere, the enforcement service adds a "very high follower count" skip rule. Visibility filtering drops its mutual-TLS settings and merges two cache flags.
The ranker's attention kernel now skips padded history. Nothing this page watches moved.
The Phoenix aggregation default is still DENSE_WITH_LONG_DWELL, RerankerHeadTag is still zero, and the adult-content gating list is unchanged.
The standing caveat applies. Code in the repository is not proof of behaviour in the live product.
ProductX flips its Phoenix aggregation default to a long-dwell variant, and lets its bot detector file reports
The nineteenth commit landed at 19:46 UTC on 2nd Sep. It touches 34 files, adding 1,081 lines and removing 525.
It is the sixteenth release since the repository opened, and the third in two days.
Two mirrored defaults moved, both the same way. rust_home_mixer_phoenix_aggregation_type and its retrieval twin changed from DENSE_WITH_SHORT_DWELL to DENSE_WITH_LONG_DWELL.
The parameter selects which aggregation Phoenix, the ranking model, applies when the home mixer calls it. Beyond the names, the two variants are not defined in the files this commit changed.
The sync timestamp in the file is 16:03 UTC on 2nd Sep. As before, a live feature switch can override the default per request.
The home mixer now asks Phoenix for "backbone scores" on every request, and each candidate carries them. The request and response formats gained fields for the backbone model's top log-probabilities and continuous values.
That reads as instrumentation. The raw outputs of the shared model travel alongside the per-action predictions, rather than changing the ranking.
The retrieval two-tower config turned on query-key normalisation and removed its attention logit cap.
The moderation-side change is the one to note. Scarecrow, the legacy rules engine X's code calls "botmaker", gained a client for an "XReview intake" service.
A rule can now file a report against a post or a profile. The report is marked source "proactive", surface "x_app", reporter id zero.
The example type in the code is bystander_impersonation, with an optional victim id. So detections from automated rules can enter a review pipeline without a person filing them.
Production and staging clients both exist. A no-op client counts skipped submissions, so the wiring can ship before the service does.
Visibility filtering continued last release's rewrite. Policies became a RuleEngine and the registry was rewritten.
A new test asserts that the rule names wired across fifteen tables are unique.
Encrypted checkpointing grew again, with KMS-wrapped data keys and an "XAIENC01" envelope header. RerankerHeadTag is still zero, and the adult-content gating list is unchanged at sixteen countries.
The standing caveat applies. This is read from a commit rather than from an announcement.
Code in the repository is not proof of behaviour in the live product.
ProductX makes the risk-bucket ads blender the default for the home timeline, and rewrites its moderation rules as two tables
The eighteenth commit landed at 20:47 UTC on 1st Sep. It touches 34 files and about 5,800 changed lines.
It is the fifteenth release since the repository opened, and the second inside one day.
One parameter moved, and it is the one this page has been watching. The mirrored default for rust_home_mixer_ads_blender changed from partition_organic_low_risk to multi_risk.
That blender sorts a batch of timeline posts into safe, medium-risk and high-risk buckets. It caps the ad budget at half the safe posts.
When no safe slot exists the batch carries no ads. The exception is an advertiser that has accepted high brand-safety risk, whose ad can sit beside medium-risk posts.
Four days ago we described this logic as wired in but unused. It is now the default wherever X has not overridden the setting.
The file states its own limit: it mirrors config defaults as of a sync timestamp. A live feature switch can still select the older partition blender, the safe-gap blender or a time-gap blender per request.
The larger diff is in visibility filtering, the layer that drops, hides or interstitials posts. Nine rule files were deleted and their contents rewritten as two declarative tables.
One table holds post rules and one holds author rules, driven by a shared rule specification.
We read the new tables in full rather than the diff. The rule names survive unchanged, from PdnaTweetLabelRule to SuspendedAuthorRule and NullcastedTweetDropRule.
The sixteen-country adult-content gating list now reaches the rules through the evaluation context. The golden corpus added on 28th Aug is what makes a rewrite of this size checkable.
The ranking side gained an option rather than a change. A new recon mode for post semantic IDs decodes each ID back into a vector through a published codebook.
It then projects that vector into the post embedding, with the decoder frozen. That replaces learning an embedding table per ID level.
The default stays learned.
Alongside it: a model bundle exporter and encrypted checkpoint saving. RerankerHeadTag is still present at its default of zero, and the gating country list is unchanged at sixteen.
The standing caveat applies. This is read from a commit rather than from an announcement.
Code in the repository is not proof of behaviour in the live product.
ProductX moves its country-by-country adult-content gating into a live config, and starts recording ranking scores per experiment bucket
The seventeenth commit landed at 00:11 UTC on 1st Sep. It touches 54 files and about 2,980 changed lines, the fourteenth release since the repository opened.
The most concrete addition is a new parameters file in the visibility-filtering service. That is the layer that decides which posts get dropped, hidden or interstitialed.
It publishes a default list of the countries where adult content is gated. The first eight are Argentina, Australia, Brazil, Canada, Germany, Spain, France and the United Kingdom.
The rest are Indonesia, Italy, South Korea, Mexico, the Netherlands, the Philippines, Portugal and Thailand.
Sixteen countries, and the list is not fixed in code. The service reloads it every thirty seconds from a runtime setting called rust_vf_nsfw_gating_countries.
So the published list is a default that X can change without shipping anything.
The migration itself is the other half. The same file reads the legacy Scala configuration this replaces and increments a drift counter when the two disagree.
That is what a team does while moving a live rule between systems, rather than after.
This is the first time X's gating list has been visible at all. It is a list of jurisdictions rather than a statement of what each one requires.
X publishes no note explaining it.
The ranking-side change is measurement. A new switch lets X record its score distributions by experiment bucket.
It is called rust_home_mixer_enable_phoenix_score_stats_experiment_bucket. Until now they were recorded only in aggregate.
The six Phoenix scoring heads it covers are the familiar ones: favorite, reply, retweet, click, video quality view and share. Each observation is now tagged with the experiment name and the bucket a user fell into.
That is the instrumentation a ranking experiment needs to read its own results. It is not a ranking change: nothing about how posts are scored moved here.
The Brazilian electoral filter got its usual maintenance, the largest single diff in the release. Accounts moved in both directions, and the file's comment ledger keeps recording why.
One account, @CARLOSVIANA, left the filtered list and joined the accounts X believes are "not the candidate's actual account". Two more were added to the roll of reported handles with no live account behind them.
The rest of the release sits outside ranking. The Grok-based content pipeline gained a screening flow for video and the multimodal embedding server was reworked.
Model checkpoints gained encryption.
ProductX adds a config switch that can change which ranking-model head serves, and locks its moderation rules under a golden test corpus
The sixteenth commit landed at 22:37 UTC on 28th Aug. It touches 24 files and about 3,100 changed lines, the thirteenth release since the repository opened.
The ranking-side change is a new parameter, RerankerHeadTag, mirrored from X's feature-switch config with a default of zero. Every scoring request to the Phoenix ranker now carries it in the user-action sequence.
Every scored post comes back stamped with it.
The published code shows the tag traveling, not what the model does with it. The serving engine's parser and embedding tables gained handling for it in the same push.
The shape is a lever for serving different reranker variants, or model heads, to different requests. It works by flipping a config value rather than shipping code.
Nothing is flipped yet. The parameter file's only other change is its own sync timestamp, so the tag sits at zero.
The bigger diff by line count is in visibility filtering. That is the layer that decides which posts get dropped, hidden or interstitialed.
The rules were refactored around a shared context module, and most rule files got shorter.
What makes that publishable rather than housekeeping is the new test material. It is a 1,039-line "golden corpus" of expected verdicts plus fixtures, compiled only for tests.
A change that alters any moderation verdict now has to edit a published expected result to pass. That makes future changes to these rules diffable in a way they were not before.
ProductX caps ads by the riskiness of nearby posts, and stored reply scores can now only fall
Commit 24c60942 was pushed at 01:00 UTC on 28th Aug. It touches 41 files for 2,071 added and 265 removed lines.
The change with the clearest advertiser consequence is a new ads blender, MultiRiskBlender. It sorts a batch of timeline posts into safe, medium-risk and high-risk buckets.
Those buckets decide how many ads the batch can carry.
The ad budget is capped at half the safe posts, on top of the existing spacing rules. When no safe slot exists, the batch carries no ads at all, with one exception.
An ad whose advertiser is marked as tolerating high brand-safety risk can still be placed beside medium-risk posts.
Every outcome is measured, including the reasons ads were withheld. The new blender is wired into the blender selector, but no parameter moved in this commit.
So which requests actually use it is not visible in the diff.
Two renames ride along in the same files. Placeholder action 84 becomes CLIENT_TWEET_VIDEO_6SEC_VIEW, a named six-second video view.
An aggregation type flips from profile short dwell to profile long dwell.
Third, the reply-score ratchet from the same release got stricter in three ways. Before, the write was skipped only when the new score was higher than the stored one.
Now it is also skipped when the two are equal. The recorded reason was renamed from "higher_than_existing" to "not_lower_than_existing".
The read of the existing score also stopped failing softly. Until now a failed fetch logged a warning and the write went ahead anyway.
It now stops the write, so the ratchet fails closed.
And the Kafka publish now runs before the primary store write rather than after it. The code still gives no reason for the rule that scores may fall but not rise.
Fourth, the Brazil election filter's comment block now lists ten accounts, each with the same sentence: "We believe the account @X reported by the candidate is not the candidate's actual account, so we are not currently filtering it."
Two of the ten, @dayse and @ricar, were in the filtered set until this commit. So X is now declining, account by account and in public, to apply parts of the Electoral Court registry.
It does so where it judges the reported handle wrong.
Smaller changes: visibility filtering gained a sampled cache warmer for the base-post safety-label map. It is configured by environment variable and off by default at zero percent.
A new test pins that a muted CJK keyword matches whole tokens only. So muting one city name does not remove posts about another that contains it.
The parameter file changed by exactly one line, its own sync timestamp. Nothing X ships behind a flag moved, and the second-generation ad brand-safety verdict stays on.
The standing caveat applies as it has to the eleven releases before this one. This is read from a commit rather than from an announcement.
Code in the repository is not proof of behaviour in the live product.
ProductX starts showing follower counts to the model that judges reply spam
Commit 45b48ba6 was pushed at 20:04 UTC on 26th Aug. It touches 36 files for 873 added and 525 removed lines.
The change that reaches ordinary users is how X describes an author to its reply-spam model. That model decides whether a reply is spam.
Until now the prompt opened with a single line combining display name and handle. It now renders the handle, the display name, and two new optional fields: User Follower Count and User Bio.
Both reply-spam classifiers, the ranking one and the simple scorer, turn the follower count on. It is rendered for every post in the thread and for the reply being judged.
The bio is rendered only for the author of the post that started the thread.
The thread renderer also gained a heading telling the model exactly whose profile it is reading: "The user profile and any signals below describe the author of the reply being evaluated (the final post of the thread)."
Read that against the last fortnight and the direction is consistent. The eighth and ninth releases moved the follower boundary, first to 80,000 and then to 100,000.
That boundary decides whether a reply goes to reply ranking or to spam detection.
Follower count was already deciding which system judged a reply. It is now also visible to the model doing the judging.
That is a different thing, and one the code states plainly.
What the diff does not show is what the model does with it. So treat any claim that a small account is now scored worse as unproven by this release.
The second change is narrower and easier to describe. When a reply ranking score is published, the writer now fetches the existing score first.
It skips the write when the new score is higher than the stored one, recording the reason as "higher_than_existing".
A stored score can therefore fall or stay put, but not rise. A score of zero is what applies the reply-spam label.
The code gives no reason for the rule.
Three smaller changes. Visibility filtering lost its media fallback cache entirely, a million-entry cache plus both of its environment flags.
So during an outage of the post-entity service, media features no longer come from a stale copy. The author-lookup fallback cache stays.
Dark-traffic mirroring now refuses to run unless it can read a workload name. It never runs on hosts whose name ends in "-canary".
The ranking model also gained three ad prediction targets, including a combined long-dwell-and-conversion action. Requests can now carry the identifiers of conversion assets a user has been shown.
On the diversity work from earlier in the cluster, the home-mixer slate context gained two more fields. They are recon_count_above and recon_gap_above.
At this release, both published copies of the protocol definition still stopped at reconCosMilli. The Rust side had gained that field a day earlier.
So the published schema was running about a day behind the code that fills it. The next commit added both fields to the schema.
Finally, the parameter file changed by exactly one line, its own sync timestamp. Nothing X ships behind a flag moved today.
So the second-generation ad brand-safety verdict switched on yesterday stays on. No weight in the ranking blend changed.
ProductX switches on the brand-safety verdict it shipped disabled, and grows its Brazilian account list from 665 to 2,328
Commit 0d3cdd80 landed at 23:20 UTC on 25th Aug. It is +5,850/-586 across 47 files, the tenth release since 13th Aug.
It is also the first since 14th Aug to touch the README. The README renames its "Latest Updates" heading to "Notable Updates" and adds one line to the Brazil section: "(Account list updated August 25, 2026.)"
The advertising change comes first, because it reverses what the code said yesterday.
EnableAdsBrandSafetyVerdictV2 now defaults to true. That switch had defaulted to false since the second-generation verdict was published on 13th Aug.
The parameter file records its own sync from the live config as 25th Aug at 16:20 UTC.
What that turns on is narrower than the name suggests, and the fallback is the reason.
The v2 function hands straight back to the original whenever a post carries none of Grok's four second-generation labels. So for every post that classifier has not scored, nothing about the verdict changes.
Where those labels do exist, they now decide it. The six high-risk labels added in yesterday's release are identical in both generations.
So the most severe category is unaffected either way.
The medium-risk list is where the two differ. The v2 list reads Grok's second-generation "not safe for advertising" label plus an expanded version of it.
It leaves out NSFA at high precision, which forces a medium-risk verdict under the original.
The test for whether Grok has scored a post at all moved to the v2 labels too. So a post the second-generation classifier has touched is now judged entirely on that generation's evidence.
Second, the Brazilian electoral filter grew from 665 accounts to 2,328. The file went from 1,573 lines to 4,947.
The mechanism is unchanged: a hardcoded set of user IDs, each annotated with its username. The author of every candidate post is checked against it.
The post is dropped unless the viewer follows that account.
The source file now also names its legal basis and its data source, which it did not before. They are Article 28 paragraph 1-A of Electoral Resolution No. 23.610, and the Electoral Court's public 2026 candidate dataset.
Forty-seven of the newly listed usernames carry a comment saying no live account was found for them. So the list tracks the candidate registry rather than accounts X has verified one by one.
Third, four ranking weights and two related defaults moved, and one of them is a first.
Dwell weight goes from 0.0 to 0.05, so predicted dwell now carries weight in the score at all. Video quality view weight goes the other way, from 0.05 to 0.0.
Video open weight rises from 0.05 to 0.07.
The Phoenix aggregation default also switches from short dwell to long dwell. That points the same way as the dwell weight.
Fourth, and this one matters for anyone reading their own view counts. The code adds a separate view_count_on_home alongside the existing total view count.
Author cold start is the mechanism that gives newer authors a chance in the feed. It now reads that home-timeline figure instead of the total, for both its sampling and its eligibility threshold.
So views a post earns from search, a profile or a notification no longer count against its cold-start eligibility. The number of cold-start candidates considered also drops from five to two.
Fifth, ads on the Following timeline get their own reporting identity. Ad events are now tagged following_promoted or ranked_following_promoted rather than sharing the For You label.
Each ad entry now carries its impression id.
Sixth, and the diff invites the wrong reading here. The topic-diversity work from 17th and 18th Aug has not been removed.
Home mixer stops computing the semantic-ID repetition counts and rank gaps for itself. It uses the ones already attached to each candidate instead, and the structure carrying them gains a new field.
What went is a local calculation, not the signal.
The multiplicative scoring path added earlier in the month did go, along with two of the ranker's configuration switches.
Two changes outside ranking complete the release. The Following timeline gains a check through the social graph.
It asks whether the author of a reposted or quoted post blocks the viewer.
And the abuse-enforcement rules gain a route for acting on penalties requested by an upstream scoring platform. They also gain a new spam label that triggers a temporary suspension under the platform-manipulation policy.
The standing caveat applies as it has to the nine releases before this one. This is read from a commit rather than from an announcement.
Code in the repository is not proof of behaviour in the live product.
ProductX adds a fifth brand-safety verdict for its most severe labels, and moves the reply-spam boundary again to 100,000 followers
Commit d011592a landed at 18:51 UTC on 24th Aug. It is +1,418/-117 across 19 files.
It is the ninth release since 13th Aug and the first after a three-day gap.
The root README is untouched for the ninth consecutive release. So the code is again the only account of what changed.
The advertising change is the substantive one.
X's brand-safety verdict has carried four values since it was published: unspecified, safe, low risk and medium risk. This release adds a fifth, high risk, and moves six labels into it.
They are NSFW at high precision and at high recall, and gore and violence at high precision. The others are PDNA, egregious NSFW and soft NSFW.
Five of those six sat in the medium-risk list until this commit. Soft NSFW appears in the file for the first time.
Nothing about where an ad can go changed today, and that is deliberate. The helper deciding which timeline gaps an ad may fill is has_avoid.
It was rewritten in the same commit to match medium risk or high risk. So a post carrying any of those six labels still blocks the slots on either side of it.
What the release buys is a severity distinction the ad system can act on later. It applies in both label generations too.
The high-risk check runs first in the original verdict function. It runs again in the v2 function that reads Grok's second-generation labels.
That v2 path shipped off at this release. Its parameter defaults to false under the key rust_home_mixer_ads_bs_v2_exp_enabled.
Every ads-injection log line now records which bucket of that experiment a request fell into. That is the change you make when an experiment starts running rather than when it is written.
Second, the follower threshold from our 21st Aug entry moved again, from 80,000 to 100,000. That is three days after it went from 60,000 to 80,000.
The mechanics are unchanged. A reply is eligible for reply ranking only when one of two accounts is above the threshold.
Those are the account replied to and the account that started the thread. It is eligible for spam detection only when both are at or below it.
So accounts between roughly 80,000 and 100,000 followers move out of reply ranking and into spam detection. Coordinated spam keeps its own separate threshold of 1,000 followers, untouched.
Third, an 812-line new file adds a shadow comparison to visibility filtering. It is the most revealing part of the release.
When an environment flag is set, each filter request also goes to the legacy visibility-filtering client. The two sets of verdicts are compared post by post and counted as exact matches or differences.
The reference call has a 1.5-second timeout.
The harness refuses to run in production. Setting the flag with APP_ENV=prod returns the error "VF_DUAL_CALL_HARNESS_ENABLED is set but APP_ENV=prod; the reference comparator is staging-only".
That confirms in code something the repository has never stated in prose. The published visibility-filtering service is a rewrite being checked against an older implementation that is not published.
Two smaller changes complete the release. Four of Grok's second-generation safety labels and a "PTOS reviewed" marker now pass through to the home mixer.
So downstream ranking can see them.
And the safety-policy flow gained a cross-validator that second-checks child-safety classifications, now extended to violent-media violations.
The standing caveat applies as it has to the eight releases before this one. This is read from a commit rather than from an announcement.
Code in the repository is not proof of behaviour in the live product.
ProductX moves the reply-spam boundary from 60,000 followers to 80,000, and wires 20 ad conversion types into the ranker
Commit 28e414f5 landed at 19:10 UTC on 21st Aug. It is +856/-152 across 35 files, the eighth release in nine days.
The repository's root README is untouched for the eighth consecutive release. So once again the changes are documented only by the code.
The change with the clearest reader consequence is a single number moved twice.
In grox/flows/reply_spam/task_filter.py, two follower thresholds go from 60,000 to 80,000. Reading the file rather than the diff shows what they do: they are the same boundary, used in opposite directions.
A reply is eligible for reply ranking only when one of two accounts is above the threshold. Those are the account replied to and the account that started the thread.
Below that, both are skipped with the reason "low_blast_radius".
A reply is eligible for reply spam detection only when both of those accounts are at or below it. Above, it is skipped with the reason "reply_ranking_target".
So the number decides which of two systems reads the replies under your posts.
Moving it to 80,000 shifts accounts between roughly 60,000 and 80,000 followers. They leave reply ranking and enter spam detection.
A third filter, coordinated spam, keeps its own separate threshold of 1,000 followers. It still exempts high-PageRank and grey-badge accounts.
The bulk of the release is advertising.
Twenty new action types enter the ranking protocol. They are all conversions the old set could not express.
The first group is purchases, add-to-carts, sign-ups, tutorial completions and level-achieved events attributed inside a mobile app. Each has a paired view-through variant.
The second group is view-through versions of the purchase, add-to-cart, checkout-initiated, sign-up, site-visit, session, landing-page-view and upper-funnel conversions.
Supporting machinery arrives with them. There is a train_view_through_heads switch and a weight for in-app conversion loss.
There is also a flag for splitting head training by source, and a delayed-feedback marker plus a keep-mask. Those let conversions which arrive long after the impression be handled rather than treated as absences.
An advertiser cannot act on this yet, and all three switches default to off, but the direction is legible. X is building a ranker that can be trained on conversions nobody clicked.
Two smaller additions matter here. A new engagement signal, ClientTweetSearchQueryReformulated, joins the existing "not relevant to search" signal.
That means the model can now be trained on the fact that a searcher rephrased the query. It is the closest thing X's search has to a documented dissatisfaction signal.
And the slate context the 18th Aug release added to the request now comes back in the model's response. So the ranker can reuse what Phoenix scored with instead of recomputing it.
What the model actually does with those context signals is still not in the repository. That is four releases after we first said so.
One disclosure changed too, in xAI's favour. The Phoenix README used to say the export ships standard AdamW in the dense-optimizer slot rather than "production's tuned internal variant".
It now says "the flagship ranking configs and the nano twin train the production Muon recipe, which ships in full". AdamW is confined to the retrieval, gen-recs and legacy ranking presets.
The repository's central question is whether the released code is the code that runs. That is a narrowing of the gap, stated in the repository rather than announced anywhere.
The child-safety flow separately dropped its Grok 4.5 path and the 30% traffic dial that fed 4.6. That leaves 4.6 as the only cross-model validator.
ProductX builds AI-generated trend labels into For You posts, with a tap-through to the trend
X pushed a seventh release in eight days to the public algorithm repository at 20:22 UTC on 20th Aug. It is 479 lines added and 200 removed across 14 files.
The README is untouched for the seventh consecutive release. So the code is again the only account of what changed.
The substantive addition is a new hydrator, AiTrendFeedbackContextHydrator. It works on a whole timeline response rather than on one post.
It takes the candidates that qualify as standalone original posts. That means not a reply, not a repost, and no reply-thread parents.
It then asks a service which AI-generated trend each belongs to.
It then counts how often each trend appears across those candidates and keeps the two most frequent. It picks one post at random from each, and those two posts get the trend's name attached.
What a reader sees is a context label above the post, the same slot that already carries topic labels. The marshalling code makes topic labels win where both exist, so the trend label is the fallback.
One difference is visible and new: a topic label has never carried a link, and this one does. The trend name renders as an external link to x.com/i/trending/<id>.
So tapping the label leaves the post for the trend page.
The underlying structure is still X's topic-feedback type, which is the plumbing behind "show me less of this". So the label is a feedback prompt as much as a badge.
For a brand account, this is a small, random distribution lottery rather than a lever. The post chosen for a trend is a random pick among the candidates that share it.
So there is nothing to optimize toward and no way to tell after the fact.
What it does say is that X is now clustering posts into machine-generated trends inside the ranking pipeline. It is surfacing that clustering to readers by name.
That is a route out of your post and into a topic page. That page did not exist in the timeline before.
The rest of the release continues the slate-context work from the 18th Aug and 17th Aug releases. The Phoenix model now returns the slate context it actually scored with.
The ranker can use that in place of recomputing the values or reading stored ones.
That closes part of the question our 17th Aug entry left open. The diversity signals now travel back from the model as well as into it.
What the model does with them is still not in the repository.
Two caveats belong on this, and the second is stronger than the standing one. As always, code in the repository is not proof of behaviour in the live product.
And in this case both changes are explicitly gated. The trend-label hydrator sits behind a flag that defaults to off in the published code.
So does the served-slate-context switch. What has shipped here, then, is the capability rather than a confirmed rollout.
ProductX extends muted keywords to the Following timeline, and makes them match quoted posts and reply threads
X pushed its sixth release in seven days to the public algorithm repository at 21:25 UTC on 19th Aug. It is 3,303 lines added and 651 removed across 82 files, much of it training and GPU work.
The README is untouched for the sixth time, so the code is again the only account of it. One change in it affects who sees a brand's posts.
Muted keywords now filter the Following timeline. That feed's pipeline previously ran two filters, one for deduplicating reposts and one for self-reply chains.
A muted word had no effect on it.
This release adds a dedicated keyword filter to it. So a term a user has muted now suppresses posts in the reverse-chronological feed of accounts they deliberately follow.
The new filter is also broader than the one on For You. The difference is in the code rather than in any announcement.
It tests three pieces of text against the muted list. The first two are the post's own text and the text of the post it quotes.
The third is the texts of the parent posts above it in a reply thread.
Two new pieces of plumbing exist to make that possible. One is a hydrator that fetches the quoted post's text.
The other is an addition to the ancestor hydrator that keeps the parents' text.
The For You filter was renamed in the same commit from MutedKeywordFilter to ViewerMutedKeywordFilter. It still matches the post's own text and nothing else.
For anyone running a brand account, that is a distribution ceiling that has just moved and that nobody can measure. Consider a user who has muted your product name, a competitor's, or a term your posts habitually quote.
They will now lose your Following-timeline posts that merely quote a post containing it.
There is no reporting surface for muted-keyword suppression on any platform. So the only visible symptom is reach that does not add up.
The rest of the release is machinery. A new module computes an adult-content prior and the safety classification flows around it were reworked.
The visibility-filtering service gains a dark-traffic harness for replaying requests. The training stack gains two optimizers and a large amount of attention-kernel work.
None of that states a ranking rule. One smaller behaviour change also lands here.
When the Following pipeline fails to expand a reply's ancestors, it now keeps the post. It keeps the ancestors it already had, where before the failure dropped the candidate.
The standing caveat applies as it did to the five releases before this one. This is read from a commit, not from an announcement.
Code in the repository is not proof of behaviour in the live product.
ProductX wires its new topic-diversity signals into the ranker, and chains its two brand-safety generations
X pushed another release to its public algorithm repository at 18:57 UTC on 18th Aug. It is 208 lines added and 70 removed across 14 files.
It is a much smaller change than the four before it. The README is again untouched, and the code is the only account of it.
The first change closes a gap we flagged in the 17th Aug release. That one gave the For You slate builder repetition counts and ranking gaps for each candidate's semantic ID.
It did so at three levels of a topic hierarchy. But it stopped there: nothing in the diff showed the signals reaching the model.
They do now. The slate context sent to Phoenix with every candidate carries sid_known.
It also carries three levels of semantic-ID repetition count and three levels of gap. Those sit next to the author-level counts that were already there.
The second change is for advertisers, and it makes the newer brand-safety path less blunt. Yesterday's release added a second-generation verdict, at that point behind a flag that defaulted to off.
That verdict rated a post medium risk whenever Grok had not scored it.
It now checks first whether any of Grok's four second-generation labels exist on the post at all. If none do, it hands the post to the original verdict function instead of failing closed.
A test shipped with it is named for the behaviour: v2 defers to v1 when v2 has not ruled.
Two first-generation labels also leave the v2 risk lists, one from medium risk and one from low risk. The helper that used to strip first-generation labels written by Grok is deleted.
The effect is that the two generations no longer mix inside one verdict. The v2 function rules on posts it has labelled, and everything else is judged by v1.
The original function keeps its own rule of rating a post medium risk when Grok has not scored it.
The Following timeline also gets its own visibility filtering. The reverse-chronological pipeline previously shared the For You hydrator and now uses a dedicated one.
That hydrator asks the visibility service about each candidate plus its ancestors, its quoted post and its reposted post. It does so before the feed is built.
As with the previous four releases, this is read from the commit rather than from an announcement. A change to the code is not proof of a change to the live feed.
The brand-safety path in particular was gated at this release by a flag that shipped off. That flag was switched on a week later.
ProductX adds topic-level diversity to For You, in a release it did not announce
X pushed a fourth release to its public algorithm repository at 20:20 UTC on 17th Aug. It is 751 lines added and 162 removed across 34 files.
The top-level README that carried the 13th Aug and 14th Aug announcements is untouched. So the code is the only account of it.
The change most likely to reach a posting strategy is topic diversity. The For You slate builder already counted how many candidates shared an author.
It also counted how far apart in the ranking they sat. It now keeps the same counts and gaps for each candidate's semantic ID, at three levels of a topic hierarchy.
In plain terms, a repeated subject within one feed refresh is now measured. A repeated author already was.
The commit adds the signals and passes them on with each candidate. What the ranking model does with them is not in the diff.
Two author signals also start reaching Phoenix, the neural ranker. A post's author follower count is now filled in on the request for anything that is not a repost.
That field was previously left empty. A separate NSFW-author bit is set from the user service's own flags and labels.
The Following feed gets bigger. Its maximum result size moves from 100 to 110 with the ads slot count unchanged at nine.
So a refresh can return ten more posts than it could before.
Advertisers get a second brand-safety verdict path, and it shipped switched off. EnableAdsBrandSafetyVerdictV2 defaulted to false at this release.
Enabled, it reads a second generation of Grok-written safety labels and adds an expanded medium-risk tier. It fails closed, rating a post medium risk when Grok has not scored it.
The same applies when a review label is missing.
A disabled flag is not a live change to anything. So treat that as a signal of direction rather than a fact about today's feed.
It is the same shape as the cold-start sampling flag that arrived on the 14th and is still off.
One thing moved away from openness. The bot-detection module's README now records that its minimum-actions enforcement gate is redacted as well.
It ships as an impossible 999999 sentinel. The stated reason is that publishing it would reveal "the account-size floor below which scoring never fires".
ProductX drops 665 Brazilian candidate accounts out of For You, and corrects how its new weights are being read
A day after publishing its ranking weights, X added a second dated update to the repo's README. The larger half of it is a country-specific change to who gets recommended.
From 16th Aug, Brazilian electoral law requires providers that run recommendation systems to exclude certain accounts from their recommendations. Those are the official accounts of candidates registered with the Electoral Court, and those accounts' posts.
X says it is complying, and For You now runs a filter named Brazil2026ElectionFilter.
One word in the English README needs care. It describes accounts "reported to Brazil's Electoral Court", which means declared to it in the candidate registry, not reported by users for misconduct.
X's own Portuguese announcement is the clearer statement: these are the official accounts of registered candidates. The measure is compliance with Resolution 23.610/2019 rather than a sanction or a change to X's own rules.
The code names every account. A hardcoded list of 665 user IDs is checked against the author of every candidate post.
Each ID is annotated with its username. A post is dropped unless the viewer explicitly follows that account.
The filter also catches reposts and quotes of a listed account, and replies whose conversation thread reaches one.
X is explicit that the accounts are not suspended and their content stays on their profiles. It is equally explicit that the change will affect the visibility and reach of those profiles and their posts.
The legal text quoted in the code carries one exclusion that marketers should note. It applies "except in cases of paid boosting".
The second half of the update answers something that happened to X within a day of the weights going public. A reading spread quickly that a report cancels out a fixed number of likes.
X has now written the rebuttal into the code itself.
The weights multiply predicted probabilities, not engagement tallies. As the new comment in the scoring code puts it, "the weights do not multiply raw engagement counts".
So treating the ratio between two weights as a count equivalence is wrong.
The README is blunter about the specific claim, calling "1 report cancels out 468 likes" incorrect. It adds that the weights are "a multiple on your own predicted probability of Liking, Reporting, etc, which is substantially driven by your own behavior".
The comment also explains why the report weight is large in the first place: "the baseline probability of a Report is more than 1000x lower than a Like". So it has to be weighted up before the prediction can move the ranking at all.
That leads into the claim most likely to matter to anyone managing an account. It is that coordinated mass reporting or blocking can bury reach.
X gives two reasons it does not work that way. Recommendations are personalised, so "reports from bad actors will primarily affect recommendations for users who are similar to the bad actors" rather than suppressing the post for everyone.
The second reason is narrower and more concrete. An action only counts in the recommendation system if it happens on a post the Home Timeline served.
So "directly navigating to a post (i.e., coordinating via groupchat) has no ranking impact". A group cannot reliably make a target post appear in their own timelines to begin with.
X says it added the comments "so that LLMs or people reading it are more likely to understand it correctly". That is a fair description of what open-sourcing a ranking system now costs it.
On the Brazil filter it makes the opposite point in its favour: "A benefit of open-source is that you can see that changes like this exist, and exactly how they work".
ProductX publishes its ranking weights and its visibility filters, plus a tool that shows your own labels
The repo's own README, dated 13th Aug 2026, lists three additions. The first is the configuration parameters that blend predicted action values into a score.
The second is the code for systems that decide whether a post is filtered out of the For You feed.
The third is real Phoenix training code, in place of the old demonstration model. It comes with synthetic data generation so a proof-of-concept training run can be done.
The new systems are the ones that decide visibility rather than order. Visibility filtering determines whether to show a post, drop it, or show it behind an interstitial.
The release also opens the machinery feeding it. Those are label rule engines, account-scoring models, image and video models, and an enforcement service.
If you post on X, the scoring detail is the useful part. Phoenix predicts a probability for each action a viewer might take.
Those actions span engagement, clicks, attention, following the author, and negative signals such as mute, block and report.
Those probabilities are summed using the now-published weights, positive for positive actions and negative for negative ones. Three adjustments follow.
The first is a decay applied to each post after an author's first. The second is a discount for accounts the viewer does not follow.
That discount also hits replies and reposts from accounts they do follow. The third is a boost for authors whose impressions sit below a threshold.
The filters are equally concrete. Posts older than 48 hours are dropped before scoring, along with posts the viewer has already been shown.
So are their own posts, and reposts and replies from accounts they do not follow.
X's VP of Product Keith Coleman told TechCrunch that "You'll get the core ranking code that pulls posts and ranks them for any given user and assembles the feed", adding "This is the kind of thing that I think people will be fairly shocked that we are releasing".
The code is Apache v2 licensed, and TechCrunch puts the expansion at roughly 10 to 15 times the previous size.
The paired transparency tool sits on an "Under the Hood" page in the app's settings. Accounts that posted 10 or more times in the past month can download aggregate statistics as a JSON file.
It shows which visibility-affecting labels were applied to the account and its posts.
What is held back is stated openly: the Grox prompt files and some botmaker rules. The grounds are that "people could use it to try to game the system".
Engadget adds that ads code and systems outside the For You timeline stay unreleased.
So this does not meet Musk's stated goal that "every line of code touching the X system will be open source and third-party audited" in August. X says third-party recommender-system experts pressure-tested the release beforehand.
It does not say how they were chosen or whether their findings will be published.
StudyPinterest moves search relevance judging to vision-language models
The paper, from eight Pinterest researchers, describes vision-language-model relevance judging deployed at Pinterest Search to evaluate A/B experiments. It says "VLMs can provide reliable relevance measurement for experiments while greatly improving the evaluation efficiency".
The approach cuts the minimum detectable effects in online experiments.
It extends the system Pinterest documented in December 2025, where fine-tuned open-source LLMs score query-and-Pin relevance on a five-level scale. Those scores match human labels exactly 73.7% of the time and within one level 91.7% of the time.
For marketers: on Pinterest, "the algorithm" is unusually inspectable. The engineering blog has documented how search relevance is modeled.
It has documented what feed ranking consumes (up to 16,000 lifelong actions per user). Now it has documented how quality itself is measured.
ProductLinkedIn ranks comments per viewer and limits automated and generic ones
The note, "Making LinkedIn Conversations More Relevant and Valuable", is signed by LinkedIn's Rishi Jobanputra. It speaks as the company throughout ("we're investing").
The ranking change takes one sentence. Comments are "ranked based on relevance and personalized using signals such as your professional interests, connections, and engagement activity".
So the comment order under a post is no longer one list that every viewer shares.
A second item is a test, not a launch. LinkedIn is "testing new ways to surface timely and relevant comments directly in the Feed".
The enforcement half carries the note's one hard number. LinkedIn says it is "proactively catching more than 200k automated comment attempts" every day, and expects that to grow.
It is also "building systems to identify and not broadly distribute comments that are low-quality and generic". Its examples are comments that repeat the post or add no new idea.
Three tools came with it. Members can flag a comment as "Seems like AI slop", and authors can block a page from commenting.
A filter showing only comments from verified members is in testing.
The note gives one usage figure: time spent reading comments is up 18% year over year.
It gives no weights and no definition of "generic". It also never says that comments lift a post's reach.
The note covers how comments are ordered and filtered, not how posts are ranked.
For marketers: automated commenting tools are now the named target of a LinkedIn system. A comment that restates the post is LinkedIn's own example of what gets shown less.
We found this note seven weeks late, through a Social Media Today write-up dated 9th Aug. The LinkedIn section now counts it in the official record.
Correction, 20th Sep 2026. Until today the LinkedIn section called two engineering posts "the entire official record on ranking".
This note was published before we wrote that sentence, so the section and the FAQ now count three documents.
DataReddit's "choppy" search referrals outweigh a 61% revenue quarter
Reddit's Q2 2026 shareholder letter reported its eighth consecutive quarter above 60% revenue growth. Revenue was $804.9 million, with net income of $253 million.
Daily uniques were up 18%. Logged-out daily uniques, the search-exposed cohort, were up 27%.
The sentence that moved the market: "Search referrals were choppy in the quarter, and traffic was more volatile later in the quarter". Shares sank roughly 11% in after-hours trading despite above-consensus guidance.
Huffman's framing leaned into independence: "While our visibility in referral traffic remains low, we're not building for drive-by traffic. We're building a daily destination."
One omission: this is the first letter in six quarters without a weekly-search-user or Reddit Answers figure. That breaks the series that ran 60, 70, 75 and 80+ million.
The quarter's other Google story compounds the dependence question. A week earlier, Reddit had discussed cutting off Google's AI access to its content.
That was per Wall Street Journal reporting carried by CNBC. The roughly $60-million-a-year data deal nears its end, with renewal talks under way.
The stock slid 8% on that report alone.
ProductFacebook tests opening straight into full-screen video, with Classic Feed demoted to a tab
Tom Alison's post, "Connecting Real People on Facebook", announced a test that opens the app directly into full-screen video. It promises that "Classic Feed will always be available as the second tab in the app, just one click away", plus an opt-out to remain Feed-first.
Rollout is staged: testing starts later this year in video-heavy international markets. US exploration is planned for the following year.
The same post bundled Facebook Verified (a free selfie-verification badge). It also bundled a Seller app for Marketplace and a Forum app for Groups.
Distribution-wise, this is the biggest Facebook change since the December 2025 redesign, which moved search results to an immersive grid. The app's default entry surface becomes a ranked video feed.
Note the dating: much trade coverage describes an "August 2026 redesign". Meta's own posts date the announcement to 9th Dec 2025 and this test to 24th Jul 2026.
No August feed post exists on the newsroom.
ProductX's second algorithm release makes the repo runnable, and documents ads inside the ranking pipeline
The second open-source release landed in xai-org/x-algorithm as a 187-file commit adding 18,263 lines. It holds a runnable end-to-end inference pipeline and a pre-trained mini Phoenix model (256-dimension embeddings, roughly 3GB).
It also holds the new Grox content-understanding service for spam detection and policy enforcement. An ads-blending module sits inside the home-mixer.
That last part is significant: the first public documentation of ads blended inside the For You ranking pipeline itself.
The commit history tells the other story. Musk had committed in January to re-releases "every 4 weeks, with comprehensive developer notes".
The GitHub record shows zero public commits between 20th Jan and this release. There were three commits total before the August release.
The gap is not a criticism we infer. It is the repo's own verifiable state, and claims that the cadence "was maintained" are false.
ProductTikTok GO puts bookable hotels and experiences inside TikTok search and location pages
TikTok announced TikTok GO on 12th May. It is a way to discover and book hotels, attractions and tours inside the app.
It is for users in the United States aged 18 or over.
The commerce story is the obvious one and it is not the reason this page carries it.
The reason is one sentence in the announcement about where the inventory appears: TikTok GO "surfaces lodging and things to do across the ways people already discover content on TikTok, through videos, search, and location pages".
Skift, which saw the feature at launch, puts the same point negatively: TikTok GO "is not a dedicated tab or section inside the app".
So this is a change to what a TikTok search result and a location page can contain. It is not a new destination bolted onto the side.
That is the same direction as the Search Hubs announced at TikTok World the following day. It is the second commercial layer to reach TikTok search inside two days.
The booking partners are Booking.com, Expedia, Viator, GetYourGuide, Tiqets and Trip.com. TikTok describes the app it is built into as one "more than 200 million Americans use".
That is its own figure and not an audited one.
For creators there is a direct incentive attached. Those who feature hotels, attractions and local services can earn commissions and take part in creator campaigns tied to bookings.
The announcement carries the note "Below is today's news made by TikTok USDS Joint Venture LLC" and quotes Adam Presser, the joint venture's CEO. So this is a product shipped by the American entity whose governance terms closed in January.
One correction to the natural reading, because the US newsroom post describes only the US. TikTok GO is not a US-only travel feature.
TechNode reported on 14th May that TikTok launched TikTok GO as a lifestyle-services brand in Indonesia, the US and Japan. It appeared in Indonesia first in late April, and its scope covers dining as well as travel.
We have not found a first-party TikTok post covering the Indonesian or Japanese launches. So those two markets rest on that reporting alone, and we have not verified what the feature does in either.
The standing caution for this platform applies here as everywhere on it. TikTok has said nothing about how, or whether, any of this affects For You ranking.
No ranking claim should be read into a booking product.
DataFacebook publishes the results of its originality crackdown: original Reels watch time doubled
Meta's "Rewarding Original Creators on Facebook" did something platforms almost never do: published distribution results for an enforcement wave. Views and watch time of original Reels about doubled in the second half of 2025 versus a year earlier.
Over 20 million impersonating accounts were removed in 2025. Impersonation reports about large creators fell by a third.
The updated guidelines draw the line concretely. Deprioritized in Feed and Reels: reaction-only watching, and stitching clips without additions.
Also deprioritized: narrating what is on screen without meaningful contribution, and minor edits of someone else's post.
Genuinely transformed content becomes eligible for recommendation and "may benefit from increased distribution".
The consequence sentence is blunt: "Creators who are not adding substantial creative value will see their content deprioritized, and they may see their account deemed non-recommendable and demonetized."
DataLinkedIn documents its feed ranking in detail, and none of the popular "rules" appear in it
"Engineering the next generation of LinkedIn's Feed", by Hristo Danchev, is the official reference the "LinkedIn algorithm" industry pretends exists elsewhere. Retrieval runs on an LLM-based dual encoder embedding members and posts.
Ranking runs on a transformer-based Generative Recommender. It processes more than 1,000 of a member's interactions in chronological order.
The signals it names: profile attributes (industry, experience, skills, geography) and engagement history (posts liked, commented on, dwelled on, skipped). It also names post metadata and engagement counts, device, and the interaction sequence over time.
Its learning philosophy in one sentence: "The model learns better from understanding what you chose to engage with than from the full set of what you were shown."
What it leaves out matters as much: no ranking-factor weights, no golden hour, no external-link penalty, no optimal posting cadence. There is also no mention of 360Brew, the withdrawn research preprint that guides cite as LinkedIn's "officially announced" new algorithm.
A companion post in January had documented the search side. It covers LLM-judged relevance and a small-language-model reranker behind AI Job Search and People Search, with published evaluation numbers.
DataReddit: 80 million weekly searchers, and one unified search
Reddit's Q4 2025 shareholder letter carried the search beat's best stats engine: "over 80 million people searching directly on Reddit every week in Q4, up from 60 million just one year ago".
The product news in the same letter: "significant progress in unifying our core search with Reddit Answers", ending the two-surface era. Answers was released in five new languages, and, forward-looking, Reddit is "piloting dynamic, agentic search results that include media beyond text".
The series behind the headline comes from the quarterly letters. It ran 60 million weekly searchers in Q1 2025 and 70 million in Q2.
By then Answers had 6 million weekly users, up from 1 million. Q3 brought 75 million and Q4 80-plus million.
Reddit Answers, launched December 2024, runs on Google's Gemini via Vertex AI. That makes Reddit's Google dependence two-sided: half its traffic and the model under its own AI search.
LegalTikTok's US joint venture closes: the algorithm gets American governance
The joint venture closed on 22nd Jan as TikTok USDS Joint Venture LLC, with Adam Presser as CEO. ByteDance retains 19.9%, and Oracle, Silver Lake and MGX are managing investors on a majority-American board.
That is per CNBC's report of the company statement.
The statement said the venture "will operate under defined safeguards that protect national security through comprehensive data protections, algorithm security, content moderation, and software assurances for U.S. users".
The algorithm terms trace to the September executive order, whose accompanying fact sheet stated them verbatim: "The divestiture puts the operation of the algorithm, code, and content moderation decisions under the control of the new joint venture."
And: "it requires all recommendation models, including algorithms, that use U.S. user data to be retrained and monitored by America's trusted security partners."
Per the close reporting, the recommendation algorithm is now hosted in Oracle's American data centers. It is retrained, tested and updated on US user data.
Two disciplines for reading this event. It is a GOVERNANCE change: nothing official states any ranking behavior change.
Headlines inferring feed changes from it go beyond the documents.
And it makes TikTok the only major platform whose ranking system is, by agreement, forked and retrained per market. That is why every future "US TikTok algorithm" story will hang off this date.
ProductX open-sources its recommendation algorithm, for the second time in its history
Ten days after Musk committed to open-sourcing "all code used to determine what organic and advertising posts are recommended to users", the xai-org/x-algorithm repo appeared. It was 79 files, 8,816 lines, Apache 2.0, in Rust.
The architecture it documents: Home Mixer orchestrates the For You pipeline, and Thunder supplies in-network posts. Phoenix, a Grok-based transformer ported from the Grok-1 release, does retrieval and ranking by predicting probabilities across engagement types.
The final score is a weighted sum of predicted engagements, attenuated for author diversity.
The README's headline claim: "We have eliminated every single hand-engineered feature and most heuristics from the system." That matches the direction Musk had set in October 2025.
He said then that the system was moving to Grok reading every post and video, with heuristics slated for deletion.
One durable caution: this is X's second open-sourcing. The 2023 twitter/the-algorithm repo describes a different, Scala-era system, and its mechanics (boosts, heuristics) are routinely cited as current.
They are not. The 2026 repo explicitly repudiates them, and it is the only citable primary for how X ranks today.
In depth: event pages
One page per story arc, built from the dated entries above and kept current as they grow.
X's open-source algorithm: every release since January 2026X published its For You ranking code on 20th Jan 2026 as 79 files of Rust. Eighteen releases since have added scoring weights, visibility filters, ads blending and the first merged outside fix.
Reddit search: users, Reddit Answers and the Google dependencyReddit disclosed more than 80 million weekly searchers in its Q4 2025 letter, up from 60 million a year earlier. Its Q2 2026 letter carried no search figure and called Google referrals "choppy".
Reddit: two search products and a Google dependence
The quarterly shareholder letters are the beat's stats engine, and the Google relationship has three distinct strands.
Reddit's beat has two halves that coverage constantly merges. The first is its own search products: classic search and Reddit Answers, the Gemini-powered AI search launched in December 2024.
The two were unified into one experience during Q4 2025.
And its visibility IN Google, where Reddit is among the most exposed large sites on the web.
The disclosed numbers all come from SEC-filed shareholder letters. Those are this page's primary channel because Reddit's own sites block automated reading.
Weekly searchers grew from 60 million (Q1 2025) to 70 million (Q2, with Answers at 6 million weekly users). They reached 75 million (Q3) and more than 80 million (Q4).
Reddit also reported roughly 50 million queries a day as of early 2025.
80M+Weekly searchers on Reddit, Q4 2025Reddit shareholder letter
6MReddit Answers weekly users, Q2 2025Reddit shareholder letter
~50MQueries a day, early 2025Reddit
The Q2 2026 letter disclosed no search figure at all.
The Google relationship runs on three distinct strands.
Organic visibility: Reddit first admitted core-update exposure in its Q4 2024 letter ("volatility with Google Search triggered by a periodic algorithm change", primarily affecting logged-out users). In the March 2026 core update reddit.com lost 64.2 SISTRIX Visibility Index points in Amsive's 2,076-domain analysis.
It rebounded in the following weeks.
That figure is Amsive's analysis of SISTRIX data, not SISTRIX's own claim, and it measures keyword visibility, not traffic.
The traffic mix: Steve Huffman put it at roughly half Google, half direct on the Q3 2025 call. He added that AI chatbots are "not a major traffic driver today".
And the money: the roughly $60-million-a-year data-licensing deal with Google entered public renegotiation in July 2026. That is per WSJ reporting carried by CNBC, and Reddit had discussed switching off Google's AI access entirely.
Meanwhile Reddit Answers itself runs on Google's Gemini, so the dependence points both directions at once.
The product arc to watch: shopping placements inside search results ("browse listings and shop directly within the Reddit search results", per the Q1 2026 letter).
Also on the list: an AI shopping-search test with product carousels, and human verification for accounts flagged as likely bots. Piloted agentic search results complete it.
X (Twitter): the algorithm is literally public, cadence promises aside
The open-source repo is the only citable primary for X ranking, and it contradicts both the myths and the marketing.
X is unique on this page: its ranking system is published code. The xai-org/x-algorithm repo documents the For You pipeline end to end.
Home Mixer orchestrates, and Thunder supplies posts from accounts you follow. Phoenix, a Grok-based transformer, retrieves and ranks by predicting the probability of each engagement type.
Those probabilities are summed with weights and attenuated for author diversity.
The README's central claim: "We have eliminated every single hand-engineered feature and most heuristics from the system." Posts are scored independently of each other, from your context and history.
Three cautions keep X claims honest. First, there are TWO open-sourcings: the 2023 Scala repo describes a system that no longer exists.
Its boosts and heuristics are still quoted as current by guides.
Second, the promised four-week release cadence was not kept. The repo holds 27 commits since January, twenty-four of them in a single run from 13th Aug onwards.
There were gaps of four and three months before it, verifiable in its own history.
Third, the repo is the citable record rather than anything said about it. So Musk's October 2025 direction-setting counts for nothing here unless the code shows it.
He said then that Grok would read every post and video, with heuristics slated for deletion.
Since May 2026 the repo also documents ads blending inside the same ranking pipeline. That is more than most platforms have ever disclosed about how paid and organic content mix.
The August 2026 release went further again. It published the weights that combine predicted actions into a score.
It also published the visibility-filtering systems that decide whether a post is shown at all. Ads code and anything outside the For You timeline remain unpublished.
It also added code comments rebutting the reading of the new weights that had already spread. That reading was that a report cancels out a fixed number of likes.
Both are checkable in the code, which no other platform on this page can offer.
Two claims to retire when you meet them, on X's own authority. First, the weights do not multiply engagement counts, they multiply predicted probabilities.
Second, coordinated mass reporting does not broadly suppress reach. Recommendations are personalised, and an action only counts when it lands on a post the timeline served.
The only official facts about TikTok's algorithm are governance terms, and its search results now sell placement above organic.
TikTok has never explained For You ranking beyond a high-level 2020 post. It publishes no ranking changelog and confirms no algorithm updates.
What it has, uniquely, is official GOVERNANCE. The US joint venture that closed in January 2026 puts the algorithm's operation under the JV.
The executive order's terms require recommendation models using US data to be "retrained and monitored by America's trusted security partners". They are hosted in Oracle's US data centers.
What Oracle retraining changes about ranking behavior is, officially, nothing stated at all. Treat any "the algorithm is changing for your For You page" headline as inference beyond the documents.
The search story is productization. At TikTok World in May 2026, Search Hubs put brand-controlled destinations at the top of the TikTok search results page.
The formats cover brand-name queries, TikTok Shop conversion and category queries where a brand buys exclusive share of voice.
TikTok reports a 36-times-higher engagement rate versus in-feed ads, its own internal figure.
Creator AI Search, inside TikTok One, matches brands to creators from campaign-performance history rather than follower demographics.
That pattern has since recurred twice, which is what makes it a direction rather than an announcement.
On 3rd Jun TikTok said its FIFA World Cup 2026 hubs sit inside the main app. They are reached by searching "FIFA World Cup".
It named the product suite behind them: TikTok GamePlan, sold to teams, leagues and broadcasters to drive discovery. That is a branded destination owning a query, again.
And TikTok GO put bookable travel inventory into search results and location pages in May. It deliberately has no tab of its own.
For anyone doing "TikTok SEO", the target has moved. Ranking first in TikTok search now means ranking first under whatever paid hub or bookable partner owns the query.
That changes what the discipline is optimizing for.
The other JV-era launch on this beat: the opt-in Local Feed in the US, ranked by location, topic and recency. It followed the European rollout in late 2025.
Pinterest: the platform that documents its own ranking
Engineering-blog disclosures with real numbers: what search relevance is, what feed ranking reads, how quality is measured.
Pinterest publishes no dated algorithm updates, but its engineering blog documents the production systems in detail. No other platform on this page matches that candor, and the trail is current.
Search relevance: an LLM teacher classifies query-and-Pin relevance on a five-level scale, reading enriched Pin text. It distills into a lightweight production model, with reported gains including +2.18% search feed relevance (April 2025 post).
Relevance measurement itself moved to fine-tuned LLM judges (December 2025: 73.7% exact match with human labels). It then moved to vision-language models (August 2026 paper).
Feed ranking: TransAct V2 in production Homefeed ranking models up to 16,000 lifelong actions per user. That is a 160-times scale-up over the prior system.
Its input sequence includes SEARCH activity, so what people search on Pinterest shapes what their feed recommends. The June 2025 post carried A/B results: repins up 6.35%, hides down 12.8%.
16,000Lifelong actions per user that TransAct V2 models in Homefeed rankingPinterest Engineering, June 2025
+6.35%Repins in the TransAct V2 A/B test; hides down 12.8%Pinterest Engineering, June 2025
73.7%Exact match between LLM relevance judges and human labelsPinterest Engineering, December 2025
The user-facing controls are official ranking inputs too. The "refine your recommendations" tuner gained per-category controls to see less generative-AI imagery, with AI-modified labels on detected Pins (October 2025).
Board activity officially drives recommendations (boards "Make it yours" and "Boards made for you", October 2025).
Practical reading for marketers: on Pinterest, relevance is modeled semantics plus engagement history. Visual search is VLM-driven and image-first, and the levers that exist are documented.
Claims about fresh-Pin boosts, board-count requirements or hashtag rules have no official source.
Facebook: distribution rules with dates attached
A few official posts a year genuinely change reach, and the 2025-2026 theme is originality enforcement with published results.
Facebook's confirmable beat is a handful of dated posts a year that explicitly change distribution. They sit on top of the standing Content Distribution Guidelines.
That is the official list of what gets reduced Feed distribution, as distinct from what gets removed.
The 2025-2026 arc is originality enforcement. April 2025: posts with long distracting captions, excessive hashtags or unrelated captions go followers-only and lose monetization.
Spam networks lose reach too.
July 2025: accounts reusing others' content get account-level penalties, "reduced distribution on everything they share". Detected duplicates are suppressed in favor of originals ("Simply stitching together clips or adding your watermark does not qualify as meaningful enhancement").
The surface itself is being rebuilt around video. December 2025's redesign moved search results to an immersive grid and added dislike-reason feedback that tunes ranking.
July 2026's test opens the app straight into full-screen video with Classic Feed one tab away.
One reading discipline for Meta posts: the newsroom bundles Facebook, Instagram, Threads and Meta AI stories freely. Only items explicitly about the Facebook surface belong in this section.
Instagram's parallel rules live on our Instagram hub.
LinkedIn: the real record versus the myth industry
Two engineering posts and one product note are the official record. None of the circulating rules appear in them.
Through 2025, LinkedIn confirmed almost nothing about ranking. That changed in 2026 with two engineering-blog disclosures.
The first is the January search-stack post (LLM-judged relevance, a small-language-model reranker, published evaluation numbers).
The second is the March feed post (LLM dual-encoder retrieval and a transformer Generative Recommender). The recommender reads 1,000+ interactions in sequence, and the post names its signals.
A third document covers comments, not posts. A 31st Jul product note says comments are ranked per viewer, and automated or generic ones are shown less.
That is the whole official record, and what it omits is the point. There are no ranking-factor weights, no golden hour, no external-link penalty, no posting-cadence advice, no format multipliers.
Every article asserting those cites, at best, third-party reverse-engineering that LinkedIn has never endorsed.
The 360Brew story deserves its own debunk because it wears academic clothes.
The paper describing a 150-billion-parameter ranking foundation model was posted to arXiv in January 2025. ALL FOUR VERSIONS were later withdrawn, with the administrators' note reading: "This version has been removed by arXiv administrators as the submitter did not have the right to agree to the license at the time of submission".
LinkedIn has never announced 360Brew as its live feed system, and the March engineering post never mentions the name. Whether the Generative Recommender it describes is that work productionized is stated nowhere official, in either direction.
Guides presenting 360Brew as "LinkedIn's officially announced new algorithm" are stacking invented numbers on a withdrawn preprint. Their attached thresholds, like a 35% reply-window boost or a 45% daily-posting penalty, have no official source.
The test from our Instagram hub applies here unchanged. Real ranking news arrives under a named engineer or an official blog, and everything else is inference or invention.
Frequently asked questions
How does the X (Twitter) algorithm work?
It is public code: the xai-org/x-algorithm repo documents Home Mixer orchestrating the For You pipeline. The Grok-based Phoenix model ranks posts by predicted engagement probabilities, summed with weights and diversity attenuation.
Its README says every hand-engineered feature has been eliminated.
Ignore mechanics quoted from the 2023 repo. That is a different, dead system.
Why is Reddit everywhere in Google results, and is that changing?
Reddit rode the 2023-2025 expansion of forum content in Google. About half its traffic came from Google per its CEO in late 2025.
The March 2026 core update cut reddit.com's visibility sharply before a rebound. Amsive's analysis put the loss at 64.2 SISTRIX Visibility Index points, and Reddit itself called search referrals "choppy" in mid-2026.
Volatile is the accurate word, in both directions.
What is Reddit Answers?
Reddit's AI search: it summarizes Reddit conversations with links out. It launched as a US test in December 2024 and runs on Google's Gemini via Vertex AI.
It grew from 1 million to 6 million weekly users during 2025 and expanded into five more languages. It was unified with core Reddit search in late 2025.
Reddit counted more than 80 million weekly searchers overall in Q4 2025.
Who controls TikTok's algorithm now?
TikTok USDS Joint Venture LLC, since 22nd Jan 2026: majority-American ownership with ByteDance at 19.9%. The executive order's terms require all recommendation models using US data to be retrained and monitored by US security partners.
Oracle hosts the algorithm, retrained on US data in its American data centers. Officially, nothing states how, or whether, ranking behavior changes.
How does the TikTok For You algorithm work?
TikTok has never officially explained it beyond a high-level 2020 post naming input categories. It announces no ranking changes.
The confirmed 2026 stories are governance (the joint venture) and search productization. Paid Search Hubs now sit above organic results for covered queries.
That is worth more to a marketer than any unofficial ranking theory.
How does the LinkedIn algorithm actually work?
Per LinkedIn's own 2026 engineering posts, the official record on feed ranking: LLM-based retrieval plus a transformer Generative Recommender. It reads over a thousand of your interactions in order, using profile, engagement-history and post signals.
No golden hour, link penalty, posting cadence or format multiplier appears anywhere official. The 360Brew paper the myth articles cite is a withdrawn preprint LinkedIn never announced as its live system.
Comments are separate: since 31st Jul 2026 LinkedIn ranks them per viewer and shows automated or generic ones less.
Does Facebook penalize unoriginal content?
Yes, explicitly and account-wide: since July 2025, repeat reusers of others' content get reduced distribution on everything they share. Duplicates are suppressed in favor of originals.
Meta's March 2026 results post reported original Reels watch time roughly doubling after the crackdown. Spammy caption and hashtag patterns separately go followers-only under the April 2025 rules.
Spotted a change we have not covered? Ranking volatility, a new SERP test, a platform change: email us a tip and we will credit you if we cover it.
Cite this page:Keywords Everywhere, "Social Algorithm Updates: X, Reddit, TikTok, Pinterest, Facebook and LinkedIn", last updated 25th Sep 2026, https://keywordseverywhere.com/news/social-algorithm-updates/
We Use Cookies
Our website employs cookies and other tracking technologies to enhance your browsing experience by
enabling essential website functionalities, improving your overall experience, gauging your interest
in our products and services, personalizing marketing interactions, and delivering advertisements
that are more pertinent to you.
Cookie Preferences Center
We Value Your Privacy
Cookies are small text files placed on your computer when you access a website. We
utilize cookies for multiple purposes to enhance your online experience on our site,
such as remembering your account login information.
You have the option to adjust your preferences and refuse specific types of cookies
from being stored on your computer while navigating our website. Additionally, you
can delete any cookies already present on your device, but note that removing
cookies might restrict your ability to use certain features of our website.
Essential Cookies
These essential cookies are required to deliver the services offered on our website
and to allow you to utilize specific features.
Without these cookies, we are unable to offer you certain services on our
website.
Permanently Enabled
Functionality Cookies
These cookies are utilized to offer a more personalized experience on our site and to
recall the preferences you set during your visits.
For instance, we may employ functionality cookies to save your preferences
or retain your login information.
Disabled
Tracking Cookies
These cookies gather information to analyze website traffic and understand how
visitors interact with our site.
For example, these cookies may monitor the duration of your visits and the pages you
view, aiding us in enhancing our website for your benefit.
The data collected via these tracking and performance cookies does not identify
individual visitors.
Disabled
Targeting and Advertising Cookies
These cookies are utilized to display advertisements that are likely to interest you
based on your browsing behavior.
These cookies, provided by our content and/or advertising partners, may merge
information gathered from our website with other data they've independently
collected about your web browser's activities across their network of websites.
If you opt to remove or disable these targeting or advertising cookies, you will
continue to see advertisements, but they may not be tailored to your interests.
Disabled
More Information
For any questions regarding our cookie policy and your choices, please contact
us.