All apps · 0 apps
khord
Docker app from khord's Repository
Overview
Readme
View on GitHubKhord
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.svelteto 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
- User registers with an email address and password; session stored as a server-side cookie
- User searches for a song (iTunes API) and selects a result; iTunes provides the Apple Music URL and artwork
- Server resolves cross-platform links in parallel — Spotify, Deezer, and YouTube Music searched directly
- Song written to SQLite with all resolved platform URLs; appears in the feed immediately
- 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.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/khordapp/khord:latestRuntime arguments
- Web UI
http://[IP]:[PORT:3000]/- Network
bridge- Shell
sh- Privileged
- false
Template configuration
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
Directory where the SQLite database and thumbnail cache are stored.
- Target
- /data
- Default
- /mnt/user/appdata/khord/data
- Value
- /mnt/user/appdata/khord/data
Publicly accessible URL for this instance, e.g. https://khord.yourdomain.com.
- Target
- PUBLIC_APP_URL
- Default
- https://khord.yourdomain.com
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 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 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 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
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
Maximum number of registered users. 0 = unlimited. Can also be adjusted live from the /admin panel.
- Target
- MAX_USERS
- Default
- 0
- Value
- 0
Display name shown in the UI and page titles.
- Target
- PUBLIC_APP_NAME
- Default
- Khord
- Value
- Khord
One-line tagline shown on the home page.
- Target
- PUBLIC_APP_TAGLINE
- Default
- Share music, listen anywhere.
- Value
- Share music, listen anywhere.
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
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
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
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