Top lists over any period
Artists, tracks, albums and genres for the last 7, 30 or 90 days, this year, or all time — each with its rank, its plays and the hours behind them.
Your listening year, on your own server.
Listening statistics for Navidrome. Top artists, tracks, albums and genres over any period, a yearly recap you play through like a story, and top-track playlists that write themselves back into your library — in the browser and as native apps for iPhone and Android.
Navidrome already counts every play. Rotation is the part that reads those numbers back to you.
Artists, tracks, albums and genres for the last 7, 30 or 90 days, this year, or all time — each with its rank, its plays and the hours behind them.
A full-screen recap that runs by itself: hold to pause, tap to step, with music from your own library underneath and questions that ask you to guess before they tell you.
Turn any top list into a real Navidrome playlist — 25, 50 or 100 tracks — refreshed daily and clearly marked as maintained, so every client on your network gets it.
A timeline, a clock of your day, and a weekday-by-hour heatmap. Rotation buckets plays into your own time zone, not the server’s.
Add other users of your Navidrome, see what they have on rotation, and find the artists you have in common.
Sunset, mint, violet, ocean, gold or rose, light or dark, English or German. On iOS the home screen icon follows the colour you pick.
Native clients for iOS and Android, talking to the same API as the browser. Point them at your server, sign in with your Navidrome account, done.
SwiftUI, iPhone and iPad with iOS 16 or newer.
Jetpack Compose, Android 8 or newer.
Rotation needs two things: read access to Navidrome’s data directory, and a URL it can reach Navidrome on. It writes nothing to Navidrome’s database — playlists go through the official API, as your own user.
services:
rotation:
image: ghcr.io/jannehy/rotation:latest
container_name: rotation
ports:
- "8770:8770"
volumes:
# Navidrome's data directory, read-only. Mount the directory, not just
# the .db file — SQLite needs the -wal and -shm files next to it.
- /path/to/navidrome:/navidrome:ro
# Rotation's own small database: friendships, settings, playlist rules.
- ./data:/data
environment:
- NAVIDROME_URL=http://navidrome:4533
- TZ=Europe/Berlin
restart: unless-stopped
docker compose up -d
Open http://your-server:8770 and sign in with any Navidrome
account. There is no separate user database and no setup wizard — Navidrome
decides who gets in.
A normal Python application with a production WSGI server in the box:
pip install -r requirements.txt, set NAVIDROME_DB
and NAVIDROME_URL, then python -m rotation. The
README has the
full list of environment variables.
On your server. Rotation has no cloud component, no account system and no analytics: it reads the play counts Navidrome has already recorded, and the only thing it ever writes is a playlist you asked for, through Navidrome’s own API.
The apps talk to your server and to nothing else. What they keep on the device is your server address, your session and your display preferences. See the privacy policy.
This project is not affiliated with Navidrome, Spotify, Apple or Google.