Beta 4.0.0-beta.181, built from master. Same commits as a dev build, packaged.
Changes since v3.12.4
- fix(packaging): ship the licence as a resource so macOS can sign (af34dbd)
- fix(node-smtc): find node-gyp instead of spawning a bin off PATH (6951fee)
- Merge pull request #76 from michei69/rewrite (24b2f76)
- chore: replace master 3.13.0 -> 4.0.0 rewrite (6e9fd61)
- fix(plugins): adapt to YouTube Music's new layout (3f579a7)
- fix(settings): keep blocked plugin rows dimmed (a0c7395)
- docs(plugins): document plugin conflicts and refresh plugin notes (fcffb0a)
- fix(plugins): resolve cross-plugin audit findings (0da7569)
- feat(plugins): add conflict-aware plugin settings (6712ce0)
- refactor(plugins): dedupe shared views, renderers, providers and test harnesses (23d3db0)
- test(notifications): match the interactive option's platforms (4f905f0)
- refactor(e2e): share lyrics, tray probe and launch fixtures (9cdca4c)
- refactor(desktop): dedupe API body reading, dialogs, links and test harnesses (8be07e7)
- refactor(ui): dedupe settings copy-debug, restart pill and style rules (602659d)
- refactor(build): parse the split id once in the pear vite plugin (4ed687e)
- refactor(sdk,page): share queue, image and DOM helpers with the page runtime (fd0ab52)
- feat(downloader): use synced-lyrics providers for file lyrics (6e76a2d)
- fix(lyrics,api): finish the karaoke wipe and use OpenAPI 3.1 for Swagger UI (bc0baa2)
- fix(lyrics,equalizer,api): stop pre-highlighting future words and sanitize the OpenAPI document (14f77f5)
- feat(settings): refine lyrics, scrobbler and equalizer controls (5c38cf2)
- feat(settings): make plugin options conditional and regroup them (37b9e29)
- feat(synced-lyrics): add optional Japanese kana conversion (b14d686)
- fix(synced-lyrics): keep word timings through Chinese conversion (34eb16b)
- feat(synced-lyrics): add Greek, Persian, Urdu, Armenian, Georgian and Indic romanization (291a0d7)
- feat(synced-lyrics): split romanization by script and add Arabic, Hebrew and Cyrillic (e347171)
- fix(synced-lyrics): describe every supported romanization script (e7968d4)
- feat(synced-lyrics): show only the selected translation provider's settings (1d3096e)
- feat(synced-lyrics): romanize unknown Japanese kanji variants (546c3a5)
- refactor(synced-lyrics): remove the provider footer (f1593a8)
- feat(settings): support conditional fields and tidy sub-settings (439d855)
- feat(downloader): make the player-bar download button optional (ec4d890)
- feat(menu): trim Options to the requested entries (51e8cfe)
- fix(synced-lyrics): scope Apple word emphasis to the highlighted word (c50f1f4)
- fix(synced-lyrics): paint Apple karaoke edges without prefilling words (b6cc61f)
- test(synced-lyrics): cover the Apple loading fallback (a2621de)
- test(synced-lyrics): cover Apple plain and error fallbacks (ee996a5)
- fix(synced-lyrics): polish Apple line and background transitions (3107d26)
- feat(synced-lyrics): replace am-lyrics with a clean-room Apple renderer (8569dfd)
- fix(synced-lyrics): survive am-lyrics time-update errors (d0c6581)
- fix(synced-lyrics): port the Apple Music renderer from master (e05975e)
- feat(settings-ui): reuse pear-desktop translations for ported plugin fields (ed6db45)
- perf(config): compare config values structurally instead of serializing (05c6975)
- fix(visualizer): port the verified master parity gaps (06db6d4)
- fix(video-toggle): port the verified master parity gaps (d0069d2)
- fix(unobtrusive-player): port the verified master parity gaps (23e0e80)
- fix(tuna-obs): port the verified master parity gaps (03430ba)
- fix(tray): port the verified master parity gaps (6a76ce0)
- fix(transparent-player): port the verified master parity gaps (7664cb3)
- fix(touchbar): port the verified master parity gaps (71385b8)
- fix(toast-autoclose): port the verified master parity gaps (e1f5d88)
- fix(taskbar-mediacontrol): port the verified master parity gaps (5eba7ee)
- fix(synced-lyrics): port the verified master parity gaps (1869aec)
- fix(statusbar-lyrics): port the verified master parity gaps (75c82e6)
- fix(sponsorblock): port the verified master parity gaps (729847a)
- fix(skip-silences): port the verified master parity gaps (af969ec)
- fix(skip-ai-slop): port the verified master parity gaps (59918a7)
- fix(shortcuts): port the verified master parity gaps (130c6ef)
- fix(sfw-music): port the verified master parity gaps (469697c)
- fix(seek-shortcuts): port the verified master parity gaps (5fd7c10)
- fix(search-commands): port the verified master parity gaps (b32ce45)
- fix(scrobbler): port the verified master parity gaps (e58813e)
- fix(resume-shuffle): port the verified master parity gaps (2f94b2e)
- fix(quality-changer): port the verified master parity gaps (ec5e4c5)
- fix(prefer-song): port the verified master parity gaps (0a71d6a)
- fix(precise-volume): port the verified master parity gaps (a59a2ab)
- fix(playlist-search): port the verified master parity gaps (a973d2a)
- fix(playback-speed): port the verified master parity gaps (6bf688a)
- fix(playback-recovery): port the verified master parity gaps (8ab91f2)
- fix(picture-in-picture): port the verified master parity gaps (c10bab4)
- fix(performance-improvement): port the verified master parity gaps (93002e2)
- fix(notifications): port the verified master parity gaps (1504a65)
- fix(no-google-login): port the verified master parity gaps (110fc14)
- fix(navigation): port the verified master parity gaps (79eeaf5)
- fix(music-together): port the verified master parity gaps (deb80a9)
- fix(memory-saver): port the verified master parity gaps (b64d8ac)
- fix(media-controls): port the verified master parity gaps (5b82a38)
- fix(lumiastream): port the verified master parity gaps (f197e26)
- fix(in-app-menu): port the verified master parity gaps (ce9bb3d)
- fix(fullscreen-auto-hide): port the verified master parity gaps (2132409)
- fix(exponential-volume): port the verified master parity gaps (8308648)
- fix(equalizer): port the verified master parity gaps (4a3b11d)
- fix(downloader): port the verified master parity gaps (b9878a5)
- fix(do-not-track): port the verified master parity gaps (25f86aa)
- fix(dismiss-multidevice-popup): port the verified master parity gaps (f53bb92)
- fix(discord): port the verified master parity gaps (0184895)
- fix(disable-autoplay): port the verified master parity gaps (20a1ef5)
- fix(custom-output-device): port the verified master parity gaps (607ef29)
- fix(crossfade): port the verified master parity gaps (8404ac7)
- fix(clock): port the verified master parity gaps (5d97e8e)
- fix(captions-selector): port the verified master parity gaps (829167d)
- fix(auth-proxy-adapter): port the verified master parity gaps (eee89c5)
- fix(audio-track): port the verified master parity gaps (0ffb3f6)
- fix(audio-only): port the verified master parity gaps (77fae29)
- fix(audio-compressor): port the verified master parity gaps (a32c4b9)
- fix(amuse): port the verified master parity gaps (34e83cd)
- fix(ambient-mode): port the verified master parity gaps (787785a)
- fix(album-color-theme): port the verified master parity gaps (2892d4e)
- fix(album-actions): port the verified master parity gaps (b9870e6)
- docs: update parity documentation (9e73d81)
- test(e2e): align parity expectations (91fbdea)
- feat(i18n): seed master translations and regenerate keys (cb68984)
- feat(settings-ui): port settings parity (b519aff)
- fix(migrations): carry 3.x config data into the rewrite (8e23b2d)
- feat(api-server): port API server parity (469047e)
- feat(core): port desktop main-process parity (7e2429d)
- feat(core): port player, audio-graph and background-playback parity (d3142ba)
- fix(build): restore packaging, CI and production minification (cb428d6)
- chore(deps): update workspace dependencies and test runners (9451517)
- fix(plugins): stop video-toggle and audio-only from fighting over playback-mode (d06e931)
- feat(synced-lyrics): port lrc.red, LRCHub, SimpMusic and the Apple Music style (821ca8a)
- chore(deps): add am-lyrics and xmldom to synced-lyrics (df05bc5)
- fix(desktop): watch sources and reload page-side changes in dev (3a5571e)
- feat(settings-ui): add sub-settings and reorderable lists (e47b27e)
- feat(downloader): let users hide the Downloads sidebar entry (4c0e3c1)
- fix(settings-ui): drop the performance line from copied debug info (032c832)
- fix(perf): remove the in-process GPU option (4be8378)
- feat(settings-ui): adopt the upstream settings layout (b0d512e)
- fix(desktop): add install-electron to predev and prestart (6ffd9bc)
- chore(i18n,migrations): add the missing keys and fix the preferSynced mapping (235a5f0)
- fix(sdk): read the shuffle state where the app itself reads it (0c75520)
- fix(main): send pear-desktop's fixed Chrome UA when overrideUserAgent is on (92c378b)
- fix(build): run electron-builder through its wrapper again (a51e38e)
- fix(downloader): clean titles and artists again, like yt-dlp's side (122db4c)
- fix(plugins): close the defects the port audit proved (72d7e47)
- feat(plugins): port audio-track and resume-shuffle into the rewrite (63c1c54)
- feat(amuse): listen on loopback by default (0e5e522)
- fix(plugins): close the gaps the port audit found (2836785)
- fix(main): restore the upstream call sites the rewrite merge left out (f604255)
- chore(deps): electron ^45.2.3 across every workspace (80f01c6)
- feat(rewrite): port master's plugin fixes onto the rewrite layout (e798db1)
- fix(themes): retry a theme mount that threw (f4ffbd5)
- fix(merge): adopt upstream's filename sanitising and keep amuse's bind default (796aa7b)
- fix(merge): repair what the rewrite merge left half-applied (ca14fbb)
- fix(sdk,i18n): repair the conflict resolution in core-config and the English resources (dc27af0)
- merge: official rewrite 1e30c0f into the fork's rewrite (cfeb151)
- feat(settings-ui): split performance mode into per-part switches (fa394e2)
- refactor: trim non-essential comments from the fixes (0d13c18)
- test(settings-ui): make the window path regression test platform-independent (ded1926)
- fix(mpris): seed the mirror on registration and stop toggling on play (0248851)
- fix(tuna-obs): retry the lite-mode probe instead of latching it (55141d4)
- fix(lumiastream): re-emit switchSong on every track change (b104cf6)
- fix(notifications): only mark a track announced when its toast is shown (d63e129)
- fix(api-server): serialise the server lifecycle and keep the unknown player state (80bb8ef)
- fix(discord): retry a connected-but-not-ready client (f315577)
- fix(music-together): claim host only when hosting and detach session listeners (065c51f)
- fix(music-together): clear queue sync latches and count nested dispatches (29dbd0c)
- fix(music-together): make the remote-edit gate depth-counted (87e88fa)
- fix(scrobbler): submit each track once and release the auth window latch (01b88a3)
- fix(downloader): follow track changes for download-on-finish (7d66e65)
- fix(downloader): make the missing-ffmpeg path reachable and keep retry material (a1826e4)
- fix(amuse): keep one advertisement state (42642bd)
- fix(statusbar-lyrics): retry a rejected send (99d2440)
- fix(synced-lyrics): time out translation provider requests (f9c4e4d)
- fix(synced-lyrics): cap MusixMatch token refreshes (32e9a36)
- fix(synced-lyrics): dispose the previous tab root before replacing it (92e883d)
- fix(synced-lyrics): release the picker lock on track change (8c84efb)
- fix(synced-lyrics): write retried provider results into the settled cache (04608e1)
- fix(skip-silences): keep onlySkipBeginning across self-induced seeks (93908b7)
- fix(sponsorblock): reset segments on track load instead of media emptied (34afb88)
- fix(equalizer): reconcile the active preset from the curve editor (f65bb06)
- fix(custom-output-device): apply the sink when enabled on a loaded track (2ad6e8d)
- fix(song-controls): route volume to the live precise-volume receiver (058699f)
- fix(precise-volume): tell programmatic slider writes from manual ones (eb3ab22)
- fix(prefer-song): keep one patch slot across duplicate enables (e4fedb8)
- fix(captions-selector): apply caption config changes to the current track (d74385d)
- fix(audio-track): cap reconciliation attempts for a refusing track (553c099)
- fix(disable-autoplay): consume the one-shot only when it applies (947b2e8)
- fix(resume-shuffle): persist shuffle when the queue is not ready (c0acce3)
- fix(audio-compressor): rebind the chain to the live media element (2c3d85e)
- fix(crossfade): restore the fade-in gain when a track fetch fails (549c62a)
- fix(playback-recovery): cover every retry attempt and reset the ladder per track (4bceae5)
- fix(ambient-mode): clear the scheduler latches on refresh (87280ee)
- fix(unobtrusive-player): clear the did-play latch after a failed auto-close (a4671de)
- fix(playlist-search): observe dialog visibility without hot-path checks (e4bd609)
- fix(in-app-menu): always clear the transition override (c80da0d)
- fix(album-color-theme): ignore artwork fetched for an older track (6446a48)
- fix(toast-autoclose): re-arm only the toast that reopened (d0e31b1)
- fix(memory-saver): reset the clear cooldown when re-enabled (cba8097)
- fix(skip-ai-slop): record a skip only after the rate limit allows it (73617a9)
- fix(do-not-track): retry a failed profile load and dispose duplicate engines (731b2a9)
- fix(search-commands): make spotlight re-entry idempotent (f5cccf8)
- fix(picture-in-picture): seed the PiP state from config on load (9117cd7)
- fix(auth-proxy): only report listening after a successful bind (c92e3c6)
- fix(song-info): report a paused-at-zero track after a short re-check (129c8c8)
- fix(settings-ui): restart a cancelled close and sequence store refreshes (eb1b971)
- fix(loader): guard duplicate main-plugin loads and drop stale menu templates (c8568de)
- fix(main): report restart requirements early and guard the first window (2c4fc11)
- fix(tray): tear down the old tray and restore its state on rebuild (4d704bd)
- fix(themes): retry a theme mount that threw (3bda585)
- fix(renderer): set up song info once and follow live share-link options (a370a01)
- fix(updater): keep the ready prompt and the recheck schedule (4dce10a)
- deps: minimatch 11 for electron-builder's packages, for GHSA-g3hv-75wg-m249 (build-time only) (1e30c0f)
- ci: reviewdog lints the PR's apps, packages, plugins and scripts (src only holds translations now) (8673aaa)
- deps: fast-uri 3.1.9, for GHSA-wjr9-j795-jxcr and GHSA-w74x-v6f9-j3xg (build-time only, via electron-builder's ajv) (f7c2e41)
- deps: Electron 44.10.2, for GHSA-jr5w-w6x2-84p9 (compromised eMudhra intermediates) (0ff1760)
- e2e: closing an app waits for its process to exit, so a relaunch on the same profile gets the lock (18f4871)
- build: no 32-bit Windows packages on Electron 44, which has none (cfabc32)
- ci: ask setup-nub for Node "24" (nub can't resolve "24.x" and falls back) (1ac4a9d)
- ci: trigger the PR build (102f02f)
- build: 32-bit ARM Linux packages again, on Electron 43 (the last with them) (56d7a30)
- build: drop dist:linux:deb-arm64 and rpm-arm64, which dist:linux already builds (c8dff35)
- build: no 32-bit ARM Linux packages on Electron 44, which has none (b0b280e)
- build: electron-builder runs as npm, so packaging works without pnpm (CI installs only nub) (a0fa74e)
- downloader: a playlist of one song gets its folder too, as with yt-dlp (c5f5040)
- sdk: plugins read the app's settings (ctx.core, ctx.onCoreChange), and named selectors replace the raw ones in plugins (38ff465)
- e2e: fix the failing and flaky tests (crossfade, picture in picture, downloader cancel, settings scroll, API server start) (770c84f)
- e2e: tests run in a 1280×800 window, whatever the app's default size (908c697)
- core: overlay scrollbars and Wayland window decorations, as pear-desktop (96a5464)
- core: protocol links run pear-desktop's queue, full screen and search box commands again (f60f75e)
- core: the macOS window has no title bar, with YTM's top bar around the traffic lights, as pear-desktop (2cdcdee)
- transparent-player: Linux gets pear-desktop's switches for a see-through window (6a352aa)
- core: strip CSP and allow YTM's CORS on every https response, as pear-desktop (74b3668)
- core: resume the last song at startup, then show the starting page, as pear-desktop (f4aade1)
- core: the Override user agent option is back, off by default as in pear-desktop (9b41e45)
- core: pear-desktop's window sizes, and its one-time note on how to show a hidden menu (f20c684)
- core: Windows gets its Start Menu shortcut with the app's id again, as pear-desktop (0d8d046)
- core: the Options menu's Single Instance Lock toggle is back, as pear-desktop (a56b1ea)
- core: where YTM is restricted, its /premium redirect goes to sign-in, as pear-desktop (888be21)
- core: a crashed page asks to wait, relaunch or quit, as pear-desktop (03e3a2e)
- core: a page that fails to load shows an error page with Retry, as pear-desktop (5aa4b3c)
- core: restarting a portable Windows build relaunches its exe, as pear-desktop (5da72e4)
- captions-selector: resume playback after picking captions, as pear-desktop (8e940f7)
- visualizer: boost butterchurn's input by 1.25, as pear-desktop (7cb2066)
- clock: English time format, as pear-desktop (a82c5e0)
- album-color-theme: unsampled artwork tints dark instead of not at all (0a7265e)
- video-toggle: video tracks always get the high-res thumbnail (317cecb)
- ambient-mode: restore pear-desktop's player and toggle-button styles (3883a91)
- scrobbler: scrobble at half the track or 4 minutes of position, as pear-desktop (1ed1160)
- notifications: the app icon stands in for missing artwork (16e31e8)
- music-together: your profile comes from your account when signed in (f50bca4)
- picture-in-picture: the mini player button opens picture in picture again (49af114)
- crossfade: crossfade manual skips and short tracks, and fade in on resume (0f84855)
- in-app-menu: pear-desktop's title bar with the menus side by side, toggled with ` (223cd8d)
- synced-lyrics: ♪ fills instrumental breaks by default again (730bab9)
- amuse: listen on IPv6 too by default, as pear-desktop (26f4629)
- precise-volume: the volume is kept between sessions again (f7906c7)
- downloader: titles, playlists, podcasts, names and formats as in pear-desktop (2496ff6)
- feat(ambient-mode): sync, fade and throttle the ambilight (7acfa58)
- feat(ambient-mode): add ambilight bar detection, filters and appearance (f22a429)
- feat(ambient-mode): add an ambilight style (e597aa4)
- fix(ambient-mode): follow the player's video/artwork switch (43fdebf)
- fix(synced-lyrics): make the Apple Music style theme-aware and drop interlude rows (887d0f3)
- feat(synced-lyrics): orderable lyrics type priority (e6e738a)
- fix(music-together): keep the guest queue and its playing row in sync (ca630b3)
- chore(deps): bump zod from 4.4.3 to 4.6.6 (#82) (ecfa340)
- chore(deps): bump body-parser from 2.3.0 to 2.4.0 (#81) (eb13dc7)
- chore(deps): bump happy-dom from 20.10.6 to 21.0.4 (#79) (e72e047)
- chore(deps): bump source-map-js from 1.2.1 to 1.2.2 (#62) (96cb05c)
- chore(deps): bump ip-address from 10.2.0 to 10.7.4 (#50) (48a4724)
- Merge remote-tracking branch 'remote' (9ba5ec5)
- feat(sponsorblock): name the segment under the seek-bar pointer (033f3a1)
- fix(sponsorblock): paint segments over progress, under the knob (4441249)
- feat(sponsorblock): draw segments on the seek bar (508d24f)
- feat(resume-shuffle): add plugin to resume the last queue shuffled (b2ebccb)
- feat(shortcuts): add like/dislike keybinds (4ad0d0c)
- fix(synced-lyrics): fix Korean romanization (5188a47)
- fix(in-app-menu): keep submenus on screen in narrow windows (c2051cb)
- fix(sponsorblock): apply segments on arrival and on player ready (ae2433b)
- fix(volume): write volume through the player API so it round-trips (d2aa0bb)
- fix(renderer): isolate per-plugin errors in onPlayerApiReady loop (90f7001)
- fix(synced-lyrics): translate background vocals and show translations in the Apple style (8288d03)
- feat(synced-lyrics): add an Apple Music lyrics style backed by am-lyrics (acac222)
- feat(synced-lyrics): add word-synced providers and karaoke lyrics (cd3269f)
- feat(synced-lyrics): parse word-level LRC and TTML lyrics (6dc202e)
- Merge pull request #85 from Astear17/feature/in-app-update-install (0b7e8de)
- docs(updates): restore updater rationale comments (3219c4c)
- fix(updates): restore updater contracts and recovery (d15b9db)
- fix(updates): address in-app installation review (c79182b)
- Extract install support detection (1bcbeed)
- Add in-app update download and installation (0f33ad1)
- feat(synced-lyrics): add LRCHub and SimpMusic lyrics providers (808e500)
- fix(plugins): make live toggles complete and drop stale restartNeeded (5316c46)
- fix(plugins): correct restartNeeded flags after audit (d0d5d8b)
- chore: bump version to v3.13.0 (0bfd65a)
- chore(deps): bump electron to 45.2.1 for the Chromium 156 security fixes (9b096eb)
- chore(deps): bump zod from 4.4.3 to 4.6.6 (4a56d6d)
- fix(taskbar-mediacontrol): keep the thumbar icons out of the renderer module graph (dd24a26)
- style: keep the new helper code to the required comment policy (6ae116f)
- test(do-not-track): give the fixture backend the ipc surface it now uses (95b24f3)
- chore(i18n): sync the English resources with the new UI strings (630f383)
- feat(audio-track): add an audio track selector and make the player hooks robust (c709f52)
- fix(plugins): give the remaining small plugins a real teardown path (0fd53de)
- feat(settings-ui): reorganize the settings and make the surfaces self-explaining (f19c609)
- fix(plugins): fix the visualizer audio path and music-together session handling (f39f3b9)
- fix(plugins): make shortcuts, PiP, Discord and ambient mode unload cleanly (934d0af)
- fix(plugins): clean up lifecycle leaks in downloader, menus and notifications (710b223)
- feat(amuse): report ads, a live position and more track info (9048b0b)
- fix(synced-lyrics): survive LRCLib overload and fix lyric timing (c16d180)
- fix(api-server): fix the IPC clone crash and harden the HTTP/WS surface (039b529)
- fix(player): keep the media session alive and stop working while hidden (f650805)
- fix(core): repair config handling and keep main-only code out of the renderer (03b0832)
- chore(i18n): Translated using Weblate (Arabic) (3337446)
- chore(deps): bump body-parser from 2.3.0 to 2.4.0 (bd1a43e)
- Merge pull request #80 from CoolJosh0221/fix/api-websocket-route-prefix (b829612)
- Fix WebSocket URLs (7868c04)
- chore(deps): bump happy-dom from 20.10.6 to 21.0.4 (fdc0b10)
- chore(i18n): Translated using Weblate (Italian) (5aa6a4d)
- fix(startup): resume the last song like pear-desktop (f0b6b1a)
- feat(navigation): let the back and forward buttons sit on the right (10e896e)
- fix(downloader): take the Downloads surfaces from YTM's variables (d07e1f9)
- fix(synced-lyrics): match pear-desktop's lyrics sizes (094f38a)
- fix(settings-ui): drop the Site features card (aeaf2ae)
- fix(settings): move the shared-link options to General (4f4948b)
- fix(settings-ui): size select controls like pear-desktop (e2233cf)
- chore(i18n): Translated using Weblate (Slovenian) (f823400)
- chore(i18n): Translated using Weblate (Lithuanian) (8a93cd3)
- chore(i18n): Translated using Weblate (German) (099b201)
- chore(i18n): Translated using Weblate (Czech) (89b0f94)
- wip2 (86a2128)
- wip2 (9321663)
- test: isolate the module-global audio graph between files (d8cca7e)
- test(do-not-track): follow the translator instead of pinning wording (716ec6b)
- fix(perf): remove the in-process GPU option (0107fc1)
- fix(settings-ui): mount the standalone window from a script-less shell (6e2dd2c)
- wip (4f513ae)
- refactor(desktop): remove a dead e2e helper and the duplicated channel rule (55c501f)
- fix(update): check whether a dev build is behind master (e1a7cfb)
- fix: switch to nub (a08ab4e)
- docs(architecture): describe how API config patches and lyrics pushes work (2a24993)
- fix(themes): rebuild the menu when a theme folder is added or removed (cfc6bbd)
- fix(api): apply a config patch instead of writing it and forgetting (c728453)
- fix(plugins): restore what audio-only, prefer-song and search-commands owe (c73b49b)
- fix(migrations): carry the fork's equalizer, filters and translations over (25df04c)
- test(e2e): stop exercising the removed dislike skipper (8a55ccd)
- test(e2e): keep the fixture's destructured parameter (874010a)
- fix(build): let kuromoji resolve its Node dictionary loader (da2bb99)
- prepare for the rewrite (2817a5e)
- fix(settings-ui): resolve the standalone window paths from the app root (0a9893d)
- downloader: the Downloads page lists kept songs when signed out (2668938)
- settings: another section opens at its top, not where the last one was scrolled to (a21ee5e)
- i18n: fill {{applicationName}} in pear-desktop's strings without the caller passing it (ecaff19)
- downloader: the Downloads popover and queue, redesigned (e5404ed)
- downloader: keep songs in the app, and save them to the folder on request (5d9e605)
- e2e: the apps open on a virtual display, out of the way (d04aa7d)
- downloader: the sidebar's Downloads entry opens the Downloads page (3c9c35c)
- downloader: play downloaded songs offline in the site's own Downloads page (68faf51)
- downloader: a queue of jobs and a Downloads popover; sdk: menu items and sidebar entries (238e447)
- settings: a Developer Tweaks section for site features and developer tools (caedb10)
- support YTM's new player bar next to the classic one (5bf1128)
- downloader: ReplayGain, clean cancelling, notifications and a queue RPC (f7bef1d)
- downloader: settings buttons, recent downloads, lyrics, archive and liked songs (f8bc488)
- downloader: a built-in engine, with yt-dlp as the fallback (4462a72)
- tray, config, synced-lyrics and web-request fixes (b85e4e0)
- page: tell plugins when the window is off screen (32635ec)
- Translate the authorization dialog; proxy, tool download and video fixes (8211f7c)
- Open external links in the browser; settings, picture-in-picture and play fixes (957ebcd)
- Undo what a plugin registers after it stopped (ae89ab3)
- sdk: plugin timers forget fired and cleared timers (a00bc4d)
- docs: pear-desktop's README back, updated for the rewrite; a plugin guide (757eb7a)
- sdk: ctx.player.details() on the host (b9ce36b)
- e2e: an app fixture with one closeApp, and shared helpers (ef5c9fe)
- plugins: audio plugins and do-not-track in smaller pieces (36cf4fe)
- plugins: host plugins on isPlaying, ctx.listen and ctx.focusWindow (1013140)
- plugins: page plugins on JSX and the ctx helpers (72226a6)
- ui: the settings dialog in parts (e0db615)
- sdk, page: tidier selectors, keys, config builders and the page runner (f1507b7)
- downloader: split host and page parts into modules (41c73c1)
- plugins: the shared picker and popup menu entry; split picture-in-picture and in-app-menu (6291c83)
- desktop: named pieces for the host side (fb45959)
- api, migrations: smaller modules (14dee1c)
- desktop: split main() and share window, URL, error and translator helpers (f78d9c8)
- sdk: DOM JSX runtime, shared page components and helpers (8cc6df8)
- Bring back pear-desktop features the ports left out (e1db534)
- Keep pear-desktop 3.x behaviour for upgrading users (9e2f53c)
- Use pear-desktop's lyrics picker in synced-lyrics (fbbcab1)
- Dismiss the Premium reminder that follows skipped ads (59b5026)
- Keep the trademarked name out of the sources (1267ed2)
- Fold the ad blocker into do-not-track, pear-desktop's ad blocker (4797465)
- Downloader: download yt-dlp and ffmpeg when missing; 3.x options; translations (e89a600)
- Carry pear-desktop 3.x plugin settings over, and translate plugin texts (7b25a36)
- Port do-not-track and performance-improvement; synced-lyrics providers (f039f22)
- Make the remaining core options work (54465d6)
- Translations: pear-desktop's Weblate languages, a language picker (7c7c34d)
- Migrate pear-desktop 3.x configs; upstream option names; version 4.0.0 (d96d026)
- Package with electron-builder, like pear-desktop (2d293f7)
- Remove the old app (1af92a3)
- Settings UI based on pear-desktop PR pear-devs#4598 (f560cb3)
- Move the API server into the core; plugins expose RPC methods (5c29bff)
- Milestone 4: port the pear-desktop plugin set (515b6b3)
- Port interface and window plugins (8008bab)
- Port synced-lyrics and music-together plugins (1bb3a74)
- Port network & files plugins: adblock, downloader, auth-proxy-adapter, sponsorblock (2dc4dec)
- Port integrations plugins: api-server, discord, scrobbler, notifications, tuna-obs, amuse, lumiastream (8d525ab)
- Move plugin files ahead of the parallel ports (c9d10d5)
- Milestone 3: settings overlay, tray, global shortcuts, startup (5dd1050)
- Move files ahead of “Milestone 3: settings overlay, tray, global shortcuts, startup” (0a311ae)
- Milestone 2: plugin SDK, macro compiler and first plugins (1fc99fa)
- Move files ahead of “Milestone 2: plugin SDK, macro compiler and first plugins” (52589ef)
- init (9b0be2b)
- Move files ahead of “init” (9dd01f5)
- Update changelog for v3.12.4 (bec37c8)
- chore: Revise README to remove sponsorship details (7c55260)
- chore(deps): bump ip-address from 10.2.0 to 10.7.4 (b3b13de)
- chore(deps): bump source-map-js from 1.2.1 to 1.2.2 (e300826)
Built from commit af34dbd.