A local "Shazam" for record collection. Place a tablet next to your turntable and it automatically identifies what's playing, displaying the album art, track name, and metadata on a nice full-screen interface.
WaxID fingerprints your personal vinyl collection and matches live audio from the turntable microphone against it. Scrobble to Last.fm, push to a Roon Now Playing display, or integrate with Home Assistant. No cloud services required — everything runs locally on your network.
- Ingest your record collection — upload audio files through the web UI or use the CLI script for batch ingestion
- Listen — the Android tablet captures audio from the turntable and sends it to the server
- Match — the server identifies the record in real-time
- Display — the tablet shows the currently playing track with cover art, progress, and vinyl side/position info
Run the server with Docker:
# docker-compose.yml
services:
waxid:
image: ghcr.io/leolobato/waxid:latest
ports:
- "8457:8457"
volumes:
- ./data:/app/data
restart: unless-stoppeddocker-compose up -dOpen http://localhost:8457 to access the web UI. The data/ directory stores the fingerprint database, album covers, and settings.
| Environment Variable | Default | Description |
|---|---|---|
WAXID_DB_PATH |
./data/fingerprints.db |
Path to the SQLite database |
WAXID_MAX_QUERY_HASHES |
0 (unlimited) |
Cap the number of query hashes per match. Set to 500 for faster matching on low-power hardware at the cost of some accuracy. 0 uses all hashes. |
WAXID_MAX_HASH_FANOUT |
500 |
Ignore hashes that appear in more than this many DB entries. These are common spectral patterns (like stop words in text search) that slow down lookups without helping identify tracks. 0 disables the stoplist. |
WAXID_LOG_LEVEL |
INFO |
Log verbosity. Set to DEBUG for detailed timing of fingerprint and match phases. |
LASTFM_API_KEY |
— | Last.fm API key for scrobbling. |
LASTFM_SECRET |
— | Last.fm shared secret for scrobbling. |
Example with Docker Compose:
services:
waxid:
image: ghcr.io/leolobato/waxid:latest
environment:
- WAXID_MAX_QUERY_HASHES=500The web UI lets you see what's currently playing in real-time with album art and track info, browse and manage your music library, and upload new albums for ingestion. Server settings (like Roon integration) are also configured here.
For a more configurable now-playing display, the server can push updates to Roon Now Playing, which offers multiple layouts, fonts, backgrounds, and AI-generated track facts. Enable it from the Settings page in the web UI.
WaxID can automatically scrobble identified tracks to your Last.fm profile. Connect your account from the Settings page in the web UI. Requires a Last.fm API key and secret, provided via LASTFM_API_KEY and LASTFM_SECRET environment variables or a lastfm_keys.json file in the server's app/ directory.
You can add albums to your collection in two ways:
Web UI — drag and drop audio files or ZIP archives into the Upload page. Album metadata (artist, title, year, track names) is read from audio file tags automatically.
CLI script — for batch ingestion from a local music library:
python scripts/ingest.py /path/to/library --recursive --server http://your-server:8457Discogs integration — include a .txt or .md file in your ZIP archive containing a Discogs release URL (e.g. https://www.discogs.com/release/12345). WaxID will fetch the tracklist from Discogs and automatically populate the vinyl side and position metadata (Side A, Track A1, etc.) for each track.
Install the APK from the releases page on an Android tablet (Android 10+).
On first launch, enter the WaxID server URL (e.g. http://10.0.1.9:8457). The app connects and displays the web UI. Tap the microphone button to start listening — the tablet captures audio and sends it to the server for matching.
The app runs a local HTTP server on port 8458 so you can start and stop listening remotely:
POST /start— start listeningPOST /stop— stop listeningGET /status— current state
A custom integration exposes WaxID as a media player entity in Home Assistant. It connects to the server and the Android client to provide:
- Media player — shows the current track with artist, album, and cover art
- Status sensor —
idle,listening, orplayingfor use in automations - Listening switch — start and stop audio capture on the tablet remotely
Install via HACS or manually. You could, for example, use a smart plug to detect when your turntable is on and start/stop listening automatically.
MIT License. See LICENSE.

