Seekify

Seekify

Docker app from Seekify's Repository

Overview

Self-hosted music server that rips what's missing. Downloads tracks and albums from YouTube (via yt-dlp) and Soulseek, tags them, and sorts them into your library. Then plays everything: browse by artist/album/playlist, now-playing with waveform and visualizer, favorites, history, and a needs-attention view that flags missing metadata, duplicates, and messy names. Single Go binary + vanilla JS SPA. Downloads: search a track or a whole album, pull from YouTube or Soulseek (you choose which to prefer), or bulk-import by pasting a list. Watched YouTube playlists auto-fetch new videos as they appear. Everything is tagged and filed into Artist/Album folders for you. Soulseek needs a free Soulseek account (create one in a regular client like Nicotine+ first; Seekify doesn't register accounts). Setup: mount your music share here, pick a port, install, then open the WebUI. On first launch you'll be asked to create an admin account (username + password) — this is one-time and unlocks the player. Paths and port are set in this dialog; everything else — Soulseek login, download format, source preference, admin passcode — is configured inside the app under Settings, and persists across updates. WARNING: Seekify performs automatic actions on your music library — it re-tags files, sorts them into Artist/Album folders, downloads new tracks, and reorganizes as part of its housekeeping. Do NOT point it at a precious or irreplaceable library. Use a copy, a dedicated share, or a library you're fine with Seekify modifying. Mount your music share at /music (you can change this path at install); the default is /mnt/user/Media/music.
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.


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.

mobile UI mobile UI mobile UI mobile UI
mobile UI mobile UI mobile UI mobile UI
mobile UI mobile UI mobile UI

see it on a computer

home library
home
now playing + menu
now playing
downloads all
live queue
bulk import
bulk import
downloads done
done
artist albums
artist / albums
artist tracks
artist / tracks
home artists + favorites
favorites + new
now playing + history
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 AnalyserNode tapped 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

  1. put your music files in your music folder
  2. open Seekify in a browser and your library shows up on its own
  3. press play; search for and download anything you're missing
  4. 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:


rip it. play it. repeat.

Media gallery

1 / 2

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-07-10
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
Soulseek AccountVariable

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