{
  "$type": "site.standard.document",
  "canonicalUrl": "https://devlog.croft.click/2026/05/10/tourmaline-v0.1.0",
  "description": "First release of tourmaline — personality archetypes, genre profiles, mood mapping, and share-to-Bluesky for Teal.fm scrobbles.",
  "path": "/2026/05/10/tourmaline-v0.1.0",
  "publishedAt": "2026-05-10T01:50:00.000Z",
  "site": "at://did:plc:ofrbh253gwicbkc5nktqepol/site.standard.publication/3mlen2qhzrt2s",
  "tags": [
    "atproto",
    "pkgs",
    "music",
    "typescript"
  ],
  "textContent": "Released tourmaline v0.1.0. A Teal.fm scrobble analyser that reads fm.teal.alpha.feed.play records from any PDS and builds a listener personality profile.\n\nWhat it does:\n\n- Resolves any Bluesky handle or AT Protocol DID to a PDS URL via Slingshot\n- Fetches Teal.fm scrobbles page by page with incremental loading\n- Aggregates top artists, tracks, albums, daily counts, genre profiles, mood mapping, era preference, diversity scoring, and obscurity indexing\n- Enriches top artists with genre data from MusicBrainz, listener counts from Last.fm, and images from Deezer\n- Caches scrobbles in both IndexedDB (client) and SQLite (server) for fast revisits\n- Builds a personality archetype from genre/mood/intensity/obscurity signals (e.g. \"Voltage Chaser\", \"Midnight Librarian\", \"Sonic Omnivore\")\n- Generates a personality profile card SVG and shares it as a PNG attached to a Bluesky post with a proper @ewancroft.uk mention\n\nShare flow:\n\nThe only write operation. Uses @atproto/oauth-client-browser with granular scope (atproto repo:app.bsky.feed.post blob:image/png). The share button stores personality data in sessionStorage and redirects to /share, which handles the OAuth handshake and posts the image with RichText facet resolution.\n\nColour palette:\n\nChrome tourmaline green (#4ade80) on dark backgrounds with green undertone (#0a0f0a). Named after the mineral — tourmaline is pleochroic, showing different colours from different angles.\n\nStack: SvelteKit 5 + Svelte 5 + Tailwind CSS 4 + TypeScript. Chart.js for genre, mood, and era visualisations. Vercel deployment.",
  "title": "tourmaline v0.1.0 — AT Protocol scrobble analyser with share-to-Bluesky"
}