All apps · 0 apps
testerfy
Docker app from Selfhosters
Overview
Testerfy — Spotify Playlist Curation Made Easy
Burn through discovery playlists at speed. Like saves to your target playlists and skips, dislike removes and skips. Every decision is logged with timestamps, decision speed, and listening stats.
Features: one-tap like/dislike with auto-skip, playlist guard, passive listening tracker, decision time analytics, undo support, mobile-friendly UI, encrypted tokens (AES-256-GCM).
SETUP (about 5 min):
- Expose the Web UI with a URL Spotify can redirect to (HTTPS is usually required for production redirect URIs). Pick one approach:
• Optional: Tailscale — install the Unraid Tailscale plugin, then run: tailscale serve --bg --https 5247 http://localhost:5247
• Or use your own reverse proxy / TLS (Nginx Proxy Manager, Caddy, Cloudflare Tunnel, etc.) in front of http://[IP]:5247 - Create a Spotify Developer App at developer.spotify.com/dashboard
- Add a redirect URI that exactly matches your public URL, e.g. https://your-domain/api/auth/callback or https://MACHINE.TAILNET.ts.net:5247/api/auth/callback if you use Tailscale Serve
- Generate session secret: openssl rand -hex 32
- Fill in the fields below and click Apply
Full guide: https://github.com/ozmoetr/testerfy#setup
Readme
View on GitHubTesterfy

Spotify Playlist Curation Made Easy
Quickly rate tracks with Like/Dislike buttons that auto-skip to the next song. Perfect for curating Discover Weekly, Release Radar, or any playlist you're auditioning.
Features
- 👍 Like → saves to your designated playlists, auto-skips
- 👎 Dislike → removes from current playlist, auto-skips
- 🛡️ Playlist Guard → lock to specific playlists to prevent accidents
- 📱 Mobile Friendly → works great on phones and tablets
One tap to rate and move on — no more fumbling through Spotify's UI!
Requirements
| Requirement | Why |
|---|---|
| Public HTTPS URL | Spotify OAuth redirect URIs must be HTTPS in production |
| Spotify Premium | Required for playback control |
| Spotify Developer App | Free API access |
Unraid users can install from Community Applications (search Testerfy). Docker Compose and plain docker run also work — see Docker (Non-Unraid).
Setup
Spotify needs a public HTTPS callback URL that matches your SPOTIFY_REDIRECT_URI exactly. Pick any approach that gives you one:
- Reverse proxy / TLS — Nginx Proxy Manager, SWAG, Caddy, Cloudflare Tunnel, etc. in front of
http://localhost:5247 - Tailscale Serve (optional) — quick HTTPS on your tailnet without a public domain
Your redirect URI is always: https://YOUR-PUBLIC-URL/api/auth/callback
Step 1: Expose Testerfy over HTTPS
Choose one method below. You only need one.
Option A: Reverse proxy (recommended for a public domain)
- Point a subdomain at your server (e.g.
testerfy.example.com) - Proxy
https://testerfy.example.com→http://localhost:5247 - Your redirect URI:
https://testerfy.example.com/api/auth/callback
See Alternative HTTPS Methods for SWAG, NPM, and Cloudflare Tunnel examples.
Option B: Tailscale Serve (optional, no public domain)
Unraid → Apps → Search "Tailscale" → Install
Settings → Tailscale → Authenticate
Find your machine URL (hostname + tailnet) at login.tailscale.com/admin
- Example machine URL:
tower.tail1234.ts.net
- Example machine URL:
Before installing Testerfy, enable HTTPS proxying:
tailscale serve --bg --https 5247 http://localhost:5247 tailscale serve statusYour Testerfy URL:
https://HOSTNAME.TAILNET.ts.net:5247Your redirect URI:
https://HOSTNAME.TAILNET.ts.net:5247/api/auth/callback
Note: Tailscale Serve persists across reboots. To remove:
tailscale serve --https=5247 off
Step 2: Create Spotify Developer App
- Go to developer.spotify.com/dashboard
- Click Create App
- Fill in:
- App name:
Testerfy - App description:
Personal music rating app - Redirect URI: your HTTPS callback from Step 1, e.g.:
https://testerfy.example.com/api/auth/callback, orhttps://tower.tail1234.ts.net:5247/api/auth/callback(Tailscale Serve)
- APIs used: Check ✅ Web API
- App name:
- Check the terms box and click Save
- Click Settings and copy:
- Client ID (visible on settings page)
- Client Secret (click "View client secret")
Step 3: Generate a Session Secret
openssl rand -hex 32
Copy the output — you'll need it in Step 4.
Step 4: Install Testerfy (Unraid)
Unraid → Apps → Search "Testerfy" → Install
Fill in the configuration:
Field Value Web UI Port 5247(default)Data Path /mnt/user/appdata/testerfy/data(default)Spotify Client ID From Step 2 Spotify Client Secret From Step 2 Spotify Redirect URI Exact HTTPS callback from Step 1 Session Secret From Step 3 Click Apply
Advanced: If you also run Mellodex with the same Spotify Client ID, mount a shared path for rate-limit state (see the template's Spotify Shared Path fields).
Step 5: Connect to Spotify
- Open your public HTTPS URL (from Step 1)
- Click Connect to Spotify
- Authorize the app
- Start rating tracks! 🎵
Usage
- Open Spotify on any device and start playing from a playlist
- Open Testerfy in your browser
- Rate tracks:
- 👍 Like — saves to your liked playlists, skips to next
- 👎 Dislike — removes from playlist, skips to next
Settings
- Liked Playlists — choose which playlists to save liked tracks to
- Playlist Guard — restrict Testerfy to specific playlists only (prevents accidental deletions from important playlists)
Troubleshooting
"Invalid redirect URI" or "Insecure redirect URI"
The redirect URI must match exactly in two places:
- Your container's
SPOTIFY_REDIRECT_URIenvironment variable - Your Spotify app settings at developer.spotify.com/dashboard
Check for:
- Typos
- Missing
/api/auth/callbackat the end httpvshttps(must behttpsfor production)- Wrong hostname, port, or domain
App not loading / Connection refused
Check container is running:
docker ps | grep testerfy docker logs testerfyIf using Tailscale Serve, confirm it is running:
tailscale serve statusYou should see
:5247proxying tolocalhost:5247If using a reverse proxy, confirm it forwards to
http://localhost:5247Check port binding: Container should be on host port
5247
Port conflict
If you see "address already in use":
- Check what's using the port:
ss -tlnp | grep 5247 - With Tailscale Serve, the container and Serve both use port
5247on different layers — they should not conflict
HTTPS certificate errors
- Reverse proxy: confirm your certificate is valid for the hostname in
SPOTIFY_REDIRECT_URI - Tailscale Serve: enable HTTPS Certificates in Tailscale Admin → DNS and wait a minute for provisioning
Alternative HTTPS Methods
If you don't want to use Tailscale, you can use any method that provides HTTPS:
SWAG / Nginx Proxy Manager
- Set up a subdomain proxy to
http://localhost:5247 - Use port
5247(not127.0.0.1:5247) - Redirect URI:
https://testerfy.yourdomain.com/api/auth/callback
Cloudflare Tunnel
- Create a tunnel pointing to
http://localhost:5247 - Use port
5247(not127.0.0.1:5247) - Redirect URI:
https://testerfy.yourdomain.com/api/auth/callback
Docker (Non-Unraid)
docker run -d \
--name testerfy \
-p 5247:5247 \
-v /path/to/data:/data \
-e SPOTIFY_CLIENT_ID=your_client_id \
-e SPOTIFY_CLIENT_SECRET=your_client_secret \
-e SPOTIFY_REDIRECT_URI=https://your-domain/api/auth/callback \
-e SESSION_SECRET=$(openssl rand -hex 32) \
-e TZ=America/New_York \
ghcr.io/ozmoetr/testerfy:latest
You'll need to set up HTTPS yourself (reverse proxy, Tailscale, etc.).
Tech Stack
- Frontend: React, TypeScript, Tailwind CSS, shadcn/ui
- Backend: Node.js, Express
- Database: SQLite
- Auth: Spotify OAuth 2.0
Support
License
MIT License
Install Testerfy on Unraid in a few clicks.
Find Testerfy in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Requirements
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/ozmoetr/testerfy:latestRuntime arguments
- Web UI
http://[IP]:[PORT:5247]- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Container port. Map host port as needed; put HTTPS in front with a reverse proxy or optional Tailscale Serve.
- Target
- 5247
- Default
- 5247
- Value
- 5247
Database and config storage. Back this up to preserve your history.
- Target
- /data
- Default
- /mnt/user/appdata/testerfy/data
- Value
- /mnt/user/appdata/testerfy/data
From developer.spotify.com → Dashboard → Your App → Settings
- Target
- SPOTIFY_CLIENT_ID
From developer.spotify.com → Dashboard → Your App → Settings → View client secret
- Target
- SPOTIFY_CLIENT_SECRET
Must match your Spotify Dashboard exactly — e.g. https://your-domain/api/auth/callback, or https://MACHINE.TAILNET.ts.net:5247/api/auth/callback if using Tailscale Serve
- Target
- SPOTIFY_REDIRECT_URI
Random security key. Generate with: openssl rand -hex 32
- Target
- SESSION_SECRET