User-Generated Platforms, chapter 20 of 54
Interest-Graph Feeds
How follow-free short-video feeds work: watch signals, multi-task value scores, real-time training, staged tryouts, boosts, dispersal, controls and the rules.
A social-graph feed shows you what the people you chose posted. An interest-graph feed shows you what a model predicts you will watch, from anyone, and it needs nothing from you to start: no follows, no friends, no communities joined. Open TikTok, Reels, YouTube Shorts, Snapchat Spotlight, Douyin or Kuaishou for the first time and the first video plays before you have told the app anything. What you do with that video (how long you watch it, whether it loops, how fast you swipe it away) is the first label, and the next video is chosen with it. A few hundred videos later the feed knows more about what holds your attention than your follow list ever said.
That inversion changed the industry. On a follow-graph platform a new user sees an empty feed until they build a graph, and a new creator reaches nobody until they collect followers. On an interest-graph platform both get distribution on day one: the viewer gets a full feed of strangers' videos, and a creator's first post can be tried on viewers who never heard of them and, if it holds attention, widened to millions. The Supreme Court's 2025 opinion on the TikTok divestiture law put the scale of the result in one paragraph: over 170 million US users, and US users uploaded more than 5.5 billion videos in 2023 that were viewed more than 13 trillion times. It also described the system in a few sentences most feed teams would recognize: the feed is generated by a proprietary algorithm from each user's interactions, shaped by moderation and filtering, and TikTok "promotes or demotes certain content to advance its business objectives and other goals."
This chapter explains how that machinery works, mechanically: the signals and why short video makes them dense, the multi-task models and the single value score they feed, retrieval and real-time training from ByteDance's published papers, the staged tryout of a new post, the manual levers (boosts, trend seeding, eligibility demotions), dispersal and filter-bubble controls, generative recommenders as of 2026, and the rules that now reach the algorithm itself: the DSA, China's algorithm filing rules and the US divestiture's retraining requirement. The generic multi-stage pipeline, graph and sequence models, fan-out, cold start, re-engagement and the feed tables are Feeds & Recommendations's; this chapter extends its feed_definitions and feed_impressions and the core data model. The encoding behind instant playback is Video on Demand; the sound graph that links videos through shared audio is Sounds, Remix & Duets; the creator funds that pay on views are Creator Monetization.
How the Platforms Do It#
| Platform | Interest feed | What it has published |
|---|---|---|
| TikTok | For You | Newsroom explainers (2020, 2023) on signals, diversification and controls; For You eligibility standards in its Community Guidelines; a non-personalised option in the EU; a press-reported internal "Algo 101" formula |
| Douyin | Recommendation feed | A Safety and Trust Center (March 2025) describing multi-objective modeling, Wide&Deep ranking and two-tower retrieval |
| ByteDance research | (BytePlus Recommend) | Deep Retrieval (learned index) and Monolith (real-time training with collisionless embeddings) papers |
| Kuaishou | Recommendation feed | OneRec (2025): one generative model replacing the retrieval-and-ranking cascade for a share of traffic |
| Reels, Explore | Mosseri's ranking explainer (2023); AI system cards listing each surface's predictions; trial reels shown to non-followers first | |
| Reels | An AI system card listing predictions and signals; non-personalized Reels through search | |
| YouTube | Shorts, Home | Multitask ranking paper (2019); "valued watchtime" surveys; Shorts view-count definitions |
| Snapchat | Spotlight | A ranking explainer listing predicted actions and signals; automated review, then human review before a wide audience |
| X | For You | Open-sourced ranking code with public engagement weights (2023) and a transformer ranker (2026) |
Three things in that table matter more than any one platform's details. Every platform that publishes describes the same shape: candidates from many sources, models predicting several actions per candidate, a weighted score, then filters, eligibility rules and diversity rules. Every one of them weights attention (watch time, completion, skips) alongside explicit actions. And every one that operates in the EU now ships a way to opt out of the personalized version, which means the interest feed has to exist in two modes.
Social Graph Versus Interest Graph#
The difference is where candidates come from and what qualifies a creator to reach a viewer.
| Social-graph feed | Interest-graph feed | |
|---|---|---|
| Candidates | Posts from accounts and communities the viewer follows | Any eligible item on the platform, retrieved by predicted interest |
| New viewer | Empty until they follow; onboarding asks for follows | Full from the first session; onboarding optionally asks for topics |
| New creator | Reaches their followers, which start at zero | Reaches a tryout audience of strangers on the first post |
| What a follow means | The main input | One signal among many, and a feed of its own (Following) |
| Failure mode | Stale, sparse feeds; incumbents keep reach | Opaque reach; repetition and rabbit holes; reach that can vanish |
TikTok's 2020 explainer stated the creator half plainly: "neither follower count nor whether the account has had previous high-performing videos are direct factors" in the recommendation system. Instagram says Reels now work the same way: it shows a reel first to a small group of non-followers and widens it to progressively larger audiences on engagement, "designed to level the playing field by distributing content based on its engagement" rather than follower count. Meta's January 2026 results claimed a related shift on the supply side: on Instagram it raised the prevalence of original content in the US by 10 percentage points in the fourth quarter of 2025, with 75% of recommendations now coming from original posts.
The consequences reach every other chapter of this book:
- Followers are worth less, and the feed is the product. A creator's audience is rented from the model each time they post. Creator funds that pay per qualified view (Creator Monetization) make the recommendation system the payroll system too.
- Supply grows fastest where distribution is open. If every first post gets a tryout, more people post. The cost is a much larger stream of new items that must be scanned, classified and checked for eligibility before any stranger sees them (The Upload Path).
- Harm travels without a graph. A follow-graph platform's worst content mostly reaches people who sought out its author. An interest feed can carry a video to millions who never did, which is why courts now treat recommendations as the platform's own conduct (Anderson v. TikTok) and regulators investigate the recommender itself.
- Most platforms run both. TikTok, Instagram, YouTube and X all keep a Following feed beside the interest feed, and the DSA's non-profiled option is often the following feed in chronological order.
Why Short Video Learns Fast#
A recommendation model improves with labeled examples, and short video produces them faster than any other format. A ten-minute session of 20-second videos yields thirty or more complete trials, each with a precise outcome: watched to the end or not, looped or not, swiped away at 0.8 seconds or at 15. A long-form video platform gets one or two such trials in the same ten minutes; a text feed gets dozens of impressions but much weaker evidence of whether each was read. And because the next video is chosen after the last one ends, the system can act on a signal within seconds of observing it.
The Wall Street Journal's July 2021 investigation measured how fast that loop converges. It ran bot accounts that were each given an age, a location and a set of interests that were never entered into the app; the bots simply lingered on and rewatched videos that matched. The Journal concluded that TikTok needs only one signal, how long you linger, to learn a user's interests; it fully learned many of the bots' interests in under two hours and some in under 40 minutes. One bot programmed with an interest in sadness and depression reached a feed in which 93% of videos were about sadness or depression after 224 videos (about 36 minutes). TikTok responded that bot behavior isn't representative of real users. The same density that makes the feed feel like it reads minds is what makes it narrow quickly, and both are properties of the format, not of one company.
The Signals#
TikTok's 2020 explainer groups its inputs into user interactions (likes, shares, accounts followed, comments, content created), video information (captions, sounds, hashtags) and device and account settings (language, country, device type), with the last group weighted lower because users don't actively express those as preferences. It names the strongest kind of signal: "whether a user finishes watching a longer video from beginning to end." Every platform's list varies around the same groups.
Watch Time, Completion and Loops
Watch time is the densest signal and the most misleading raw number, because it scales with the video's length. A 7-second video watched three times and a 60-second video watched for 20 seconds are both 21 seconds of watch time and mean opposite things. The platforms that publish normalize:
- Instagram's Reels system card predicts how likely you are to watch more of a reel "than 95% of users who watched reels of the same length", comparing against other viewers of same-length reels rather than an absolute threshold.
- Facebook's Reels system card predicts both "how long you're likely to watch a reel" and "how likely you are to watch a reel to completion," and uses how many times others watched the reel to completion as a signal.
- Snapchat lists watching longer and completing a video among the positive factors for Spotlight.
Loops (the video restarting because the viewer didn't swipe) are a short-video signal with no long-form equivalent. A loop is strong evidence on a 7-second video and weak on a 90-second one, so the useful features are loop count and total watch divided by duration, both capped. How views are counted is a separate, public definition: YouTube's help pages say that from August 24, 2026 views of every format, Shorts included, count the moment playback starts, while Partner Program earnings stay based on "engaged views." A view count is a display and payout definition; the ranking model needs the raw play record underneath it.
Skips and Swipe-Away Speed
How fast a viewer leaves is the negative half of watch time and arrives just as densely. Instagram's Reels card predicts the likelihood that you will "watch less than three seconds"; Facebook's predicts how likely you are "to move on to the next reel after watching one"; X's 2026 ranker predicts "not dwelled" among its negative actions; Snapchat counts skipping as a negative factor. YouTube added a "viewed versus swiped away" metric for Shorts to YouTube Studio in 2023. An early skip is ambiguous for one viewer (they may have swiped by habit) and highly informative in aggregate, which is why it is a primary metric in the tryout rounds below.
Explicit Actions
Likes, comments, shares, saves and follows are sparse and deliberate, and each says something different:
- Shares (in-app to a friend, to a story, off-platform) appear in every published list, because they recruit new viewers. Instagram's Reels card predicts resharing and sharing off Instagram, and Mosseri's explainer lists the likelihood of a reshare first among Reels predictions.
- Follows from a video convert an interest edge into a social one; Instagram predicts "follow the author."
- Using the audio. Instagram predicts whether you will use a reel's audio in your own reel, and its explainer treats a visit to the audio page as a sign you might make a reel of your own. On short-video platforms a sound is an item in its own right; Sounds, Remix & Duets covers that graph.
- Comments are weighted for conversation, and comment ranking is its own system (Meta publishes a card for Instagram comments).
Negative Feedback
"Not interested," hide creator, hide sound, report and unfollow are the cheapest measures of a bad recommendation. TikTok's 2020 explainer lists long-pressing to mark a video "Not Interested," hiding videos from a creator or with a sound, and reporting as inputs to future recommendations. Facebook's Reels card predicts how likely you are "to hide a reel" and "to ask to see less content like this." The open-sourced X weights (below) show how much heavier a negative action counts than a positive one. My rule is to treat explicit negative feedback as both a training label and an immediate filter: a viewer who says "not interested" should stop seeing that creator or sound in the same session, not after the next training run.
The Explicit-Versus-Implicit Problem
Implicit signals are plentiful and ambiguous; explicit ones are clear and rare. Lingering can mean delight, outrage, confusion or a viewer who put the phone down. The employee who leaked TikTok's "Algo 101" document was, per the New York Times, disturbed by the platform's tendency to push users toward sad content, the same pattern the WSJ bots surfaced. Three countermeasures appear across the published systems:
- Ask. YouTube's VP of Engineering wrote in 2021 that clicks were unreliable ("clicking on a video doesn't mean you actually watched it"), that watch time was added in 2012, and that surveys now measure "valued watchtime": viewers rate a video from one to five stars, and only four- and five-star ratings count. Instagram's explainer says Reels ranking is informed by surveys asking whether people find a reel worth their time.
- Model selection bias. A viewer can only react to what was shown, at the position it was shown. YouTube's 2019 multitask ranking paper treats the "implicit selection biases in user feedback" as a core problem and handles it with a Wide & Deep framework; the impression log with positions is what makes any such correction possible (Measuring It).
- Demote outside the model. Content that holds attention for bad reasons is handled by eligibility rules and integrity demotions applied after scoring, not by hoping the model learns it (see Manual Levers).
Objectives: Many Predictions, One Score#
A modern ranker is multi-task: one network with shared layers and one output head per predicted action. It doesn't predict "will they like this video"; it predicts a vector of probabilities and expectations (like, comment, share, follow, finish, loop, skip under three seconds, hide, report, expected watch time), and a value model folds that vector into one number per candidate. The fold is a weighted sum, and the weights are editorial policy written as arithmetic (What the Feed Optimizes; the general technique is Weighing Objectives).
The press-reported version of TikTok's formula comes from "TikTok Algo 101," an internal document written for non-technical staff that the New York Times reported in December 2021 and TikTok confirmed as authentic. As Gizmodo quoted the Times, the document gives a "highly simplified" equation:
Plike × Vlike + Pcomment × Vcomment + Eplaytime × Vplaytime + Pplay × Vplay
P is a predicted probability, E an estimated value (playtime), and V the value the company assigns to that outcome. The document says the real equation is much more complicated but follows the same logic, and, per the Times, it optimizes for two closely related metrics, "retention" and "time spent," in service of adding daily active users.
X's open-sourced heavy ranker published actual weights, as of April 5, 2023, with the warning that they can change at any time:
| Predicted engagement | Weight |
|---|---|
| Like | 0.5 |
| Repost | 1.0 |
| Reply | 13.5 |
| Profile click followed by a like or reply | 12.0 |
| Click into the conversation, then reply or like | 11.0 |
| Click into the conversation and stay two minutes or more | 10.0 |
| Watch at least half of a video | 0.005 |
| Reply that the author then engages with | 75.0 |
| Negative feedback (show less often, block, mute) | -74.0 |
| Report | -369.0 |
The score is the sum of each predicted probability times its weight. The table shows the design, not X's current numbers: rare, effortful actions carry large weights so that a small probability of them can outrank a large probability of a like; a negative action outweighs dozens of positive ones; and a text-first platform barely weighted video watching. X's 2026 replacement keeps the same formula, Final Score = Σ (weight_i × P(action_i)), with positive weights on positive actions and negative weights on negative ones, and its README groups the actions (engagement, clicks, attention, author, negative); the repository ships default weights in a parameter file, with the caveat that live values come from a configuration system and can differ during experiments.
The other published systems describe the same structure in less detail. YouTube's 2019 paper optimizes "multiple competing ranking objectives" with Multi-gate Mixture-of-Experts, so that tasks share some layers and specialize in others. Douyin's 2025 disclosure says its system estimates the probability of user actions and uses "multi-objective modeling" for "higher-quality and more diverse" recommendations. Snapchat says Spotlight predicts actions like favoriting and sharing and how long you will watch, and "the predictions are then used to assign a score."
Three practices separate a deliberate value model from an accidental one:
- Calibrate the heads. A weighted sum of probabilities only means something if each head outputs a calibrated probability. A head that is overconfident after a retrain silently raises the effective weight of its action; I check calibration per head on every model version, not just overall AUC.
- Normalize attention by length. Use watch ratio, completion against same-length peers and capped loops, not raw seconds, or the value model will learn to prefer long videos for reasons that have nothing to do with the viewer.
- Version the weights as their own release. Changing a weight changes what millions of people see and what thousands of creators earn. It ships through an experiment with guardrail metrics like any model (Guardrail Metrics), and it gets its own row in
ranking_models(below), because "when did the feed change" is a question from creators, regulators and plaintiffs.
Retrieval for an Interest Feed#
Retrieval for an interest feed differs from a social feed in one respect: the follow graph supplies a small share of candidates, so most must come from models over the whole corpus. The stages are the same as in The Recommendation Pipeline; the published systems show the retrieval choices.
- Two-tower retrieval. One network embeds the viewer, another embeds each item, and candidates are the items whose vectors are nearest the viewer's. Douyin's 2025 disclosure describes a two-tower retrieval model producing "digital fingerprints" for users and videos, where closer fingerprints make a video more likely to be recommended. X's 2026 Phoenix retrieval "embeds the viewer and each post as vectors, and returns the posts nearest the viewer," beside Thunder, which holds recent in-network posts in memory.
- Learned indexes. ByteDance's Deep Retrieval paper (2020) skips the nearest-neighbor index. It learns a structure of D layers with K nodes each, where a path through one node per layer is a cluster of items; each item is assigned to several paths, the assignments are model parameters learned with an EM-style algorithm, and serving runs a beam search for the most probable paths and reranks their items. In a live A/B test on a short-video platform with hundreds of millions of users and items, against a well-tuned baseline of FFM embeddings with HNSW search, it reported +3.0% video finish rate, +0.87% app view time and +0.036% second-day retention, and found that it recommended "much more" of less popular videos and creators, because items in a path are indistinguishable at retrieval and a little-known video sharing behavior with popular ones gets retrieved too. Rebuilding its structure took about 10 minutes, which matters for a corpus that gains new items every second.
- Cheap pre-ranking to about a hundred. Instagram's Reels card says a lightweight model selects "approximately 100 of the most relevant reels"; Facebook's says "approximately 10-100." Heavy ranking runs only on those.
- Candidate isolation. X's 2026 ranker lets candidates attend to the viewer's context but not to each other, so a candidate's score doesn't depend on which other candidates happened to be in the batch, which keeps scores cacheable and comparable.
Fresh items are the retrieval problem particular to this format. An item uploaded a minute ago has no engagement and, in an embedding index rebuilt nightly, no vector. Interest feeds need content embeddings computed at upload from the video, audio and text (so a new item is retrievable on content alone), an index that accepts inserts continuously, and a dedicated tryout source (below) that doesn't depend on retrieval at all.
Real-Time Training#
The second ByteDance paper, Monolith (2022), explains why minute-fresh models matter and how to build them. Its premise is that recommendation data differs from vision or language data in two ways: features are "mostly sparse, categorical and dynamically changing" (user ids, video ids, sound ids, hashtags appear and disappear constantly), and the distribution is non-stationary; as the paper puts it, the same user "interested in one topic could shift their zeal every next minute." Its design, deployed in ByteDance's BytePlus Recommend product (the paper doesn't say which consumer apps use it):
- A collisionless embedding table. Standard frameworks hash ids into a fixed-size table, so different ids share a row and their information is cramped together (the paper's first design principle is to avoid "cramping" different ids into one embedding). Monolith uses a cuckoo hashmap (two tables with different hash functions; an insert that lands on an occupied slot evicts the occupant to its alternative slot) so every id gets its own embedding. On MovieLens, the hashing baseline it compares against collided 7.73% of user ids and 2.86% of movie ids, and the collisionless model had higher AUC from the first epoch.
- Admission and expiry. Ids are admitted only after appearing a tunable number of times (plus a probabilistic filter), and embeddings expire after a tunable period of inactivity per table. A video id that stops appearing frees its memory; a one-off id never takes any.
- Online training from a stream. User actions go to one Kafka queue and serving-time features to another; a Flink job joins them by a unique request key into training examples, holding features that wait for late actions in an on-disk store, and online training consumes the joined stream directly while batch training reads the same examples dumped to HDFS. Negative sampling is corrected at serving time so the model stays an unbiased estimator.
- Split parameter sync. Sparse embeddings dominate model size but only a few change per batch, so Monolith tracks touched keys and pushes only those from training to serving parameter servers at minute-level intervals; dense weights move slowly and sync at day level, at low-traffic times. The paper estimates 100,000 updated ids a minute at dimension 1,024 as about 400 MB a minute.
- Reliability traded for freshness. It snapshots daily and accepts that a failed parameter server shard loses a day of updates for a small fraction of users, calculating the loss as acceptable.
Its results quantify freshness. On the Criteo dataset, syncing every 5 hours, 1 hour and 30 minutes gave online AUCs of 79.66, 79.78 and 79.80, each above batch training; in a live A/B test of an ads model, online training improved AUC over batch training by 14.0% to 18.1% across seven days.
For an interest feed, freshness is not a nicety:
- Trends. A sound or format that takes off this afternoon has ids that didn't exist this morning. A model trained nightly can't rank them until tomorrow, by which time the trend may be over.
- New items and new creators. Their embeddings start from content features and become behavioral only as engagement arrives; minute-level updates are what let a tryout round's results change the model while the round still matters.
- The first session. A new user's embedding is learned during the session that decides whether they return.
The engineering costs are the ones the playbook describes for any online model (Features and Training/Serving Skew; Monitoring and Drift), sharpened. Log features at serving time and train on what was served, because recomputing features later trains on a world the model never saw. Join late labels with a window: a loop or a share can arrive minutes after the impression, and the joiner's window decides whether it counts (Watermarks and Late Data). Guard the stream: an online model learns from attackers as fast as from users, so fake engagement must be filtered before the joiner, not after the model has learned it (Vote Rings and Manipulation).
Generative and Sequence Recommenders#
From 2024 the published frontier moved from many hand-built features and a cascade of models toward treating a user's history as a sequence and the recommendation as the next item in it.
- Meta's HSTU ("Actions Speak Louder than Words," ICML 2024) reformulates recommendation as sequential transduction over a user's actions, "Generative Recommenders," with an architecture built for high-cardinality, non-stationary streaming data. The paper reports 1.5-trillion-parameter models deployed on multiple surfaces of a large internet platform with a 12.4% improvement in online A/B metrics, runs 5.3 to 15.2 times faster than FlashAttention2-based transformers on 8,192-long sequences, and finds model quality scaling as a power law of training compute across three orders of magnitude.
- Kuaishou's OneRec (technical report, June 2025, revised September 2025) replaces the cascaded retrieval and ranking architecture with one end-to-end generative model, and reports that reinforcement learning shows significant potential within it. It reports a tenfold increase in model FLOPs, operating expense of 10.6% of the traditional pipeline, handling 25% of total queries per second in the Kuaishou and Kuaishou Lite apps, and stay-time gains of 0.54% and 1.24% in the two apps.
- X's 2026 ranker is a transformer that predicts each action for each candidate from the viewer's context, with candidates isolated from one another.
What changed is where the knowledge lives: in a long sequence of raw actions rather than in engineered aggregates (a creator's 7-day completion rate, a user's top hashtags), and in one large model rather than a chain of small ones, which makes compute, not feature engineering, the scaling axis. What didn't change is everything outside the model. Eligibility rules, integrity demotions, blocks and age filters, dispersal rules, manual overrides, the non-profiled mode and the impression log still sit around it, and they have to, because a generative model can't be asked to promise that it never shows a blocked author or an ineligible video. My default is to keep those as explicit stages that run on the generator's output, with the same records as before, so a model swap doesn't change what can be audited.
Distributing New Videos#
The staged tryout is how an interest feed turns "anyone can be recommended" into a budget it can afford. Instagram describes it directly: a reel is first shown to a small group of non-followers, and the best performers reach progressively wider audiences. Snapchat describes the safety version: Spotlight content is "first reviewed via automation" before being recommended, and once it "gains a certain number of views, it is reviewed by human moderators" before it can reach a large audience. TikTok's own published statements are narrower: follower count is not a direct factor, videos "that have just been uploaded or are under review" may be ineligible for recommendation, and creators can see in analytics whether a video was made ineligible. I found no TikTok page that describes its tryout stages or their sizes, and the audience numbers that circulate among creators are not sourced to the company, so this section describes the mechanism, not TikTok's parameters. TikTok publishes no audience sizes per round, so the rounds below describe the mechanism, not TikTok's numbers.
A tryout runs in rounds:
- Gate. The item passes upload scanning, classification and eligibility checks. Until then it is visible on the creator's profile but not a candidate for strangers.
- Seed round. A small audience is drawn: some of the creator's followers (where the platform includes them), and viewers whose interest embeddings are near the item's content embedding. The audience is chosen to be representative of where the item would go, not the most likely to love it, or every round looks better than the next.
- Measure against peers. The round's metrics are compared with items of similar length, format and audience: completion against same-length peers, early-skip rate, loop rate, shares and follows per impression, negative feedback and reports per impression.
- Decide. Widen to a larger and broader audience, hold, or stop. A decision to widen past a threshold of reach triggers review where the policy requires it (Snapchat's human review before a large audience is the published example), and a classifier or report signal arriving mid-round pauses widening.
- Repeat with larger rounds until the item saturates its audience, a negative signal stops it, or it ages out.
Three properties keep this honest:
- Exploration is a reserved share, not a leftover. Some fraction of every viewer's impressions goes to tryout items, decided per surface and per viewer, and logged as exploration in the impression log so evaluation can separate exploration from exploitation (Cold Start).
- Rounds are records. Each round's audience, size, metrics, baseline and decision is a row, so a creator's "why did my video stop at 300 views" has an answer, and the platform can measure how often tryouts reach review, how often reviews stop them, and how long the gates take.
- Creators get the outcome, not the parameters. Platforms show creators views, completion, the share of views from the For You or equivalent feed versus follows and search, and whether a video was ineligible; Instagram's trial reels show views, likes, comments and shares about 24 hours after posting and can share a trial automatically to followers if it performs well within 72 hours. Publishing the thresholds invites gaming; publishing nothing invites conspiracy theories about "shadowbans." A per-video eligibility status and traffic-source breakdown is the useful middle.
A tryout is also an experiment on creators, with the interference that implies: changing the tryout policy changes which creators grow, which changes what everyone's feed holds next month. Creator-side holdouts and long-run supply metrics (Supply and Creator Health) belong in every tryout experiment.
Manual Levers#
The algorithm is not the only author of the feed. Every platform also has people who push items up or down.
Heating. In January 2023 Forbes reported, from six current and former TikTok and ByteDance employees and an internal document, that TikTok staff could hand-pick videos and boost them into For You feeds, a practice called "heating." An internal document cited by Forbes described it as "boosting videos into the For You feed through operation intervention to achieve a certain number of video views." TikTok confirmed the process. Its spokesperson said it promotes some videos to "help diversify the content experience" and to introduce celebrities and emerging creators, that only a few people based in the US can approve US content for promotion, and that such content makes up about 0.002% of videos in For You feeds; the internal document put heated videos at 1% to 2% of all TikTok views, a figure about views rather than videos. Forbes reported that some employees had heated their own accounts and their spouses' accounts.
The useful lesson is not that heating exists (every platform seeds launches, partners and events) but which properties made it a scandal: it was undisclosed, the target was a number of views rather than a test, and the controls didn't stop self-dealing. A defensible manual boost has a stated purpose from a short list, a reach cap, an expiry, a requester and a different approver, no relationship between approver and beneficiary, and a record that ends up in the impression log next to the algorithm's own choices. A boost bought with money is an ad and gets an ad's disclosure (Ads & Data Licensing).
Trend seeding. Platforms seed trends: a featured hashtag challenge, a sound promoted at launch, an event hub. These are boosts of a class of items rather than one, with the same record requirements, and they interact with the sound graph (Sounds, Remix & Duets).
Eligibility demotions. The larger manual lever points down. TikTok's For You eligibility standards say it makes "ineligible for the FYF certain content that may not be suitable for a broad audience," that such content can still be found through search or the creator's profile, and that low views don't necessarily mean a rule was broken. Its Community Guidelines name categories that may be viewable only by adults or ineligible for the feed, among them graphic footage of events that are in the public interest to view, such as wars and major disasters; graphic physical altercations; misinformation that may cause moderate harm; unverified information about crises or major civic events; content temporarily under review by fact-checkers; and unoriginal or reused material with nothing new added. Instagram says reels may be made less visible if they are low-resolution, watermarked, muted, have borders, are mostly text or were already posted on Instagram. Snapchat says content allowed on Snapchat isn't always recommended, and it can decline to recommend based on moderation history, user feedback, engagement signals or editorial discretion.
That is a third state between allowed and removed, and it needs to be modeled as one. An item can be published and visible to followers while ineligible for strangers, eligible only for adults, or limited in how often it can be shown; the state has a reason, a policy version, a decider and an appeal path, and the creator can see it. Removal belongs to moderation; eligibility is the recommendation system's own enforcement layer, and it is what transparency reports and the DSA's statements of reasons increasingly have to count.
Diversity, Repetition and Filter Bubbles#
A ranker that scores each candidate independently will happily serve five videos in a row from the creator you just watched. Every interest feed applies diversity rules after scoring.
Dispersal rules. TikTok's 2020 explainer says the feed generally won't show "two videos in a row made with the same sound or by the same creator," and that it won't recommend duplicated content, content you've already seen, or spam. X's 2026 mixer multiplies "each post after an author's first" by a decaying factor down to a floor, which is the soft version of the same rule. Snapchat says it mixes in other content, such as news or "hidden gems," even when you watch a lot of one topic, and applies "further adjustments and limits so a diverse range of content is shown."
Interrupting repetitive patterns. The harder problem is topical: a feed can be varied in creators and sounds and still be all about one thing. TikTok's March 2023 announcement says it intersperses a variety of topics, substitutes videos about other topics into clusters of sad or extreme-diet themes, and limits how often even recovery or educational content on those themes is eligible. Its eligibility standards name the patterns it tries not to repeat: "extreme fitness or dieting, sexual suggestiveness, sadness, or overgeneralized mental health advice." Dispersal across a session is a page-level constraint (no two adjacent items share an author or sound); pattern interruption is a session-level budget (no more than a share of the last N items from one sensitive topic cluster), and it needs topic labels on items, which the classifiers from Moderation at Scale supply.
The investigations. The WSJ's 2021 bots and the "Algo 101" leak put the rabbit-hole question in public. The European Commission's formal proceedings against TikTok, opened on February 19, 2024, cover the "rabbit hole effect" of its recommender systems alongside addictive design, and the Commission's February 6, 2026 preliminary findings named its "highly personalised recommender system" among the addictive features and said TikTok may need to adapt it (Regulators & Enforcement). Douyin's vice president publicly rejected the idea that its algorithms create filter bubbles in January 2025, during a Chinese regulatory campaign aimed at, among other things, filter bubbles.
User controls. The controls platforms ship are inputs to the same pipeline, and each has a precise meaning to implement:
| Control | Platforms (published) | What it does to the pipeline |
|---|---|---|
| Not interested | TikTok, Instagram, Facebook (as "see less"), X | A training label and an immediate filter on similar items |
| Hide a creator or sound | TikTok | A standing filter in every retrieval source |
| Keyword filters | TikTok (over 200 million words filtered globally as of June 2025; AI-extended "smart" filters) | A standing filter on captions, hashtags and transcripts |
| Topic levels | TikTok Manage Topics (over 10 topics, June 2025; an AI-generated content control announced for testing in November 2025) | A per-topic weight or budget in mixing; TikTok says it won't eliminate topics entirely |
| Sensitive content level | Instagram (the "more" option unavailable under 18) | An eligibility threshold for unconnected accounts' content |
| Refresh or reset | TikTok Refresh (March 2023); Instagram reset across Explore, Reels and Feed (tested from November 2024) | Discard the learned interest profile and restart as a new user |
| Why this video | TikTok (December 2022) | An explanation from the impression record |
| Non-personalized feed | TikTok in the EU (August 2023); Facebook Reels through search | Switch to a feed definition without profiling |
Two of these need care. A reset is not a delete. TikTok says Refresh shows the feed "as if they just signed up" and that it "won't override any settings you've already chosen to enable," with followed accounts kept; Instagram's reset lets you review follows on the way. Implemented, a reset sets a cutoff before which the viewer's history no longer feeds their profile, reinitializes their embedding, keeps their explicit filters, and is itself recorded; the history may still exist for other lawful purposes (Data Retention & Deletion). An explanation is only as good as the record. "Why this video" can only state reasons the impression log captured: the candidate source, the matched interest, the region's popularity, an override.
The Rules#
The interest feed is now regulated as a system in its own right, and four regimes reach the algorithm directly.
The EU. DSA Article 27 requires recommender parameters in the terms and, where there are several options, a way to select and change them; Article 38 requires very large platforms to offer at least one option not based on profiling (Feed Rules from Regulation). TikTok's answer, announced on August 28, 2023, is the template for an interest feed: with personalisation off, For You shows "locally relevant and globally 'popular' videos," Following and Friends show followed creators "in chronological order only," and search returns popular content from the user's region in their preferred language. Building it means a popularity ranking per region and language that uses no per-viewer history, a feed definition marked as non-profiled, and every surface (For You, Live, search, notifications) honoring the choice. Beyond Articles 27 and 38, the Article 34 and 35 duties to assess and mitigate systemic risks reach the design itself, and the Commission's addictive-design case against TikTok is the test: as of October 2026 its findings are preliminary, and if confirmed, a non-compliance decision can carry a fine of up to 6% of worldwide annual turnover (Regulators & Enforcement).
China. The Provisions on the Administration of Algorithmic Recommendation of Internet Information Services, issued by the Cyberspace Administration of China with three other agencies and effective March 1, 2022, require providers to offer "a choice to not target their individual characteristics" and "a convenient option to switch off algorithmic recommendation services" (Article 17), to let users choose or delete the tags used to profile them, not to lead users "to addiction or excessive consumption" (Article 8) or lead minors to online addiction (Article 18), not to manipulate topic lists or search rankings (Article 14), and, for services with "public opinion properties or social mobilization capabilities," to file the algorithm within 10 working days of providing the service (Article 24). In March 2025 Douyin launched a Safety and Trust Center explaining its recommendation principles, after a three-month campaign by the Cyberspace Administration and other agencies against algorithmic problems including filter bubbles. Profile tags that users can see and delete are a schema requirement there, not a feature.
The United States. The Protecting Americans from Foreign Adversary Controlled Applications Act (Public Law 118-50, Division H) made distributing or hosting TikTok unlawful unless it underwent a "qualified divestiture," which the Act defines to preclude any operational relationship with ByteDance, "including any cooperation with respect to the operation of a content recommendation algorithm." The Supreme Court upheld the Act on January 17, 2025. A series of executive orders delayed enforcement, and Executive Order 14352 of September 25, 2025 determined that a framework agreement for a US joint venture would be a qualified divestiture. Among its findings, the divestiture puts "the operation of the algorithms and code, as well as content-moderation decisions," under the joint venture's control, and "requires all recommendation models, including algorithms, that use United States user data to be retrained and monitored" by trusted security partners. TikTok USDS Joint Venture LLC was established in January 2026, with Oracle, Silver Lake and MGX holding 15% each and ByteDance 19.9%, and said it "will retrain, test, and update the content recommendation algorithm on U.S. user data," with the algorithm "secured in Oracle's U.S. cloud environment" and source code reviewed with Oracle as its trusted security partner. NPR reported that ByteDance would still own the underlying algorithm and, under the deal, license it to the US entity for retraining, and quoted a former Treasury official who said the structure doesn't meet the "clean break" the law requires. As of October 2026 I found no public statement from the joint venture that the retraining is complete or that the US feed has switched to a retrained model, so the status is "committed and in progress, completion unannounced."
The engineering content of that deal generalizes beyond one company: a recommendation model can be subject to data residency, code review and lineage requirements. That means knowing, for every model version that served, which region's data trained it, which code built it, who reviewed it, and where it ran. Those are columns, not a document.
Minors and liability. Feed and notification rules by age are Minors, Age Assurance & US State Law's, and the claims that a recommendation was the platform's own conduct are The Law of Hosting User Content's. Both point at the same records: what was recommended, to whom, by which model, with which demotions and boosts.
How to Build It#
The chapter's additions to the core model and to feed_definitions and feed_impressions from Feeds & Recommendations:
CREATE TABLE ranking_models ( -- every model and value-model version that served
id UUID PRIMARY KEY DEFAULT uuidv7(),
role TEXT NOT NULL CHECK (role IN ('content_embedding', 'retrieval',
'pre_rank', 'rank', 'value', 'generative')),
name TEXT NOT NULL,
version TEXT NOT NULL,
objective_weights JSONB, -- value models: {"p_share": 8.0, "p_hide": -60.0, ...}
embedding_dim INT, -- embedding and retrieval models
training_mode TEXT NOT NULL CHECK (training_mode IN ('batch', 'online')),
sparse_sync_secs INT, -- online: how stale serving embeddings may be
dense_sync_secs INT,
training_data_region TEXT NOT NULL, -- 'us', 'eu', 'global': residency of training data
uses_profiling BOOLEAN NOT NULL, -- may it serve a non_profiled feed? (never)
code_ref TEXT NOT NULL, -- the reviewed build that produced it
reviewed_by TEXT, -- the security partner or internal reviewer
experiment_ref TEXT, -- the experiment that shipped it
serving_during TSTZRANGE, -- null until deployed
UNIQUE (name, version)
);
ALTER TABLE feed_impressions
ADD COLUMN value_model_id UUID REFERENCES ranking_models (id),
ADD COLUMN exploration BOOLEAN NOT NULL DEFAULT FALSE,
ADD COLUMN distribution_round_id UUID, -- distribution_rounds; set for tryout serves
ADD COLUMN override_id UUID; -- distribution_overrides; set when one applied
CREATE TABLE watch_events ( -- one row per play of a served item; by day
served_at TIMESTAMPTZ NOT NULL, -- with request_id and position: the impression
request_id UUID NOT NULL,
position SMALLINT NOT NULL,
play_seq SMALLINT NOT NULL DEFAULT 1, -- swiping back starts a new play
content_item_id UUID NOT NULL REFERENCES content_items (id),
viewer_account_id UUID REFERENCES accounts (id),
duration_ms INT NOT NULL, -- the rendition's length at serve time
first_pass_ms INT NOT NULL, -- watched before the first loop or exit
total_watch_ms INT NOT NULL, -- including loops
loops SMALLINT NOT NULL DEFAULT 0,
completed BOOLEAN NOT NULL, -- first pass reached the end
exit_action TEXT NOT NULL CHECK (exit_action IN ('swipe_next', 'swipe_back',
'open_profile', 'open_sound', 'open_comments', 'share', 'background',
'session_end')),
sound_on BOOLEAN,
ended_at TIMESTAMPTZ NOT NULL,
PRIMARY KEY (served_at, request_id, position, play_seq),
CHECK (first_pass_ms <= total_watch_ms)
) PARTITION BY RANGE (served_at);
CREATE TABLE recommendation_feedback ( -- explicit steering: labels and short-term filters
id UUID PRIMARY KEY DEFAULT uuidv7(),
account_id UUID NOT NULL REFERENCES accounts (id),
kind TEXT NOT NULL CHECK (kind IN ('not_interested', 'interested',
'see_less_topic', 'see_more_topic')),
content_item_id UUID REFERENCES content_items (id), -- the item it was given on
request_id UUID, -- the served page, for the training join
topic TEXT, -- for topic feedback
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE feed_preferences ( -- standing controls, applied in every source
account_id UUID NOT NULL REFERENCES accounts (id),
kind TEXT NOT NULL CHECK (kind IN ('hide_author', 'hide_sound', 'keyword_filter',
'topic_level', 'sensitive_content_level')),
key TEXT NOT NULL, -- account id, sound id, keyword, topic, 'level'
value TEXT, -- topic_level: 'less' .. 'more'; null for hides
expanded TEXT[], -- keyword_filter: AI-suggested variants shown to user
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (account_id, kind, key)
);
CREATE TABLE feed_resets ( -- "start fresh": a cutoff, not a deletion
id UUID PRIMARY KEY DEFAULT uuidv7(),
account_id UUID NOT NULL REFERENCES accounts (id),
surfaces TEXT[] NOT NULL, -- {'for_you'} or {'explore', 'reels', 'feed'}
history_cutoff TIMESTAMPTZ NOT NULL, -- history before this no longer feeds the profile
requested_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
completed_at TIMESTAMPTZ -- embedding reinitialized, caches purged
);
CREATE TABLE recommendation_eligibility ( -- published is not the same as recommendable
id UUID PRIMARY KEY DEFAULT uuidv7(),
content_item_id UUID NOT NULL REFERENCES content_items (id),
state TEXT NOT NULL CHECK (state IN ('pending_review', 'eligible',
'ineligible', 'adults_only', 'limited')),
reason TEXT, -- policy key: 'unverified_emergency_claim', ...
policy_version TEXT NOT NULL,
decided_by_type TEXT NOT NULL CHECK (decided_by_type IN ('rule', 'classifier',
'reviewer')),
decided_by UUID REFERENCES accounts (id),
moderation_decision_id UUID REFERENCES moderation_decisions (id),
creator_notified_at TIMESTAMPTZ, -- shown in the creator's analytics
valid_during TSTZRANGE NOT NULL,
EXCLUDE USING gist (content_item_id WITH =, valid_during WITH &&)
);
CREATE TABLE distribution_rounds ( -- a new item's tryout, widening on performance
id UUID PRIMARY KEY DEFAULT uuidv7(),
content_item_id UUID NOT NULL REFERENCES content_items (id),
round SMALLINT NOT NULL,
audience TEXT NOT NULL CHECK (audience IN ('followers', 'seed_non_followers',
'interest_cluster', 'broad_regional', 'broad_global')),
target_impressions INT NOT NULL,
served_impressions INT NOT NULL DEFAULT 0,
metrics JSONB, -- completion vs peers, early skips, shares, negatives
peer_baseline_ref TEXT, -- which length/format/region cohort it was compared to
decision TEXT CHECK (decision IN ('widen', 'hold', 'stop', 'needs_review')),
decided_by_type TEXT CHECK (decided_by_type IN ('policy', 'reviewer')),
review_required BOOLEAN NOT NULL DEFAULT FALSE,
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
closed_at TIMESTAMPTZ,
UNIQUE (content_item_id, round)
);
CREATE TABLE distribution_overrides ( -- manual boosts and demotions; never silent
id UUID PRIMARY KEY DEFAULT uuidv7(),
target_type TEXT NOT NULL CHECK (target_type IN ('content_item', 'account', 'sound',
'tag')),
target_id TEXT NOT NULL,
direction TEXT NOT NULL CHECK (direction IN ('boost', 'demote')),
purpose TEXT NOT NULL CHECK (purpose IN ('creator_onboarding', 'event',
'public_information', 'trend_seed', 'integrity', 'legal')),
justification TEXT NOT NULL,
multiplier NUMERIC(6, 3) NOT NULL, -- applied to the value score after ranking
impression_cap BIGINT, -- boosts must stop somewhere
regions TEXT[], -- null: everywhere
requested_by UUID NOT NULL REFERENCES accounts (id),
approved_by UUID REFERENCES accounts (id),
approved_at TIMESTAMPTZ,
valid_during TSTZRANGE NOT NULL,
revoked_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CHECK (approved_by IS NULL OR approved_by <> requested_by),
CHECK (direction = 'demote' OR impression_cap IS NOT NULL),
CHECK (upper(valid_during) - lower(valid_during) <= INTERVAL '30 days')
);
Notes on the sketch:
- Watch events are the label stream, keyed to the impression they came from, with duration stored at serve time so completion is computable after the creator trims or replaces the video. They live in the event stream and warehouse at production volume, like impressions; the table is the contract (Streaming).
- Feedback and preferences are different things. "Not interested" on one video is an event: a training label and a session filter. "Hide this creator" is a standing preference that every retrieval source must apply, cached per viewer with explicit invalidation like blocks. Blocks themselves stay in
blocks. - Eligibility is a time range per item, never overlapping, so "was this video recommendable on March 3" is a lookup, and an appeal that restores eligibility closes one range and opens another. The candidate index filters on current eligibility, and render re-checks it.
- Rounds and overrides are referenced from impressions, so every serve that came from a tryout or a manual lever is countable, and the share of reach that came from people rather than the model is a query.
- Overrides need a second person and expire. The checks enforce the structural rules; a policy that approvers can't approve their own accounts, relatives or business partners is enforced in the approval service and audited below.
- Model rows carry lineage: training data region, reviewed code, reviewer, the experiment that shipped it, and when it served.
uses_profilinglets the serving layer refuse to use a profiling model for anon_profiledfeed definition. - Events:
watch.completed,feedback.recorded,feed.reset_requested,eligibility.changed,distribution.round_closedandoverride.approvedgo through the outbox (The Transactional Outbox); the online training joiner consumes watch and feedback events, and the creator analytics service consumes eligibility and round events.
A tryout round's decision, comparing the item to same-length peers:
WITH served AS (
SELECT w.*
FROM feed_impressions i
JOIN watch_events w USING (served_at, request_id, position)
WHERE i.distribution_round_id = $1 AND w.play_seq = 1
), item AS (
SELECT count(*) AS plays,
avg(least(w.first_pass_ms::real / w.duration_ms, 1)) AS watch_ratio,
avg((w.first_pass_ms < 3000)::int) AS early_skip_rate,
avg((w.exit_action = 'share')::int) AS share_rate,
(SELECT count(*) FROM recommendation_feedback f
WHERE f.kind = 'not_interested'
AND f.request_id IN (SELECT request_id FROM served))::real
/ greatest(count(*), 1) AS negative_rate
FROM served w
)
SELECT item.*,
item.watch_ratio / p.watch_ratio AS watch_ratio_vs_peers,
item.early_skip_rate / p.early_skip_rate AS early_skip_vs_peers
FROM item
CROSS JOIN peer_baselines p -- warehouse view per length/format/region
WHERE p.cohort = (SELECT peer_baseline_ref FROM distribution_rounds WHERE id = $1);
Dispersal, checked against what was actually served (any adjacent pair from the same author is a bug, not a tuning question):
SELECT request_id, position, author_account_id
FROM (
SELECT i.request_id, i.position, c.author_account_id,
lag(c.author_account_id) OVER (PARTITION BY i.request_id ORDER BY i.position)
AS prev_author
FROM feed_impressions i
JOIN content_items c ON c.id = i.content_item_id
WHERE i.served_at >= now() - INTERVAL '1 hour' AND i.surface = 'home'
) s
WHERE author_account_id = prev_author;
The same check joined through sound_uses (from Sounds, Remix & Duets) covers the "same sound" rule.
The loop that ties the tables together, per request and per minute:
- Request. Read the viewer's feed mode (
accounts.feed_mode_id); if the definition is non-profiled, serve the regional popularity ranking and skip to step 6. - Retrieve. Query the sources (following, two-tower or learned-index retrieval, related to recent watches, trending in region, the tryout pool for the viewer's reserved exploration share), excluding
blocks,feed_preferenceshides and filters, and items without current eligibility. - Rank. Pre-rank to about a hundred, run the multi-task ranker, fold heads with the serving value model, apply demotions and approved overrides as multipliers.
- Mix. Apply dispersal (author, sound), topic budgets from pattern-interruption rules and the viewer's topic levels, insert ads and modules.
- Check at render. Re-read state for the final page: removals, new blocks, eligibility changes.
- Log. Write the page to
feed_impressionswith candidate source, model versions, exploration, round and override ids, and the features used, as served. - Learn. The client streams plays to
watch_eventsand actions to their tables; the joiner pairs labels with logged features within its window; online training updates sparse embeddings, which sync to serving within minutes and dense weights daily; tryout rounds close when their targets are met and write their decisions.
Auditing#
- Boosts and demotions: every override with purpose, requester, approver, validity, cap and the impressions it produced; approvals by people related to the beneficiary flagged; the share of total impressions from overrides per month, which is the number a spokesperson will be asked for (Audit Trails).
- Eligibility decisions: every range with its reason, policy version, decider and appeal outcome, counted by reason for transparency reporting and the DSA's statements of reasons (Transparency Reporting).
- Tryout outcomes: rounds per item, decisions and the reviews they triggered, so a creator's complaint and a regulator's question about distribution fairness can both be answered from data.
- Non-profiled proof: for each account in a non-profiled mode, impressions served only under
profiled = falsefeed definitions by models withuses_profiling = false, and no personalized notifications; the query returning zero violations is the evidence the DSA's Article 38 option works on every surface. - Model lineage: which value weights and model versions served when, which region's data trained them, which reviewed code built them, and the experiments that shipped them, for the retraining and oversight obligations that now attach to some recommenders.
- Resets and controls: when each reset was requested and completed, and that filters and hides were applied in every source, sampled from impressions.
What This Means for the System You Build#
- Build for day-one distribution: content embeddings at upload, an index that takes inserts continuously, and a tryout pool that doesn't depend on follower count.
- Record plays, not views: duration at serve time, first pass, total watch, loops and how the viewer left, joined to the impression that caused them.
- Normalize attention by length and compare against same-length peers before any watch signal reaches the value model.
- Predict many actions and fold them explicitly, with calibrated heads, heavy negative weights on hides and reports, and value weights versioned and shipped through experiments.
- Ask people with sampled surveys, and treat explicit negative feedback as an immediate filter as well as a label.
- Train online where freshness matters, logging features at serve time, joining late labels in a window, filtering fake engagement before the joiner.
- Run new posts through recorded tryout rounds, with a review gate before wide reach and reserved exploration in every feed.
- Make eligibility a state with a reason, separate from removal, visible to the creator and appealable.
- Put every manual boost and demotion in a capped, expiring, two-person record that the impression log references.
- Enforce dispersal and pattern interruption after scoring, and test them against served pages.
- Implement controls precisely: hides and filters in every source, resets as a cutoff that keeps explicit settings, explanations from the impression record.
- Keep the non-profiled feed first-class and keep model lineage (data region, code, reviewer) as columns, because the algorithm itself is now regulated.
References#
Law
- Regulation (EU) 2022/2065 (Digital Services Act), Articles 27 and 38 on recommender parameters and the non-profiling option, and Articles 34 and 35 risk duties
- Public Law 118-50 (including the Protecting Americans from Foreign Adversary Controlled Applications Act, Division H), the qualified divestiture definition and the bar on cooperation in operating a content recommendation algorithm
- TikTok Inc. v. Garland, 604 U.S. ___ (2025), the January 17, 2025 decision; 170 million US users, 5.5 billion uploads and 13 trillion views in 2023; the For You page and promotion and demotion of content
- Executive Order 14352: Saving TikTok While Protecting National Security, September 25, 2025; prior enforcement delays, the joint venture's control of algorithms and moderation, retraining and monitoring of recommendation models by trusted security partners, the 120-day non-enforcement
- DigiChina: Translation of the Internet Information Service Algorithmic Recommendation Management Provisions, Articles 8, 14, 17, 18 and 24, issuing agencies and the March 1, 2022 effective date
- European Commission: Commission preliminarily finds TikTok's addictive design in breach of the Digital Services Act (IP/26/312), February 6, 2026; the personalised recommender among the features, suggested changes, the 6% ceiling and the February 19, 2024 proceedings covering the rabbit hole effect
Papers
- Gao et al.: Deep Retrieval, Learning a Retrievable Structure for Large-Scale Recommendations (2020), the layered path structure, multiple paths per item, EM training, beam search, the live A/B results against HNSW, less popular creators and the 10-minute structure build
- Liu et al.: Monolith, Real Time Recommendation System With Collisionless Embedding Table (2022), cuckoo hashmap, admission filtering and expiry, the Kafka and Flink joiner, minute-level sparse and day-level dense sync, the Criteo sync-interval and ads A/B results, BytePlus Recommend deployment
- Zhao et al.: Recommending What Video to Watch Next, a Multitask Ranking System (RecSys 2019), multiple competing objectives with Multi-gate Mixture-of-Experts and selection bias with Wide & Deep
- Zhai et al.: Actions Speak Louder than Words, Trillion-Parameter Sequential Transducers for Generative Recommendations (ICML 2024), HSTU, 1.5 trillion parameters, the 12.4% online gain, speed against FlashAttention2 and the scaling law
- Kuaishou OneRec Team: OneRec Technical Report (2025), end-to-end generative recommendation, FLOPs, MFU, operating expense, 25% of QPS and stay-time gains
Platforms
- TikTok: How TikTok recommends videos #ForYou (June 18, 2020), signal groups and weighting, finishing a longer video, follower count not a direct factor, no two in a row from the same creator or sound, Not Interested, ineligible content
- TikTok: Introducing a way to refresh your For You feed (March 16, 2023), Refresh, what it keeps, topic interspersing, substituting sad and extreme-diet clusters, limits on recovery content
- TikTok: More ways to discover new content and creators you love (June 3, 2025), Manage Topics, keyword filters and the 200 million figure, smart keyword filters
- TikTok: More ways to spot, shape and understand AI-generated content (November 19, 2025), the AI-generated content control tested in Manage Topics
- TikTok: Compliance with the Digital Services Act (August 28, 2023), the non-personalised For You, chronological Following and Friends, and non-personalised search
- TikTok: For You feed eligibility standards, ineligibility for a broad audience, search and profile access, analytics, the repetition patterns it avoids
- TikTok Community Guidelines: Sensitive and mature themes, graphic public-interest footage and altercations as adults-only or ineligible for the For You feed
- TikTok Community Guidelines: Integrity and authenticity, moderate-harm misinformation, unverified crisis information, content under fact-check and unoriginal content as ineligible for the For You feed
- TikTok: Learn why a video is recommended For You (December 20, 2022), the Why this video feature and the reasons it shows
- Douyin via TechNode: Douyin reveals algorithm amid government push (April 1, 2025), the Safety and Trust Center, Wide&Deep and two-tower models, the regulatory campaign and the January 2025 filter-bubble statement
- EqualOcean: Douyin reveals algorithm principles (March 31, 2025), predicted user actions and multi-objective modeling
- Instagram: Instagram Ranking Explained (May 31, 2023), per-surface ranking, Reels predictions and surveys, reduced visibility for watermarked and reposted reels, Not Interested and the Sensitive Content Control with no "more" option under 18
- Meta: Instagram Reels Chaining AI system card, the roughly 100 candidates and the listed predictions (updated November 11, 2025)
- Meta: Facebook Reels AI system card, predictions, signals, integrity processes and non-personalized Reels through search (updated June 19, 2026)
- Instagram: Helping creators of all sizes break through (February 26, 2025), reels shown first to non-followers and widened on engagement
- Instagram: Trial reels (December 10, 2024), non-followers first, metrics after about 24 hours, automatic sharing within 72 hours
- Meta: Reset your Instagram with a recommendations reset (November 19, 2024), clearing recommendations across Explore, Reels and Feed
- Meta: 2026, AI drives performance (January 28, 2026), original content prevalence and the 75% share of recommendations
- YouTube: On YouTube's recommendation system (September 15, 2021), clicks, watch time from 2012, valued watchtime surveys
- YouTube Help: How engagement metrics are counted, views counted at playback start from August 24, 2026 and engaged views for earnings
- Snapchat: How we rank content on Spotlight, predicted actions and score, weighted signals, positive and negative factors, diversity adjustments
- Snap: Moderation, enforcement and appeals, automated review before recommendation and human review after a number of views (September 2026)
- Snap: Content guidelines for recommendation eligibility, allowed but not recommended, and the grounds for declining
- X: the-algorithm-ml heavy ranker README, predicted engagements and weights as of April 5, 2023
- xAI: x-algorithm repository, Thunder, Phoenix retrieval and ranking, candidate isolation, the weighted score and default weights in a parameter file, author diversity decay and filters (2026)
Press
- Gizmodo: Leaked TikTok doc reveals its obvious secret (December 6, 2021), the New York Times' "TikTok Algo 101" report, the formula, retention and time spent, TikTok's confirmation
- Social Media Today: YouTube adds more Shorts performance insights (February 22, 2023), the viewed versus swiped away metric in YouTube Studio
- 9to5Mac: How TikTok's algorithm works (July 2021), the Wall Street Journal bot investigation, watch time, under two hours, the 93% sadness feed after 224 videos, TikTok's response
- Tubefilter: TikTok admits it can control which videos are "heating" up (January 23, 2023), the Forbes report of January 20, 2023, the internal definition, the 0.002% and 1% to 2% of views figures, US approvers and self-heating
- TikTok: Announcement from the new TikTok USDS Joint Venture LLC (January 2026), ownership, board, retraining on US data, Oracle's cloud and source code review
- NPR: TikTok finalizes deal to form new American entity (January 22, 2026), licensing the algorithm for retraining and the Act's cooperation bar
- NPR: TikTok signs deal to give US operations to Oracle-led investor group (December 18, 2025), ByteDance's continued ownership of the underlying algorithm per an internal memo, and a former Treasury official's view that it isn't a clean break