Releases: samuelb/somad
Releases · samuelb/somad
Release list
v0.15.1
Changes
Bug Fixes
- Scrobble each play once across reconnects, pauses, and channel round trips (dec9aee)
Miscellaneous
Full Changelog: v0.15.0...v0.15.1
v0.15.0
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 cimirror 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
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
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
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
v0.11.0
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
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 listandsomatui 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 favoriteCLI 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
Changes
Changes since v0.8.0:
- Add Homebrew tap installation (6ab78d8)
- Add a
somatui listCLI 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
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)