Skip to content

Release history

gonic releases

Lightweight music streaming server. Subsonic compatible. `GPL-3.0` `Go/Docker`

All releases

6 shown

Review required
v0.21.0 Breaking risk
Auth Breaking upgrade

Transcoding, seeking, artist metadata, playlist security, Go bump

v0.20.1 Bug fix

Fixed regression in playlist ID handling.

Full changelog

Bug Fixes

  • playlist: fix regression in playlist ID handling (103a048), closes #655
v0.20.0 New feature
Notable features
  • Playlist cover art support on filesystem
  • Log‑db option to log queries
  • Non‑admin podcast episode downloads
Full changelog

Features

  • add support for playlist cover art on filesystem (aad729e), closes #650
  • ci: bump golangci-lint (79e3898)
  • db: add an index on albums.created_at (816e437), closes #620
  • gonic: add log-db option to log queries (75a0918), closes #620
  • scanner: read multi valued release types (c752a22)
  • subsonic: allow non admins to download podcast episodes (c2ebe96), closes #623
  • subsonic: implement getSimilarSongs for artists and albums (#649) (db9aa2b)
  • subsonic: return disc titles (0377bfa)
  • taglib: add .ape as a supported filetype (82642eb), closes #615

Bug Fixes

  • db: enable WAL also for Wasm driver (b67c1c1), closes #620
  • db: use separate DSN for both drivers (4696499)
  • gonic: correct typo in command line help (#640) (99e2ccf)
  • podcast: truncate filenames longer than 200 chars (e12ab54), closes #624
  • podcast: validate response status code when fetching podcast audio (2900ce5), closes #639
  • scanner: clear metadata of albums who no longer have tracks (ca59601), closes #638
  • scanner: reset embedded cover for album when toggling scan-embedded-cover (ea5e625), closes #619
  • subsonic: correct spec typos (04ff7f3), closes #653
v0.19.0 Breaking risk
⚠ Upgrade required
  • Set `CGO_ENABLED=0` when building to produce static binaries
  • Verify vendored WASM artifacts using provided attestations (taglib.wasm and sqlite3.wasm)
  • To opt out of WebAssembly backends, build with `-tags nowasm`; this re‑enables Cgo for SQLite and uses ffprobe for tagging
Breaking changes
  • Removed requirement for `sqlite-dev` and `libtag-dev` system packages
  • Default build switched to Cgo‑free WebAssembly backends; native Cgo builds are opt‑in via the `nowasm` tag
Notable features
  • Cgo‑free database backend using go‑sqlite3 WASM implementation
  • Cgo‑free tagging backend using go‑taglib WASM implementation
  • Added `scan-embedded-cover-enabled` flag for embedded cover handling
Full changelog

This release uses WebAssesmby for the tagging and database backends. This means that gonic no longer requires Cgo or external dependencies to build. As a result, static binaries will be available in the releases page, and Docker images for more architectures. Performance of scanning and tagging should also be improved.

Features

  • build: add Cgo free database (505f7d8)
  • build: add Cgo free tagging backend (7802e20)
  • ci: merge nightly and debug workflows (ca85eed)
  • ci: remove Cgo dependencies, cross compile without QEMU, upload static binaries (e3db819)
  • ffprobe: add more supported file types (8e7820a)
  • gonic: add scan-embedded-cover-enabled flag (c69cb8c)
  • gonic: use wrtag/normtag for nag normalisation (aba758f)
  • subsonic: also read unsynced lyrics from .txt files and tag metadata (eb0d8fd), closes #593
  • subsonic: keep original cover file format when caching (#609) (1af4ce3), closes #11
  • subsonic: return genres for getAlbumListTwo2 (3909e9b), closes #605
  • subsonic: support embedded cover art (ec7cffd), closes #11 #556
  • subsonic: support embedded track level cover art (d66814b), closes #11
  • tags: add ffprobe reader (3a9c03a)
  • tags: add Properties.HasCover (bc0b6c0)
  • tags: add ReadCover interface method (e413bc3)

⚠ Note to package maintainers

  • The sqlite-dev and libtag-dev (or your distro's equivalents) packages are no longer required; please remove them from package dependencies.
  • Build with CGO_ENABLED=0 to produce static binaries.

gonic now vendors reproducible WebAssembly backends for TagLib and SQLite, eliminating Cgo and external system libraries. Builds are fully static, cross-compiling is straightforward, and supply-chain verification is easier.

Verify the vendored WASM artifacts using Artifact Attestations:

Example build pipeline:

$ git clone https://github.com/sentriz/gonic
$ cd gonic

$ sha256sum "$(go list -m -f '{{.Dir}}' go.senan.xyz/taglib)/taglib.wasm"
# expected ca5ce04b35f1e6cad8b8d9f00906a4c108ccd004b56e713db5ce69aa69b3805d (https://github.com/sentriz/go-taglib/attestations/11402786)

$ sha256sum "$(go list -m -f '{{.Dir}}' github.com/ncruces/go-sqlite3)/embed/sqlite3.wasm"
# expected 117262b6241d8de78ba564a44383fa1562e52f1a978de269e20a02b3c06c02e3 (https://github.com/ncruces/go-sqlite3/attestations/11344814)

$ CGO_ENABLED=0 go build ./cmd/gonic/.

Opting out of WebAssembly:

  • If you prefer not to use the WebAssembly binaries, you can build with nowasm:
$ go build -tags nowasm ./cmd/gonic/.
  • This mode is not supported, and tagging/scan performance will degrade.
  • Cgo will be used for sqlite, so sqlite-dev is still required.
  • ffprobe will be used for tagging, so that must be available in $PATH. libtag-dev is still not used in this mode.
v0.18.0 Breaking risk
Breaking changes
  • Minimum Go version bumped to go1.25
Notable features
  • Docker now uses Alpine native taglib
  • Subsonic added lyrics support and improved internet radio/podcast handling in jukebox
  • README updated with comma escaping documentation
Full changelog

⚠ BREAKING CHANGES

  • deps: bump to go1.25

Features

  • docker: use alpine native taglib (c9f4181)
  • readme: document comma escaping in readme (eaa82b0), closes #596
  • subsonic: add support for lyrics (#519) (db97bc7)
  • subsonic: better support for internet radio and podcast episodes in jukebox (3db183b), closes #572
  • subsonic: replace html2text with bluemonday (5916a7f), closes #591

Bug Fixes

  • subsonic: restore disc/track ordering in getMusicDirectory (8ac8779), closes #597

Miscellaneous Chores

v0.17.0 Bug fix
Notable features
  • Covering index on tracks (album_id, length)
  • Paginate loved tracks in lastfm
  • Admin ownership for root‑dir playlists
Full changelog

Features

  • db: add a covering index on tracks (album_id, length) (018343d), closes #508
  • lastfm: paginate loved tracks (5c7d065)
  • playlist: assume playlists in the root dir without a user dir belong to admin (#499) (f5893ea)
  • podcast: download most recent episode when switching to download recent mode (c222ecb), closes #557
  • podcast: use podcast author if episode author is not defined (#574) (19b707c)
  • scanner: cleanup bookmarks on scan (#583) (b8dfe14)
  • scanner: support full scan cleanups in watcher (#496) (93ce039)
  • scanner: use wrtag/coverparse for cover selection (453639e), closes #338 #516
  • subsonic: allow search albums with MBID (7b19101)
  • subsonic: allow search with MBID (#579) (2d4111d)
  • subsonic: bump image cache expiration (bbe16b7)
  • subsonic: expose album isCompilation and releaseTypes (29b7549)
  • subsonic: expose replaygain tags (0e45f5e)
  • subsonic: fallback to filename when title is missing tags (58d54c2), closes #541
  • subsonic: support more podcast metadata and podcast bookmarks (#569) (63a420d)
  • transcode: add cache pruning and config options (bcb613c)

Bug Fixes

  • admin: better handing of resolve proxy path escaping (7b21e82), closes #493
  • adminui: resolve reverse proxy paths for fonts (718686a), closes #543
  • ci: bump golangci-lint (640d872)
  • ci: ignore gosec integer overflow conversion (120fd79)
  • ci: update .golangci.yml exclude config (e5f7ef3)
  • ci: use new sqlite package name (1c23771)
  • dockerfile: install abuild key (#526) (fb36dbf)
  • playlist: fix non-admin users not being able to create playlists (#524) (ac798ac)
  • podcast: gracefully handle no podcast cover URL (#547) (aef5f92)
  • subsonic: gracefully handle missing playqueue items (3fc9d5d)
  • subsonic: order some browse-by-tag responses (39df00e), closes #512
  • subsonic: populate ArtistID and AlbumID for playlists (#567) (c6d8751)
  • subsonic: skip bookmarks for missing items instead of failing (#580) (e3dc188)
  • taglib: support lower case filenames again (8a0fa05), closes #491

Beta — feedback welcome: [email protected]