# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.34.6] - 2026-04-08 > I'm sorry this is already the third release today β€” every time we shipped a critical fix, another critical issue surfaced. Hopefully this one holds. 🀞 ### 🚨 Critical Fix - **ZIP downloads no longer freeze the UI**: All ZIP downloads (Album Detail, Playlist Detail, Albums, New Releases, Random Albums) previously buffered the entire file in the JS heap via `fetch + blob + arrayBuffer`, which caused the app to become completely unresponsive for large downloads (e.g. a 600-song, 7 GB playlist). Downloads now stream directly to disk via the Rust backend (`invoke('download_zip')`), matching the existing single-album download behavior. Progress is shown in the download overlay (bottom right). - **Offline cache downloads no longer freeze the UI**: Caching a large playlist (600+ songs) triggered up to ~1,200 synchronous `localStorage.setItem` calls as Zustand's `persist` middleware wrote on every state update. Transient download job state has been moved to a new non-persisted store (`offlineJobStore`), reducing localStorage writes for an entire download to **2** regardless of playlist size. ### Added - **Playlist offline toggle**: When a playlist is already cached offline, clicking the cache button now removes it from the offline cache (shown with a red trash icon) instead of re-downloading it. ### Fixed - **Home page β€” "Recently Added" section title** now links to `/new-releases` instead of `/albums`. --- ## [1.34.5] - 2026-04-08 ### 🚨 Critical Fix - **Massive API request flood fixed** *(closes [#133](https://github.com/Psychotoxical/psysonic/issues/133))*: Psysonic was generating 15,000+ background requests per day, filling reverse-proxy access logs (Traefik, nginx) and in some cases crashing the proxy entirely. Four root causes identified and resolved: - **Now Playing polling**: Was firing every 10 seconds unconditionally β€” even when minimized or the dropdown was closed. Now only polls while the dropdown is open, and respects the Page Visibility API to pause immediately when the window is hidden. - **Connection check interval**: Reduced from every 30 seconds to every **120 seconds** (4Γ— reduction). - **Queue sync debounce**: Increased from 1.5 s to **5 s**, preventing request bursts when skipping rapidly through tracks. - **Rating prefetch cache**: Artist and album ratings are now cached in memory for **7 minutes**. Repeated page loads (Random Albums, Random Mix) no longer re-fetch ratings that were just retrieved. ### Added - **Theme Scheduler** *(Settings β†’ Appearance)*: Automatically switches the active theme at configurable times of day. Two time slots (e.g. a light theme during the day, a dark one at night). English locale displays hours in 12-hour AM/PM format; all other languages use 24-hour format. - **Theme Scheduler hint**: When the scheduler is active, a notice appears at the top of the Theme Picker explaining why manually selecting a theme has no immediate effect. - **UI Scale** *(Settings β†’ Appearance)*: Adjust the global interface scale (80 % – 125 %) without changing the system font size. - **Folder Browser**: New sidebar section with Miller-columns directory navigation. Browse the server's music folder tree and play or queue folders directly. - **Seekbar β€” Waveform fade edges**: The Waveform seekbar style now fades out at both ends, giving it a cleaner, less abrupt look. - **Cover art fallback logo**: When a cover art image fails to load (broken URL, server error), the Psysonic logo is shown as a placeholder instead of a broken image icon. - **Tiling WM support** *(PR [#134](https://github.com/Psychotoxical/psysonic/pull/134))*: On tiling window managers (Hyprland, Sway, i3, bspwm, AwesomeWM, etc.) the custom title bar is automatically hidden β€” the WM manages window decorations. The title bar toggle in Settings is also hidden on tiling WMs. Detection is based on environment variables (`HYPRLAND_INSTANCE_SIGNATURE`, `SWAYSOCK`, `I3SOCK`, `XDG_CURRENT_DESKTOP`). ### Changed - **Custom title bar disabled by default**: New installations start with the native OS title bar. Existing users keep their saved preference. ### Fixed - **Custom title bar (Linux) β€” drag & resize**: Window dragging via the title bar now works correctly (missing Tauri `core:window:allow-start-dragging` capability was silently blocking it). CSS resize grips are now shown at the bottom corners to compensate for the removed native GTK grips. The title bar no longer misplaces itself when the window is resized to a small width (mobile-grid layout now includes the title bar row). - **Fullscreen Player β€” accent color delay**: The dynamic accent color extracted from album artwork now appears in ~200–300 ms instead of up to 18 seconds. The previous implementation queued the cover fetch behind up to 5 concurrent image loads via the app-wide image cache. It now fetches the cover directly and independently. The extracted color is also cached per cover ID, so switching between tracks on the same album is instant. - **Artist Detail page β€” slow initial render** *(closes [#132](https://github.com/Psychotoxical/psysonic/issues/132))*: Artist info and biography are now fetched independently of the main artist data, so the page renders immediately and the bio fades in once available. Previously, a slow `getArtistInfo` response blocked the entire page from rendering. - **Seekbar β€” Pulse Wave & Retro Tape styles**: Pulse Wave no longer leaves a stray connecting line at the playhead position. Retro Tape's rolling wheel is now anchored at the playhead instead of the center of the bar. - **Statistics β€” Top Rated Songs/Artists sections removed**: These sections were incorrectly added in v1.34.4 and have been removed. All other rating features from that release remain fully intact. --- ## [1.34.4] - 2026-04-08 ### Added - **Entity ratings** *(PR [#130](https://github.com/Psychotoxical/psysonic/pull/130))*: Full star-rating support (1–5 β˜…) for songs, albums, and artists via the OpenSubsonic `setRating` API. Ratings are shown and editable in the album track list, artist detail page, and the Favorites song list. A new shared `StarRating` component is used consistently across all surfaces. Requires an OpenSubsonic-compatible server (e.g. Navidrome β‰₯ 0.53). - **Song ratings β€” context menu & player bar**: Songs can additionally be rated directly from the **right-click context menu** and from the **player bar** (below the artist name), with optimistic updates reflected immediately across all views. - **Skip-to-1β˜…** *(PR [#130](https://github.com/Psychotoxical/psysonic/pull/130))*: Automatically assigns a 1-star rating to a song after it has been manually skipped a configurable number of consecutive times. This skip count threshold can be enabled and adjusted in Settings β†’ Ratings. - **Mix minimum rating filter** *(PR [#130](https://github.com/Psychotoxical/psysonic/pull/130))*: Random Mix and Home Quick Mix can now be filtered by minimum rating per entity type (song / album / artist). Configure thresholds in Settings β†’ Ratings. - **Statistics β€” Top Rated Songs & Artists**: New "Top Rated Songs" and "Top Rated Artists" sections on the Statistics page, derived from starred items with a `userRating > 0`. Lists update live as ratings are changed without a page reload. - **Seekbar styles β€” 5 new styles**: Added Neon Glow, Pulse Wave, Particle Trail, Liquid Fill, and Retro Tape. Animated styles run a dedicated `requestAnimationFrame` loop. The style picker in Settings shows an animated live preview for each style. - **Custom title bar (Linux)**: Optional custom title bar with now-playing display (song title + artist, live-updating). Replaces the native GTK decoration when enabled. Automatically hides in native fullscreen (F11). Can be toggled in Settings β†’ Appearance. - **Album multi-select**: Albums, New Releases, and Random Albums pages now support multi-select mode. Selected albums can be batch-queued or enqueued. - **Most Played β€” compilation filter**: New toggle on the Most Played page to hide compilation artists from the Top Artists list. - **Scroll reset on navigation**: The content area now scrolls back to the top automatically on every route change. ### Fixed - **Backup**: The `psysonic_home` key is now included in the settings backup export. ### i18n - New keys for seekbar styles, entity ratings, rating sections (Settings + Statistics), and entity rating support added to all 7 languages (EN, DE, FR, NL, ZH, NB, RU). --- ## [1.34.3] - 2026-04-07 ### Added - **Most Played page** *(closes [#86](https://github.com/Psychotoxical/psysonic/issues/86))*: New dedicated page accessible via the sidebar (TrendingUp icon, `/most-played`). Shows **Top Artists** (ranked by total play count, derived by aggregating album play counts per artist) and a paginated **Top Albums** list with cover art, play count, sort toggle (most/fewest first), and a Load More button. - **Playlist ZIP download** *(closes [#127](https://github.com/Psychotoxical/psysonic/issues/127))*: Download (ZIP) button in the playlist hero header β€” same UX as album download. Uses the Subsonic `/rest/download.view` endpoint with the playlist ID, shows a progress bar during transfer, and remembers the last used folder. - **Fullscreen Player β€” adaptive accent color**: Extracts the most vibrant pixel from the current album cover (8Γ—8 Canvas downscale, max-HSL-saturation) and applies a WCAG 4.5:1-compliant accent as `--dynamic-fs-accent`. Song title, play button, seekbar, active states, background mesh blobs, and cover art glow all transition smoothly to the extracted color. Resets to the theme accent when the player closes. - **Dracula theme**: Added to the Open Source Classics group. - **Discord Rich Presence β€” Apple Music cover opt-in**: iTunes artwork lookup is now disabled by default. A new toggle in Settings β†’ Integrations ("Fetch covers from Apple Music for Discord") must be explicitly enabled β€” it sends artist and album name to Apple's search API to find cover art for the Discord profile. - **Discord Rich Presence β€” Paused state**: When playback is paused, the Discord presence now shows "Paused" as the status text. ### Fixed - **M4A playback β€” older iTunes-purchased files**: Files with an embedded MJPEG cover-art stream and an `iTunSMPB` gapless tag now play correctly. The Symphonia isomp4 patch skips malformed trak atoms gracefully; `parse_gapless_info` now searches for the `" 00000000 "` sentinel to skip the 16-byte binary `data`-atom header, correctly extracting encoder delay and total sample count. ### i18n - New keys for the Most Played page, playlist download, and Discord Apple Music opt-in added to all 7 languages (EN, DE, FR, NL, ZH, NB, RU). --- ## [1.34.2] - 2026-04-07 ### Added - **M4A / ALAC / AAC-LC support** *(closes [#51](https://github.com/Psychotoxical/psysonic/issues/51))*: Apple Lossless (ALAC) and AAC-LC files in M4A containers are now decoded natively by the Rust audio engine (Symphonia) without requiring server-side transcoding. - **Per-server music folder filter** *(PR [#125](https://github.com/Psychotoxical/psysonic/pull/125) by [@cucadmuh](https://github.com/cucadmuh))*: Users with multiple music libraries on their Navidrome server can now scope browsing to a single folder. A dropdown in the sidebar (visible only when more than one library exists) lets you pick a folder or switch back to "All Libraries". The selection is persisted per server and automatically resets to "All" if the selected folder is no longer available. - **Hi-Res / Bit-Perfect Playback** *(Alpha)*: New opt-in toggle in Settings β†’ Playback. When enabled, the audio output stream is re-opened at the file's native sample rate (e.g. 88.2 kHz, 96 kHz) β€” bypassing rodio's internal resampler for a bit-perfect signal path. Disabled by default (safe 44.1 kHz mode). Includes ALSA/PipeWire underrun hardening: scaled quantum size, 500 ms sink pre-fill at high rates, and scheduler priority escalation only when needed. - **Hot Playback Cache** *(Alpha, PR [#123](https://github.com/Psychotoxical/psysonic/pull/123) by [@cucadmuh](https://github.com/cucadmuh))*: Configurable on-disk prefetch cache for the next track in the queue. Reduces playback latency on slow or metered connections. Toggle and directory can be configured in Settings β†’ Storage. ### Changed - **Fullscreen Player β€” info block reworked**: The track title is now the dominant element (large, bold, accent color) and sits above the artist name (small, muted). Matches community feedback on visual hierarchy. - **Fullscreen lyrics β€” line wrapping**: Long lyric lines now wrap onto a second line instead of being truncated. Slot height increased from 3.6 vh to 6 vh to accommodate two-line entries without breaking rail positioning. - **Update notifications**: Removed the Tauri auto-updater (in-app download and install). The app now shows a simple dismissible toast when a newer version is detected on GitHub, with direct links to the [GitHub Releases page](https://github.com/Psychotoxical/psysonic/releases/latest) and the [Psysonic website](https://psysonic.psychotoxic.eu/#downloads). No signing keys, no update manifests. ### Fixed - **Standard mode CPU usage**: Playing a 44.1 kHz MP3 with Hi-Res disabled no longer triggers an unnecessary audio device re-open on every track start. MSS read-ahead buffer reduced from 4 MB to 512 KB for standard-rate files. Background prefetch is now throttled by 8 s to avoid competing with playback startup. Combined, these changes reduce idle CPU from ~6–10 % to ~2–3 % on a modern machine. - **Hi-Res toggle β€” stream rate not restored**: Toggling Hi-Res off while a track was playing at 88.2 or 96 kHz left the output stream at the high rate for subsequent tracks. The device's default rate is now restored on the next play. - **Fullscreen lyrics β€” CPU spikes on line transitions**: Animating `font-weight` in CSS triggered a full layout reflow on every animation frame. Removed `font-weight` from the transition list; active-line emphasis now uses `transform: scaleX(1.015)` (compositor-only). Added `contain: layout style` to the overlay to isolate reflows from the rest of the page. ### i18n - New keys for Hi-Res playback settings and music folder filter added to all 7 languages (EN, DE, FR, NL, ZH, NB, RU). --- ## [1.34.1] - 2026-04-06 ### Added - **Fullscreen Player β€” Synced Lyrics Overlay**: Synced lyrics are now displayed directly in the Fullscreen Player as an animated 5-line rail with a soft fade mask at the top and bottom edges. Click any visible line to seek to that position. Toggle the overlay on/off with the new microphone icon button next to the heart β€” preference is persisted. > **Note:** The overlay currently requires synced (timestamped) lyrics. Support for unsynced lyrics in the Fullscreen Player is planned for a future release. - **Embedded Lyrics & LRC support**: The app now fetches lyrics from two sources using the shared `useLyrics` hook (used by both the Lyrics Pane and the Fullscreen overlay): - **Server-embedded lyrics** via the OpenSubsonic `getLyricsBySongId` endpoint β€” reads timestamped or plain lyrics baked directly into the audio file's tags (Navidrome 0.53+). - **LRCLIB** β€” external LRC lookup as fallback (or primary, configurable in Settings β†’ Playback). Both sources share a module-level cache so switching between the Lyrics Pane and the Fullscreen Player never triggers a second network request. - **Artist Image Upload**: A camera overlay now appears when hovering the artist portrait on the Artist page. Clicking it opens a file picker and uploads the image directly to your server. > **Requires `EnableArtworkUpload = true`** in your Navidrome configuration (new option in Navidrome [#5110](https://github.com/navidrome/navidrome/issues/5110) / [#5198](https://github.com/navidrome/navidrome/issues/5198) β€” default: `true`). The same requirement applies to the existing Radio Station cover upload. - **Discord Rich Presence β€” Album Cover Art**: Album artwork is now displayed in Discord's Rich Presence card. Because Subsonic cover URLs require authentication (and can't be accessed by Discord directly), artwork is fetched from the iTunes Search API using a 3-strategy search (exact β†’ relaxed β†’ track-title fallback), cached for 1 hour, and passed as a direct URL to Discord. Falls back to the static Psysonic asset when no match is found. - **Nightfox themes** *(PR [#112](https://github.com/Psychotoxical/psysonic/pull/112) by [@nisrael](https://github.com/nisrael))*: Six themes from the [nightfox.nvim](https://github.com/EdenEast/nightfox.nvim) palette have been added to the **Open Source Classics** group β€” Dawnfox, Dayfox, Nightfox, Nordfox, Carbonfox, and Terafox. - **Auto-install script** *(PR [#121](https://github.com/Psychotoxical/psysonic/pull/121) by [@kilyabin](https://github.com/kilyabin))*: `install.sh` now supports Debian/Ubuntu (`.deb`) and RHEL/Fedora (`.rpm`) β€” automatically detects the distro, downloads the correct package from the latest release, and installs it. ### Changed - **Fullscreen Player β€” performance overhaul**: - `FsArt` (cover art) and `FsLyrics` are now isolated `memo` components β€” unrelated state changes no longer trigger their re-renders. - Cover crossfade uses an `onLoad` DOM event instead of `new Image()` preloading. This avoids a React batching edge case where both state updates were flushed together and the browser never saw the `opacity: 0` starting state, preventing the CSS transition from firing. - `useCachedUrl(..., true)` passes the raw URL as an immediate fallback β€” the image starts fetching from the network instantly while IndexedDB resolves the blob in the background. - Lyrics slot height is stored in a `useRef` and updated only on `resize` β€” eliminates repeated `window.innerHeight` layout reads on every render. - Mouse-move handler is throttled to 200 ms. - **Artist page β€” biography**: The bio text is now collapsed by default with a *Read more* / *Show less* toggle button, keeping the page layout clean for artists with long bios. - **Settings β€” Logout button**: Moved from the System tab to the bottom of the Server tab, styled as a danger button (red outline β†’ red fill on hover). ### Fixed - **Gapless playback β€” manual skip** *(PR [#119](https://github.com/Psychotoxical/psysonic/pull/119) by [@cucadmuh](https://github.com/cucadmuh))*: When the next track had already been gapless-pre-chained into the Sink, a manual skip would not interrupt it β€” the pre-chained track continued playing at full volume from the old Sink after the fade-out. The chain is now matched by stream identity so user-initiated playback always takes precedence. - **Radio / Artist cover cache**: `invalidateCoverArt` is now called after every cover upload and delete, so the old image is evicted from the local cache immediately. - **Queue auto-scroll**: The active track now scrolls reliably into view; eliminated unnecessary component re-renders caused by unstable selector references. - **macOS TLS** *(PR [#114](https://github.com/Psychotoxical/psysonic/pull/114) by [@nisrael](https://github.com/nisrael))*: Switched `reqwest` from `native-tls` (macOS Security framework) to `rustls-tls` (statically linked). The native backend was returning *bad protocol version* when connecting to HTTPS music servers, silently preventing playback. ### i18n - **Russian translation improvements** *(PR [#120](https://github.com/Psychotoxical/psysonic/pull/120) by [@kilyabin](https://github.com/kilyabin))*: Extensive phrasing refinements across the entire Russian locale. - New keys (`fsLyricsToggle`, embedded lyrics settings) added to all 7 languages (EN, DE, FR, NL, ZH, NB, RU). --- ## [1.34.0] - 2026-04-06 ### Added - **Mobile UI β€” Early Preview** ⚠️ β€” After multiple requests from the community, an initial mobile layout is shipping in this release. **This is a very early work-in-progress** β€” expect rough edges, missing features, and layouts that still need a lot of polish. Feedback is very welcome! Join the [Discord](https://discord.gg/ckVPGPMS) to share your thoughts. - Sidebar and queue panel are hidden on mobile; a sticky **Bottom Navigation Bar** replaces them with quick access to Mainstage, Albums, Now Playing, and Search. - **Mobile Player View** (`/now-playing`) β€” Full-screen ambient player with dynamic album-art-based background color, large cover art, track metadata line, and playback controls. - **Mobile Search Overlay** β€” Full-screen search with recent search history, category chips (Albums, Artists, Genres), and grouped results. - **Mobile Album Header** β€” Compact two-row icon button layout (Play + Queue primary, Favorite + Bio + Download + Offline secondary). - **Mobile Tracklist** β€” Simplified track rows; disc headers preserved for multi-disc albums. - **Mobile Hero / Carousel** β€” Blurred-background-only layout with circular Play + Queue buttons. - **Russian 2 translation** *(PR [#107](https://github.com/Psychotoxical/psysonic/pull/107) by [@kilyabin](https://github.com/kilyabin))*: A second Russian translation alongside the existing one from [@cucadmuh](https://github.com/cucadmuh) *(PR [#106](https://github.com/Psychotoxical/psysonic/pull/106))*. Both are selectable in Settings β†’ Appearance as **Russian** and **Russian 2**. Since the maintainer neither speaks nor reads Russian, **community feedback is essential here** β€” please vote on the [Discord](https://discord.gg/ckVPGPMS) or via GitHub which translation feels more natural so we can retire the weaker one in a future release. - **Clickable Mainstage section headers** β€” "Zuletzt hinzugefΓΌgt", "Entdecken", "KΓΌnstler entdecken", and "PersΓΆnliche Favoriten" now navigate to their respective pages on click, with a `ChevronRight` indicator and accent-color hover effect. ### Fixed - **macOS network playback** *(Issue [#108](https://github.com/Psychotoxical/psysonic/issues/108))*: Added `com.apple.security.network.client` to `Entitlements.plist` and disabled the app sandbox for unsigned/ad-hoc builds. Without this, macOS silently blocked outbound TCP connections from the Rust audio engine, causing the player to skip through every track without playing anything. - **Auto-updater** *(under observation)*: Fixed an incorrect signature in the auto-generated `latest.json` β€” the CI was writing the public key as the signature value. The updater now receives a correctly signed manifest. **Note:** Due to OS-level restrictions on macOS (Gatekeeper) and Windows (SmartScreen) for unsigned apps, it is not yet certain whether the in-app updater will reliably work on these platforms. Manual installation from the Releases page remains the safe fallback. ### Changed - All new i18n keys added to all 8 languages (EN, DE, FR, NL, ZH, NB, RU, RU2). ## [1.33.0] - 2026-04-06 ### Added - **Norwegian (BokmΓ₯l) translation** *(PR [#101](https://github.com/Psychotoxical/psysonic/pull/101) by [@zz5zz](https://github.com/zz5zz))*: Psysonic is now fully translated into Norwegian BokmΓ₯l β€” selectable in Settings β†’ Appearance. - **Configurable next-track preload** *(Issue [#102](https://github.com/Psychotoxical/psysonic/issues/102))*: A new setting in Settings β†’ Playback controls when Psysonic starts buffering the next track. Three modes available: - **Balanced** (default) β€” begins buffering 30 s before the end of the current track (previous behaviour). - **Early** β€” begins buffering after just 5 s of playback, maximising reliability on slow connections. - **Custom** β€” set the exact threshold (5 – 120 s before the end) via a slider. - **Tray icon visibility toggle**: A new toggle in Settings β†’ App Behavior lets you show or hide the system tray icon. When disabled, the icon is fully removed from the notification area / menu bar. ### Changed - **Fullscreen Player β€” complete redesign**: The Ambient Stage has been rebuilt from the ground up. - **Animated mesh background**: A GPU-only animated dark gradient mesh replaces the static blurred cover art background β€” smooth, performant, no layout repaints. - **Artist portrait**: The right half of the screen now shows the artist's image (loaded from the server), crossfading smoothly on every track change. Falls back to the album cover if no artist image is available. - **Bottom seekbar**: The seekbar is now pinned to the very bottom edge, spanning the full width, with elapsed and remaining timestamps above it. - **Heart button**: You can now star/unstar the currently playing track directly from the Fullscreen Player without leaving the view. - Removed the marquee-scrolling title in favour of a large, wrapping typographic layout. - **Star buttons** β€” all star/favourite buttons across the app (Player Bar, Album Header, Album Tracklist, Queue Panel) now use the CSS class `.is-starred` instead of inline color overrides, making them trivially themeable. ### Fixed - **macOS β€” HTTP audio streams**: Added `NSAppTransportSecurity` / `NSAllowsArbitraryLoads` to `Info.plist`. Without this, App Transport Security silently blocked HTTP radio streams and non-HTTPS Navidrome servers from loading audio in WKWebView on macOS. --- ## [1.32.0] - 2026-04-05 β€” *The Big Easter Update* 🐣 ### Added - **Custom Offline Storage Directory (#95)**: You can now specify a custom directory for the offline library in Settings β†’ Storage & Downloads. This is perfect for offloading your internal drive to an SD card or external HDD. - **Robust Volume Handling**: The app now automatically detects if a configured external storage medium is missing and provides a clear "Volume not found" notification instead of failing silently or attempting to download to a non-existent path. - **Internet Radio β€” full release**: The Radio page is now accessible from the sidebar. Complete UI rewrite to a card-based layout (cover art, name, edit/homepage buttons) consistent with the Playlists look. Covers can be uploaded or removed via a hover menu directly on the card. - **Internet Radio β€” Edit Modal**: A dedicated modal lets you change station name, stream URL, and homepage URL, and upload or remove cover art. - **Internet Radio β€” Radio Browser directory** *(via [radio-browser.info](https://www.radio-browser.info))*: Discover new stations directly inside Psysonic. Top stations by vote are shown as suggestions; a debounced search finds stations by name. Favicon images can be imported as cover art in one click. - **Settings β€” Backup & Restore**: Export all your settings (servers, theme, font, keybindings, EQ preset, sidebar order) to a single JSON file and import them on another machine or after a reinstall. Available in Settings β†’ Storage. - **Albums β€” Year Range Filter**: A From/To year input now appears in the Albums toolbar alongside the existing genre filter. Filtering by year and by genre can be combined; clearing both inputs returns to the default view. - **Statistics β€” Library Insights** *(requested via [#88](https://github.com/Psychotoxical/psysonic/issues/88))*: - **Total Playtime** card: computed in the background by paginating your full album list (up to 5 000 albums). Shows `β‰₯ Xh Ym` if the library is larger. - **Genre Insights**: Top 10 genres ranked by song count with proportional progress bars. - **Format Distribution**: Codec breakdown from a random 500-track sample β€” shows format name and percentage. - **Playlist Detail β€” Cover Upload**: Change or remove a playlist's cover image via the hover menu that appears on the hero artwork β€” no external tool needed. - **Tracklist columns β€” Playlists & Favorites** *(work in progress)*: PlaylistDetail and Favorites now support the same resizable, configurable column system introduced in v1.31.0 for Album tracklists. Column widths and visibility are persisted independently per page. The feature is still being refined. ### Changed - **Crossfade β€” fine-grained control**: The crossfade duration slider now ranges from 0.1 s to 10 s in 0.1 s steps (previously 1 s minimum, 0.5 s steps). The current value is shown with one decimal place. - **Settings β€” Storage tab redesign**: The "Offline Library" section now has a short description and includes Cache settings. The "Downloads" section is now labelled "ZIP Export & Archiving". Both sections have been visually consolidated. - **Artists page β€” Load More button** *(reported via [#90](https://github.com/Psychotoxical/psysonic/issues/90))*: The button is now styled as `btn-primary` with a `ChevronDown` icon and proper spacing. Previously it was an unstyled ghost button with no visual affordance. - **Tracklist layout consistency**: The Play-button column is now uniformly 60 px and the title column uses `minmax(150px, 1fr)` across all list views β€” Search Results, Artist Detail, Random Mix, and Advanced Search now match the Album tracklist layout. - **Internet Radio β€” HTML5 playback**: Radio now streams via the browser's native `