Data Sources
Game Radar collects signals and discovers games through several pipelines, each with its own cadence and purpose:
YouTube Gaming Chart (4H)
Top 50 videos in Gaming category (US region). Per-game view deltas, video count, trend score. Source of the snapshot charts.
Google Suggest (4H)
Autocomplete probes on top candidates: five English intents (bare / guide / wiki / build / tips) and two zh-CN intents. Feeds keyword opportunities and — v4.2 — the Chinese demand component (a suggestion counts when it contains both the game name and Chinese characters).
Steam (4H stats / 12H full sweep)
Every 4H: player count, review count, review velocity (reviews/day), price, tags for top candidates. Every 12H: a full sweep of Steam coming-soon and recently released — the radar’s main new-game discovery source. Linked via steam_app_id. Apps within ±14 days of release keep refreshing every 4H — including deep-tail apps whose coming-soon flag hasn’t flipped yet, so launch-day player data is never missed.
YouTube Comments (12H)
Top videos per game, extract pain points (confused / how-to / bug / recommendation). LLM-enhanced keyword matrix when configured.
SERP Competition Radar (12H)
Top 10 results per query. Queries are drawn from the game’s top keywords by demand (genre templates as fallback), capped at 3 queries per game in production. Domains classified (Fandom / Game8 / Official / Forum / LowAuthority / GuideWiki …). Gap score 0–100.
Domain Checks (12H)
Exact-match .com availability (Verisign RDAP) for BUILD_NOW / WATCH leaders: {slug}guide.com and {slug}wiki.com, 7-day cache. Feeds the Domain Window annotation.
Discovery Layer (12H)
Roblox explore charts, The Playlin weekly webgame chart, App Store RSS new-apps chart, itch.io /games/newest (indie / Game Jam early signals, jina reader fallback for datacenter IPs), and the Wikipedia release calendar — each adds games the YouTube chart alone would miss (browser, web, mobile, indie and Steam deep-tail titles).
Google Trends / Reddit (currently blocked)
Collectors are integrated but currently blocked (Trends 429, Reddit 403). Their metrics are null and excluded from scoring — missing is never treated as zero.
Region and category are configurable via environment variables.
API Quota & Limits
External APIs have usage limits. The system tracks quota per operation and handles exhaustion gracefully:
YouTube Data API v3
Daily quota: 10,000 units. Cost per operation: list=1, search=100, commentThreads.list=1. Resets at midnight Pacific Time. When quota is exhausted, collection stops until reset. Existing charts remain visible but become stale.
Steam API
No strict quota, but rate-limited. 12H collection interval prevents hitting limits. Player counts and review data may be delayed by hours during peak load.
SERP Sources
DuckDuckGo lite (free, no API key). Rate-limited by IP: pacing between queries, a per-game query cap (3 in production), and a circuit breaker that skips the rest of the batch after consecutive failures. A Bing parser is retained in the codebase but disabled — datacenter IPs receive degraded shell pages from Bing.
Quota monitoring: Dashboard shows API quota status (used/remaining). Alerts fire when usage exceeds 80% or 95% thresholds.
Release Date Backfill
Every game needs a release date to compute its Timing score. Game Radar backfills release dates through a three-layer pipeline that runs automatically every 4 hours (right after the YouTube collection):
Curated dictionary: Hand-maintained list of popular games + aliases. Instant, offline.
Steam storesearch: For games missing a date, search Steam by canonical name (with name normalization to absorb ®/suffixes like Official). When matched, pull release_date and also link steam_app_id — unlocking the Steam panel. Games still in coming_soon are intentionally skipped (their date will change).
Wikidata SPARQL: Optional manual fallback for games that aren't on Steam (Roblox/ Nintendo exclusives, indie). Slower and subject to endpoint rate limits, so not in the automatic loop.
Idempotent: Only fills null values. Existing dates are never overwritten.
Collection Frequency
Different data sources have different update cadences:
YouTube Gaming Chart (Every 4 hours)
00:00, 04:00, 08:00, 12:00, 16:00, 20:00 UTC. Creates a collection_snapshot record. Idempotent — same time slot + region produces one snapshot.
Release Date Backfill / Suggest / Steam stats (Every 4 hours)
Backfill runs right after the chart collection so newly discovered games get a release date the same round; Google Suggest probes and Steam stats for top candidates follow.
Full Sweep / SERP / Domains / Discovery / Comments (Every 12 hours)
Steam full sweep, SERP competition radar, domain checks, discovery sources (Roblox / Playlin / App Store / itch.io / Wikipedia), YouTube comments and keyword pipelines run twice daily to avoid API rate limits and reduce server load.
Opportunity Score Engine (Every 4 hours)
Recalculates after each YouTube chart collection (and again inside the 12H cycle after SERP and domain checks). Uses latest available data from all sources — if a 12H source hasn't run yet, uses its previous snapshot.
Daily Release Research (Every 4 hours)
Runs right after the score engine in the 4H cycle: today's (UTC) releases sitting in the top three guide-demand tiers each get an LLM deep-research verdict — capped at 12 games/day, one row per game per day. Results power the Today's Releases page.
Total: ~6 chart collections per day for YouTube, ~2 per day for the 12H pipelines.
Data Missing Handling
When a data source is missing or unavailable, the system handles it gracefully:
Steam data missing: Game still appears on charts, but Steam-related metrics (players, reviews, price) show as null. Opportunity score engine excludes missing components and renormalizes weights. On release day itself metrics may still be null: Steam unlocks releases at 17:00 Pacific, and the player-count endpoint returns empty until then — a data vacuum, not a real zero.
Google Trends blocked: Integrated but currently rate-limited (429). Trend interest metrics are null. Engine still works with other sources.
Reddit blocked: Currently 403-blocked. Reddit post counts and intensity metrics are null. Engine excludes Reddit from demand calculation.
SERP not collected: Competition gap score is null. This affects the 15% competition component — other 85% still valid.
YouTube API quota exhausted: Collection stops until quota resets (midnight Pacific Time). Charts become stale but don't disappear.
Dynamic weight normalization: If a component is null, its weight is redistributed proportionally among available components. Example: If SERP (15%) is missing, the remaining 85% scales to 100%.
Tracked Views ≠ Total YouTube Views
Tracked Views is the sum of view counts from the videos captured in the current snapshot for a given game — not the game's total YouTube views. A 400K-view video in our Top 50 contributes 400K; a video we didn't capture contributes nothing.
Game Resolution
YouTube returns videos, we analyze games. The resolver maps video titles to canonical game names using 4-tier priority:
- Dictionary — Exact match against known game names (confidence: 1.0)
- Alias — Match against known aliases like "wukong" → "Black Myth: Wukong" (confidence: 0.9)
- Rule — Pattern extraction: "GameName Gameplay", "GameName - Boss Fight" (confidence: 0.6-0.7)
- Unresolved — No match found, data preserved for re-processing later
Generic titles like "This Game Is Insane" or "Best Game Ever" are filtered out.
4H / 24H Diff
For each game, we find the closest historical snapshot within a tolerance window:
4H Diff
Window: 3.5h – 4.5h ago
If no match → null
24H Diff
Window: 23h – 25h ago
If no match → null
delta = current_views - previous_views
growth = delta / max(previous_views, 1)
NEW Game Detection
A game is marked NEW if the radar first detected it within the last 24 hours — measured from firstSeenAt, the timestamp when Game Radar first captured the game on a YouTube Gaming snapshot.
⚠️ "NEW" ≠ "Newly Released"
This is radar discovery time, not game release date. A game released months or years ago can still appear as NEW if it just hit the YouTube Gaming chart for the first time in the radar's view.
Example: If a 2024 game suddenly goes viral and hits the chart today, it is still marked NEW for 24 hours — but the homepage New Games table applies the same 1-day release window as the Today board, so games proven live for more than 1 day no longer appear in that table. The NEW badge itself (detail pages, the 24H stat card) is unaffected.
Three lifecycle states (priority order):
First detected ≤ 24 hours ago. Radar has never seen this game before.
Was on the chart, dropped off, and now back. Higher priority than NEW — the radar already knows this game.
Already on the chart and gaining momentum: 4H view delta > 0 AND growth ≥ 20% AND trend score ≥ 60.
Trend Score (0–100)
Measures a game's short-term heat burst. Higher = hotter.
Velocity Score (50%)
Based on positive 4H view delta. Uses log normalization to handle different scales:
velocity = min(100, log10(1 + delta) / log10(1 + 10M) × 100)+10M views in 4H ≈ 100 points
Video Growth Score (20%)
≤ 0 new videos → 0 | +1 → 40 | +2 → 60 | +3 → 80 | ≥ +4 → 100
Null (no history) → 50 (neutral default)
Persistence Score (20%)
How many of the last 6 snapshots (24H) this game appeared in:
persistence = seen_count / 6 × 100New Game Bonus (10%)
first_seen ≤ 24h → 100, otherwise → 0
SEO Score (v1 — deprecated)
Deprecated: The v1 SEO Score formula (used by the snapshot-based chart internally) has been superseded by the v2 Opportunity Score Engine described below. We keep the formula here only for historical reference — the homepage ranking and all BUILD_NOW signals are driven by the v2 engine. The homepage "SEO Opportunities" table (which still shows the v1 score) applies the same 1-day fresh window as the Today board: anything proven live for more than 1 day drops off.
Legacy formula: SEO Score = Trend Score × 60% + New Game Score × 25% + Content Spread × 15%
Opportunity Score Engine (v2, 0–100)
The main "Today Opportunities" board uses a five-component engine. Components missing for a candidate are excluded via dynamic normalization (weights rebalanced to sum to 100%). Cross-game percentile ranking within each batch. The board only lists games known to have launched within the last 1 day, games not yet launched, and games with unknown release dates — anything proven live for more than 1 day drops off. v4.2 traffic floor: a game whose demand score lands in the batch top decile (≥ 90) is exempted from the momentum / timing / opportunity numeric gates for BUILD_NOW — big-traffic games whose signals ramp up slowly are no longer mis-killed (hard gates still apply: huge traffic cannot save a game that does not need guides).
Demand (30%)
Seven sub-signals with relative weights, renormalized over the sources present for each game (a blocked source redistributes its weight instead of zeroing the score): Creator coverage 0.20 · Steam players 0.25 · Steam reviews 0.20 · YouTube views 0.20 · Google Trends 0.25 · Reddit posts 0.10 · Chinese suggest demand 0.15 (v4.2 — the number of zh-CN autocomplete suggestions containing both the game name and Chinese characters; collected for top candidates only, absent for the rest). Weighted average of batch percentiles.
Momentum (25%)
Two time buckets: 4H window (35%): YouTube view growth, creator videos, Steam player growth. 24H window (35%): YouTube 24H growth, Steam review velocity, Trends 7-day change, Reddit intensity. Missing signals drop out; bucket weights renormalize.
SEO Fit (20%)
Genre-based prior (RPG / soulslike / survival / open-world = 90, sandbox / simulation / co-op / roguelike = 85, strategy / fps = 80, roblox = 75, horror / action / adventure = 70, fighting = 60, puzzle = 55, sports = 50; unknown genres default to 60). Only a prior signal — real SERP data dominates when available.
Competition Gap (15%)
SERP-derived rule score (0–100). Higher = more weak competitors in top 10 (blogspot/unknown domains, no exact game name match in title). Not percentile-normalized — absolute score is meaningful across games. v4.2: dedicated guide sites (Fandom / Fextralife / wiki.gg / Game8 / GamePressure / GamerGuides / NeoSeeker / StrategyWiki) incur an explicit penalty per query — −15 when one occupies top-3, −5 when only lower positions — because they are the same-form competitors a guide site must beat directly.
Timing (10%)
Days to/from release date. Peak zone: release ±7 days. Pre-release countdown and post-release decay modeled with piecewise linear bands. Unknown release date → neutral 50.
Lifecycle
first_seen_at ≤ 24 hours
ALL of: view_delta_4h > 0 AND view_growth_4h ≥ 20% AND trend_score ≥ 60
Off the chart last slot, back on now, and seen in an earlier slot
Everything else
Opportunity Status
Based on the v2 Opportunity Score Engine (not the v1 SEO Score). Four tiers:
No hard gate triggered AND (Opportunity Score ≥ 80 AND Momentum ≥ 70 AND Timing ≥ 85, or the v4.2 traffic floor: Demand ≥ 90)
High demand + strong momentum + favorable release window = build a guide site now; big-traffic games whose signals ramp up slowly are not mis-killed
Opportunity Score ≥ 60
Decent opportunity but not urgent yet — keep monitoring
Momentum ≥ 70 BUT demand signals from fewer than 2 sources
Strong momentum but insufficient data — research first, collect more signals before deciding
Everything else
Not enough signals to justify action
Decision Layer Rules (v3.7–v4.1)
Beyond the five-component score, these rule sets shape what you see on the board and detail pages:
Pre-release Mode (4–90 days before launch)
When release is 4–90 days away, component weights switch: Demand 30% → 20%, SEO Fit 20% → 25%, Timing 10% → 20%. Pre-launch search volume has not materialized yet, so genre priors and the release window count for more. Beyond 90 days no switch happens — distant vaporware gets no front-loading.
Hard Gates (opportunity capped)
A single bad dimension cannot be offset by a high total. Guide Score < 40 (players do not need guides) → cap 64. Content Depth < 35 (cannot sustain a standalone site) → cap 69. SEO Score < 35 AND Demand < 30 (search space exhausted) → cap 60. All caps land inside the WATCH band — the game stays observable but cannot reach BUILD_NOW. The v4.2 traffic floor exempts the numeric gates only, never the hard gates.
Grades A–E & Priority Index
Every scored game gets a grade tied to a site-investment recommendation: A ≥ 85 Full Site · B ≥ 75 MVP · C ≥ 65 Test · D ≥ 50 Watch · E Skip. Confidence (0–1) measures data completeness (demand sources 40%; momentum, SERP, release date and guide evidence 15% each); Priority Index = opportunity score × confidence.
Product Model & Window Annotations (v4.0 / v4.1)
v4.0 adds Tool / Database / Launch opportunity scores and an auto-determined product model (guide site / database / tool / combination) with MVP tool recommendations — shown as board badges and on detail pages. v4.1 adds two annotation-only dimensions: Hype Window (7-day rolling creator-video ratio: ≥ 1.5× strongly rising, ≥ 1.2× rising, 0.75–1.2× steady, < 0.75× fading = chase risk) and Domain Window (exact-match .com still registrable = niche unclaimed). Annotations do not enter the score formula until backtested.
TPR Review — The Second Gate (v4.2)
BUILD_NOW is the radar's recommendation, not a final order. Before committing to a build, run the game through the TPR (Traffic-to-Competitor Ratio) review — a single-game go/no-go check that cross-examines the radar's verdict:
Formula: TPR = estimated monthly searches ÷ dedicated guide sites in the SERP top 10. Search volume = Steam wishlist × 0.03–0.08 (avg 0.05), or Steam followers × 9–12 when no wishlist data exists.
TPR bands: > 50k ⭐⭐⭐⭐⭐ · 20k–50k ⭐⭐⭐⭐ · 10k–20k ⭐⭐⭐ · 5k–10k ⭐⭐ · < 5k ⭐ — base score 85 / 72 / 57 / 45 / 30, modifiers then apply.
Traffic floor: estimated searches > 100k/month → forced "strong" verdict even with 20 competitors; > 50k → at least "recommended".
Modifiers (±): release window 7–30 days +15 · Early Access +10 · guide-friendly genre +10 · linear/puzzle genre −5 · thin-AI SERP ecology +10 · deep human wiki already present −10 · Chinese search demand +10.
Auto-filled: Steam App ID (database → live store search), competitor count (fresh SERP within 7 days → live DuckDuckGo probe as fallback), Chinese demand, genre, release window, Early Access flag, plus the radar status for cross-checking.
Manual input: wishlist — Steam exposes no public wishlist API, so the page generates a direct SteamDB charts link; look the number up and type it in.
Verdict: ≥ 80 strong · 65–79 recommended · 50–64 possible · 35–49 marginal · < 35 pass. Shown side-by-side with the radar status — when the two gates disagree, investigate before committing.
Today's Releases Page — Daily Calendar & Deep Research
The /releases page is a release calendar: every game known to release on the current UTC date, ranked and tiered by guide demand. It deliberately complements the Today board — the board is the scoring pool under the 1-day freshness window; this page is the unfiltered calendar of the day itself.
Scope: Games whose release date equals the page date exactly (day precision, UTC). Month/year precision cannot pin a day and stays out; unknown dates surface through the Today board instead. ?date=YYYY-MM-DD replays any past day — useful 1–2 days after launch, once guide-intent evidence has accumulated.
Five guide-demand tiers: Extreme ≥ 80 · Strong ≥ 65 · Mod. strong ≥ 50 · Moderate ≥ 35 · Weak < 35; Unrated only when the game has no score row at all. The tier score is the guide-demand proxy (creator guide-video share + community topic keywords) whenever it has been collected — on release day it usually has not (creators publish guides after launch, not before), in which case the engine demand score stands in. Guide intent always wins when present, even at 0.
Deep research (top three tiers): A 4H pipeline step (right after the score engine) runs an LLM over each top-tier release. Inputs are collected evidence only — engine scores, Suggest intent counts, SERP gap, competitor domains, platforms. Output is a structured verdict: target regions, guide necessity, SEO verdict, competitor summary, risks, plus a BUILD_NOW / WATCH / IGNORE recommendation shown side-by-side with the engine grade (disagreements are highlighted — exactly the cases worth a manual look). The LLM interprets evidence, never invents numbers, and its verdict never writes back into scores.
Budget & retries: Capped at 12 games per UTC day, highest tier score first; the leftover count is stated on the page. One research row per game per day — late-discovered games are picked up by the next 4H cycle, failed LLM calls retry automatically.
Demand evidence column: Google Trends is hard-blocked (429), so the column shows Suggest autocomplete counts (EN guide/wiki/build/tips intents + the zh-CN channel) as the live demand signal; the last known Trends value, when one exists, appears with a stale tag.
Release Year Gate
2026 cutoff: Games released before 2026-01-01 do not appear on any leaderboard, are not collected by SERP/comment pipelines, and are excluded from the matrix generation. Only games released in 2026 or later (or with unknown release dates) are eligible.
The gate is enforced at multiple points: score engine candidate pool (primary), SERP collector, homepage snapshot charts, and v3.6 mining modules. Unknown or unparseable release dates are not blocked — new games without date info are common, and unknown ≠ old.
Alert Push Pipeline
Beyond the dashboards, the radar pushes alerts to messenger channels. Detection runs every 4 hours across five detectors; entries merge into a single outboxed message:
Five detectors: new game entering the candidate pool · momentum spike (momentum jump ≥ +20, or 4H views +100% with trend ≥ 70) · creator cluster (≥ 3 creators in 24H) · release approaching (30/14/7/3/1-day and today windows) · opportunity score jump ≥ +15.
Priority budget: Priority 1 gets 5 message slots per round, Priority 2 gets 3, Priority 3 gets 2. Overflow entries are not dropped — they rotate back in on the next flush ("resend with next batch").
1-day freshness window: Alerts for games proven released more than 1 day ago are dropped entirely; not-yet-released and unknown-date games are never blocked. The excluded count is always stated in the message.
Genre filter (four checks): name prefix (mass-produced pipeline series) · platform source (Roblox chart batch titles; dual-platform games and WATCH+ graded ones are exempt) · genre keywords (casual / puzzle / match-three / merge / clicker / incremental / …) · Steam tags. Filtered alerts never enter the retry rotation, and the count is stated in the message.
Outbox delivery: Detectors only enqueue; a unified flush merges everything into one message (build signals pinned on top). Failed sends stay in the outbox and retry on a 30-minute cron — rate limits never lose content.
Game Detail Page
Click any game on the homepage to view its detail page. Each detail page includes:
Score Breakdown: Five-component opportunity score (Demand/Momentum/SEO Fit/Competition Gap/Timing) with per-component values and contribution. Grade, confidence, priority index, and any hard gate that capped the score are shown alongside.
Steam Panel: Current players, review count, review velocity (reviews/day), price, developer/publisher, tags. Historical trend chart if data available.
Pain Points Card: Top player pain points extracted from YouTube comments (confused / how-to / bug / recommendation). Indicates what players struggle with.
Keyword Matrix: SEO keyword opportunities with demand proxy, competition score, and page type (guide/wiki/build/recommendation). Prioritized by estimated traffic.
SERP Competition: Top 10 search results for keyword-driven queries. Domain classification (Fandom/IGN/Official/Forum/LowAuthority). Gap score indicates weak competitors.
Product Opportunity (v4.0): Tool / Database / Launch opportunity scores, the auto-determined product model (guide site / database / tool / combination), and MVP tool recommendations with implementation-ease rankings.
Window Annotations (v4.1): Hype Window (strongly rising / rising / steady / fading, with the 7-day momentum ratio) and Domain Window (open — exact-match .com still registrable, or taken). Warning colors flag fading hype and closed domains.
Drill-Down Suggestions: Long-tail keyword ideas with estimated competition and traffic potential. Based on autocomplete + pain points + SERP gaps.
Interpreting the data: High pain point count + high SERP gap score + low competition = strong signal to build a guide site. Low keyword matrix entries = insufficient data, mark as RESEARCH.
SEO Infrastructure
Game Radar is optimized for search engine discoverability:
Domain: gameradar.site (purchased via Spaceship, Cloudflare CDN with DNS proxy enabled).
Sitemap: Dynamic /sitemap.xml generated at build time. Includes all game detail pages (EN + ZH) with lastmod timestamps.
Robots: /robots.txt allows all crawlers, disallows /api/* endpoints (data routes, not pages).
JSON-LD: VideoGame structured data on every game detail page. Includes name, genre, release date, developer, publisher, platform, aggregate rating (when available). Enables Google rich results.
Open Graph / Twitter Card: All pages (homepage, about, game detail) include og:title, og:description, og:image, og:url, og:locale. Twitter Card meta tags for social sharing previews.
Canonical URLs: Every page specifies canonical URL to prevent duplicate content issues (EN vs ZH versions).
Indexing status: Submitted to Google Search Console. Sitemap accepted. Rich results eligible via VideoGame schema.
Game Search
The search box in the navigation bar searches across two data sources:
In-database games: Clickable — takes you to the game's detail page. Ranked by prefix match → match position → name length.
Dictionary (not yet in database): Shown dimmed at the bottom, not clickable — indicates the game exists in our curated/Wikidata/SteamSpy dictionaries but hasn't entered the radar yet. Merges from the in-database group to avoid duplicates.
Debounced at 200ms. In-flight requests are cancelled on new keystrokes. Keyboard-navigable with arrow keys, Enter, Esc.