Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.2.0"
".": "0.3.0"
}
104 changes: 104 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,110 @@ All notable changes to this project are documented here.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.3.0](https://github.com/rowkavdev/nowplaying/compare/v0.2.0...v0.3.0) (2026-10-03)


### Features

* **linux:** add native tray with WebUI menu and bounded lifecycle ([513a34a](https://github.com/rowkavdev/nowplaying/commit/513a34ac83b62177d2227717bd7c6d9d1f6bbe05))
* **linux:** stage native desktop packages with declared tray dependencies ([7edcdb5](https://github.com/rowkavdev/nowplaying/commit/7edcdb5fd657c1d21a7e95221a069f9f98f36101))


### Fixes

* accept Spotify loopback callback only once ([dcd79cc](https://github.com/rowkavdev/nowplaying/commit/dcd79cc34dee588b9f6f3db8804efa732ab42ea4))
* add Plex GDM and gateway identity discovery ([3ff647d](https://github.com/rowkavdev/nowplaying/commit/3ff647dfe452e7015e573327e25280caf1e3f946))
* allow bounded status card cache buster ([fc52a06](https://github.com/rowkavdev/nowplaying/commit/fc52a06e353994b623754a343e133986f78d0e82))
* **analytics:** send one Discord ping per process start when calls overlap ([1126e31](https://github.com/rowkavdev/nowplaying/commit/1126e31843b5bab01eb77d43bdeab1710c2e9acf))
* apply privacy to Settings sample card preview ([46857d4](https://github.com/rowkavdev/nowplaying/commit/46857d484a4b0e51abf80b2c3d7103069f96977e))
* atomically order hosted device ingests ([2dae312](https://github.com/rowkavdev/nowplaying/commit/2dae31272c56d5e04bb3529906ca6d68442ff7f0))
* bind local card artwork to selected server ([c67c5e7](https://github.com/rowkavdev/nowplaying/commit/c67c5e7b85f34d8928b6406f3184a6424effd92f))
* **card:** pick auto text direction from the displayed title ([cef0e17](https://github.com/rowkavdev/nowplaying/commit/cef0e172411dfffc2c948171cf05b0074ad37097))
* classify revoked media server tokens as authentication failures ([723ed56](https://github.com/rowkavdev/nowplaying/commit/723ed56db9f8078ccd0cc08b7d7208901ed63950))
* clear hosted playback on privacy save during outage ([5b9d572](https://github.com/rowkavdev/nowplaying/commit/5b9d5720e3b7df0ad94f76251d5033799213043d))
* clear stale Spotify consent link on sign-in failure ([5ea5954](https://github.com/rowkavdev/nowplaying/commit/5ea5954385064d6b73c1d7709993110cf5647cb0))
* confine provider credential redirects to original origin ([345edce](https://github.com/rowkavdev/nowplaying/commit/345edcebbc2f47c2cdd03ed2154c97aa5bb76d7a))
* discard late sign-in start after Cancel ([8f52243](https://github.com/rowkavdev/nowplaying/commit/8f52243177978de6b8575688d8d731fc8d119cb5))
* discard Spotify sign-in completion after expiry ([52d53bb](https://github.com/rowkavdev/nowplaying/commit/52d53bb23bfabc59ba3d90bb795f3893efa83817))
* drive the injected test clock through both Discord client timers ([#731](https://github.com/rowkavdev/nowplaying/issues/731)) ([cf15ab0](https://github.com/rowkavdev/nowplaying/commit/cf15ab0fb4c1ba9f651209c9bb35ed3f4b2924d9))
* expire abandoned hosted sign-in guard ([e0629c1](https://github.com/rowkavdev/nowplaying/commit/e0629c159ce6e75c08cc01ceff3ef25df00c82bd))
* expire artwork cache by elapsed time ([#721](https://github.com/rowkavdev/nowplaying/issues/721)) ([513c1af](https://github.com/rowkavdev/nowplaying/commit/513c1afa44468a1d02e80c6ce429ccf1a4d74657))
* expire Discord artwork by elapsed time ([#723](https://github.com/rowkavdev/nowplaying/issues/723)) ([3693e51](https://github.com/rowkavdev/nowplaying/commit/3693e51fd7dee9e440535de54ec02b8215426168))
* expire local last-good card by elapsed time ([7844ffe](https://github.com/rowkavdev/nowplaying/commit/7844ffed00d509a0de2d8a6ff265cf3c28b70b6e))
* expire YouTube tabs by elapsed time ([bcc0465](https://github.com/rowkavdev/nowplaying/commit/bcc0465a4a71750d503a447fc3633f6a06111410))
* explain server sign-in save failures in Settings ([0260a5b](https://github.com/rowkavdev/nowplaying/commit/0260a5bad13e21a6078ca00dc5bfdb42e35f9838))
* guard server sign-in and restore credentials on failed saves ([057f648](https://github.com/rowkavdev/nowplaying/commit/057f64846dc9716b7f3e011fab2f36ea4de82bdc))
* **hosted:** require the exact application/json media type on ingest ([be97948](https://github.com/rowkavdev/nowplaying/commit/be97948dcdea488145b47d541abd91c0b00927fa))
* identify current repository in MusicBrainz User-Agent ([ede2712](https://github.com/rowkavdev/nowplaying/commit/ede271278e80ca96d838ef52188935fb1a25d522))
* invalidate cancelled provider sign-in polls ([ef5cb56](https://github.com/rowkavdev/nowplaying/commit/ef5cb566c4f872a69bedba6118e0eb76df201e44))
* invalidate last-good card after appearance save ([9b21318](https://github.com/rowkavdev/nowplaying/commit/9b21318c9b44d08fb054b8950245b63a44621fa1))
* invalidate pending Spotify sign-in on disconnect ([70f10e3](https://github.com/rowkavdev/nowplaying/commit/70f10e3ad7d393d871a0684c26d945f5cc465de9))
* invalidate private card cache after privacy changes ([76bfa90](https://github.com/rowkavdev/nowplaying/commit/76bfa90e8abadee2178b5ec9810d96beed077083))
* keep a clickable auth link in WebUI provider flows ([287c095](https://github.com/rowkavdev/nowplaying/commit/287c0954e0a2b3f46bed6eb52265a2b75cdfd32a))
* keep authenticated artwork redirects on original origin ([f3f7090](https://github.com/rowkavdev/nowplaying/commit/f3f709014a611610db9c3c6166cfb20bb9230032))
* keep committing sign-in flows through expiry ([1412f5d](https://github.com/rowkavdev/nowplaying/commit/1412f5d4000f3323bb7e45e90566e8736cf21fb9))
* keep hosted heartbeat alive after client clock rollback ([819a4ab](https://github.com/rowkavdev/nowplaying/commit/819a4abcc24aa6db711029d9f628078f019caba3))
* keep sign-in flow claimed throughout finish ([61bd08e](https://github.com/rowkavdev/nowplaying/commit/61bd08eff07e44620ccd9621803803187bfe1d63))
* keep sign-in visible while commit finishes ([23a65a2](https://github.com/rowkavdev/nowplaying/commit/23a65a2b162fab9ed4343bf13764848101b49657))
* keep status snapshot ordered by provider poll start ([9101ee8](https://github.com/rowkavdev/nowplaying/commit/9101ee8c0a0bc88780c95019218b2e83363a72c6))
* **linux:** constrain native packaging scripts and tests to Linux ([641763a](https://github.com/rowkavdev/nowplaying/commit/641763a428d5956251682552ba7bbe5387a2e4fc))
* **linux:** disable RPM debug extraction for prebuilt Node bundles ([f25d9da](https://github.com/rowkavdev/nowplaying/commit/f25d9da2476640d67fb96a7a71cf9d612f00037f))
* **linux:** route tray pages to Settings until first-run setup completes ([e9f7999](https://github.com/rowkavdev/nowplaying/commit/e9f79995c68a8c4237c8c867badc1d1f4b30371d))
* make sign-in cancellation honest during credential commit ([bd0ec6a](https://github.com/rowkavdev/nowplaying/commit/bd0ec6a7b7e660b36b52597d967a6b2742851294))
* measure Discord stuck and grace by elapsed time ([#727](https://github.com/rowkavdev/nowplaying/issues/727)) ([dc42e39](https://github.com/rowkavdev/nowplaying/commit/dc42e39e789cbcaeaa956a28463ce30589b8db69))
* newest overlapping Spotify sign-in supersedes older pending flows ([#703](https://github.com/rowkavdev/nowplaying/issues/703)) ([b8649b2](https://github.com/rowkavdev/nowplaying/commit/b8649b2346c2edb032d85034c50686f156efcd87))
* normalize private subnet targets before probing ([c8055b1](https://github.com/rowkavdev/nowplaying/commit/c8055b19b47fe14f04863deda363656c9eb296ff))
* offer auth links in legacy setup page ([ec3fe04](https://github.com/rowkavdev/nowplaying/commit/ec3fe0423fc43d128c69954a1e3329ac1c013679))
* omit hidden subtitles from card metadata and uploads ([4b2f4da](https://github.com/rowkavdev/nowplaying/commit/4b2f4dae6752b292d8e77b128fcc97e2f6935276))
* omit progress track when timing is hidden ([17ad73e](https://github.com/rowkavdev/nowplaying/commit/17ad73e24fa489f4c1f24950fc739af30a2d2cb4))
* prevent older hosted pushes from retrying above newer state ([7801e7d](https://github.com/rowkavdev/nowplaying/commit/7801e7d5d428e56ad6e9f02b5b95b10cbee99cf5))
* prioritize failed sources over hosted startup ([ac10770](https://github.com/rowkavdev/nowplaying/commit/ac107707e79faea493a9120de3279acef201d6b3))
* rank combined playback by activity order ([d4b83f9](https://github.com/rowkavdev/nowplaying/commit/d4b83f9a3f8b7987fc292c18cf73042e1a6b987a))
* rank distinct same-title media items by stable ID ([d44b0ed](https://github.com/rowkavdev/nowplaying/commit/d44b0ed93bd7c051959695da87bb60ef79c87a25))
* rank multi-server playback by activity order ([0bb954e](https://github.com/rowkavdev/nowplaying/commit/0bb954e06c1efd95bbd957ac7ee813e2a2aa4289))
* rank YouTube tabs by playback activity order ([21c140f](https://github.com/rowkavdev/nowplaying/commit/21c140f0f1493bfd75eea0ba149de7037f257e9c))
* re-check credential liveness before saving a rotated refresh token ([#725](https://github.com/rowkavdev/nowplaying/issues/725)) ([3ff3ccb](https://github.com/rowkavdev/nowplaying/commit/3ff3ccb3aa8af4461fc7ee5e70e83b6f3c4a51c5))
* recover hosted upload sequence after clock rollback ([beb495d](https://github.com/rowkavdev/nowplaying/commit/beb495d50da48f6125bb916d64b531223b33fc22))
* reflect per-server auth failures in tray and diagnostics ([1e6203d](https://github.com/rowkavdev/nowplaying/commit/1e6203d8ad59874dcfe8a48114e472e65a9b347f))
* reject hosted ingest committed after device revocation ([2c668ce](https://github.com/rowkavdev/nowplaying/commit/2c668ce18fb43047dcc26a02abe81d49829163da))
* reject oversized Discord IPC activity without leaking waiter ([a94006a](https://github.com/rowkavdev/nowplaying/commit/a94006afb036ca2750ba162127cb106f850de670))
* remove saved sign-in when disconnecting a server ([fdd7c70](https://github.com/rowkavdev/nowplaying/commit/fdd7c701e4a53465d64886204d44116b7dd93b3b))
* replace prior hosted device on same-PC sign-in ([e8e0755](https://github.com/rowkavdev/nowplaying/commit/e8e0755d70c1f585b98210f0322caaea65575e8a))
* report bounded discovery probe failure reasons ([abcccbc](https://github.com/rowkavdev/nowplaying/commit/abcccbcb382f7421ba86a2e011dffb458b9cb7e1))
* reset stuck detection for distinct same-title media ([8e26ced](https://github.com/rowkavdev/nowplaying/commit/8e26cedf3a0e9f01ace04ea845e247ed76148f17))
* restore focus after cancelling server sign-in ([83cee39](https://github.com/rowkavdev/nowplaying/commit/83cee39b80c54d7caf9ba5dc88629d58d7764718))
* restore Spotify credential when config save fails ([6f6b404](https://github.com/rowkavdev/nowplaying/commit/6f6b404dac44408b58bbeaf6fe316691219e8428))
* retain hosted revoke key and expose pending disconnect ([abe2377](https://github.com/rowkavdev/nowplaying/commit/abe2377243f478f6aaf6a06def17cfdf5941c72b))
* retry Discord clear after publish limiter ([7a2203d](https://github.com/rowkavdev/nowplaying/commit/7a2203d69030d3a7158e7b1edfc0e575602adae2))
* retry failed Plex owner checks ([7729906](https://github.com/rowkavdev/nowplaying/commit/77299065807bb261f3393bc2342849cc2e64b2a0))
* retry first-run activation after another sign-in ([91c9fe2](https://github.com/rowkavdev/nowplaying/commit/91c9fe2acd4cd7ff2014fec31fc776c20c45c723))
* retry unchanged Discord activity after publish failure ([d6cff56](https://github.com/rowkavdev/nowplaying/commit/d6cff5638fb67c16718836d53870fad3d393572e))
* run optional setup before committing server config ([89d9319](https://github.com/rowkavdev/nowplaying/commit/89d9319e1a279e6271b2e80126623d07c0dba9e5))
* serialize same-account Spotify credential writes ([#703](https://github.com/rowkavdev/nowplaying/issues/703)) ([be5fdd1](https://github.com/rowkavdev/nowplaying/commit/be5fdd11955012c3acde85d85d2a2fe1fdd7cee4))
* **setup:** accept a 4096-byte draft on load ([7d68d1d](https://github.com/rowkavdev/nowplaying/commit/7d68d1d9c904e73becab33fdbabc092103009c81))
* **setup:** settle LAN discovery when cancelled during bind ([1757815](https://github.com/rowkavdev/nowplaying/commit/1757815d7596d7c69da70b5263d82edc604e6f81))
* share first hosted registration across callers ([0cb6d0e](https://github.com/rowkavdev/nowplaying/commit/0cb6d0e35ecd43713a2bb2e289ac151dd29a5669))
* show failed server in Settings notice ([65d65dd](https://github.com/rowkavdev/nowplaying/commit/65d65dd036d609cdd9c0e59f00dddb0e531fb6b4))
* show localhost Plex probe failures in quick scan ([85d0e28](https://github.com/rowkavdev/nowplaying/commit/85d0e28d058c0f35600125489b79834907d4e29a))
* show per-server sign-in failures in multi-server status ([627a8b2](https://github.com/rowkavdev/nowplaying/commit/627a8b2f2d197286beab59503c7d8fa7b855632c))
* skip artwork fetch when card hides image ([d039fcb](https://github.com/rowkavdev/nowplaying/commit/d039fcb2b80e6e0eb6e9ed56c3405076ed4763f3))
* space MusicBrainz requests by elapsed clock ([#734](https://github.com/rowkavdev/nowplaying/issues/734)) ([4a0cc23](https://github.com/rowkavdev/nowplaying/commit/4a0cc23c430d51fb1b373dbac79df2bab9ff2a06))
* stream first-run discovery probe bodies with a running byte cap ([#745](https://github.com/rowkavdev/nowplaying/issues/745)) ([0ccf48b](https://github.com/rowkavdev/nowplaying/commit/0ccf48b6173b6824ab0d257e9430558d025e0f54))
* surface failed first-run activation with recovery ([192e8b6](https://github.com/rowkavdev/nowplaying/commit/192e8b6d11bde8b4fe49fa081c7c35d29cb798f7))
* surface hosted upload failures in app health ([b670eca](https://github.com/rowkavdev/nowplaying/commit/b670eca419e8f07c53d7b3753d16a42aa265d34b))
* time Discord publish throttle and reconnect backoff by elapsed clock ([#731](https://github.com/rowkavdev/nowplaying/issues/731)) ([5794b1d](https://github.com/rowkavdev/nowplaying/commit/5794b1db1ad6f70dd1e4d29f3fbedb0f87be2cf5))
* time hosted device flow by elapsed clock ([#729](https://github.com/rowkavdev/nowplaying/issues/729)) ([692f110](https://github.com/rowkavdev/nowplaying/commit/692f110f7ee32a541376f61f841fc2f50d6b75d0))
* time hosted sign-in restart guard by elapsed clock ([#741](https://github.com/rowkavdev/nowplaying/issues/741)) ([18859b1](https://github.com/rowkavdev/nowplaying/commit/18859b1d86eac28d23d5068465d5848c0bcd3182))
* time status-only refresh interval by elapsed clock ([#736](https://github.com/rowkavdev/nowplaying/issues/736)) ([d670e3a](https://github.com/rowkavdev/nowplaying/commit/d670e3aeb9a955c6f94cb60dd8701be31696d433))
* track setup test rate window by elapsed clock ([#739](https://github.com/rowkavdev/nowplaying/issues/739)) ([e79d193](https://github.com/rowkavdev/nowplaying/commit/e79d1936b13c4c4153005c5f6c4c289ef74757b4))
* **tray:** close the app on a stop request after the tray fails ([031a0b7](https://github.com/rowkavdev/nowplaying/commit/031a0b796c83085f614bff187aee01042421c94a))
* **tray:** keep one quit waiter across Settings restarts ([1b2d99f](https://github.com/rowkavdev/nowplaying/commit/1b2d99ff9efd7da4e9201a514e7931492127719a))
* **tray:** log tray outcomes with statuses the logger accepts ([73b4110](https://github.com/rowkavdev/nowplaying/commit/73b4110acdc974845f12db83a0fbc8540a53ea0a))
* use elapsed time for hosted stale playback guards ([14b4cd9](https://github.com/rowkavdev/nowplaying/commit/14b4cd9652ebfd77055e7498e018a852590ebd70))
* use elapsed time for hosted upload backoff ([e9cf458](https://github.com/rowkavdev/nowplaying/commit/e9cf45892c11a84052c10d7f7ed4d09700dc4da6))
* use elapsed time for provider reconnect backoff ([e81bc10](https://github.com/rowkavdev/nowplaying/commit/e81bc10b3bd02a497eb585aa475485795146630d))
* wait for cancel before switching server sign-in ([a3e90a6](https://github.com/rowkavdev/nowplaying/commit/a3e90a6535fb106eaa3d34add3a3b11965070982))

## [0.2.0](https://github.com/rowkavdev/nowplaying/compare/v0.1.0...v0.2.0) (2026-09-26)


Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "nowplaying",
"version": "0.2.0",
"version": "0.3.0",
"private": true,
"type": "module",
"description": "Universal media presence core for Plex, Jellyfin, Navidrome and Emby",
Expand Down