khord

khord

Docker app from khord's Repository

Overview

Khord is a self-hosted music sharing app. Share a song once — everyone listens on whichever streaming service they use (Spotify, Apple Music, YouTube Music, Deezer, and more). Setlists, upvoting, cross-platform links, and an admin panel all included. All data stored in a single SQLite database — no external services required. No reverse proxy is included — point your existing Unraid reverse proxy (NGINX Proxy Manager, Swag, Traefik, etc.) at port 3000 on this container. HTTPS is required for a publicly accessible instance.

Khord

Share music, listen anywhere.

Khord is a self-hosted music sharing app. Share a song once — everyone listens on whichever streaming service they use. Spotify, Apple Music, YouTube Music, Deezer, and more. Artist revenue flows naturally because playback happens natively in each platform.

Vibe coded with Claude — this project was built collaboratively with Claude Code (Anthropic). Architecture decisions, feature design, and implementation were a human+AI pair programming effort.


Features

For users

  • Song sharing — search for any song, share it with an optional note; album art and cross-platform links resolved automatically
  • Cross-platform links — your preferred streaming service shown first; no in-app playback, songs open natively in each platform
  • Feed — songs from everyone on the instance, plus a Daily view to browse shares by date
  • Daily view — browse shares by date; create a setlist from an entire day in one click
  • Setlists — curated, ordered playlists; drag to reorder; shareable via link; propose songs to others' setlists
  • Upnotes — lightweight reactions on any shared song

For instance owners

  • 18 themes — neutral and chromatic, dark and light variants; set via PUBLIC_THEME
  • Customizable landing page — edit src/lib/landing.svelte to add community-specific copy and imagery
  • Instance configuration — app name, tagline, and access control via env vars
  • Admin panel — manage users, bans, access requests, and instance settings at /admin
  • Streaming integrations — enable Spotify, YouTube Music, and Apple Music playlist import via the admin panel; Deezer and iTunes always-on
  • Access control — open registration, invite-only, or user cap; mix and match
  • Playlist import — users can paste a Spotify, YouTube Music, Deezer, or Apple Music playlist URL to import all tracks at once

Stack

  • SvelteKit + TypeScript + TailwindCSS
  • better-sqlite3 — all data stored in SQLite (songs, votes, setlists, users)
  • bcryptjs — password hashing for email/password auth
  • iTunes Search API — free song discovery and Apple Music track links (no auth)
  • Spotify Web API — client credentials search + playlist fetch (optional)
  • Deezer API — track search and playlist fetch (no credentials, always-on)
  • YouTube Data API v3 — YouTube Music links + playlist fetch (optional)
  • Apple Music catalog API — playlist import via MusicKit developer token (optional)
  • svelte-dnd-action — drag-to-reorder for setlists

How it works

  1. User registers with an email address and password; session stored as a server-side cookie
  2. User searches for a song (iTunes API) and selects a result; iTunes provides the Apple Music URL and artwork
  3. Server resolves cross-platform links in parallel — Spotify, Deezer, and YouTube Music searched directly
  4. Song written to SQLite with all resolved platform URLs; appears in the feed immediately
  5. Listeners open songs in their preferred platform — no in-app playback

Getting started

npm install
cp .env.example .env   # fill in values
npm run dev            # http://localhost:5173

See docs/contributing.md for full dev setup, tunnel configuration, and project structure.

Deploying

Docker Compose + Caddy on a VPS, or install the container directly from Unraid Community Applications.

See docs/deploying.md for step-by-step instructions.

Managing your instance

See docs/admin.md for the full admin guide — streaming integrations (Spotify, YouTube Music, Apple Music), themes, access control, admin panel reference, and backup.

Roadmap

  • Email + password auth with server-side sessions
  • Song sharing with cross-platform links (Spotify, Apple Music, YouTube Music, Deezer, and more)
  • Feed — instance-wide view; upnotes; SQLite storage
  • Setlists — create, reorder, collaborate via proposals, daily view
  • Instance management — 18 themes, access control, admin panel, Docker/Unraid deployment
  • Playlist import — Spotify, YouTube Music, Deezer, Apple Music (requires MusicKit token)
  • Setlist export to Spotify
  • Setlist export to Apple Music
  • Android app (Capacitor — in internal testing; background notifications via 15-min polling, by design for self-hosted instances)
  • iOS app (Capacitor — not started)

Questions

Open an issue or email dev@khord.app.

License

Khord is licensed under the GNU Affero General Public License v3.0. See LICENSE for details.

Third-party API attributions are listed in NOTICE.

Install Khord on Unraid in a few clicks.

Find Khord 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 Khord Review the template variables and paths Click Install

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/khordapp/khord:latest
Last Updated2026-07-17
First Seen2026-05-31

Runtime arguments

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

Template configuration

Web UI PortPorttcp

Port exposed by the container. Point your reverse proxy (NGINX Proxy Manager, Swag, etc.) at this port — do not expose it directly to the internet.

Target
3000
Default
3000
Value
3000
Data PathPathrw

Directory where the SQLite database and thumbnail cache are stored.

Target
/data
Default
/mnt/user/appdata/khord/data
Value
/mnt/user/appdata/khord/data
App URLVariable

Publicly accessible URL for this instance, e.g. https://khord.yourdomain.com.

Target
PUBLIC_APP_URL
Default
https://khord.yourdomain.com
Owner EmailsVariable

Comma-separated email addresses granted admin/owner privileges. The first account registered with a matching email receives the admin role automatically.

Target
OWNER_EMAILS
Spotify Client IDVariable

Spotify app client ID from developer.spotify.com. Optional — enables Spotify URL resolution and playlist import. Both Client ID and Client Secret are required together. After setting, enable Spotify in the admin panel Settings tab.

Target
PUBLIC_SPOTIFY_CLIENT_ID
Spotify Client SecretVariable

Spotify app client secret from developer.spotify.com. Required alongside Spotify Client ID. Keep this private. Note: the account that owns the Spotify app must have an active Spotify Premium subscription.

Target
SPOTIFY_CLIENT_SECRET
YouTube API KeyVariable

YouTube Data API v3 key from console.cloud.google.com. Optional — enables YouTube Music URL resolution when sharing songs. Also enable YouTube Music in the admin panel Settings tab. Note: free quota is ~100 searches/day (100 units per call, 10,000/day limit).

Target
YOUTUBE_API_KEY
Apple Music Developer TokenVariable

MusicKit JWT from developer.apple.com → Keys. Optional — enables Apple Music playlist import. Requires an Apple Developer account ($99/yr). Tokens are valid up to 6 months; regenerate before expiry. After setting, enable in the instance admin panel under Settings.

Target
PUBLIC_APPLE_MUSIC_DEV_TOKEN
Max UsersVariable

Maximum number of registered users. 0 = unlimited. Can also be adjusted live from the /admin panel.

Target
MAX_USERS
Default
0
Value
0
App NameVariable

Display name shown in the UI and page titles.

Target
PUBLIC_APP_NAME
Default
Khord
Value
Khord
App TaglineVariable

One-line tagline shown on the home page.

Target
PUBLIC_APP_TAGLINE
Default
Share music, listen anywhere.
Value
Share music, listen anywhere.
Disable Album ArtVariable

Set to true to hide album art thumbnails on song cards. Can also be toggled live from the /admin panel.

Target
DISABLE_ALBUM_ART
Default
false
Value
false
ThemeVariable

UI color theme. Requires a container restart to apply. Options — neutral dark: dark, zinc, slate, gray, neutral, stone. Neutral light: light, zinc-light, slate-light, neutral-light, stone-light. Chromatic dark: navy, teal, emerald, rose, violet.

Target
PUBLIC_THEME
Default
dark
Value
dark
Database File NameVariable

File name of the SQLite database stored in the Data Path directory. Only change this if you need to rename the database file.

Target
INDEXER_DB_NAME
Default
khord.db
Value
khord.db
Thumbnail Cache DirectoryVariable

Directory for the server-side album art disk cache. Lives inside the Data Path volume by default. Manage cache size from the admin panel (Admin → Cache tab).

Target
THUMBNAIL_CACHE_DIR
Default
/data/thumbnails
Value
/data/thumbnails