Seekify

Seekify

Docker app from Seekify's Repository

Overview

Self-hosted music server. Scans local libraries, streams audio, and pulls metadata/cover art from MusicBrainz. Download from YouTube (yt-dlp) and Soulseek (aioslsk), generate waveforms, and auto-tag your library. Single Go binary + vanilla JS SPA; mobile-friendly.
Seekify

Seekify

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.


Screenshots are a snapshot, not a promise. The interface keeps moving.

home library
home
now playing + menu
now playing
downloads queue
live download queue
artist albums
artist / albums

on a phone

mobile UI mobile UI mobile UI mobile UI

Install it as an app on a phone for a full-screen player with lock-screen and media-key controls.

More screenshots
now playing + history
history
downloads done
done
bulk import
bulk import
artist tracks
artist / tracks
home artists + favorites
favorites + new
mobile UI mobile UI mobile UI mobile UI
mobile UI mobile UI mobile UI

What It Does

  • browse albums, artists, playlists and favorites, with a play history, a waveform seekbar, shuffle and repeat
  • plays any format in any browser: if the browser can't handle it (FLAC on iPhone, ALAC in Chrome), the server converts it on the fly
  • a full-screen audio-reactive visualizer, written in raw WebGL2 shaders and tinted to the current album cover
  • browse an artist's whole catalogue, see which tracks you already have, and rip the rest with one tap; Rip More jumps there straight from now-playing
  • search for a track or a whole album, paste a YouTube, SoundCloud or Bandcamp link, or paste a list of songs and bulk-rip them all; downloads come from Soulseek or YouTube, whichever you prefer, and every job shows its progress live
  • when a download fails or arrives corrupt, the next candidate takes over, and live or wrong versions of a song get rejected in favor of the studio recording
  • downloads are tagged and sorted into artist and album folders for you; a needs-attention view flags missing info, messy names, duplicates and bad artwork; fix problems inline, and a track you approve stays approved
  • tags, artwork and lyrics are written into the audio files themselves, so anything you rip stays fully tagged if it ever leaves Seekify
  • send someone a playlist link and they can play it in their browser; upload your own cover art when the official one is wrong
  • first run sets up an admin account; each user you add gets their own playlists, favorites and history, and visitors can still listen
  • a rolling 7-day backup of your library database
  • an admin log viewer for seeing what the server has been up to

Getting Started

The quickest start, from a clone of this repo:

./scripts/start.sh        # installs helpers if missing, builds, and runs

Then:

  1. Seekify opens at http://localhost:8081. Create the admin account on first run.
  2. Put music in the folder it's watching (./music next to the app, or whatever MUSIC_DIR points at). Anything you already have works: it reads the tags, finds cover art, and builds the library on its own.
  3. Press play.
  4. Missing something? Search for it and rip it. Downloads arrive tagged, sorted, and ready to play.

To stop it later: ./scripts/stop.sh (Mac/Linux), stop.bat (Windows), or just close it. Windows users can double-click start.bat; the scripts/ folder also has a Mac double-click starter.

Once running, Seekify runs as one program and works on its own; yt-dlp for YouTube, ffmpeg for converting and waveforms, and python for Soulseek are optional helpers, and it runs fine without them. Everything else (download format, sources, Soulseek login, what the needs-attention checker looks for) you set inside the app. There's also an example GitLab pipeline that builds a Docker image for an Unraid-style server. Reaching it from the internet and starting it on boot are yours to set up.

Soulseek account: you need a Soulseek account before you can use the Soulseek download source. Seekify can register one for you in Settings, or you can log in with an account you already have.

The .env file

.env is an optional plain-text settings file (NAME=value, one per line) that sits next to the app. Real environment variables override it.

ADMIN_PASSCODE=          # locks the settings screen only (with ADMIN_AUTH_ENABLED=true)
ADMIN_AUTH_ENABLED=false
MUSIC_DIR=./music        # primary music library
# MEDIA_MUSIC_DIR=       # optional secondary read-only library
PORT=8081

The passcode guards the settings screen only, never the player or your music.

Changelog

Seekify moves fast; what's in main is the app. What changed lives in CHANGELOG.md.

Credits

Written in Go, with a vanilla JavaScript and CSS front end, plus a little Python and shell. It's powered by:


rip it. play it. repeat.

Media gallery

1 / 4

Install 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.

Open the Apps tab on your Unraid server Search Community Apps for Seekify Review the template variables and paths Click Install

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/sadoway7/seekify:latest
Last Updated2026-09-06
First Seen2026-07-10

Runtime arguments

Web UI
http://[IP]:[PORT:8081]
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUIPorttcp

HTTP port for the WebUI.

Target
8081
Default
8081
AppdataPathrw

SQLite database, cover/waveform cache, download jobs.

Target
/app/data
Default
/mnt/user/appdata/seekify/data
Music LibraryPathrw

Primary music directory (read/write - autosort and downloads land here).

Target
/music
Default
/mnt/user/Media/music
Secondary LibraryPathro

Optional read-only secondary music library.

Target
/media-music
MUSIC_DIRVariable

Path inside the container for the primary library.

Default
/music
MEDIA_MUSIC_DIRVariable

Set to /media-music only if you mount the Secondary Library path.

PORTVariable

Container-internal HTTP port. Leave as 8081.

Default
8081