All apps · 0 apps
Seekify
Docker app from Seekify's Repository
Overview
Readme
View on GitHubSeekify
a self-hosted music player. rip what's missing.
Seekify is a music player you run yourself. Point it at your music and listen in any browser. It can also find and download tracks you don't have yet, tag them, and keep your library tidy.
see it on a phone
The whole thing works on a phone too. Open it in the browser, or install it as an app for a full-screen player.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
see it on a computer
![]() home |
![]() now playing |
![]() live queue |
![]() bulk import |
![]() done |
![]() artist / albums |
![]() artist / tracks |
![]() favorites + new |
![]() history |
Screenshots are from an early beta, June 2026. The interface keeps moving, so what's here is a snapshot, not a promise.
the player
- browse albums, artists, playlists, and favorites, with a history of what you've played
- now-playing screen with a waveform, queue, shuffle, and repeat
- floating mini-player; lock-screen and media-key controls when you install it as an app
- per-track menu to queue, add to a playlist, fix the tags, jump to the album or artist, or favorite
the visualizer
- a full-screen, audio-reactive visualizer written in raw WebGL2 fragment shaders
- it reads the live audio through an
AnalyserNodetapped off the player, so what you see is what you hear - the palette tints to the current album cover, so the visualizer matches the rest of the now-playing screen
- more shader looks can be dropped in; each one is a self-contained GLSL program
the ripper
- search for a single track or a whole album and download it
- pull from Soulseek or YouTube, and you choose which to prefer
- bulk import: paste a list of songs and download them all at once
- watch each job live, from searching to downloading to tagging to done
guided scraping
- point Seekify at a YouTube playlist and it watches it for you: every new video is fetched, tagged, and filed into your library automatically
- watched playlists sync on a schedule, so a playlist you follow keeps feeding your library new tracks as they appear
- the ripper's job queue shows every step of the pipeline, so you see search, download, tag, and sort as they happen
- you stay in control: pause a playlist, drop one you've stopped following, or re-point one at any time
housekeeping
- downloaded music is tagged and sorted into artist and album folders for you
- a needs-attention view flags the rough stuff: missing info, messy names, duplicates, missing artwork
- fix problems inline, fetch new artwork, or re-look-up the details
- approve a track once and it stays approved
how to use it
- put your music files in your music folder
- open Seekify in a browser and your library shows up on its own
- press play; search for and download anything you're missing
- keep the needs-attention list tidy and your library stays clean
runs anywhere
Seekify runs as one program and works on its own. Optional helpers add more, and it runs fine without them: yt-dlp for YouTube, ffmpeg for converting and waveforms, and python for Soulseek. Everything else, like download format, sources, Soulseek login, and what the needs-attention checker looks for, you set inside the app.
Soulseek account: you need a Soulseek account before you can use the Soulseek download source. Seekify logs in with one you already have — it does not register one for you. Create an account in a regular Soulseek client first (such as Nicotine+ or the official Soulseek client), then enter those credentials in Seekify's settings. You can uninstall the client afterward. (Seekify may one day create the account for you; it can't yet.)
scripts
The scripts folder has simple start and stop scripts: a version for Mac and Linux (start.sh / stop.sh), one for Windows (start.bat / stop.bat), and a double-click starter for Mac. They install anything Seekify needs, build it, and run it, or stop it.
the .env file
.env is a plain-text settings file that sits next to the app. It's a short, optional
list of preferences, one per line, written as NAME=value. Open it in any text
editor, change a value, and save. You don't need it to run; it's there for the
few things you might want to set before starting.
If you ever lose it or mess it up, here's the whole file to copy back in:
# Copy to .env and edit. Real environment variables override this file.
# A passcode that locks the settings screen (download options, Soulseek login,
# and the like). It does not lock the player or your music; those stay open.
# No effect unless you switch ADMIN_AUTH_ENABLED on below.
ADMIN_PASSCODE=
# Switch this to true to ask for the passcode before opening settings.
# Off (the default) means settings are open, just like the rest of Seekify.
ADMIN_AUTH_ENABLED=false
# Primary music library directory.
MUSIC_DIR=./music
# Optional secondary read-only library (mounted with a "media:" prefix).
# MEDIA_MUSIC_DIR=
# HTTP listen port.
PORT=8081
Everything else, like download format, sources, Soulseek login, and the needs-attention checker, lives in the app's own settings screen. That screen is the only thing a passcode guards; your music and the player stay open either way. And if you set the same thing as a real environment variable on your system, that takes priority.
running it
Once it's running, Seekify lives at http://localhost:8081 on the machine you started it on. It's local access for you and anything else on that machine.
There's an example GitLab pipeline (the .gitlab-ci.yml file) that builds a
Docker image and drops it on an Unraid-style server. It's just an example. Use
it, adapt it, or ignore it.
A couple of things are on you, and a little beyond what Seekify covers:
- reaching it from the internet: opening it up to the outside world means setting up port forwarding on your router. That's between you and your network.
- starting it automatically: Seekify runs while you start it. Making it launch on boot is something you set up with your own operating system.
roadmap
Seekify moves fast and changes often. There's no version number to chase; what's
in main is the app. Things being looked at (not promised, not scheduled) are
listed in ROADMAP.md. If a thing lands, it lands; if it doesn't,
the roadmap said so up front.
changelog
This project doesn't ship numbered releases. Instead there's a running
CHANGELOG.md of what changed, grouped by date. There's always an
Unreleased block at the top for whatever's in flight, and dated entries below
for what's already out. It's a log, not a version stamp.
credits
Written in Go, with a vanilla JavaScript and CSS front end, plus a little Python and shell.
Powered by:
- aioslsk: Soulseek downloads
- yt-dlp: YouTube downloads
- musicbrainzngs: MusicBrainz lookups
- Cover Art Archive: album art
- lrclib: lyrics
- ffmpeg: audio conversion and waveforms
- dhowden/tag: reading audio tags
- mutagen: writing audio tags
Media gallery
1 / 2Install Seekify on Unraid in a few clicks.
Find Seekify 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.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/sadoway7/seekify:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8081]- Network
bridge- Shell
sh- Privileged
- false
Template configuration
HTTP port for the WebUI.
- Target
- 8081
- Default
- 8081
SQLite database, cover/waveform cache, download jobs.
- Target
- /app/data
- Default
- /mnt/user/appdata/seekify/data
Primary music directory (read/write — autosort and downloads land here).
- Target
- /music
- Default
- /mnt/user/Media/music
Soulseek downloads need a free Soulseek account. Create one in a regular client (e.g. Nicotine+) first — Seekify does NOT register accounts. After install, enter your credentials in Seekify's in-app Download Settings.
- Target
- SLSK_NOTE
- Default
- Create one separately
Optional read-only secondary music library.
- Target
- /media-music
Path inside the container for the primary library.
- Default
- /music
Set to /media-music only if you mount the Secondary Library path.
Container-internal HTTP port. Leave as 8081.
- Default
- 8081



















