Nightshift

Your music library’s night shift.

A self-hosted web UI that pulls music from Spotify, SoundCloud and YouTube into your local library — tagged, organized, playlist-ready, and kept up to date automatically every night.

Get started Source on GitHub

MIT licensed · Docker or bare metal · runs next to Navidrome, Jellyfin or any folder-reading server

What it does

Three sources, one box

Paste a Spotify, SoundCloud or YouTube link. Nightshift picks the right pipeline — spotDL or yt-dlp — by itself and streams the progress live.

Playlists that stay current

Mark a playlist once and the nightly job keeps it up to date, working through large ones across several nights when rate limits bite.

Search and download

Find tracks and albums through the iTunes catalog, preview them, and pull them into the library with one click.

Tagged on arrival

Optional beets integration imports and tags new files, and m3u8 playlists are written so your media server picks them up instantly.

Multi-user

Admin and regular accounts, each with their own download log. Downloaded playlists can be made public or handed to a Navidrome user.

Day & night shift

A full light and dark theme, and an interface translated into seven languages.

Apps for your phone

Native clients for iOS and Android, talking to the same API as the browser. Nothing to enable on the server.

The downloads screen with its live log Searching the iTunes catalog Playlists kept in sync Settings

iOS

SwiftUI, iPhone and iPad with iOS 16 or newer. Apple does not allow this kind of app in the App Store, so it is installed through AltStore or SideStore — or sideloaded from the IPA.

nightshift-ios

Android

Jetpack Compose, Android 8 or newer. Download the APK, open it, allow the install once — updates then land straight over the previous version.

nightshift-android

Getting started

The image brings everything the pipelines need — ffmpeg, yt-dlp, deno, spotDL and beets — so there is no version drift between components.

Docker

services:
  nightshift:
    image: ghcr.io/jannehy/nightshift:latest
    container_name: nightshift
    ports:
      - "8765:8765"
    volumes:
      - ./config:/config
      - /path/to/your/music:/music
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Berlin
    restart: unless-stopped
docker compose up -d

Open http://your-server:8765 and follow the setup wizard: admin account, library path, options. No config file editing required.

Bare metal

Nightshift is a normal Python application and ships with a production WSGI server, so pip install -r requirements.txt and python -m nightshift are enough. The README has the details, including why deno has to be on the PATH.