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
- 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) #
- 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.
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.
- 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