TuneLog is a self-hosted music recommendation system for Navidrome. It learns from listening behavior such as skips, partial plays, full plays, and repeats to generate personalized playlists and improve search results.
sql Querysocketioresearch like which python module to use and stuffPlaylist Page was re written using claude aiNavidrome 0.62.0 introduced the playbackReport API, which provides more accurate playback state reporting from clients.
TuneLog now supports this new reporting mechanism, resulting in significantly improved tracking of:
Recommended: Update your Navidrome client to a version that supports
playbackReportfor the most accurate listening statistics and recommendations.
This feature lets user sync there local starred song from navidrome to listenbrainz. Read here Push Heart
This feature uses ListenBrainz recommendation data and matches it against songs already available in your library to automatically generate personalized playlists.
For setup instructions and details, see the ListenBrainz Collaborative Filtering documentation.
Note: Navidrome/subsonic client like
symfoniumscrobble data to navidrome and navidrome reports that tolistenbrainz, So Do not add those apps inpano appscrobble list or it will create two list of same song
ItunesFuzzy: Songs that are new or that is not in either
itunesormusicbrainz, such as ofsmall creatorswill be markedunmatchedas api will returnnone
In the dashboard there is a jam section, if you wish to use jam go to jam and now playing section in the dashboard
features
- sync play , pause , skip
- Queue reorder
- Transfer host
- Chats for joined user - chats are not end to end encripted, do not share personal/private info
- Queue can be added from library or playlist
- In config you can toggle some features for jam like only host reorder queue, only host clear queue and more
Requirements
- Navidrome Running
- VITE_NAVIDROME_URL in .env for search and album arts
- All users in same server/dashboard
Setup - Start the navidrome server - start tunelog server and frontend - go to dashboard - do a library sync if havent - Add or create users in users - go to jam/nowplaying - start jam - users that have logged in the dashboard will see join jam option in nowplaying page, - join it and enjoy
user profile
- User profile can be changed by users section
mkdir tunelog && cd tunelog
curl -o .env https://raw.githubusercontent.com/adiiverma40/tunelog/main/.env.example
curl -o ghcr-compose.yaml https://raw.githubusercontent.com/adiiverma40/tunelog/main/ghcr-compose.yaml
docker compose -f ghcr-compose.yaml up -d
Update:
docker compose -f ghcr-compose.yaml pull
Edit .env before starting the stack.
git clone https://github.com/adiiverma40/tunelog
cd tunelog
cp .env.example .env
docker compose up --build
Backend:
cd backend
pip install -r requirements.txt
python3 main.py
Frontend:
cd frontend
npm install
npm run dev
Update .env with your Navidrome details and the addresses you want to allow.
# Navidrome Server
BASE_URL=http://192.168.29.118:4533 # your navidrome ip
ADMIN_USERNAME=adii # your admin username
ADMIN_PASSWORD=1234 # your admin password
# Allowed origins to make api request to backend
# This is to allow user to access website form diffrent ip or devices,. just add your ip here
ALLOWED_ORIGINS=http://localhost:5173, http://192.168.29.118
# change the allowed origins as needed, use "*" for everyone
#Frontend / API
VITE_API_URL=http://localhost:8000 # if local host doesnt work then use your server's ip
VITE_NAVIDROME_URL=http://localhost:4534 # Give here the proxy port if you want search enchancment
MY_DOMAIN=localhost
# Logging
# Forces the logs to save exactly where Docker is listening for the volume mount
LOG_DIR=/app/logs
LOG_MAX_SIZE=10 MB
LOG_RETENTION_DAYS=7 days
LOG_LEVEL=DEBUG
# Proxy for search result alteration in clients
PROXY_PORT=4534
For better artist mapping, you can add this to navidrome.toml:
Tags.Artist.Aliases = ["artist", "artists"]
Then run a full library scan in Navidrome.
The proxy layer is optional. When enabled, client search requests are routed through TuneLog before falling back to Navidrome.
To use it:
PROXY_PORT in .env if neededTuneLog uses implicit feedback from Navidrome activity to score tracks:
The playlist engine combines those scores with recency and discovery logic to keep playlists balanced.
TuneLog/
├── backend/
│ ├── main.py
│ ├── playlist.py
│ ├── library.py
│ ├── db.py
│ └── Data/
├── frontend/
└── compose.yaml
data/ if needed.$ claude mcp add tunelog \
-- python -m otcore.mcp_server <graph>