How the Score works
The Score is a weekly, data-computed measure of cultural and commercial momentum. It is not a poll, a panel, or an editor’s list. Nobody decides it — a formula does, computed from public data, and it is the same formula for every person on the chart.
The five principles
The five pillars
| Pillar | Weight | What feeds it |
|---|---|---|
| Consumption | 35% | How much of this person people actually watched this week: Twitch and Kick viewer-hours, YouTube long-form and Shorts views, TikTok views, Instagram Reel views, podcast plays — pulled from platform APIs and platform data exports. Raw attention, weighted by how much time each format really holds. |
| Engagement | 20% | How hard their audience engages per view: interactions, comments, and shares relative to plays, on TikTok and Instagram. Measured as rates, not totals, so a smaller creator with a rabid audience registers. |
| Momentum | 20% | The direction of travel: week-over-week growth of their consumption and demand, plus follower net-adds. A flow measure by construction — being big is not the same as moving. |
| Commercial | 15% | Disclosed commercial activity: ad-marked and sponsored posts, and tiered commercial events. Only disclosed work counts — it's read from public disclosure marks, not guesses. |
| Demand & Mentions | 10% | How much the world asked about them this week: press mentions (weighted by outlet), Google and YouTube search interest, Wikipedia pageviews, clip views about them made by other channels, mentions and appearances. Sourced from press feeds, search-interest data, and the Wikimedia API. |
Each pillar is compared against the person’s vertical, then combined as a weighted geometric mean — strength in one pillar cannot fully paper over absence in another.
What the number means. The Score is displayed as an index where 100 = a typical week for the vertical — every pillar exactly at its reference. 120 means a week twenty percent bigger than typical on the combined measure; 80, twenty percent smaller. The underlying computation and stored values are unchanged; the display divides the stored score by ten and rounds. Ranks always sort on the full-precision stored value.
The clock
A chart week runs Monday through Sunday, Eastern Time. The Score settles every Monday at 9AM ET. Each new chart is provisional for 48 hours while late-arriving platform data lands, then final. If a Score is ever revised, the revision is logged publicly — see the changelog below.
Anti-manipulation
Stated at the rule level; the numeric thresholds are deliberately private.
Changelog
Every methodology amendment, newest first. Rendered from the public log — if the formula changes, it changes here.
- 2026-08-13: v0.2.8 mentions ENABLED in production via the two-stage publishing architecture — stage 1 publishes the chart on essential inputs (nothing can block it), stage 2 always runs the hashtag mention scrapes afterward at RESULTS_PER_TAG=50 with hard budget caps and enriches the same week's chart when it lands, or fails loudly without touching the published chart. First-enable receipts (who mentions lifted, and by how much) ship with every stage-2 commit as reports/<week>-mentions-impact.md.
- 2026-08-12: second publication-reliability incident — no chart shipped for weeks 2026-31 or 2026-32. Root causes: (1) the Apify account began returning HTTP 403 on every actor trigger on 2026-07-31 (account/billing side) and was never restored, so both Monday runs died at the scrape step, exactly as the publication guard intends; (2) the Monday external dispatcher was never created, so both runs fired hours late via GitHub's throttled cron; (3) no alerting existed, so two red runs went unseen for twelve days. Weeks 31–32 backfilled from data genuinely measured or archived for those weeks — Twitch/Kick viewer-hours from live snapshots (week 32 missing ~7 hours on 2026-08-06: lost hours are lost, not interpolated), Wikipedia pageviews and Google/YouTube Trends from their historical APIs. TikTok, Instagram, YouTube, press, mentions, and follower inputs for those weeks were not measured in-window and are absent, floored per v0.2.1a — both charts are provenance-labeled partial. Failure alerting (auto-issue), a client-side stale-site banner, and an audit system-health header added so silence is now impossible at every layer.
- 2026-07-22: first roster identity-integrity incident — six dead/squatted TikTok handles (Kai Cenat, Jynxzi, DDG, Rayasianboy, Danielle Pheloung, Jessica Wang) detected via ingest failure and corrected per founder verification; correction notes recorded on each roster entry, and the three distinctive new handles (pontiacmadeddg, rayasianboy, jynxziontwitch) added as query aliases.
- 2026-07-23: second identity-integrity audit — Instagram handles for 11 roster entries founder-verified via ingest audit; one correction applied (Brigette Pheloung acquiredstyle -> acquired.style, previous handle squatted/wrong), the other ten already matched the verified values in the roster.
- 2026-07-27: publication-reliability incident — the first scheduled Monday chart run never fired (GitHub cron throttling; no run in the Actions log at all, so no Apify scrape and no chart). Fixes: external cron dispatch is now the primary Monday trigger (in-repo cron demoted to backup); chart week resolved as the COMPLETED week (date -d yesterday — the old $(date +%G-%V) would have scored the hours-old new week on Mondays); a publication guard fails the workflow without computing or committing a chart unless same-day Apify consumption data landed (data/freshness.json stamps); the weekly audit report opens with a per-source freshness table. Week 2026-30 TikTok/IG rows re-ingested Monday 2026-07-27 from a fresh full-week scrape, replacing Thursday's mid-week test rows.
- v0.2.8 (2026-07-27): mentions and follower deltas go live. (1) mentions_by_others is now computed, not manual: TikTok + Instagram hashtag scrapes over each person's APPROVED mention_tags (excluded_from_scoring tags are never queried), ~200 results per tag, plus Instagram tagged-posts as an additional source when the actor is available (probed at run time; skipped loudly otherwise). Rules, public at rule level: chart-window filter; self-exclusion (posts by any of the person's own handles never count); per-post view winsorization; per-account weekly cap (top posts by winsorized views); score = 0.6 x log-scaled capped mention-views + 0.4 x log-scaled unique mentioning accounts above a minimum-views floor; results-cap floor flags when a tag saturates the scrape. Thresholds private. Input reclassified kind=ratio (recomputed weekly, duplicates are errors). (2) follower_netadds is now emitted weekly from consecutive fan snapshots (TikTok + Instagram from week 2026-31; YouTube subscriber snapshots begin 2026-31 via the existing channels call, joining deltas from 2026-32), summed across platforms, negative deltas pass through — falls count. Per-platform breakdown in data/follower_deltas/<week>.json feeds the site's "Followers this week" box, which appears only where a person-week has data.
- v0.2.7 (2026-07-23): Instagram consumption + engagement live via ingest/apify_instagram.py (manual Apify exports, like TikTok). ig_reel_views joins consumption (existing ig_reel_view coefficient); NEW ig-scoped engagement inputs ig_interactions_per_view_trimmed (weight 0.25) and ig_comments_per_view (0.10), existing three engagement inputs rebalanced x0.65 (interactions 0.39, shares_comments 0.195, chat 0.065). Reels are OWNER-ONLY in v1: records whose ownerUsername is not a roster handle are dropped. OPEN METHODOLOGY QUESTION — collab coauthors: 10.8% of scraped reels (95/881) were foreign-owned but carried a roster person as coauthorProducer; v1 rule is owner-only (no credit), revisit with a split-credit or full-credit rule once collab volume is better understood. ENGINE duplicate-row policy: every config input now declares kind=additive|ratio (documented in duplicate_row_policy); load_week SUMS duplicate additive rows (e.g. TikTok + IG disclosures feeding disclosed_partnerships_tiered) and raises a loud error on duplicate ratio rows.
- v0.2.6 (2026-07-21, founder-approved batch): (1) Verticals renamed: "Streamers" -> "Gen Z Streamers", "NYC Creators" -> "NYC Influencers". Verticals are now separate charts: rank_overall and all overall ordering removed from chart output (ratio math unchanged); Person of the Week and Riser of the Week are per-vertical (two crowns weekly, in chart "crowns"; riser is null until a prior week exists). (2) autocomplete_rank pillar weight set to 0 — still collected weekly for history. TODO: re-enable at 0.04 as a within-person delta vs a trailing 4-week baseline once history exists; cross-sectional autocomplete rank rewards name rarity, not demand. Its 0.04 redistributed proportionally: trends 0.1693, wikipedia 0.1017, mentions 0.2032, appearances 0.1355, sound_clip_reuse 0.0677, youtube_clip_views 0.1195, press_mentions_tiered 0.1406, youtube_search_index 0.0625. (3) query_terms upgraded to {primary, aliases} (founder-reviewed alias table); news and autocomplete query primary + aliases with cross-query dedupe; trends uses aliases only to assist topic-entity resolution (raw fallback stays the primary; entity-resolved people unchanged). DDG's primary is "DDG streamer" per founder hotfix; his news/trends/autocomplete rows re-ingested for 2026-30. (4) Weekly query audit: ingests write receipts to data/audit/<week>.json and ingest/audit.py renders reports/query-audit-<week>.md (terms, wikipedia article, trends entity/raw, top-3 matched headlines with sources, autocomplete prefix and position, topical-mismatch flags) as part of the Monday workflow.
- v0.2.4 (2026-07-21): two search-presence inputs join Demand & Mentions at modest weights. (a) youtube_search_index — Google Trends YouTube-search property (gprop="youtube") fetched alongside web trends with the identical anchor batching (Kai Cenat in every payload, anchor = 100). (b) autocomplete_rank — weekly probe of YouTube's public suggest endpoint: type the person's query_terms one character at a time, record the shortest prefix at which they surface and their position; score = 100 * prefix_share * position_share (surfacing at 1 char in slot 1 = 100, never surfacing = explicit 0; endpoint failure = loud skip, no row). Weights: youtube_search_index 0.06, autocomplete_rank 0.04; the seven existing inputs rebalanced x0.90: trends 0.1625, wikipedia 0.0976, mentions 0.1951, appearances 0.1301, sound_clip_reuse 0.0650, youtube_clip_views 0.1147, press_mentions_tiered 0.1350.
- v0.2.3 (2026-07-21): three live Demand & Mentions ingests join the weekly workflow. (a) wikipedia_views — Wikimedia REST daily pageviews summed over the chart week; name -> article resolved once (exact-title match only, null when no article exists, never guessed) and stored in roster.json as wikipedia_article. (b) NEW INPUT press_mentions_tiered — Google News RSS search per person using roster query_terms; articles published in the chart window, deduped by (domain, title), tiered by the whitelist in ingest/news_sources.json (major 3x, mid-tier 1x, unknown 0.5x). Weight 0.15 within the pillar; existing six inputs rebalanced proportionally (x0.85): trends 0.1806, wikipedia 0.1084, mentions 0.2168, appearances 0.1445, sound_clip_reuse 0.0722, youtube_clip_views 0.1275. (c) google_trends_index — now live via pytrends with anchor batching: every payload of 4 people includes the fixed anchor (Kai Cenat) and scores are rescaled relative to the anchor's mean for cross-batch comparability (anchor = 100); Trends topic entities used where the top suggestion exactly matches the person's name, roster query_terms otherwise; retries + loud graceful skips for pytrends fragility. All name-based ingestion reads roster query_terms (disambiguated search strings, founder-reviewed).
- v0.2.2 (2026-07-21): new Demand & Mentions input `youtube_clip_views` — weekly YouTube search per person by canonical roster name; sums views of videos published inside the chart window that are about the person (name must appear in title/description), excluding all channel IDs owned by roster members (resolved from roster youtube handles), deduped by channel with a per-channel contribution cap of 5,000,000 views/week. Log-scaled like all inputs (ln(1+v)). Weight 0.15 within the pillar; the five existing demand inputs were rebalanced proportionally (x0.85): google_trends 0.2125, wikipedia 0.1275, mentions 0.255, appearances 0.17, sound_clip_reuse 0.085. Ingest now fails loudly: resolved-but-quiet channels write explicit zero rows; unresolved handles emit a prominent error block in the Actions log instead of being silently skipped.
- v0.2.1a: pillar ratios use additive smoothing (delta = 10% of reference) and a 0.2 floor, so a zero pillar penalizes proportionally instead of annihilating the geometric mean. Momentum ratio clamped to [0.5, 2.0].