music growth

How it works

Architecture

Last.fm API
chart, tag, similarity, geo
Python ingestion
pipeline/*.py
Postgres (Neon)
raw tables
dbt
staging → marts → api
Next.js API
/api/* route handlers
Frontend
this app

Pipeline freshness

Live from /api/stats. Measured against the latest snapshot date, not the dbt run — a rebuild over failed ingestion still reads as stale.

Latest snapshot
Aug 2, 2026
5d ago
Weeks in series
13
Artists tracked
22207
Redacted names
47
profanity-filtered

The dbt DAG

Staging views normalize raw ingestion tables. Marts do the general-purpose analytical joins. The api/ layer is narrow, pre-joined, and pre-indexed on purpose — the app never queries the marts directly.

staging
intermediate
marts
api (serving layer)

Methodology & caveats

Listener counts are cumulative all-time, not active listeners — Last.fm's artist.getInfo returns a running total, so "growth" here means new scrobblers discovering an artist, not a change in how many people are currently listening. This can only go up.

Headline finding: median 13-week growth falls monotonically with starting listener size — 2.67% / 2.46% / 2.10% / 1.76% / 1.71% from smallest to largest quintile, across 22,201 artists. An earlier claim that growth increases with chart page depth was retracted after re-analysis — smaller starting size, not chart depth, is what predicts higher growth.

Chart survivorship: the mainstream/indie split comes from a chart snapshot that is now fully seeded (all 10,000 ranked artists), but the remaining ~17,000 tracked artists were seeded via genre tags or the similarity graph and never had a chart position — "unranked" is an observation gap, not a popularity tier, which is why cohorts here are built on listener-size bands rather than chart tier.

Self-reported tags: genres come from Last.fm user tagging, not a curated taxonomy — expect noise and overlapping labels.

Two early snapshot dates are excluded from cross-artist aggregates: 2026-04-27 and 2026-05-03 cover different, non-overlapping populations of artists rather than a full weekly panel; every aggregate here is computed from 2026-05-10 onward.

Source

Full repo, including the ingestion scripts, dbt project, and this app, is on GitHub.