Self-hosted music release tracker for Spotify users. Never miss a new release from your favorite artists again.
- Your data stays yours - Self-hosted means no third-party tracking your listening habits
- Automatic playlist updates - New releases are automatically added to your TrackWatch playlist
- Never miss a release - Checks for new music multiple times daily
- Simple deployment - Up and running in minutes with Docker
- Docker installed
- A Spotify Developer app with Redirect URI:
http://127.0.0.1:80/callback
One container with everything included — no cloning, no building. Available on GHCR and Docker Hub.
docker run -d \
--name trackwatch \
-e SPOTIFY_CLIENT_ID=your-client-id \
-e SPOTIFY_CLIENT_SECRET=your-client-secret \
-e SECRET_KEY=your-secret-key \
-v trackwatch_data:/var/lib/postgresql/data \
-p 80:80 \
--restart unless-stopped \
ghcr.io/emlopezr/trackwatch:latestOpen http://127.0.0.1 and you're done.
If port 80 is in use, change
-p 80:80to-p 8080:80and access athttp://127.0.0.1:8080
For the full AiO guide (optional variables, Docker Compose, email setup, backups), see docs/DOCKER_AIO_SETUP.md.
Best for development or if you need independent control over each service.
git clone https://github.com/emlopezr/trackwatch.git
cd trackwatch
cp .env.docker.example .envEdit .env with your configuration:
SECRET_KEY=your-random-secret-key
DATABASE_PASSWORD=your-secure-password
SPOTIFY_CLIENT_ID=your-client-id
SPOTIFY_CLIENT_SECRET=your-client-secretdocker-compose up -dOpen http://127.0.0.1 and you're done.
# AiO
docker stop trackwatch
# Multi-container
docker-compose down- Go to Spotify Developer Dashboard
- Click Create App
- Fill in the app details:
- App name: TrackWatch (or any name)
- App description: Your description
- Redirect URI:
http://127.0.0.1:80/callback - Which API/SDKs are you planning to use? Web API
- Click Settings and note your Client ID and Client Secret
- Add these to your
.envfile
Important: Spotify only allows
http://for127.0.0.1. Any other address (LAN IPs like192.168.x.x, custom domains) requires HTTPS.localhostis not accepted at all.
If deploying to a custom domain:
-
Update the redirect URI in your Spotify app settings to match your domain:
https://your-domain.com/callback -
Update your
.env:VITE_SPOTIFY_REDIRECT_URI=https://your-domain.com/callback
-
Rebuild the frontend:
docker-compose up -d --build frontend
| Variable | Required | Default | Description |
|---|---|---|---|
SECRET_KEY |
Yes | - | Django secret key for security |
DATABASE_PASSWORD |
Yes | - | PostgreSQL password |
SPOTIFY_CLIENT_ID |
Yes | - | From Spotify Developer Dashboard |
SPOTIFY_CLIENT_SECRET |
Yes | - | From Spotify Developer Dashboard |
VITE_SPOTIFY_REDIRECT_URI |
No | http://127.0.0.1:80/callback |
OAuth callback URL |
PORT |
No | 80 |
Frontend port |
DEBUG |
No | False |
Django debug mode |
SCHEDULER_HOURS |
No | 7,14,21 |
Hours to check for releases (24h) |
SCHEDULER_MINUTE |
No | 0 |
Minute of the hour to run |
RESEND_API_KEY |
No | - | For email notifications |
- Spotify Integration - Connect your Spotify account securely via OAuth
- Artist Tracking - Follow artists and track their releases automatically
- Automatic Playlist - New releases are added to a dedicated TrackWatch playlist
- Ghost Track Detection - Find and remove unavailable tracks from your playlists
- Scheduled Checks - Automatically checks for new releases 3x daily (7am, 2pm, 9pm)
┌──────────────────────────────────────────────────────────────────────────┐
│ Docker │
├─────────────┬─────────────────────┬─────────────────┬────────────────────┤
│ Frontend │ Backend │ Scheduler │ Database │
│ (Nginx) │ (Gunicorn) │ (APScheduler) │ (PostgreSQL) │
│ │ │ │ │
│ React SPA │ REST API │ Background │ User data + │
│ + Reverse │ + Spotify Auth │ task runner │ Track history │
│ Proxy │ │ │ │
└─────────────┴─────────────────────┴─────────────────┴────────────────────┘
The scheduler service runs independently from the web server, checking for new releases at configured times (default: 7am, 2pm, 9pm).
Alternative: External Triggers
If you prefer external scheduling (e.g., n8n, system cron), you can:
- Stop the scheduler service:
docker-compose stop scheduler - Trigger updates via webhook:
curl -X POST http://localhost/api/actions/releases \ -H "X-Admin-Key: YOUR_SECRET_KEY"
For local development without Docker, see docs/MANUAL_SETUP.md.
- Frontend: React 18, TypeScript, Vite, React Router 7
- Backend: Django 5, Django REST Framework, APScheduler, Gunicorn
- Database: PostgreSQL 15
- Deployment: Docker, Nginx
Ensure the redirect URI in your Spotify app settings matches exactly:
- For local Docker:
http://127.0.0.1:80/callback - For custom domain:
https://your-domain.com/callback
Note: Spotify only allows
http://for127.0.0.1. LAN IPs (e.g.192.168.x.x) and custom domains require HTTPS.localhostis not accepted.
Check logs:
docker-compose logs backend
docker-compose logs frontend
docker-compose logs schedulerEnsure the database is healthy:
docker-compose psIf db shows unhealthy, check PostgreSQL logs:
docker-compose logs dbdocker-compose down -v
docker-compose up -d --buildContributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License. See also the Data Handling Statement for information about how the application processes data.

