Rotation

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.

Get started Source on GitHub

MIT licensed · Docker or bare metal · reads Navidrome’s database read-only

What it does

Navidrome already counts every play. Rotation is the part that reads those numbers back to you.

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 year as a story

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.

Playlists that keep themselves

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.

When you listen

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.

Friends on the same server

Add other users of your Navidrome, see what they have on rotation, and find the artists you have in common.

Six palettes, two themes

Sunset, mint, violet, ocean, gold or rose, light or dark, English or German. On iOS the home screen icon follows the colour you pick.

Apps for your phone

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.

The overview with top artists and tracks An artist page with its rank and plays The yearly recap card The weekday and hour heatmap

iOS

SwiftUI, iPhone and iPad with iOS 16 or newer.

rotation-ios

Getting started

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.

Docker

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.

Bare metal

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.