jukebox.

self-hosted ยท your own library

A library,
surrounded by players.

The server indexes, transcodes and serves. The players stay where they already are โ€” a browser, a Sonos, an AirPlay speaker, a Raspberry Pi with a DAC โ€” and iPods sync through satellites. An iTunes-style interface on top, because the shape was right the first time.

Read the architectureTry the interface

jukeboxdemoopen โ†—

A fabricated library, generated in the browser โ€” no server behind it. Four themes, switchable from the status bar.

Three directions, kept apart

Most projects conflate them, and then cannot explain why casting to a Sonos is not the same as filling an iPod.

Renderer

Plays right now. A browser, a Sonos, a tablet, a sound card. It gets a stream, not files.

Device

Holds a copy. An iPod. Files have to be transferred, converted and checked โ€” the phase where a power cut corrupts something.

Emitter

Lets others read the library. An OpenSubsonic server, DLNA, an outgoing radio stream.

What runs today

PieceState
Server โ€” Hono on node:sqliteLibrary index, streaming folder scan, tag read and in-place write, acoustic fingerprints, manual and smart playlists, a job queue resumable after a crash, cursor pagination, delta sync by revision, SSE.
Interface โ€” React + TanStackVirtualized table over the real API, multi-selection, drag and drop, bulk editing, four themes (iTunes 8, iTunes 12, Apple Music and Studio), generated artwork.
Satellites, plugins, emittersSpecified in the architecture, not written yet. The contracts come first on purpose.
Node โ‰ฅ 22.13, zero native modules, no install script: the same install on x64, ARM, a NAS and a Raspberry Pi. That constraint decided half the stack โ€” see Stack.