Self-Hosted Web Mode
Run Nightingale on a Linux box at home, then open it from phones, laptops, tablets, or TVs on your LAN.
You get one local URL:
http://<hostname>.localUse plain HTTP for browsing, playback, queues, and most features. Use HTTPS if you want browser features like microphone capture, fullscreen, and clipboard (unless they work via http).
Quick install
Section titled “Quick install”On the Linux host:
curl -fsSL https://raw.githubusercontent.com/rzru/nightingale/master/scripts/install.sh | bashWhen system changes start, the installer shows the first sudo command, asks for confirmation, then prints each admin command before it runs.
When it finishes, open the URL shown by the installer, usually:
http://<hostname>.localThe installer is safe to re-run. Re-running upgrades Nightingale and keeps your data.
What the installer does
Section titled “What the installer does”It sets up:
nightingale.service— runs the Nightingale web server.caddy.service— serves Nightingale on HTTP and HTTPS.avahi-daemon— makes<hostname>.localwork on your LAN.- A system user named
nightingale(optional). - A default data folder at
/var/lib/nightingale.
Your music folder is not configured by the installer. You choose it in the app.
Requirements
Section titled “Requirements”- Linux host with
systemd. - Root access with
sudo. - Internet access to download Nightingale and setup dependencies.
- Ports
80,443, and5353/udpallowed on your LAN if you use a firewall. - Optional: NVIDIA GPU for faster analysis.
The installer can install caddy and avahi-daemon with apt, dnf, pacman, zypper, or apk. If your distro uses something else, install those packages first, then run the installer.
First launch
Section titled “First launch”- Open
http://<hostname>.localfrom any device on your LAN. - Follow setup in the browser.
- Choose a data folder with enough space for models, cache, videos, and analysis files.
- Wait while Nightingale downloads
ffmpeg, Python, PyTorch, WhisperX, Demucs, UVR models, and other dependencies. - Open the library menu, choose a music folder, and scan your songs.
If your songs are on the server at /srv/music/karaoke, enter that full path in the app.
Microphone support and HTTPS
Section titled “Microphone support and HTTPS”Browsers block microphone capture on normal HTTP pages unless the page is localhost. Since <hostname>.local is not treated as secure, mic capture needs HTTPS. When Nightingale asks for microphone access, allow it so the browser can list your inputs.
Nightingale already serves HTTPS at:
https://<hostname>.localBefore browsers trust it, install Nightingale’s local certificate once on each device.
Download the certificate from your LAN:
curl -O http://<hostname>.local/root.crtThen trust it:
- macOS — open
root.crt, add it to Keychain, set it to Always Trust. - iPhone / iPad — send
root.crtto the device, install the profile, then enable it in Settings → General → About → Certificate Trust Settings. - Windows — double-click
root.crt, install it to Trusted Root Certification Authorities. - Android — install it as a CA certificate in security settings. Some browsers may need their own certificate import too.
- Linux — copy it to
/usr/local/share/ca-certificates/nightingale.crt, runsudo update-ca-certificates, and import it separately in Firefox if needed.
After that, use https://<hostname>.local for microphone scoring.
Firewall
Section titled “Firewall”If your firewall is active, open these inbound LAN ports:
| Port | Protocol | Used for |
|---|---|---|
80 | TCP | HTTP app access |
443 | TCP | HTTPS app access and microphone support |
5353 | UDP | .local discovery with Avahi / mDNS |
Ubuntu / Debian / Raspberry Pi OS with ufw:
sudo ufw allow 80/tcp comment 'nightingale http'sudo ufw allow 443/tcp comment 'nightingale https'sudo ufw allow 5353/udp comment 'nightingale mdns'sudo ufw reloadFedora / RHEL / openSUSE with firewalld:
sudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --permanent --add-service=mdnssudo firewall-cmd --reloadIf your firewall is inactive, you do not need to do anything.
Music folder permissions
Section titled “Music folder permissions”Nightingale runs as the nightingale user by default, or any other user you prompt during the setup. That user needs read access to your songs.
For a common /srv/music/karaoke folder:
sudo setfacl -m u:nightingale:rx /srv/musicsudo setfacl -R -m u:nightingale:rx /srv/music/karaokeYou can also grant access with normal Unix groups if that fits your setup better.
Updating
Section titled “Updating”Run the installer again:
curl -fsSL https://raw.githubusercontent.com/rzru/nightingale/master/scripts/install.sh | bashThis replaces the server binary and restarts Nightingale. Your config, library, cache, and music stay in place.
To install a specific version:
curl -fsSL https://raw.githubusercontent.com/rzru/nightingale/master/scripts/install.sh | NIGHTINGALE_VERSION=v1.3.0 bashUseful commands
Section titled “Useful commands”systemctl status nightingale caddyjournalctl -u nightingale -fjournalctl -u caddy -fsudo systemctl restart nightingaleChange the local name
Section titled “Change the local name”To use a friendlier URL like nightingale.local, follow the setup prompts or use an environmental variable:
curl -fsSL https://raw.githubusercontent.com/rzru/nightingale/master/scripts/install.sh | NIGHTINGALE_HOSTNAME=nightingale.local bashThen open:
http://nightingale.localIf your router supports DHCP reservations, reserve a stable IP for the host too.
Run with Docker
Section titled “Run with Docker”Prefer containers? You can skip the systemd / Caddy / Avahi installer entirely and run the server in Docker (CPU or CUDA/GPU). See Docker.
Build from source
Section titled “Build from source”Use this if you are testing local changes or no release exists yet:
git clone https://github.com/rzru/nightingale.gitcd nightingalebash scripts/install.sh --from-sourceYou need cargo, node, and pnpm available in your user shell.
Advanced installer options
Section titled “Advanced installer options”Most users do not need these.
| Variable | Default | Use |
|---|---|---|
NIGHTINGALE_VERSION | latest | Install a specific GitHub Release tag. |
NIGHTINGALE_REPO | rzru/nightingale | Install from another repo. |
NIGHTINGALE_HOSTNAME | $(hostname -s).local | Publish a different .local name. |
NIGHTINGALE_USER | nightingale | Run service as another system user. |
NIGHTINGALE_DATA_DIR | /var/lib/nightingale | Bootstrap config and service data path. |
NIGHTINGALE_FORCE_AVAHI_HOSTNAME | unset | Overwrite an existing Avahi hostname override. |
NIGHTINGALE_FORCE_CADDYFILE | unset | Let installer replace an existing Caddyfile after backing it up. |
The installer tries not to overwrite your existing Caddy or Avahi setup. If it detects a conflict, it stops and prints what to fix.
Uninstall
Section titled “Uninstall”sudo systemctl disable --now nightingalesudo rm /etc/systemd/system/nightingale.servicesudo systemctl daemon-reloadsudo rm -f /usr/local/bin/nightingale /usr/local/bin/nightingale.etag /usr/local/bin/nightingale.versionsudo rm -f /etc/avahi/services/nightingale.servicesudo systemctl restart avahi-daemonIf the installer created Nightingale’s Caddy snippet, remove it and reload Caddy:
sudo rm -f /etc/caddy/Caddyfile.d/nightingale.caddysudo systemctl reload caddyData is kept by default. Remove it only if you are done with it:
sudo rm -rf /var/lib/nightingalesudo userdel nightingale