A decentralized music tracking and discovery platform built on AT Protocol 🎡 rocksky.app
spotify atproto lastfm musicbrainz scrobbling listenbrainz

README.md

Rocksky #

ci build discord FlakeHub

A decentralized, open-source Last.fm alternative built on the AT Protocol (Bluesky).

Rocksky automatically tracks ("scrobbles") the music you listen to from Spotify, Jellyfin, Navidrome, browsers, Android, and more β€” then publishes it to your decentralized identity. Own your listening history, see what friends are playing in real time, get rich stats, and discover new music β€” all without a central company controlling your data.

rocksky.app β€’ Docs β€’ Discord

Get Rocksky on Google Play

Preview

Contents #

✨ Features #

🎡 Scrobbling #

  • Last.fm compatible API β€” works with almost any existing Last.fm scrobbler
  • ListenBrainz compatible API β€” broad client support
  • Spotify β€” direct "now playing" detection
  • Jellyfin, Navidrome β€” media server scrobbling
  • Pano Scrobbler (Android/Linux/Windows), WebScrobbler (browser)
  • Rocksky Connect β€” scrobble from MPD, Mopidy, VLC, Kodi, and any MPRIS player
  • Automatic Last.fm mirroring of new scrobbles
  • Import your history from Last.fm or ListenBrainz

πŸ“š Your library #

  • Upload your own music and stream it back from anywhere
  • Bring your own storage β€” keep the files in your own S3 bucket, or use the managed one
  • Import from Dropbox and Google Drive
  • Browse by track, album, artist, playlist or favorites
  • Playlists mirrored to your AT Protocol repo, so they travel with your identity rather than living only on a server

▢️ Playback #

  • Plays in the browser β€” decoding and DSP run in WebAssembly, with no streaming server in the middle
  • Rocksky Connect β€” start something on one device and control it from another
  • Queue, shuffle, repeat, crossfade and a parametric equalizer
  • Fullscreen player with a live scrobble timeline

🏷️ Physical shortcuts #

Tap or insert a card and the album, playlist or your favorites starts playing.

  • NFC tags β€” NTAG213/215/216, MIFARE Ultralight, and MIFARE Classic (formatted automatically on first write)
  • Smart cards β€” SLE5528 memory cards and ACOS3 processor cards
  • Tags carry the record's AT-URI, so one written on any Rocksky player works on every other β€” with the library id behind it as a fallback
  • Write them from the desktop app, the CLI, or the terminal UI

🌐 Social & discovery #

  • Stories β€” see what everyone is listening to, live
  • Shouts and likes on songs, albums, artists and profiles
  • Follow other listeners; see who else plays what you play
  • Recommendations precomputed from your history and audio features
  • Wrapped β€” your listening year, summarised

πŸ“Š Insights #

  • Top artists, tracks and albums over any period
  • Charts, listening analytics and daily/weekly visualisations
  • Explorer β€” query your own listening data with RSQL
  • Blazing-fast search powered by Typesense

πŸ’» Apps & clients #

  • Web β€” rocksky.app, with a dedicated mobile build
  • Android β€” native client on Google Play, with automatic scrobbling, local and uploaded music playback, and listening stats
  • Desktop β€” native app for macOS, Linux and Windows
  • CLI β€” scrobble, search, browse, upload and import from the terminal, including a full TUI player
  • MCP server β€” let Claude and other assistants read your listening history

πŸ”§ Build on it #

  • SDKs for TypeScript, Python, Rust, Go, Ruby, Kotlin, Elixir, Erlang, Clojure and Gleam
  • Public HTTP API with an OpenAPI spec, plus AT Protocol lexicons
  • API keys and long-lived access tokens for your own integrations
  • Embeddable player for sharing what you are listening to

🚧 Roadmap #

  • Webhooks (Discord, custom integrations)
  • Extensions system
  • Cross-device settings sync
  • More storage backends and media servers

Quick Start (for users) #

  1. Go to rocksky.app and sign in with your Bluesky account
  2. Connect your music apps (Spotify, Jellyfin, etc.)
  3. Start scrobbling β€” your data stays under your control

Self-hosting and advanced usage instructions are below.

Android app #

Install Rocksky from Google Play and sign in with your Bluesky account. Allow notification access when prompted to scrobble music from other apps. Play local files and your uploaded music, browse your listening history and stats, and keep up with friends.

The Android client lives in apps/app, built with React Native, Expo and a native Rust playback engine.

Desktop app #

brew install --cask tsirysndr/tap/rocksky

The macOS build is ad-hoc signed and not notarized (no Apple Developer account yet), so Gatekeeper blocks the first launch. Open Rocksky once, then go to System Settings β†’ Privacy & Security and click Open Anyway next to the Rocksky message β€” macOS remembers it from then on. The terminal equivalent is xattr -dr com.apple.quarantine /Applications/Rocksky.app.

Linux .deb, .rpm and .AppImage bundles are attached to each desktop-v* release. See desktop/README.md for details.

πŸš€ Self-Hosting / Development #

Prerequisites #

  • Node.js (v22+)
  • Bun
  • Docker + Docker Compose
  • Rust (for some crates)
  • Deno, Go, Turbo, Wasm Pack (see full docs)

Getting Started #

# 1. Clone the repo
git clone https://github.com/tsirysndr/rocksky.git
cd rocksky

# 2. Install dependencies
npm install -g turbo
bun install

# 3. Environment variables
cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env
cp apps/feeds/.env.example apps/feeds/.env
cp .env.example .env
# Edit the .env files as needed
# 4. Start services
docker compose up -d

# 5. Database migrations
turbo db:migrate --filter=@rocksky/api

# 6. Spotify integration (optional but recommended)
# Set SPOTIFY_ENCRYPTION_KEY and SPOTIFY_ENCRYPTION_IV first
bun run spotify <your_client_id> <your_client_secret>

Then run the dev servers:

bun run dev:jetstream
bun run mb
bun run feeds
turbo dev --filter=@rocksky/api --filter=@rocksky/web

Operations console (Clojure REPL) #

tools/console/ is a Clojure project that centralizes every operational script in the monorepo β€” lexicon codegen, DB migrations, data sync/backfill, Rust daemons, devops glue β€” behind one discoverable REPL. Instead of remembering which package.json script lives in which workspace or which cargo run -p ... invokes which daemon, you call functions:

cd tools/console
mise install                       # locks JDK 21, Clojure, Babashka
clj -M:rebel                       # pretty terminal REPL (try `(help)`)
clj -M:dev                         # nREPL on :7888 for CIDER / Calva / Cursive
bb help                            # or fast one-shot CLI tasks
bb sync did:plc:abc123             # e.g. sync one user's scrobbles

See tools/console/README.md for the full command catalog and design notes.

Comparison #

Feature Last.fm ListenBrainz Rocksky
Open Source No Yes Yes
Decentralized Identity No No Yes (AT Protocol)
Social Feed Limited Basic Real-time Stories
Data Ownership Last.fm You (export) You (on your PDS)
Last.fm Compatibility β€” Partial Strong

πŸ“š Documentation #

Full documentation is available at docs.rocksky.app.

Feedback & Contributing #

This repo is the central place for issues and discussions.


Made with ❀️ for music lovers who want control over their data.

rocksky.app β€’ Docs