The topkpop Index

Transparent by design.

One 0–100 score, computed from normalized public signals. No LLM and no editorial opinion: just a published weighting, recency decay, and a reproducible ranking pipeline.

Two views, one engine

Song / Release Index

What is hot right now. Recency-weighted so a comeback can spike and naturally settle over roughly two to three weeks.

Artist Index

Sustained standing with less volatility, combining the artist's best representative song with audience, video, wins, and touring signals.

Song / Release signals

SignalWeightSource
YouTube MV view velocity (24h + 7d gains)25%YouTube Data API
Spotify popularity (0–100)25%Spotify Web API
Korean realtime chart position25%Melon primary
Billboard presence15%billboard-json GitHub feed
Music-show win momentum (last 14 days)10%Music-show feed

Artist signals

SignalWeightSource
Best representative song's Song Index30%Computed
Spotify followers + 30-day growth25%Spotify Web API
YouTube subscribers + view velocity20%YouTube Data API
Recent music-show wins (last 30 days)15%Music-show feed
Active touring10%Concerts feed

Normalize → decay → blend → rank

01 · Collect

Take the latest successful snapshot for each signal from D1.

02 · Normalize

Convert each raw signal to 0–100 across the tracked cohort using percentile rank. Missing or stale signals are dropped and remaining weights are re-normalized; coverage is recorded.

03 · Decay

Apply an exponential half-life of roughly seven days to velocity and event components such as YouTube velocity and music-show momentum.

04 · Blend

Combine normalized components with the published weights to produce a 0–100 score per song and artist.

05 · Rank

Compare with the prior daily snapshot and the snapshot from seven days ago to calculate up, down, new, or steady movement.

06 · Snapshot

Write a ranked, timestamped snapshot to D1. Live rankings read the latest; the weekly topkpop 100 reads the Monday 00:00 KST freeze.

Weights live in a single configuration file so they can be tuned without changing the engine. “Global-fan balanced” is the locked v1 default. Before launch, a sanity backtest against a known week must confirm that the output matches recognizable fan expectations and does not contain obvious data artifacts.