Statistics

Luma by the numbers

Every figure below is measured directly from the data the app ships with and the code that builds it. These describe the product — catalogue size, programme coverage, translation reach and engineering — not listener activity.

50,000+
Radio stations bundled in the app
241
Countries and territories covered
203,493
Weekly programme slots in the guide
82
Languages the interface speaks

The station catalogue

A merged, de-duplicated catalogue shipped inside the app, so browsing works before a single network call. Snapshot generated 2 August 2026.

50,000+
Stations
241
Countries
65,353
Stream endpoints
some stations carry several
645
Broadcast languages
11,705
Distinct tags
122
Normalised categories
38.4 MB
Bundled catalogue size
3,826
Streams at 320 kbps+

Largest country catalogues

United States7,664
Germany6,103
Russia3,171
Greece2,813
France2,757
Mexico2,751
United Kingdom2,325
China2,163
Australia2,056
Italy1,747

The remaining 231 countries make up the rest of the catalogue.

Catalogue completeness

Last stream check passed98.9%
Has a homepage95.8%
Has a stored logo64.3%
Streams at 128 kbps or better55.3%
Has map coordinates21.2%

Codec mix across 65,353 streams

MP344,106
AAC+10,186
AAC8,257
Unlabelled1,937
OGG742

The programme guide

Real schedules crawled from each station's own website — not a synthetic filler grid. Every station keeps its own source attribution and freshness stamp. Refreshed 28 July 2026.

1,303
Stations with a schedule
81,370
Programme entries
203,493
Weekly broadcast slots
61
Countries with guide data
96.3%
Verified from station sites
75
Site-specific crawler adapters
5 need a headless browser
156
Slots per station on average
20.3 MB
Bundled guide size

Guide coverage by country

Germany272
France149
United Kingdom97
Italy45
Canada43
Czechia40
Spain38
Singapore38
Netherlands35
Australia33

How schedules are gathered

Every broadcaster publishes its grid differently, so the generator keeps one adapter per site shape and records the exact source URL, attribution and last fetch result against each station. A failed crawl never deletes the last good schedule.

52 countries in the source registry 1,231 stations pinned to a source 75 adapters 5 JavaScript-rendered sites Daily automated refresh Per-station attribution DST-aware timezones

Discovery and reach

Local genre profiles are computed per country, so a listener in Cyprus sees Cypriot categories rather than a global average — and the interface speaks their language.

Curated local discovery

10,488
Stations hand-classified
366
Country-genre shelves
76
Distinct local genres
45
Priority countries

Category names stay in the local language where that is what listeners expect — Ειδήσεις in Greece, Noticias in Mexico, News in the UK.

Localisation

82
Shipped languages
552
Interface strings
39,480
Translated strings
15
Non-Latin scripts

Greek, Arabic, Hebrew, Russian, Ukrainian, Bulgarian, Macedonian, Serbian, Japanese, Chinese, Korean, Thai, Persian, Hindi and Kazakh are checked for character integrity on every release.

What each listener gets back

Luma now keeps a private picture of how you actually listen, and hands it back to you. Eleven measures, computed for one person at a time, on request.

Minutes listenedReal listening time, not app time
Listening sessionsHow often you tuned in
Stations playedBreadth of what you reached for
Countries exploredHow far your dial travelled
New stations discoveredFirst-ever plays inside the period
Longest listening streakConsecutive days, in your own timezone
Top stationsRanked, with minutes on each
Top genresWhat you actually play, not what you say
Top countriesWhere your listening comes from
Favourite listening hoursMorning, midday, evening or night
Top artistsFrom resolved now-playing metadata — the only one that needs a station to broadcast song titles

Over any window you ask for

Last week Last month Last year All time Year in review for any calendar year

Plus a personal play history

Station now-playing text is messy — QUEEN/BOHEMIAN RHAPSODY, Queen: Bohemian Rhapsody, ADVERT. It is cleaned, split into artist and title, matched against MusicBrainz for artwork and release, and filed with a confidence score — so “what song was that, an hour ago?” finally has an answer.

The signals behind it

Listening events understood9
Preference dimensions built7
Time-of-day buckets4
Recency half-life21 days
History window180 days
Data tables behind it19

A favourite counts eight times as much as a play; a skip counts against. Everything decays, so last week outweighs last spring.

Why there are no numbers in this section. There is nothing to show yet, and nothing that would be honest to show. The app has not launched publicly, so there is no real listening history to draw on — these are the measures the service computes, never a pool of other people's listening. Each figure is derived from one person's own events, returned only to them.

The intelligence layer

The backend behind those statistics, built in three phases. 47 endpoints and 2 live channels — every one of them covered by tests. This describes what the API implements, not every capability is wired into the app's UI yet — social features (follow, share, listen together) are live server-side and pending a client screen.

Phase 1

Foundation

13 endpoints · 14 operations
  • Anonymous device identity — a signed token, no sign-up, no email
  • Event ingestion across 9 listening signals
  • Playback reporting that scores every stream out of 100
  • Server-driven config, cached and revalidated with ETags
  • Schedule-source registry feeding the programme guide
  • Redis caching with an in-process fallback, plus rate limiting
  • Background worker: stream probes, schedule refresh, reminders
Phase 2

User value

8 endpoints · 10 operations
  • Recommendation engine weighing 7 signals, explaining every result
  • 6 home sections that rebuild themselves through the day
  • Similar-station lookup from tag overlap plus personal taste
  • Cross-device sync of 7 kinds of data, last write wins, deletes stick
  • Account linking with a verified sign-in token, never a claimed one
  • Programme reminders across 7 subscription types
Phase 3

Differentiation

20 endpoints · 25 operations · 2 live channels
  • Ask in plain words — “relaxing German music without too much talking”
  • What's on right now, aggregated across listeners
  • Curated collections editable without shipping an app update
  • Now-playing clean-up and MusicBrainz matching
  • Listening history, statistics and the year in review
  • Podcast search, chapters, transcripts, people and funding links
  • Episode summaries written on demand and cached
  • Follow friends, share what you're playing, listen together

How a recommendation is weighed

Fixed weights, published here in full. Nothing is paid for, and nothing is a black box — each suggestion carries the reason it appeared.

Genre affinity30%
Country & language20%
Listening history15%
Favourite similarity10%
Stream reliability10%
Time of day10%
Global popularity5%

What we refuse to do with it

The same data could power a lot of things nobody asked for. These are the lines drawn in the code itself, not in a policy document.

  • No “come back to Luma” notifications — a push must name real content you chose to follow
  • Quiet hours, a daily cap and de-duplication gate every message
  • Nothing is shared socially without a claimed handle, a follow, and an explicit share
  • Trending needs at least 3 separate listeners before a station appears
  • Known-broken streams are dropped from recommendations rather than padded out
  • Statistics stay yours: they are computed per person and returned to that person

Engineering

What it takes to keep the above working across phones, cars, Bluetooth headsets and the web preview.

555
Latest Android build
444
Changelog entries
65,481
Lines of Dart
across 97 files
23
Screens
30
Reusable widgets
27
Service modules
62
Regression guards
one per fixed-for-good bug
2
Vendored audio forks

Backend service

A FastAPI layer for what a public catalogue cannot provide on its own: personalised recommendations, now/next programme data, stream reliability scoring, reminders and cross-device sync.

REST endpoints47
Operations47
Typed schemas60
WebSocket channels2
Lines of Python7,390
Automated tests92

How a station gets scored

Reliability is deterministic and explainable — no black box. Server probes and real playback outcomes blend into one rolling score out of 100.

Success rate55%
Time to audio20%
Freshness15%
Stability10%

Recommendations follow the same principle — fixed, published weights and a stated reason on every result. The full breakdown is above.