Skip to main content
Rockbox can act as a Jellyfin server for native Jellyfin clients on your LAN. Internally it’s a thin actix-web shim over the same rockbox-library SQLite database the Subsonic API reads from — there’s no separate scan, no separate user store, and no extra daemon to manage.

Enabling

Set jellyfin_port in ~/.config/rockbox.org/settings.toml:
Then rockbox restart. The server is disabled when jellyfin_port is missing or when subsonic_password is empty — credentials are shared with the Subsonic side.

Discovery

When enabled, two discovery mechanisms run alongside the HTTP server:
  • mDNS: _jellyfin._tcp.local. is advertised on the configured port, with a ID=… TXT record matching the server’s stable Jellyfin id.
  • UDP 7359: the server binds the standard Jellyfin client-discovery port and answers the literal probe "Who is JellyfinServer?" with a JSON response containing the server’s LAN URL.
Both run automatically; nothing to configure.

Tested clients

For music, use Finamp (or Amcfy / Symfonium).

Endpoint surface

The server implements enough of the Jellyfin OpenAPI to satisfy the native music clients above. All authenticated routes accept the token via X-Emby-Token header, Authorization: MediaBrowser Token="…", or ?api_key=… on streaming URLs. Query parameters work in both camelCase (?parentId=…) and PascalCase (?ParentId=…); repeated keys (?includeItemTypes=Audio&includeItemTypes=MusicAlbum) are concatenated. Item IDs are deterministic dashed UUIDs derived from the native Artist/Album/Track ids, and round-tripped via a jf_guids lookup table so subsequent requests resolve back to the right row.

Quick test

What’s not supported

  • Video — Rockbox is an audio-only player. Video libraries and the /Videos/{id}/stream endpoint family are not implemented.
  • Transcoding — only direct play. MediaSource.SupportsTranscoding is false; clients must support the container natively.
  • WebSocket notifications (/socket) — clients fall back to polling /Sessions, which is supported.
  • Multi-user — there is a single synthetic user matching subsonic_username. Token storage is real (persisted in jellyfin_tokens), but every token belongs to the same user.
  • Playlists, lyrics, parental ratings, sync, live TV — out of scope.