About Tourmaline
Privacy & data
Tourmaline analyses your listening history from your Teal.fm scrobbles. Your scrobbles are fetched, processed in your browser, and cached in IndexedDB for faster repeat visits. No data is sent to any server other than your own PDS.
The network requests made are:
- Slingshot (
slingshot.microcosm.blue) — resolves your AT Protocol handle to a DID and PDS URL. This is a standard identity lookup. No personally identifiable data beyond your handle is sent. - Your PDS — reads
fm.teal.alpha.feed.playrecords from your Personal Data Server. Reading is unauthenticated; the only write is sharing your personality profile to Bluesky — which requires explicit OAuth consent. - MusicBrainz — enriches top artists with genre and tag data. Rate-limited to 1 request per second.
- Last.fm — supplements artist data with listener counts, play counts, and images. Rate-limited to 5 requests per second.
- Deezer — provides artist images as a fallback when Last.fm has none.
- Bluesky CDN — loads your avatar from
cdn.bsky.app.
Scrobbles are cached locally in your browser's IndexedDB. The server-side cache
(the PUT /api/scrobbles/cache endpoint) stores scrobbles in SQLite
to speed up subsequent visits, but this data is never shared or sold.
How it works
- 1 Resolve identity
Your handle or DID is resolved to a PDS URL via Slingshot.
- 2 Fetch scrobbles
fm.teal.alpha.feed.playrecords are fetched page by page from your PDS. If you've visited before, only new scrobbles since the last visit are fetched. - 3 Analyse
Scrobbles are aggregated into top artists, tracks, albums, daily counts, genre profiles, mood mapping, era preference, diversity scoring, and obscurity indexing.
- 4 Enrich
Top artists are enriched with genre data from MusicBrainz, listener counts from Last.fm, and images from Deezer. This runs in the background after the profile is already visible.
What's analysed
- Top artists, tracks, and albums
- Genre profile (MusicBrainz + Last.fm tags)
- Mood mapping (energetic, melancholic, etc.)
- Listening timeline (365-day heatmap)
- Era preference (decade distribution)
- Diversity score (0–100)
- Obscurity index (0–100)
- Listener personality archetype
Not analysed: Private/hidden scrobbles. Only fm.teal.alpha.feed.play records visible on your PDS are read.
Licence
Tourmaline is free software released under the GNU Affero General Public License v3.0 (AGPL-3.0-only).
In short: you are free to use, modify, and redistribute this software, but any modified version you run as a network service must also be released under the same licence with its source code made available.
The full licence text is included in the repository.
Credits
Created by
Contributors
Contributions via GitHub are always welcome. The full contributor list is maintained there.
Dependencies
- Svelte / SvelteKit — UI framework
- Tailwind CSS — utility styles
- Chart.js — charts and radar plots
- Lucide — icons
- Slingshot — identity resolution
- Teal — the
fm.teal.alphalexicon this tool reads from - MusicBrainz — genre and tag data
- Last.fm — listener counts and artist images
- Deezer — artist image fallback