← dean's list
data engineering · 2026 · ● live

Music Growth Pipeline

Tracked 7,751 artists over 7+ weeks. Underground acts (pages 1000+) grow 3× faster than mainstream in listener percentage.

view on github ↗
open dashboard ↗

Listener growth by tier and genre, a listener count vs. growth rate plot with per-artist drill-through, and an Artist Spotlight page showing listener growth over time and week-over-week change.

12 weeks of data · updated 2026-07-26
mainstream · pages 1–50
2.61% median 7-week growth
4.18% p90 growth
indie · pages 51+
3.41% median 7-week growth
12.78% p90 growth
fastest-growing indie artists · 2026-07-26
ridgeclub pg 1657 +659.9%
[redacted] pg 1036 +331.3%
Alyssa Grace pg 1559 +306.9%
Alexandra Căpitănescu pg 1798 +218.7%
Laurinha Costa pg 1702 +215.8%
Underground artists show 12.8% P90 growth — 3.1× higher than mainstream (4.2%). 7,751 artists tracked.
how it's built

The Last.fm API returns only cumulative all-time stats — there is no native time series. To study whether chart position correlates with listener growth over time, you have to build the longitudinal dataset yourself by snapshotting repeatedly.

Weekly ingestion pipeline snapshots listener data for 7,751 artists from the Last.fm global chart into Postgres on Neon. Artists are split into tiers by chart page depth: mainstream (pages 1–50) vs indie (pages 51+). A dbt transformation layer (6 staging + 7 mart models) powers both cross-sectional and longitudinal analysis. After each weekly snapshot, dbt rebuilds the mart views, a stats script queries them and writes pipeline_stats.json to GitHub, and this portfolio page picks up the fresh data in its nightly rebuild.

  • 7,751 artists tracked across 7 weekly snapshots (April–June 2026): 250 mainstream (pages 1–50), 7,501 indie
  • Core finding: underground artists (pages 1000+) show P90 growth of 9.16% over 7 weeks vs mainstream 2.75% — the gap widens at the tail, not the median
  • dbt mart layer: listener_growth (LAG window function), artist_growth_summary, weekly_growth_by_tier, genre_growth — marts build on marts via ref()
  • Cross-sectional finding: ~4× plays-per-listener gap (mainstream median 74.76 vs indie 17.69) consistent across full distribution — indie P90 listeners (782K) falls below mainstream P25 (2.3M)
  • Genre signal: EDM shows highest median growth rate; classical and metal are slowest — genre appears secondary to chart depth as a growth predictor
  • Standout cases: several underground artists (pages 1500+) grew 100–400% over 7 weeks — growth patterns split between viral spikes and steady week-over-week acceleration
PythonPostgreSQL (Neon)dbt Core (dbt-postgres)Last.fm APIGitHub ActionsSQL