1.3.0 (2026-04-04)
- agent: add batch mode and model selection docs (a203129)
- agent: add decade/genre filters, tune model params, update backlog (2bee235)
- agent: add decade/year/genre filters to search_library (fb232af)
- agent: add heuristic evals with wiremock mock Ollama server (Phase 6) (27f9c2e)
- agent: add onboarding and Ollama setup commands (Phase 5) (f1cf52c)
- agent: add performance fixes and artist variety controls (c8c0ccf)
- agent: add Python Ollama agent script with JSONL logging scaffolding (4f29c97)
- agent: add Python prompt override harness (d5b5416)
- agent: add repeat penalty, LLM-as-judge eval, creative naming (4ac5ca6)
- agent: add rig-core + schemars deps and implementation plan for TASK-277 (fc5846b)
- agent: add types, prompt, module scaffold and wire into lib.rs (2f121f7)
- agent: expand genre filter with parent-subgenre mapping (a063a5c)
- agent: implement Last.fm tools and strategy-based system prompt (e063a28)
- agent: implement tools and agent loop for playlist generation (d9a37c9)
- agent: tighten Rust playlist prompt guidance (103776b)
- agent: wire up JSONL logging, temperature control, and think toggle (8fec18b)
- backlog: add genius UI refresh task (13bd3f5)
- genius: add frontend UI for Genius playlist creator (4953fab)
- genius: Enter to generate, auto-dismiss banner, centered spinner (765c54d)
- genius: refresh chat-style UI layout (8604bd6)
- genius: update keyboard shortcut to Shift+Enter, fix glasses angle (c7de133)
- agent: cfg-gate lastfm discovery types, methods, and tests behind agent feature (fd8593a)
- agent: cfg-gate new_unconfigured behind test+agent to fix dead_code error (b8b2d3e)
- ci: enforce nightly toolchain in tauri build setup action (4a8ac10)
- ci: force MSVC host toolchain on Windows to prevent dlltool errors (b92b2d0)
- ci: guard RUSTUP_TOOLCHAIN against empty PINNED_RUST on Windows (31abafc)
- ci: harden nightly status guards for ci setup tasks (c4bd4f3)
- ci: pin Rust toolchain from .tool-versions and add MSVC target on Windows (cdf8ef4)
- ci: restore default keychain after release build cleanup (f74c32f)
- ci: use pwsh for toolchain extraction on Windows, restore macOS build (dc8a7d7)
- clippy: derive Default for OnboardingState, collapse nested if (1855050)
- genius: crop glasses SVG viewBox to match sidebar icon size (3ec1869)
- playlists: refresh agent-created playlists (a96e616)
- remove orphaned new_unconfigured test helper (75df683)
- ci: merge rust-lint and rust-tests into single job, drop macOS build (a3c2e3b)
- remove unused lastfm agent types and methods from main (3520dc7)
1.2.4 (2026-03-31)
- ci: replace broken choco windows-sdk-10.1 with winget fallback (747ca49)
1.2.3 (2026-03-31)
- ci: add [[bin]] section to produce 'mt' binary name (95db4f0)
1.2.2 (2026-03-31)
- deps: remove mcp-bridge from default features to reduce release binary deps (599a44f)
1.2.1 (2026-03-31)
- ci: remove stale Taskfile fingerprint cache that skips builds (eb503d6)
1.2.0 (2026-03-31)
- add context menu to now playing view (a6b5850)
- ci: resolve cargo fmt failures and bump GHA actions to Node 24 (c06ca35)
- keyboard: prevent space from toggling play/pause during type-to-jump (5195080)
- now-playing: prevent long lyrics from pushing queue panel off viewport (67c292b)
- queue: resolve shuffle, remove, and Play Next queue bugs (49b1515)
- resolve merge conflict in .serena/project.yml (e97f9e8)
- theme: add search field contrast for metro-teal and neon-love themes (37a60ad)
1.1.0 (2026-03-27)
- add active section highlight to settings nav for dark themes (#29) (1d9eeff)
- add listening statistics dashboard under Settings (a74c222)
- add Neon Love theme preset from Love color palette (af912cc)
- add network file caching for SMB/NFS mounts (#27) (e6c55ae)
- artists-browser: sort artist albums by year ascending (9d3c59c)
- audio: add output device selection in Settings > Audio (#26) (d5c9f35)
- context-menu: add "Go to Album" menu item to track context menus (e93eaba)
- context-menu: add "Go to Artist" menu item to track context menus (83e6cdc)
- cross-directory track deduplication with reinstatement (a7ef45a)
- dynamic lyrics layout reflow with content-based width measurement (f2181cc)
- library: persist removed track identifiers to prevent re-addition on scan (f7721ef)
- show LRCLIB lyrics in Now Playing view with caching (b7e5533)
- show LRCLIB lyrics in Now Playing view with caching (532bf87)
- stats: add placeholder art with artist name for chart grid, fix PNG export (da5b2b3)
- stats: rework statistics dashboard to Last.fm-inspired layout (900620d)
- apply roborev fix for 7da95a2 (job #6) (4c0908b)
- apply roborev fix for 83e6cdc (job #17) (4885972)
- apply roborev fix for 968f392 (job #2) (5d161ee)
- apply roborev fix for 9cf7984 (job #25) (c3cea62)
- apply roborev fix for 9d3c59c (job #20) (77b3700)
- apply roborev fix for e93eaba (job #13) (81793fc)
- cargo: create CARGO_HOME/bin symlinks for mise shim compatibility (38cb8f9)
- cargo: symlink project CARGO_HOME/bin to ~/.cargo/bin, add PATH (aaefd99)
- cargo: symlink tools to rustup binary instead of mise install dir (37fd360)
- ci: add libasound2-dev for Linux and fix macOS keychain search list (5151e62)
- ci: force cargo-binstall to install tarpaulin binary (6e3383a)
- ci: gate build matrix behind all lint and test jobs (ede587e)
- ci: gate rust-tests behind rust-lint (300b6da)
- ci: resolve release build failures on macOS, Linux amd64, and Linux ARM64 (5d919af)
- ci: skip Tauri DMG bundling on macOS, create DMG with hdiutil (f702934)
- clippy: collapse nested if statements into let-chains (930c092)
- drag-drop: use relative offset for queue drag ghost position (cf244ee)
- guard playNextTracks against background queue build race condition (2c17f80)
- library: force repaint when returning from albums view (c70b4c5)
- media-keys: register MediaRewind/FastForward for macOS F7/F9 keys (2b84602)
- metadata-modal: prevent repeated re-opens during library updates (3d61cd5)
- playback: loop-one not re-queuing current track and icon not untoggling (7481401)
- propagate DB errors instead of silently swallowing in removed tracks (1451d61)
- resolve clippy warnings in mount_detect and stats (58b4293)
- roam: resolve 3 false-positive dependency cycles (f7131bf)
- startup: prevent FOUC flash between window.show() and CSS load (#30) (930bc32)
- test: anchor Playwright route patterns to avoid intercepting JS modules (f3b854b)
- testing: update 3 stale visual regression snapshots (662b96e)
- themes: add dark-theme toggle overrides for network cache settings (1b621a2)
- ui: prevent text selection on all UI chrome (be560ce)
- watcher: return original tracks on filter_removed_tracks error (4e3f633)
- conductor: replace signed build with deno install in setup (0841f5c)
- dev: add cranelift codegen, panic=abort, and shared target dir (b4ed57b)
- dev: add panic=abort and shared target dir for dev builds (fea390e)
1.0.0 (2026-02-21)
- Python backend has been removed
- a11y: integrate Alpine.js Focus plugin for improved focus management (a98dbcd)
- add agent skills (6a1a320)
- add artwork LRU cache and consolidate time formatting utilities (0957392)
- add database persistence, logging, and CSV results to benchmark suite (aa10dcd)
- add Docker cross-build for Linux ARM64 (Raspberry Pi) (363006a)
- Add double-click to jump to current track in library view (1c75a4a)
- add infinite scroll to library view using Alpine.js Intersect plugin (2ba1293)
- add Last.fm frontend integration for settings and scrobbling (b473c3e)
- add Linux amd64 build support, remove global-shortcut plugin (c57f8c1)
- add MCP bridge for E2E test debugging (a4c6bfa)
- add play history tracking for shuffle navigation (task-200) (7dcad78)
- add queue state Tauri commands and events (543ed26)
- add queue_state table and database operations (b2fdf7e)
- auto-install Linux system deps before Tauri build (cd1955a)
- backend: add bulk delete and purge-missing Tauri commands (task-272) (663638e)
- backend: batch reconciliation, transaction wrapping, frontend memoization (task-272) (b93685a)
- backend: implement Rust database layer and scanner modules (79a92fd)
- backend: make export_diagnostics async to prevent UI blocking (08f2236)
- backend: structured logging with tracing, frontend error capture (task-277) (905547c)
- build: add Linux amd64 Docker build mirroring arm64 (b795816)
- build: enable MCP bridge by default in release builds (c012d43)
- build: statically link TagLib, eliminate Homebrew runtime dependency (task-259) (d5fcf43)
- ci: add act configuration for local GitHub Actions testing (d169a00)
- ci: add macOS code signing, notarization, and release pipeline (task-021) (f6f128d)
- ci: add platform selector to release workflow (5dda144)
- ci: add Playwright E2E tests to test-local.yml and document flakiness (c026bab)
- ci: add Windows NSIS packaging to release pipeline (024c3c0)
- ci: auto-cancel superseded workflow runs (d22a8cc)
- complete Tauri migration - remove Python sidecar (9feabb0)
- context-menu: add "Add to Liked Songs" toggle to track context menus (task-276) (2a6a751)
- coverage: add Phase 4 coverage measurement and CI integration (463102a)
- create frontend settings service for backend sync (c2843d3)
- events: replace WebSocket with Tauri event system (452cc28)
- Favorites API migrated from FastAPI to Rust (cc3b996)
- frontend: add .log extension and loading state to log export (4c7c553)
- frontend: migrate Last.fm API to Tauri commands (Phase 7) (8e28e21)
- frontend: perf instrumentation, early window show, scan loading state (task-277) (2f35425)
- implement 3-phase performance optimizations for library scanning (7435364)
- implement Last.fm scrobbling integration (712580a)
- initialize settings service before Alpine starts (7a387d9)
- integrate Deno for faster frontend builds (8x install, 2.2x build) (aa4bc7b), closes #215
- integrate queue state persistence in frontend (df60cc7)
- last.fm integration (45c6fda)
- lastfm: add loved tracks cache for automatic favoriting (8fc045d)
- lastfm: add UI and background sync for loved tracks cache (3f0403e)
- lastfm: bidirectional love sync, tighter matching, cache reset (1e87fc0)
- lastfm: implement loved tracks import (Phase 6) (2d98554)
- lastfm: implement Phase 1 core infrastructure (e33a6bf)
- lastfm: implement Phase 2 settings commands (f787eec)
- lastfm: implement Phase 3 authentication commands (c0c6e9a)
- lastfm: implement queue commands and background retry (Phase 5) (3d2d6e8)
- lastfm: implement scrobbling commands (Phase 4) (8fa5681)
- library: add dragged pill button files to watched folders with confirmation (task-259) (650d852)
- library: add ellipsis to default ignore words list (da17fc6)
- library: add persistent view caching to eliminate loading spinners (5d72cd6)
- library: add Rust library commands and migration analysis (3a0bcd6)
- library: add same-letter cycling for type-to-jump navigation (088fd97)
- library: add type-to-jump artist navigation (WIP) (08069be)
- library: add Year, Genre, Disc, and Total columns to library table (1425d11)
- library: wire Cmd+D queue-next shortcut to library browser (task-107) (c20f491)
- linux: add GTK HeaderBar with dynamic theme colors (bae124c)
- migrate library column settings to backend (8d1ac21)
- migrate sidebar component settings to backend (45396c2)
- migrate ui store settings to backend persistence (2030e26)
- move Last.fm scrobbling to Rust audio thread (b2cbf5a)
- playlists: fix library-to-playlist drag-drop and add reorder visual feedback (dfa15bb)
- playlists: migrate playlists API to Rust Tauri commands (f210a20)
- queue: add stop-after-current, play-next offset, and insert guard (task-107) (6f049aa)
- queue: migrate queue API to Rust Tauri commands (0b38622)
- re-enable queue events with debouncing (97cbc66)
- Replace Python/Tkinter with Tauri/Rust implementation (cf7cbf6)
- Repurpose track number column for playlist ordering (b7a73b8)
- scripts: add Windows build and signing script for local testing (72d0457)
- scripts: elevate choco installs via Start-Process -Verb RunAs (3a01dd2)
- settings: add Columns section with reset options and confirmation dialog (1dab664)
- settings: display keyboard shortcuts in settings panel (task-107) (f609cba)
- settings: migrate Settings API to Rust using Tauri Store (957b029)
- shortcuts: add global keyboard shortcuts module (task-107) (82f06d7)
- shortcuts: require modifier keys for mute, loop, shuffle shortcuts (56ffeb6)
- sidebar: delete active playlist via Delete/Backspace key (9cea11b)
- skills: add ideation skill adapted from Auto-Claude patterns (65b3bc5)
- sort: install @alpinejs/sort plugin (914a0a5)
- sort: migrate column header reordering to Alpine.js Sort plugin (3439ac6)
- sort: migrate playlist track reordering to Alpine.js Sort plugin (Phase 2) (171d63e)
- sort: migrate queue reordering to Alpine.js Sort plugin (58dd5d9)
- sort: migrate sidebar playlist reordering to Alpine.js Sort plugin (Phase 3) (b6a2041)
- tasks: add cargo-nextest support and build timing analysis (8fb6ede)
- tests: add API mocking infrastructure for Playwright tests (a52f6f8)
- tests: add comprehensive frontend E2E test coverage (db85304)
- tests: add event emission and thread safety tests (93c8fcd)
- tests: add fail-fast with maxFailures=5 for CI (b8db04d)
- tests: add library store Vitest unit tests (ecf49b6)
- tests: add Phase 2 E2E and unit tests for error states, settings, and selection (33123ec)
- tests: add Phase 3 backend Rust command tests (82e25a6)
- ui: add "Add to Playlist" context menu to Albums and Artists views (task-275) (c9a9726), closes #3
- ui: add Artists and Albums sidebar navigation with view routing (task-273.01) (2c328dd)
- ui: implement Albums browsing view with grid and detail (task-273.03) (8008d91)
- ui: implement Artists browsing view with split-pane layout (task-273.02) (6a776c3)
- ui: move now playing indicator to status column with dynamic icons (611363e)
- ui: optimistic bulk delete, debounced scan events, allTracks store (task-272) (45eba56)
- watched folders (0a74265)
- add requests dependency to PEX build for Last.fm API integration (c07689d)
- audio: use Decoder::try_from(File) for M4A/AAC playback (4315d8f)
- build: add sccache as macOS dep, filter IDE extension paths from PATH (d81e6ec)
- build: target baseline x86-64 CPU for Zig and TagLib static libs (b2d0723)
- ci: add x86_64-pc-windows-msvc target to nightly toolchain (9b3d78f)
- ci: consolidate signing env vars, add library-validation entitlement, docs (50e0b5c)
- ci: enable Rust toolchain caching (91b469c)
- ci: ensure complete TagLib source extraction and add verification (66cd50f)
- ci: fix Deno formatting in vite.config.js (a9d4b8a)
- ci: fix Windows build path and add Taskfile to CI (0dea066)
- ci: install cmake via brew on macOS runner (5495a90)
- ci: install Playwright browsers from project directory (c2d9873)
- ci: install Rust via chocolatey on Windows runner (06305c3)
- ci: install rustup via choco, pin nightly-2026-02-09 to match .tool-versions (1555a02)
- ci: install system dependencies and fix Playwright port conflict (90dd494)
- ci: install webkit browser for Playwright E2E tests (b85862b)
- ci: kill stale dev server on port 5173 before Playwright tests (1344f2a)
- ci: prevent duplicate workflow runs on PRs (4612180)
- ci: prevent test-local.yml from running in GitHub Actions (a077863)
- ci: replace dtolnay/rust-toolchain with actions-rust-lang/setup-rust-toolchain (096db60)
- ci: resolve macOS cargo check and Windows release build failures (e7778ca)
- ci: revert setup-node to v6, add act to .tool-versions (3b44472)
- ci: show cmake errors in build-taglib script (8b00c12)
- ci: skip cmake reinstall and pin setup-node to v4 for act compat (bec4eeb)
- ci: skip visual regression tests in CI (f8ccdfb)
- ci: update webkit2gtk package to 4.1 for Ubuntu 24.04 (c2b6fcd)
- ci: use .cmd wrapper for Windows signtool signing (62e9428)
- ci: use pwsh for Rust setup and npm ci on Windows (64ef8b4)
- clear queue on startup and enqueue only subsequent tracks in sequential mode (0b78072)
- clippy: resolve all linter warnings in Rust code (2bea4fe)
- config: update deno.jsonc to use flat options format (ab370c4)
- correct npm path prefix in tauri.conf.json for monorepo structure (dcbf1de)
- db: make compat tests skip gracefully in CI (8daa834)
- deno: use --frozen lockfile for reproducible installs (bec4ccf)
- deps: update @tauri-apps/api to 2.10.1 to match tauri crate 2.10.2 (9965ef9)
- dialog: allow selecting both files and folders in add music picker (#19) (9f7045f)
- e2e: fix 6 failing tests and metadata editor navigation (01738fd)
- e2e: fix all 34 Last.fm E2E tests (5877cfa)
- e2e: update Last.fm UI text and add missing HTTP mocks (3b3b1c2)
- frontend: use static import for api.js in UI store (69d1cc8)
- handle NaN/Infinity and clamp seek position to duration (36f179f)
- js: resolve deno linting warnings (d84dc45)
- lastfm: improve error message display for connection failures (c299f4b)
- lastfm: improve loved tracks import matching and add logging (065dcf2)
- lastfm: use fraction-based threshold comparison for robustness (85f3a64)
- library capping visible tracks at 100 (8cb2e26)
- library: filter missing tracks and set missing=0 on insert (port from task-216) (011b5a6)
- library: fix default sort order to respect disc number (c116b02)
- library: improve missing track reconciliation and locate UX (c95edfd)
- library: prioritize stripped-prefix matches in type-to-jump (ff120d7)
- library: remove word-boundary matching from type-to-jump (60003fc)
- library: restore missing async on _fetchLibraryData (e19da1f)
- library: suppress keyboard shortcuts when input is focused (6f7577b)
- lint: resolve async/await lint errors in library store (d5ba0d1)
- linux: enable decorations=false for GTK HeaderBar dragging (646d6c0)
- make queue state session-only (reset on app start) (207c267)
- metadata: enable prev/next navigation for single-track editor (c2b917e)
- move ignore-words sorting to SQL, fix album/artist grouping (16cef12)
- npm: regenerate package-lock.json to fix native bindings (9ef0e64)
- playback: resolve shuffle and rapid-next regressions (ebeaeff)
- player-controls: commit volume immediately on drag release (470f267)
- player: update volume optimistically for immediate UI feedback (23a8104)
- playlists: dispatch event on rename to sync context menu (fff3188)
- playlists: use global workaround for drag-drop in Tauri (354ec90)
- preserve play history across queue rebuilds (33e6752)
- prevent double-queuing of clicked track in sequential mode (37f0af4)
- prevent queue event listener from overriding shuffle state during init (e41611e)
- prevent race condition causing tracks to play twice on double-click (25fa679)
- queue: prevent shuffle state desync during skip next/previous (task-263) (1217130)
- queue: resolve shuffle bugs causing track restart and repeats (f76b0b5)
- reduce track transition gaps, fix shuffle race conditions, add queue virtual scroll (0867a84)
- replace $watch with Alpine.effect in ui store (57e23d2)
- resolve 4 Playwright test failures from data-track-id collision (24e8a0a)
- resolve deno fmt and lint errors (9fbec03)
- resolve Rust 2024 never type fallback warning (9655011)
- restore play/pause on macOS (task-279) (651cf1e)
- rust: resolve clippy linting warnings (cb24938)
- scanner: replace Zig FFI inventory with pure Rust to fix SIGBUS crash (2f68c74)
- scripts: guard against UNC paths, switch to npx @tauri-apps/cli (35eed8b)
- scripts: set RUSTUP_TOOLCHAIN early as process env var (9b5d9ba)
- scripts: skip beforeBuildCommand, merge config into single override (0b6a38a)
- scrobble: use Math.ceil for played_time/duration to prevent off-by-one threshold failures (fcfb3fb)
- sidebar: add delay before playlist reorder activation (16573ef)
- sort: handle empty album_artist in artist sort order (e5c3cc0)
- sort: resolve race conditions and clone errors in queue reordering (c276daf)
- startup: prevent flash of unstyled content on app launch (1b78d94)
- taskfile: replace npm lint/format with deno commands (fa24f06)
- tasks: stop deleting tracked deno.lock in clean tasks (eedc795)
- tauri: remove mcp-bridge permission from default capabilities (0acca6f)
- test: accept confirm dialog in column reset test (1011b41)
- test: align Playwright tests with SQL-side sorting from 16cef12 (f540fd1)
- test: prefix unused variable in lastfm_loved upsert test (0dbdd2c)
- tests: adjust Playwright timeouts to avoid flaky failures (27f55ef)
- tests: align test mock _stripIgnoredPrefix with library.js (f339396)
- tests: correct import paths in error-states Playwright tests (fd2e474)
- tests: correct seek invariant tests and add dot reporter (12c00f5)
- tests: make column and sorting tests flexible for browser mode (6a327ce)
- tests: update scrobble and sidebar tests for current architecture (ee39250)
- trim value in _stripIgnoredPrefix early return (0ec9da3)
- ui: add scrolling to playlist submenu when it exceeds viewport (task-151) (1a54200)
- ui: center empty library state without breaking virtual scroll (e9ae286)
- ui: default artist sort, normalize sort keys, fix O(n^2) artist SQL (task-272) (8b326c3)
- ui: disable column width animation for instant sizing (728d504)
- ui: disable default browser context menu in webview (346e60e)
- ui: prevent context menu and text selection on sidebar items (f66a802)
- ui: prevent intermittent sidebar theme flash on reload (task-256) (e564b54)
- ui: remove background hover effect from transport buttons (e0b838c)
- ui: remove jittery animations from volume slider (3ce4b8b)
- ui: style success toasts to match theme accent colors (task-258) (718b843)
- ui: use # column header consistently in library and playlist views (2064276)
- use relaxed parsing for tracks with malformed ID3 tags (task-281) (b8d7bc8)
- watcher: prevent UI freeze during manual scan (360218e)
- windows: resolve crash-on-launch and signing pipeline issues (842b53d)
- backend: defer content hashing in scan, transaction-wrap queue adds (task-272) (6329ca1)
- batch metadata loading and parallel saves (task-279) (3d6eeb1)
- build: switch zig-core to ReleaseSmall optimization (64b55ae)
- build: use dynamic BUILD_JOBS calculation for lower-spec machines (b01a81f)
- ci: add build parallelism env vars to Windows CI setup (ed41c21)
- ci: add path filters to skip CI for non-business logic changes (ad8578a)
- ci: cache cargo-tarpaulin binary to speed up Rust tests (6c5cad9)
- ci: disable incremental compilation for faster clean builds (6ccd698)
- ci: enable incremental compilation for self-hosted Rust jobs (365ac3b)
- ci: remove npm cache from self-hosted jobs (6d5b08b)
- ci: remove Rust dependency cache from self-hosted jobs (5e0fb95)
- css: strip transitions, fix hidden spinners, add containment (task-262) (1e16ec2)
- feature-gate devtools to reduce release binary size (2e2b23c)
- frontend: implement virtual scrolling for library track list (task-261) (a1a0480)
- frontend: stop caching full track arrays in sectionCache (c79a3f9)
- library: make reconcile scan async with rayon parallelism and progress UI (task-280) (40b1f99)
- linux: tune glibc malloc arenas for WebKitGTK memory reduction (aad2d84)
- runtime: limit rayon thread pool to 4 threads with 2 MB stacks (b720148)
- runtime: reduce SQLite pool to 4 connections, artwork cache to 50 (907a378)
- rust: optimize dev build performance and trim tokio features (71f0cb7)
- tests: optimize Playwright E2E performance for CI (3c98d33)
- ui: immediate playback on double-click with background queue build (task-272) (7cc8e60)