How hosaka knows

16 independent signal kinds. One identity primitive. 3.16M-row bitemporal detection ledger. Every fact dated to the moment it was observed.

The identity primitive — Invariant 0

cluster_id is the spine. Every artist, label, and song in the substrate maps to one cluster, identified by a bytea hash produced by pe-norm-v1 normalisation. It is the sole key across every table, gate, and product in the fleet. MusicBrainz IDs, Discogs IDs, ISRCs — these are nullable annotations on a cluster, never the identity key.

That constraint is Invariant 0, set by the operator and never negotiated away. Requiring an external catalogue ID before an artist "counts" would filter out exactly the artists a detection system exists to find: the ones a catalogue has not yet caught up to. The unresolved tail — clusters with no MusicBrainz or Discogs ID — is where the newest, least-catalogued talent lives. They sit in dossiers on equal footing with fully catalogued ones.

If you are integrating: resolve to cluster_id first, treat every external ID as optional enrichment, and never gate on ID presence. See /developers for the full primitive contract.

The 16 source kinds

The appearance spine draws from 16 independent source kinds. Each kind is a separate instrumentation of the world — radio programmers, festival bookers, underground retailers, press writers, and DJ curators do not coordinate. When the same cluster lights up across several of them, that convergence is the signal.

Counts below are clusters with at least one observation in that kind, as of the date in the caption. They are not mutually exclusive — one cluster can appear in several kinds, and often does. That overlap is the whole point.

One identity to flag before it surprises you: the ra_booking count below and the emergence cohort cited elsewhere on this page are the same 119,095 clusters, not two independent measurements. artist_emergence holds one row per performing_entity cluster, and the ra_booking branch reads that same table. Read them as one fact stated twice.

16 signal sources — cluster counts as of 2026-08-13
Source kindDescriptionClusters
mb_releaseMusicBrainz releases921,863
radio_airplayRadio airplay796,328
pressPress coverage452,834
editorial_mentionEditorial mentions283,316
dj_setDJ sets132,404
ra_bookingRA bookings119,095
retail_undergroundUnderground retail116,989
bandcampBandcamp85,098
festivalFestival appearances68,046
soundcloud_repostSoundCloud reposts45,442
live_demandLive demand10,266
retailRetail (broad)3,451
ra_reviewRA reviews2,586
shazamShazam identifications1,642
ra_podcastRA podcasts1,009
ra_recommendedRA recommended548

Convergence as conviction

Any single signal can be noise: a friendly booker, a one-off spin, a bulk retail purchase. Conviction comes from convergence — the same identity lighting up across independent kinds simultaneously. The more independent the sources, the harder the convergence is to manufacture or mistake.

As of 2026-08-13, within the 119,095-cluster emergence cohort: 13,352 clusters have converged across 2 independent dimensions; 1,733 across 3; 257 across 4; 40 across 5 or more. That last group — five unrelated ways of watching landing on the same identity at the same time — is the deepest-conviction tier the substrate currently produces.

Each dossier carries a break_odds figure calibrated to convergence depth. A two-dimension hit and a five-dimension hit are never presented as the same bet. The ladder is the signal, not a summary label.

The detection-time ledger

The ledger holds 3,161,405 rows in a bitemporal schema. Every appearance carries two timestamps: occurrence date (when the event happened in the world) and publish date (the date the source made the event public — article publish date, lineup date, release date). The distinction matters: hosaka's own ingest timing is a crawler-ops artifact, not a signal about the artist. We anchor to publish dates, not ingest timestamps.

This structure is what lets a dossier answer "was this visible early" rather than only "is this true now". A watchlist entry is not a claim of foresight taken on faith — it is a timestamped record you can audit after the fact. When a name is flagged before the lagging channels catch up, the ledger shows it.

The ledger is bitemporal — 3,161,405 rows recording what is known and since when. See /developers for the contract surfaces that expose it.

What we do not do

No private data. No proprietary streaming telemetry. No paywalled scraping. The substrate is built entirely from public traces: events that happened in public, in venues and on airwaves and on open platforms, recorded as they happened.

We do not aggregate listening histories, purchase records, location data, or any information about individual listeners. The unit of measurement is the artist, not the fan. The evidence chain is the public record of how the world has responded to the artist — not surveillance of who is listening.

We also do not stitch signals onto catalogue IDs and call that emergence. An artist without a MusicBrainz entry is not absent from hosaka; they live in the unresolved tail, tracked by cluster_id, and are visible to every dossier and watchlist. See /about for the cluster-id idea in plain terms.

Measure first

Hypotheses are killed before the build, not during it. The codebase carries an append-only dead-ends log — things we tried that did not work: wrong tuning attempts, plausible-but-broken ideas, approaches that looked attractive until we probed them. Concrete metrics required; "didn't work" with no detail is not a useful entry.

This is not a quality-performance. The nature of emergence detection is that most signals look reasonable until you measure them. A feature that appears to confirm earliness may, on inspection, merely re-describe what the catalogue already knows. Those are the hypotheses worth killing loudest.

The measure-first posture also means we publish what we have, not what we plan to have. Every number on this site is dated and traceable to a staging verification. If a number is absent, the measurement either hasn't been made or we're not confident enough in it to put it here.

Reproducibility

The substrate is queryable without a key. The keyless endpoint — GET https://crate.hosaka.fm/api/v2/preview/artist?q={name} — is open at 100 requests/hour/IP and returns a capped, dated subset of the same dossier production integrations consume: emergence tier, a dated arc of tier transitions, booked-with co-appearances, and press count. The full ~24-facet contract is keyed. Responses are cached at s-maxage=300.

There are 67 published contract surfaces across the fleet, each pinned in contracts/published.yaml with primary key, columns, and producer invariants. Published surfaces are the integration target; inferred schema is not. Changes to a published table land in the same PR as the contract update, so drift is visible at review time. See /agents for machine-readable entry points including llms.txt, per-page .md mirrors, and the OpenAPI spec via crate-sdk.

curl -sL 'https://crate.hosaka.fm/api/v2/preview/artist?q=four+tet'
Keyless endpoint — no signup, 100 req/hr/IP, CORS open