avatar

Pacificsky's Blog

TuneBoss: Turn an Old iPhone into an Always-On Spotify Display

· 553 words · 3 minutes ·

I built TuneBoss because I wanted a dedicated screen showing what’s playing on Spotify — something I could mount under my monitor and forget about. No app switching, no phone unlocking, just a permanent glanceable display with album art and visuals that react to the music.

It’s open source, self-hosted, and runs on a Raspberry Pi, NAS, Proxmox, home server or anywhere you run docker containers.

TuneBoss showing album art, track info, and spectrum analyzer with dynamic color theming

What It Does

TuneBoss polls the Spotify API from a lightweight Node.js backend and pushes track updates over WebSocket to a Vue 3 Progressive Web App. The display shows:

The whole thing runs fullscreen in portrait mode on the iPhone, with the screen wake lock keeping it on indefinitely. Install it as a PWA from Safari and it behaves like a native app — no browser chrome, no accidental navigation.

Three different tracks showing how the color theme adapts to each album's artwork

Why Not Just Use Spotify’s App?

Because Spotify’s app wants to be the thing you’re interacting with. I wanted a display that sits there passively — a piece of ambient information, not another app demanding attention. TuneBoss is a single-purpose appliance: the iPhone becomes a music screen and nothing else.

Architecture

iPhone (Safari PWA)  ◄──── WebSocket ────►  Node.js Backend
                                                  │
                                            Spotify Web API
                                          (poll every 3 seconds)

The backend handles all OAuth credentials and API communication. The iPhone is completely stateless — it just renders whatever the server sends. No Spotify tokens ever touch the client.

Polling is client-gated: the server only hits the Spotify API while someone is actually watching. Close the display and it stops polling immediately.

The Spectrum Analyzer

Spotify deprecated their audio analysis endpoint in late 2024, so TuneBoss generates its own visuals. Each track ID is hashed to seed a deterministic random number generator that produces a unique BPM, oscillator shapes, and per-band wave patterns. The same song always produces the same visualization.

For something closer to reality, there’s an optional microphone mode. It captures ambient audio through the Web Audio API, maps FFT data to 10 logarithmic frequency bands, and crossfades smoothly between the procedural and real-time spectrum when music is detected.

Running It

TuneBoss is Docker-ready. Set your Spotify API credentials, run the container, and open the URL on your phone:

docker compose up -d

It also runs bare-metal with Node.js, or behind Caddy for automatic HTTPS on a homelab. Full setup instructions are in the repo.

On the iPhone side: open the URL in Safari, tap Share → Add to Home Screen, and you’re done. For a truly locked-down display, enable Guided Access in iOS accessibility settings.

Building with AI

Tuneboss was built almost entirely by Claude Code. I prompted it and steered it when it got stuck on a few bugs - particularly on acquiring the iOS wake lock to keep the screen alive. But otherwise, Claude gets the credit for the software engineering.

Get It

TuneBoss is MIT licensed and available on GitHub:

GitHub: TuneBoss

Contributions and feedback are welcome — open an issue if you have ideas or run into problems.

Tags: Selfhosted  Spotify  Docker  Vue  Pwa  Homelab  Iphone  Node