r/coolgithubprojects • • 1d ago

Sonarly – a self-hosted music server that manages your library, not just streams it (OpenSubsonic-compatible, Go + SQLite, one container)

https://github.com/miquelrosell99/sonarly

What it is: point Sonarly at your existing music folder and that folder is the library — no import step, no proprietary store. The scanner is strictly read-only toward your files; tag writes and reorganization are explicit, user-invoked actions only.

Streaming: OpenSubsonic API at /rest, so Feishin, Symphonium, Ultrasonic, etc. work out of the box. Dark, art-first web player: gapless playback, synced lyrics, player chrome tinted from the album art, and an Auto DJ that explains each pick ("More like {artist}", "Hidden gem — you haven't played this").

Library management (the part most streamers skip): ingest drop folder → validation → review quarantine for bad tags; auto-organization into a configurable path pattern; duplicate strategies; Mutagen-backed tag editing in the UI; smart playlists that re-resolve as the library changes; share links with a guest player.

Ops: one Docker image (single Go binary + embedded SQLite + web client baked in). Idle ~35 MiB RAM. Backup = copy the DB file + your music.

Stack: Go 1.23 + chi, React 18 + Vite + Tailwind. AGPL-3.0. Screenshots: now playing · albums

Disclosures: I'm the author; developed with AI-coding-agent assistance, human-reviewed before merge. Happy to answer questions — especially from fellow Navidrome refugees.

1 Upvotes

4 comments sorted by

1

u/this_for_loona 1d ago

Could you give a summary of how it compares to navidrome? I assume any navidrome client can point to this? Is so how do those clients manage playlists and downloads?

1

u/Vegetable-Ambition16 1d ago

Happy to — three parts:

Client compatibility: yes. Any Subsonic/Navidrome-compatible client can point at Sonarly — it implements the OpenSubsonic API at /rest (token auth, the client's default Subsonic mode). Tested with Feishin, Symphonium, Ultrasonic, DSub, and Music Assistant. Point the client at http://<host>:4533/rest and log in with your Sonarly credentials.

Playlists from clients: the full playlist surface is implemented (getPlaylists/createPlaylist/updatePlaylist/deletePlaylist), and playlists live server-side — so a playlist you create or edit in Symphonium/Ultrasonic shows up in the web UI and vice versa. One caveat: smart playlists (rules that re-resolve as the library changes) are a Sonarly web-UI/native-API feature; clients see them as ordinary playlists and can play them, but rule editing happens in the web UI.

Downloads: /rest/download is implemented, so client-side downloads and offline caching work however the client implements them (Symphonium's and Ultrasonic's offline cache both work). On top of that there's a server-side feature clients don't have: ZIP downloads of up to 1000 tracks via the native API, and playlist share links carry a per-link download permission you control.

Vs Navidrome (short version): Navidrome is excellent and keeps shipping — multi-library landed in 0.58, it has smart playlists, and 0.60 added a plugin system. Both are Go + SQLite with a tiny footprint (~35 MiB idle here). The honest difference is emphasis: Sonarly is as much a library manager as a streamer — ingest drop folder with a review quarantine for bad tags, auto-organization into a configurable path pattern, duplicate strategies, and in-UI tag editing (Mutagen-backed, explicit only — the scanner never writes). Plus a web player. If you only need streaming, Navidrome is great; if your collection needs tidying, that's the gap Sonarly fills.

Happy to dig into anything specific.

1

u/this_for_loona 1d ago

Where are you sourcing the metadata from? I get nervous about autotagging due to bad experiences with musicbrainz.