Skip to content

Releases: samuelb/somad

v0.15.1

Choose a tag to compare

@github-actions github-actions released this 10 Sep 10:21

Changes

Bug Fixes

  • Scrobble each play once across reconnects, pauses, and channel round trips (dec9aee)

Miscellaneous

  • Skip the Go gates for website and docs-only pushes (a8b7aab)
  • Build the website with Zola (c11fbd0)

Full Changelog: v0.15.0...v0.15.1

v0.15.0

Choose a tag to compare

@github-actions github-actions released this 04 Sep 14:27

Changes

Features

  • Soma lastfm login/logout/status (4f23594)
  • Last.fm now-playing and scrobbling (opt-in) (3381238)
  • Allow the Last.fm API host as a second, explicit allowlist entry (2b85c81)
  • Add a favorites-only view toggle (7ca6bcf)
  • Show a fuzzy matches-only view while searching (1198435)
  • Add now-playing history overlay (b7c096c)
  • Add soma history command (d629105)
  • Add track history RPC and in-memory ring (16fc4e4)
  • Desktop notification on track change (opt-in) (3175d68)
  • Support mouse wheel scrolling in the channel list (7194693)
  • Add sleep timer to stop command (f84a78a)
  • Add soma daemon --gen-psk and harden PSK file checks (e9964ab)
  • Map volume through a cubic perceptual curve (be4a626)
  • Add mute toggle to the TUI, CLI, and protocol (61e6ebc)
  • Add play/pause toggle bound to p (3d56200)
  • Add a stream quality knob (e075e44)
  • Finish --json for play, next, prev, pause, stop, volume (6d5beb6)
  • Set mpris:artUrl from the channel image (ec842a7)
  • Add systemd user unit and launchd plist (ae9c593)
  • Play AAC streams on macOS, falling back to MP3 (477e879)
  • Buffer the stream between the network and the decoder (1f9dec1)
  • Require TLS 1.3 on the TCP transport (4c1cdaf)

Bug Fixes

  • Repeat the spawn while the socket stays down (47c35db)
  • Keep a stale reconnect from restarting a stopped stream (a2b38d2)
  • Never panic on a property update after the bus is gone (b4653fa)
  • Reject a catalog response with no channels (96e30b6)
  • Keep filtered selection stable, drop stale history results (c363854)
  • History backfill scope, final scrobble, sleep-timer race (2b3af39)
  • Expand ~ in path-valued config keys and matching flags (a5ea259)
  • Accept trailing --json, validate --in, close a PSK-file TOCTOU (78d7f68)
  • Close the review findings on the shared playback generation (7d6da98)
  • Make the bash completion for volume reachable (3ffc4af)
  • Prefer https stream and playlist URLs (5704e35)
  • Exempt dev builds from the version-skew restart (aa51539)
  • Make Enter on the already-playing channel a no-op (6099a20)
  • Log cache-write failures with log.Printf, not raw stderr (5124e25)
  • Bound what a TCP peer can hold open (ce83966)
  • Bound the stream connect phase and give play calls a longer timeout (a0aa54c)
  • Share one playback generation between server and player (8d2d3d1)
  • Report decoder read errors that occur after Play returns (c175752)
  • Adapt colors to the terminal background (9b254e7)

Refactoring

  • Split TUI key handling, connection handshake, and daemon flag parsing (94058d3)
  • Split playChannel into begin, connect, and commit (295b829)
  • Split Play into pipeline and commit, derive search state (476f7c3)
  • One keymap, shared command/footer/selection helpers (42e710e)
  • Collapse request dispatch, client wrappers, and CLI tails (c529260)
  • Share save staging, broadcast, and session teardown (76132ab)
  • Load config once, share file-safety helpers, split runServer (0983876)
  • Move shared types and SanitizeUTF8 out of the MPRIS pair (5010f40)
  • Share JSON load/save and corrupt-file quarantine (6912dbf)
  • Resolve daemon options without log.Fatal (9f3512a)
  • Split main.go into daemon.go and tui.go (04db152)
  • Split ICY titles into artist and title once (27582b6)
  • Deduplicate XDG dirs, favorites sets, and a config-string helper (2c2881d)

Documentation

  • Amend 0017, the oto fork was never adopted (15b4e44)
  • Rewrite the TODO.md preamble now that the backlog is empty (f92ebe4)
  • Drop the main.go split from TODO.md (9485848)
  • Drop the Last.fm item from TODO.md (369fe66)
  • Re-record demo.gif with the filtered search view (9bd80e7)
  • Drop the search and favorites-only items from TODO.md (43e411a)
  • Align the volume mute usage line (7fa98c1)
  • Drop finished items from TODO.md and split the website feature cards (fe73821)
  • Make the keyboard tables and in-app help agree with the keymap (0bec20d)
  • Drop the https and quality items from TODO.md (51ba302)
  • Drop finished items from TODO.md (ab36d46)
  • Add SECURITY.md (567f823)
  • Record demo.gif with the Dark+ theme (79ae532)
  • Re-record demo.gif with VHS and add make demo (2def24a)
  • Remove ADR-0027 (website) (7d81d2b)
  • Add CLAUDE.md as a link to AGENTS.md and require website upkeep (618ff08)
  • Replace the Hugo site with a single hand-written page (564acda)
  • Add a Hugo website deployed to GitHub Pages (5c295f2)
  • Simplify AGENTS.md and add a quick reference for agents (69e77b9)
  • Add architecture decision records mined from code and history (c565e86)
  • Drop speculative TODO items and record the decisions (5040d70)
  • Re-verify TODO findings, reprioritize, and record dropped items (8d3d66c)
  • Rename CLAUDE.md to AGENTS.md and document trunk-based workflow (def624b)
  • Add TODO with open assessment findings (97b412d)

Testing

  • Add fuzz targets for the ICY demuxer, ADTS reader, and playlist parser (1182487)

Miscellaneous

  • Fix the codex invocation for codex-cli 0.153 (ebfd288)
  • Sign and notarize the macOS build when the Developer ID secrets exist (36b4eeb)
  • Compile-check linux/arm64 and darwin universal on every push (9a18f69)
  • Pin release-workflow supply chain and add build provenance (4d72d28)
  • Bump AUR PKGBUILD pkgver to match v0.14.1 (ea4501a)
  • Make make ci mirror CI, drop the redundant security target (6283a1b)
  • Fix gofmt drift and enforce it via golangci-lint (2144e6a)
  • Stamp binaries with the tagged commit, not the trigger SHA (bf1be76)
  • Repoint package-deb at nfpm (9c1c165)
  • Update transitive dependencies and require Go 1.25.13 (ac78e50)
  • Bump github.com/stretchr/testify from 1.11.1 to 1.12.1 (#18) (e84bcc3)
  • Bump github.com/charmbracelet/x/ansi from 0.11.7 to 0.11.8 (#17) (b121ccf)
  • Bump github.com/ebitengine/oto/v3 from 3.4.0 to 3.4.1 (#15) (e6fd1fe)
  • Bump actions/setup-go from 6 to 7 (#14) (ea82c09)

Other

  • Bump github.com/stretchr/testify from 1.11.1 to 1.12.1 (fd20832)
  • Bump github.com/charmbracelet/x/ansi from 0.11.7 to 0.11.8 (ea14c2b)
  • Bump github.com/ebitengine/oto/v3 from 3.4.0 to 3.4.1 (c208277)
  • Bump actions/setup-go from 6 to 7 (85720cd)

Full Changelog: v0.14.1...v0.15.0

v0.14.1

Choose a tag to compare

@github-actions github-actions released this 13 Jul 22:18

Changes

Bug Fixes

  • Register connections for broadcasts before confirming auth (88312ec)

Miscellaneous

  • Derive the release version from conventional commits (1b90bdf)

Full Changelog: v0.14.0...v0.14.1

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 13:39

Changes

Miscellaneous

  • Unify the release pipeline with whirr (bcc819e)

Other

  • Suspend audio device when playback stops (0c0e7ba)
  • Capitalize Somad in README prose (5c99937)
  • Point Homebrew publishing at homebrew-tap (3a60bcd)

Full Changelog: v0.13.0...v0.14.0

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 12 Jul 08:43
f6f2e67

Changes

Changes since v0.12.0:

  • Cover the CLI commands end-to-end against a fake daemon (f6f2e67)
  • Document two subtle invariants (591c434)
  • Name the offending flag when rejecting flags before daemon (35e56fe)
  • Make Client.Close idempotent (c2d4fbc)
  • Guard the resampler against a zero source rate (12045de)
  • Wrap the status bar on narrow terminals (ec9e74d)
  • Keep status --json parseable when the server is unreachable (0dadcbd)
  • Parse .pls playlists leniently and cap the download (3a143ad)
  • Route MPRIS Quit to server shutdown (a6f0d6f)
  • Make the request-throttle send shutdown-aware (f0d3eb4)
  • Make state.ToggleFavorite copy-on-write (93ddc93)
  • Bound the wait for audio-device readiness at startup (073aa73)
  • Always authenticate when the endpoint has a PSK (de4cb38)
  • Retry a failed state save at shutdown (a4d6016)
  • Cap the channel-catalog download at 4 MiB (acdf2e5)
  • Give each stream failure exactly one reporting path (de8dd79)
  • Surface TUI request failures instead of dropping them (5e1cf2f)
  • Fall back to the running server when a skew restart times out (59fccbd)
  • Require TLS and a PSK for non-loopback TCP listeners (890fd5f)
  • Fix data race on the MPRIS command sender (f4aa570)
  • Stop the per-call timeout timer once a response arrives (0fd2f1d)
  • Add bash and zsh shell completions (0c2224a)
  • Add optional TCP transport with TLS and pre-shared-key auth (a396db0)

v0.12.0

Choose a tag to compare

@github-actions github-actions released this 08 Jul 12:43
eb5799e

Changes

Changes since v0.11.0:

  • Document starting the daemon with soma daemon; call it the playback daemon (eb5799e)
  • Refer to the project as somad in the README (935b5dd)
  • Rename project to somad with a soma binary (c82d8fc)

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 08 Jul 12:01
7ba2316

Changes

Changes since v0.10.0:

  • Scan and build with a patched Go toolchain (7ba2316)
  • Run macOS tests under -race and add a govulncheck CI job (8fbbe1d)
  • Document the lossy behavior of the audio error channel (f062394)
  • Add CLI unit tests and extract volumePercent helper (848502f)
  • Serialize state persistence so stale writes can't win (748e409)
  • Make server state persister injectable to speed up race test (3596858)
  • Collapse tray play/pause/stop into one Play/Stop item (be4000e)
  • Polish the shutdown-on-exit option (91ec5ba)
  • Add TUI shutdown-on-exit option (9c5e5d0)
  • Add a favorite toggle for the playing channel to the tray menu (f263967)
  • Add CLAUDE.md and Codex-backed Claude Code sub-agents (40d4b13)
  • Keep the server running by default instead of idle-exiting (3cd4a18)
  • Add a configuration file for the server settings (4d177db)
  • Add a system tray icon with playback controls (d1d33df)
  • Build a universal macOS binary for releases (de2e067)

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 06 Jul 14:05

Changes

Changes since v0.9.0:

  • Add linux/arm64 packages and a release dry-run mode (ac1dcce)
  • Add Linux package release support (7333b4f)
  • Add macOS CI test coverage (97d6e20)
  • Remove unused GoReleaser config (7a627ec)
  • Validate favorite channel IDs (974c713)
  • Persist server state outside lock (1a5c191)
  • Sync parent directory after atomic writes (afdd677)
  • Harden socket directory validation (477035d)
  • Only restart a version-skewed server when playback is interrupted anyway (9936858)
  • Auto-restart a version-skewed server, resuming playback (e5620c4)
  • Add --json output to somatui list and somatui favorite (79f4ba1)
  • Gate CI on a minimum test coverage threshold (658f3b6)
  • Add tests for previously-uncovered catalog and log-path functions (a5d6a61)
  • Copy the favorites slice before handing it to clients (bd150a4)
  • Ignore the write error when printing usage (d5a526c)
  • Add --json output to somatui status (cc3a8f2)
  • Show and adjust the volume from the CLI (3f1e825)
  • Add a somatui favorite CLI command (e8f929a)
  • Pin the CI Go version to go.mod (b7f0f3d)
  • Remove unused client.IsNotRunning (a8f541b)
  • Default the install directory from go env GOPATH (7a03049)
  • Handle help as a command instead of failing as unknown (44d2c79)
  • Update dependencies and raise minimum Go to 1.25 (6a85d95)
  • Cover more ValidateURL edge cases (bc1ed2e)
  • Re-validate redirect targets against the host allowlist (04b1ad4)
  • Preserve semicolons inside ICY stream titles (523f241)
  • Move a corrupt channel cache aside instead of discarding it silently (f47d0fe)
  • Cap concurrent in-flight requests per connection (48dff39)
  • Surface an error when a version-skewed server won't exit (2efbb4f)
  • Make the SomaFM host allowlist check case-insensitive (54dd6fe)
  • Fix gofmt formatting drift (1095e4b)

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 05 Jul 14:50

Changes

Changes since v0.8.0:

  • Add Homebrew tap installation (6ab78d8)
  • Add a somatui list CLI command (224efb2)
  • Reconnect indefinitely with capped backoff instead of giving up (eead2e1)
  • Quote the server log when a spawned server fails to start (51cb000)
  • Cap server.log growth at 1 MiB (75c43c6)
  • Write state and cache atomically, survive a corrupt state file (df4f0f0)
  • Detect silently stalled streams and hung-up servers (d39497b)
  • Rewrite as client-server: playback survives closing the TUI (95fb723)

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 03 Jul 10:46

Changes

Changes since v0.7.0:

  • Merge pull request #13 from samuelb/dependabot/github_actions/actions/checkout-7 (0fc7388)
  • Document volume keys and updated dependencies in README (ef2ed4a)
  • Add volume control with +/- keys, MPRIS integration, and persistence (a0b1dc8)
  • Reconnect automatically after a stream drop (4f3332d)
  • Demux now-playing titles from the playback stream itself (1ee8025)
  • Connect to streams asynchronously with a visible connecting state (f9445e6)
  • Decode MP3 with go-mp3 directly instead of the ebiten wrapper (dbaa748)
  • Share one http.Client across all SomaFM requests (494330d)
  • Drop ValidatePathNoTraversal (f1acbfa)
  • Move test-only host allowlist helper out of the production package (f2955b4)
  • Extract stopPlayback, quitApp, and selectChannelByID helpers (495c559)
  • Accept non-ASCII characters in search input (3c875df)
  • Prefer the highest-quality MP3 playlist instead of the first match (6005115)
  • Stop the audio session when a stream error is reported (adf2072)
  • Clear load error when a background channel refresh succeeds (ad212d2)
  • remove AGENTS.md and TODO.md (bf9e5fa)
  • chore(deps): bump actions/checkout from 6 to 7 (3d673c5)