Rocksky #
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

Contents #
- Features
- Roadmap
- Quick Start (for users)
- Self-Hosting / Development
- Comparison
- Documentation
- Feedback & Contributing
β¨ 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
- 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) #
- Go to rocksky.app and sign in with your Bluesky account
- Connect your music apps (Spotify, Jellyfin, etc.)
- Start scrobbling β your data stays under your control
Self-hosting and advanced usage instructions are below.
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.
- Quickstart β Get scrobbling in a few minutes
- FAQ β Common questions answered
- Integrations β Jellyfin, Navidrome, Pano Scrobbler, Kodi, Claude Desktop
- Migrating β from Last.fm Β· from ListenBrainz
- Rocksky CLI β Scrobble, search, and manage from the terminal
- SDKs β TypeScript, Python, Rust, Go, Ruby, Kotlin, Elixir, Clojure, Gleam
- API reference β HTTP endpoints and OpenAPI spec
Feedback & Contributing #
This repo is the central place for issues and discussions.
- Join the Discord
- Open issues on Tangled
- See CONTRIBUTING.md for development setup
Made with β€οΈ for music lovers who want control over their data.
rocksky.app β’ Docs