Self-hosted media popularity tracking for Sonarr/Radarr/Lidarr + Plex/Emby/Jellyfin. The backend is async Rust with Postgres, and the UI is React + TypeScript.
- Copy the config and fill in your URLs + API keys:
cp config/unpopularr.example.toml config/unpopularr.toml
- Run the backend + Postgres:
docker compose -f docker/compose.yml up --build
- Run the web UI (dev mode):
cd apps/web
npm install
npm run dev
The UI expects the API at http://localhost:8099. Set VITE_API_BASE if it lives elsewhere.
If you prefer not to run Postgres, set the database URL to SQLite (file path can be relative to the server working dir):
[database]
url = "sqlite://./data/unpopularr.db"
Make sure the directory exists or mount a volume when running in Docker.
POST /webhook/plexPOST /webhook/jellyfinPOST /webhook/embyPOST /admin/syncGET /items?type=&sort=&filter=&page=GET /items/{id}GET /stats/overview
- Path remapping uses
[ [path_mapping] ]entries withfromandto. - Use
webhook.tokensor per-instancewebhook_tokento secure webhooks. - Polling playback history runs every
worker.poll_interval_secs(set to0to disable) usingmedia_server.base_url+token. - Multiple media servers can be configured; pass
?instance=namein webhook calls.
GNU GPLv3. See LICENSE.