Download Latest Version cliamp-windows-amd64.exe (38.0 MB) Google Add to Preferred Sources
Home / v2.3.0
Name Modified Size InfoDownloads / Week
Parent folder
checksums.txt 2026-09-28 524 Bytes
cliamp-darwin-amd64 2026-09-28 38.2 MB
cliamp-darwin-arm64 2026-09-28 34.9 MB
cliamp-linux-amd64 2026-09-28 38.0 MB
cliamp-linux-arm64 2026-09-28 35.7 MB
cliamp-windows-amd64.exe 2026-09-28 38.0 MB
cliamp-windows-amd64.zip 2026-09-28 14.0 MB
README.md 2026-09-28 32.9 kB
v2.3.0 source code.tar.gz 2026-09-28 1.6 MB
v2.3.0 source code.zip 2026-09-28 1.9 MB
Totals: 10 Items   202.4 MB 10

What's Changed

  • ci(release): build the Intel macOS codec libs from source by Bjarne Oeverli (@bjarneo) (d0501a3)
  • feat(radio): open on the cliamp radio channels as playlists by Bjarne Oeverli (@bjarneo) (30ffcaa)
  • fix(spotify): stop crashing on tracks without normalisation params (#522) by Lukasz Jagiello (@ljagiello) (eb59f54)
  • feat(lua): let queue.add take a track table queued as given (#566) by Gjermund Garaba (@gjermundgaraba) (b4689cf)
  • feat(lua): emit playback.stop when the user stops playback (#536) by Gjermund Garaba (@gjermundgaraba) (2342c0d)
  • fix(ui): omit repeated show names from podcast episode rows (#564) by David Siegel (@dvdsgl) (d0c4e32)
  • feat(lua): expose track.is_live for streams with no track boundary (#535) by Gjermund Garaba (@gjermundgaraba) (f85829d)
  • fix(player): read yt-dlp PCM from a pipe cliamp owns (#561) by Gjermund Garaba (@gjermundgaraba) (276713b)
  • fix(playback): cancel a scheduled reconnect on stop (#556) by Gjermund Garaba (@gjermundgaraba) (e0559a5)
  • fix(resolve): mark yt-dlp live streams as realtime (#534) by Gjermund Garaba (@gjermundgaraba) (f00408b)
  • test(ui): bind a plugin-ownable key in the full-screen visualizer test (#555) by Gjermund Garaba (@gjermundgaraba) (41bab63)
  • fix(ui): pin favorite marker column to avoid layout shift by Taha Sadough (@tahadx) (06ee7af)
  • fix(ui): stop showing add/remove favorite notifications in the footer (#440) by Taha Sadough (@tahadx) (903a1ed)
  • Revert "fix(lua): let plugins bind uppercase keys (#525)" (#547) by bjarneo (@bjarneo) (72d786d)
  • fix(ui): dispatch plugin keys in the full-screen visualizer (#545) by Gaurab KC (@gaurabxkc) (e5baeae)
  • fix(lua): let plugins bind uppercase keys (#525) by Gaurab KC (@gaurabxkc) (ac2d1bc)
  • feat(lua): emit queue.end when playback runs out of tracks (#533) by Gjermund Garaba (@gjermundgaraba) (57ae3ba)
  • feat(spotify): populate album art for Spotify tracks (#527) by Gaurab KC (@gaurabxkc) (8e27e96)
  • Merge pull request [#532] from gaurabxkc/docs/community-plugins-autoplay-pomodoro by Gaurab KC (@gaurabxkc) (da63f89)
  • fix(lua): route play_pause, stop, and seek through the model (#500) by Gjermund Garaba (@gjermundgaraba) (ed98f8e)
  • docs: add discord link to readme by Bjarne Oeverli (@bjarneo) (4dee32c)
  • feat(site): add discord link to header by Bjarne Oeverli (@bjarneo) (bee3309)
  • Merge pull request [#510] from srgrsj/feat/download-directory by bjarneo (@bjarneo) (4809680)
  • fix(config): reject relative download directories by Sergei Zhukov (@srgrsj) (ce99ae4)
  • feat(config): make the track save directory configurable by Sergei Zhukov (@srgrsj) (444105a)
  • Merge pull request [#369] from tharinfernando/feat/spotify-lyrics by Bjarne Oeverli (@bjarneo) (81ec636)
  • fix(lyrics): gate offset keys on synced lyrics and surface save errors by Bjarne Oeverli (@bjarneo) (9e8be78)
  • Merge branch 'main' into fix/pr-369 by Bjarne Oeverli (@bjarneo) (06513f2)
  • Merge pull request [#450] from cesarho/fix/resample-headroom-clipping by Bjarne Oeverli (@bjarneo) (ddc53a4)
  • test(player): prove resampler overshoot with a full-scale source by Bjarne Oeverli (@bjarneo) (5463e95)
  • Merge branch 'main' into fix/pr-450 by Bjarne Oeverli (@bjarneo) (3a18256)
  • Merge pull request [#439] from wundervrc/feat/spotify-progressive-track-loading by Bjarne Oeverli (@bjarneo) (d877587)
  • fix(spotify): retire in-flight track pages on wholesale queue replacement by Bjarne Oeverli (@bjarneo) (d40d69b)
  • Merge branch 'main' into fix/pr-439 by Bjarne Oeverli (@bjarneo) (4fe8948)
  • Merge pull request [#477] from oweneldridge/playlist-queue by Bjarne Oeverli (@bjarneo) (a58017d)
  • perf(queue): render the inline queue from a bounded window by Bjarne Oeverli (@bjarneo) (cb6ef44)
  • Merge branch 'main' into fix/pr-477 by Bjarne Oeverli (@bjarneo) (bd202da)
  • Merge pull request [#476] from oweneldridge/podcast-subscriptions by Bjarne Oeverli (@bjarneo) (77f80de)
  • fix(subs): surface empty shows to the status line from the provider list by Bjarne Oeverli (@bjarneo) (77435a2)
  • Merge branch 'main' into fix/pr-477 by Bjarne Oeverli (@bjarneo) (0a07865)
  • Merge branch 'main' into fix/pr-476 by Bjarne Oeverli (@bjarneo) (add62de)
  • Merge pull request [#475] from oweneldridge/podcast-progress by Bjarne Oeverli (@bjarneo) (d9c1e3a)
  • fix(podcast): scope progress identity to the feed and clear played on restart by Bjarne Oeverli (@bjarneo) (bc5fda5)
  • Merge branch 'main' into fix/pr-450 by Bjarne Oeverli (@bjarneo) (35aae7a)
  • Merge branch 'main' into fix/pr-439 by Bjarne Oeverli (@bjarneo) (975586b)
  • Merge branch 'main' into fix/pr-475 by Bjarne Oeverli (@bjarneo) (7abc2ea)
  • Merge pull request [#438] from RGR09/main by Bjarne Oeverli (@bjarneo) (1f323e8)
  • Merge pull request [#479] from oweneldridge/visualizer-fixes by Bjarne Oeverli (@bjarneo) (0ce5a91)
  • Merge pull request [#505] from legacynode/ci/nix-flake-build by Bjarne Oeverli (@bjarneo) (cdfba47)
  • fix(queue): never spend the last row on an album header by Owen Eldridge (@oweneldridge) (a4eb17e)
  • fix(podcast): only providers that list shows get the l and a keys by Owen Eldridge (@oweneldridge) (6361052)
  • fix(playlists): keep the stored track on prepend, scroll the queue past headers by Owen Eldridge (@oweneldridge) (e8d4608)
  • fix(podcast): load overlay episodes through the subscription provider; forward F to plugins by Owen Eldridge (@oweneldridge) (9e3201e)
  • docs(site): mention the queue view and playlist append by Owen Eldridge (@oweneldridge) (c6de2dd)
  • docs(site): mention the subscriptions overlay by Owen Eldridge (@oweneldridge) (7dbea4f)
  • feat(queue): keep the playback chrome when the queue is open by Owen Eldridge (@oweneldridge) (659309b)
  • feat(podcast): append a whole show from the provider list by Owen Eldridge (@oweneldridge) (32ab699)
  • feat(queue): show the queue the way the playlist is shown by Owen Eldridge (@oweneldridge) (738b794)
  • feat(podcast): queue the latest episode from the provider list by Owen Eldridge (@oweneldridge) (de64115)
  • feat(playlists): append a saved playlist to the current one by Owen Eldridge (@oweneldridge) (179259d)
  • feat(podcast): browse subscribed shows and pull latest episodes by Owen Eldridge (@oweneldridge) (cadecf4)
  • feat(playlists): add tracks to the start of a saved playlist by Owen Eldridge (@oweneldridge) (c315e1f)
  • docs(podcast): state the publication-date rule for the URL fallback by Owen Eldridge (@oweneldridge) (5a783ad)
  • feat(radio): who's listening globe as an easter egg by Bjarne Oeverli (@bjarneo) (4871f0c)
  • docs: link cliamp mobile from the readme and the site by Bjarne Oeverli (@bjarneo) (5f16265)
  • fix(yandex): accept string and numeric artist IDs (#509) by Sergei Zhukov (@srgrsj) (f964dd5)
  • fix(podcast): tell same-titled no-GUID episodes apart by publication date by Owen Eldridge (@oweneldridge) (637e523)
  • fix(podcast): carry a URL-keyed episode's record across a CDN rewrite by Owen Eldridge (@oweneldridge) (4616ef9)
  • fix(podcast): refuse a progress file written by a newer cliamp by Owen Eldridge (@oweneldridge) (d2bc19e)
  • fix(vis): label the playing track's own provider, wrap the save error by Owen Eldridge (@oweneldridge) (1606447)
  • feat(vis): hide the episode name in the full screen visualizer by Owen Eldridge (@oweneldridge) (2f7e523)
  • fix(vis): persist the visualizer set over IPC by Owen Eldridge (@oweneldridge) (bc3aab5)
  • fix(podcast): a short episode counts as played past its midpoint by Owen Eldridge (@oweneldridge) (3d525e0)
  • fix(podcast): one record per episode, scoped by feed, with title aliases by Owen Eldridge (@oweneldridge) (090c76b)
  • docs(site): mention episode resume and played state by Owen Eldridge (@oweneldridge) (7ef8c9f)
  • fix(podcast): keep listening position when a track loses its metadata by Owen Eldridge (@oweneldridge) (bb531ec)
  • fix(podcast): keep an episode's metadata when it is saved to a playlist by Owen Eldridge (@oweneldridge) (fb42670)
  • feat(podcast): remember per-episode position and played state by Owen Eldridge (@oweneldridge) (89ea079)
  • Merge pull request [#474] from oweneldridge/podcast-seekable-length by Owen Eldridge (@oweneldridge) (23ddf04)
  • Preserve symlinks when saving files (#494) by Robert Holak (@rholak) (30e953a)
  • ci: add Nix flake builds by Neo Lehmann (@legacynode) (bb12801)
  • fix(setup): name the supported result navigation keys (#496) by Gjermund Garaba (@gjermundgaraba) (a166178)
  • fix press q to quit on setup (#495) by Diego Dorado (@diegodorado) (d8b24df)
  • fix(radio): share station favorites with playback (#493) by Gjermund Garaba (@gjermundgaraba) (cac0399)
  • Merge pull request [#480] from legacycode-forks/ci/update-github-actions by bjarneo (@bjarneo) (9864404)
  • Merge pull request [#481] from legacycode-forks/ci/align-local-and-github-checks by bjarneo (@bjarneo) (d792692)
  • Merge pull request [#482] from legacycode-forks/ci/improve-workflow-observability by bjarneo (@bjarneo) (e509c6c)
  • feat(lua): expose queue.has_next for playback continuation (#488) by Gjermund Garaba (@gjermundgaraba) (ee8e250)
  • fix(lua): queue.list reported every track as queued (#487) by Gjermund Garaba (@gjermundgaraba) (55d6819)
  • fix(ui): refuse stale stream starts after a stop (#486) by Gjermund Garaba (@gjermundgaraba) (abad20e)
  • fix(ui): persist theme picker selection (#483) by legacynode (@legacynode) (f3e7b55)
  • test(jellyfin): assert MediaBrowser scheme on standard Authorization header (#460) by Dimas Setia Pambudi (@setiapam) (6762dd8)
  • fix(ui): emit track-change events for yt-dlp sources (#484) by Gjermund Garaba (@gjermundgaraba) (62a102d)
  • fix(docs): correct docs and seek help that contradict the code (#467) by BAKocska (@BAKocska) (423d9fc)
  • ci: improve workflow observability by Neo Lehmann (@legacynode) (1ef7eec)
  • ci: update GitHub Actions by Neo Lehmann (@legacynode) (df14ced)
  • ci: align local and GitHub checks by Neo Lehmann (@legacynode) (1be0e52)
  • fix(jellyfin): restore auth and streaming on Jellyfin 12 (#471) by Henrik N (@heggrik) (6c16a71)
  • refactor(ui): centralize theme style initialization (#472) by Gjermund Garaba (@gjermundgaraba) (3f71671)
  • fix(nix): refresh vendorHash so the flake builds again (#459) by Levon Kirakosyan (@noosxe) (6b2e85b)
  • fix(ui): rebuild favorite heart styles on theme change (#466) by BAKocska (@BAKocska) (0014888)
  • spotify: bind OAuth callback to loopback (#461) by Bruno Rodrigues (@brunorodriguescabral) (d96b66d)
  • Fix Navidrome transcoding configuration and player identity (#445) by Gjermund Garaba (@gjermundgaraba) (83e5e2a)
  • feat(ui): start with the playlist expanded via config or flag (#395) by RyLoS (@rylos) (55d53dd)
  • Smooth ClassicPeak sampling and redraws by Gjermund Garaba (@gjermundgaraba) (764ca0d)
  • Smooth ClassicPeak sampling and redraws by Gjermund Garaba (@gjermundgaraba) (2984da4)
  • Merge branch 'bjarneo:main' into main by RGR09 (@RGR09) (132a835)
  • fix(player): apply headroom before resample to prevent clipping by Cesar Ho (@cesarho) (1800abe)
  • Merge pull request [#448] from AlexZeitler/feat/red-sector-visualizer by bjarneo (@bjarneo) (93a4ac6)
  • feat(ui): add RedSector visualizer mode by Alexander Zeitler (@AlexZeitler) (220fb30)
  • Merge branch 'bjarneo:main' into main by RGR09 (@RGR09) (b7aaebe)
  • Merge pull request [#442] from TyRichards/feat/persistent-music-choice by bjarneo (@bjarneo) (d40cb79)
  • merge: preserve updated site with Jellyfin resume docs by Bjarne Oeverli (@bjarneo) (78cf54b)
  • fix(jellyfin): address resume review and sync main by Bjarne Oeverli (@bjarneo) (19e079b)
  • feat(site): new OG image and a logo that follows the theme by Bjarne Oeverli (@bjarneo) (7ac3f3a)
  • feat(site): follow the Omarchy desktop theme by Bjarne Oeverli (@bjarneo) (e8b444f)
  • feat(site): redesign landing page and serve install.sh from cliamp.stream by Bjarne Oeverli (@bjarneo) (2cb7f72)
  • Merge branch 'bjarneo:main' into main by RGR09 (@RGR09) (fff7a9a)
  • feat(jellyfin): restore playback context by Ty Richards (@TyRichards) (81d2a80)
  • fix(spotify): wrap the playlist snapshot errors by wunder (@wundervrc) (511c5c6)
  • feat(spotify): resume a playlist load on an unchanged snapshot by wunder (@wundervrc) (7775996)
  • fix(spotify): route saved albums and narrow the resume rule by wunder (@wundervrc) (b05baff)
  • docs(spotify): document the paging entry points by wunder (@wundervrc) (7772e86)
  • fix(ui): name the playlist to reopen in the changed-list notice by wunder (@wundervrc) (492ead7)
  • fix(ui): let the changed-list notice expire by wunder (@wundervrc) (455e351)
  • fix(docs): added "make" to packages to install by RGR09 (@RGR09) (0973ac2)
  • Fix(docs): corrected formatting by RGR09 (@RGR09) (6b29847)
  • fix(docs): build from source on windows by RGR09 (@RGR09) (c5fcd03)
  • fix(spotify): stop a paged load once the library moves under it by wunder (@wundervrc) (e5918e0)
  • fix(ui): retire a paged load when IPC replaces the queue by wunder (@wundervrc) (8ee9028)
  • fix(ui): hold off preloading until a paged load settles by wunder (@wundervrc) (e706757)
  • fix(ui): drop a stale preload when a page lands by wunder (@wundervrc) (49a5575)
  • test(ui): pin the album header against later pages by wunder (@wundervrc) (025bbfe)
  • refactor(spotify): collapse the paging test stubs by wunder (@wundervrc) (9d24a95)
  • test(spotify): cover resuming several abandoned lists by wunder (@wundervrc) (13e4d54)
  • fix(spotify): compare the head before resuming an abandoned load by wunder (@wundervrc) (6fe0dcd)
  • perf(spotify): resume an abandoned load instead of restarting it by wunder (@wundervrc) (97303f2)
  • test(spotify): assert the restart lands on the settled snapshot by wunder (@wundervrc) (76a8a11)
  • fix(spotify): restart a full load when the library moves under it by wunder (@wundervrc) (1146916)
  • test(ui): guard the append path against superseded pages by wunder (@wundervrc) (9dd3550)
  • fix(spotify): pin the snapshot a progressive load started from by wunder (@wundervrc) (e911624)
  • fix(ui): unblock the provider pane while pages load by wunder (@wundervrc) (5ec8d3d)
  • chore: ignore coverage.out by wunder (@wundervrc) (c7d65eb)
  • test(spotify): assert superseded pages still reach the caller by wunder (@wundervrc) (feb53a2)
  • refactor(spotify): fold paging into tracksLoadedMsg by wunder (@wundervrc) (351c0a4)
  • feat(spotify): load playlist tracks progressively by wunder (@wundervrc) (a3cfa68)
  • Merge remote-tracking branch 'origin/main' into feat/spotify-lyrics by Tharin Fernando (@tharinfernando) (e6d31e5)
  • spotify lyrics: fetch synced lyrics from color-lyrics endpoint by Tharin Fernando (@tharinfernando) (948464f)

Checksums (SHA256)

c0b5af09abca83a615d2f47146adcfc61b0723b333509b5eeb6c8ada11cce6d3  cliamp-darwin-amd64
5917a5071c79768c6c8eb33d027a3f4bd0713a27ae9531ca1a161bb6c13dd357  cliamp-darwin-arm64
5c59b5380c5165b473c06148c108ee60a18a1f9961f8013e38b4a68ed5def641  cliamp-linux-amd64
827b4aa879feecab33ea621dc1460c60ffa765c210b5046d679ce5a4073d2b32  cliamp-linux-arm64
97d591be7a26ae9068ba51e69ae63b338413509e5f42758d9a2866a236ff54a9  cliamp-windows-amd64.exe
13d5cd2235af71fdfca0259f4aa4502d066c51218f404cffbefef52978a89843  cliamp-windows-amd64.zip

Full Changelog: https://github.com/bjarneo/cliamp/compare/v2.2.0...v2.3.0

Source: README.md, updated 2026-09-28