# 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.14.0] - 2026-03-22 ### Critical Fixes - **Prebuffer Flood — 300 simultaneous downloads eliminated**: The audio engine was spawning up to 300 concurrent HTTP download requests during prebuffering, causing network saturation of ~200 Mbit/s and significant CPU load. The root cause was unbounded parallel preload logic in the Rust engine. Fixed: the engine now buffers intelligently with a single controlled preload per track. Network usage dropped to under 100 kbit/s during normal playback. - **Gapless Playback — fully stable**: Gapless transitions now work correctly end-to-end. Previously, edge cases in the sample-accurate handoff between tracks caused audio glitches or silence between songs. - **Crossfade — fully stable**: The equal-power crossfade (sin/cos envelope) is now reliable across all track transitions. Previous instability was caused by race conditions in the fade-out trigger and Sink lifecycle management. - **Now Playing Page — performance**: The Now Playing page no longer causes sustained CPU spikes. Heavy re-renders triggered by frequent `audio:progress` events (previously every 500 ms with wall-clock drift) are resolved — progress is now driven by an atomic sample counter at 100 ms intervals with no layout thrashing. ### Fixed - **Volume — Clipping at 100%**: Audible distortion at maximum volume eliminated. A `MASTER_HEADROOM` constant of −1 dB (`0.891`) is now applied to all volume calculations, preventing inter-sample peaks from 0 dBFS masters and EQ biquad ripple from clipping. - **Seek — Display Desync**: Seeking while paused could cause the time display to jump to the new position while audio continued from the old one. `CountingSource::try_seek` now only resets the sample counter after confirming the seek succeeded. - **Gapless + Crossfade — Mutual Exclusion**: Both modes can no longer be active simultaneously. Enabling one auto-disables the other (Queue toolbar + Settings). Running both simultaneously caused a glitch where Song 2, gapless-chained inside the Sink, would play at full volume after Song 1's crossfade completed. - **Now Playing — About the Artist**: The "About the Artist" card is now hidden when no biography is available. Artist images that fail to load are silently hidden instead of showing a broken image placeholder. ### Added - **Waveform — Hover Tooltip**: Hovering over the waveform seekbar shows a floating time label above the cursor. Hidden when no track is loaded or the cursor leaves. - **Hero & Album Detail — Format Badge**: Audio format (FLAC, MP3, OGG, …) now shown alongside Year, Genre, and Track Count in the hero meta row on the Home page and in the Album Detail header. - **Help — FLAC Seeking**: New FAQ entry explaining that FLAC files without an embedded SEEKTABLE cannot be seeked, with instructions for adding one via `flac` or `metaflac`. ### Changed - **Queue — Tech Info**: Codec/bitrate badge moved from the frosted-glass cover overlay into the top-right corner of the meta box. Album artwork is no longer obscured. --- ## [1.13.0] - 2026-03-22 ### Added - **SVG Logo**: The Psysonic wordmark is now an inline SVG with a theme-adaptive gradient (`--accent` → `--ctp-blue`), matching the app's visual identity across all 47 themes. The collapsed sidebar shows a standalone P-icon with the same gradient. - **Player Bar — Marquee**: Song title and artist name scroll smoothly when the text overflows the fixed-width track info area, pause briefly, then jump back and repeat. - **Player Bar — Volume Tooltip**: A floating percentage label appears above the volume slider on hover and updates live while dragging. ### Changed - **Sidebar — Collapse button**: Moved from the brand header to a small circular hover-tab on the right edge of the sidebar. Hidden until you hover over the sidebar, keeping the logo area uncluttered. - **Player Bar — Layout**: Track info area is now a fixed 320 px width. Waveform section has increased margins on both sides for better visual separation between controls, waveform, and volume. - **Settings**: Server tab is now the default when opening Settings. - **Crossfade**: Experimental badge removed — considered stable. - **Help page**: Added entries for Lyrics, Configurable Keybindings, and Font Picker. Theme count corrected to 47 themes across 7 groups. ### Fixed - **Global shortcuts — double-fire**: Pressing a global shortcut (e.g. `Ctrl+Alt+→`) was triggering the action twice. Root cause: `on_shortcut()` in `tauri_plugin_global_shortcut` accumulates handlers per shortcut across JS HMR reloads. Fixed with a Rust-side `ShortcutMap` state that makes `register_global_shortcut` idempotent. - **W98 theme**: Comprehensive contrast fixes across all interactive elements — hover states, buttons, queue items, settings panels, and toggles now use silver-grey (`#e0e0e0`) text on navy (`#000080`) backgrounds. - **Help page**: Removed orphaned translation key that was rendering as raw text under the Playback section. ### Beta - **Global Shortcuts** (Settings → Global Shortcuts): System-wide keyboard shortcuts that trigger playback actions while Psysonic is in the background. Functional on all platforms, but edge cases with certain key combinations or OS-level conflicts may still occur. --- ## [1.12.0] - 2026-03-22 ### Added - **Synchronized Lyrics**: Lyrics pane integrated into the Queue sidebar, powered by [LRCLIB](https://lrclib.net) — no API key required. Shows time-synced lyrics with auto-scroll and active-line highlighting; falls back to plain text when synced lyrics are unavailable. Access via the microphone icon in the player bar, fullscreen player, or Now Playing page. #### 15 New Themes **Games** (new group — 6 themes): - **Ascalon**: Dark stone fantasy inspired by Guild Wars 1. Near-black base, gold accent (`#d4af37`). - **Azerothian Gold**: World of Warcraft inspired. Charcoal base, warm gold accent (`#c19e67`). - **Grand Theft Audio**: GTA-inspired night city aesthetic. Pure black base, green accent (`#57b05a`). - **Lambda 17**: Half-Life inspired. Deep blue-black base, amber accent (`#ff9d00`). - **NightCity 2077**: Cyberpunk 2077 inspired. Near-total black base, neon yellow accent (`#FCEE0A`). - **V-Tactical**: Battlefield inspired. Gunmetal base, burnt orange accent (`#ff8a00`). **Series** (new group — 3 themes): - **A Theme of Ice and Fire**: Game of Thrones inspired. Cold dark navy base, ice blue accent (`#70a1ff`). - **D'oh-matic**: The Simpsons inspired. Cream/yellow light base, blue accent (`#1F75FE`). - **Heisenberg**: Breaking Bad inspired. Dark desaturated green base, crystal blue accent (`#3fe0ff`). **Movies** (2 additions): - **Imperial Sith**: Star Wars dark side. Pure black base, red accent (`#e60000`). - **Order of the Phoenix**: Harry Potter inspired. Deep charcoal base, ember-orange accent (`#e63900`). **Operating Systems** (1 addition): - **W98**: Windows 98 teal desktop aesthetic. Classic teal background, silver card, navy accent (`#000080`). ### Changed - **Last.fm integration**: Promoted out of beta — scrobbling, Now Playing, love/unlove, Similar Artists, and top stats are considered stable. - **Crossfade**: No longer marked experimental. Stable on Windows and Linux; macOS under observation. - **Gapless playback**: Experimental badge removed — considered stable. - **Theme picker — groups reorganised**: Catppuccin, Nord, and Retro (Gruvbox) merged into a single **Open Source Classics** group. Streaming themes (Spotless, DZR, Cupertino Beats) moved into **Psysonic Themes — Mediaplayer**. The app now ships **47 themes** across **7 groups**. - **Tokyo Night themes removed**: `tokyo-night`, `tokyo-night-storm`, and `tokyo-night-light` retired to make room for the new groups. - **Settings — tab order**: Reordered to Server → Appearance → Playback → Library → Shortcuts → About. - **Settings — Theme picker**: "Betriebssysteme" group renamed to "Operating Systems". ### Fixed - **Text selection on double-click**: Double-clicking song titles or anywhere in the UI no longer accidentally selects text. `user-select: none` applied globally; re-enabled for bio/description text areas. - **Middle Earth theme — star buttons**: Active favourite star in the album tracklist and album header was barely visible (gold on parchment, ~1.4:1 contrast). Both active and inactive states now use darker brown tones with proper contrast. - **Middle Earth theme — play button hover**: Hovering the primary play/pause button no longer makes the icon invisible (gold icon on gold background). ## [1.11.0] - 2026-03-22 ### Added #### Five New Themes — Movies - **Middle Earth**: Warm parchment light theme. Cream/beige background, dark ebony player and sidebar, gold accent (`#d4af37`). Georgia serif for track names, subtle noise texture. - **Morpheus**: Pure black terminal aesthetic inspired by The Matrix. Phosphor green accent (`#00ff41`), monospace font. - **Pandora**: Deep bioluminescent navy inspired by Avatar. Cyan accent (`#00f2ff`), large radii, glow effects. - **Stark HUD**: Near-black tactical HUD inspired by Iron Man. Cyan accent, JetBrains Mono, uppercase track name. - **Blade**: Deep black with blood-red accent (`#b30000`). Sharp radii, uppercase track name. - All five themes in a new **Movies** group in the theme picker. ### Changed - **Settings — tab order**: Reordered to Server → Appearance → Playback → Library → Shortcuts → About. - **Settings — Appearance**: Language selector moved to the top of the tab, above Theme and Font. - **Settings — Theme picker**: "Betriebssysteme" group renamed to "Operating Systems". - **Default font**: Changed from Inter to **Lexend** for new installations. - **Gapless playback**: Experimental badge removed — gapless is now considered stable. - **Now Playing — background**: Ken Burns animation (40 s, subtle scale + translate). Background blur increased to eliminate JPEG block artefacts at high blur values. - **Now Playing — Similar Artists**: Tag cloud redesigned into 2 rows with varied font sizes and vertical offsets for a natural look. - **Statistics**: "Now Playing" indicator rendered as a styled badge matching the app's badge style. ## [1.10.0] - 2026-03-22 ### Added #### Three New Themes (Streaming Series) - **Spotless**: Flat dark theme inspired by modern music streaming. Pitch-black sidebar (`#000000`), dark-grey app background (`#121212`), Spotify-green accent (`#1ED760`). White play button, green hover on primary actions. - **DZR**: Flat light theme inspired by Deezer's modern redesign. White base, light-grey sidebar (`#F5F5F7`), purple accent (`#A238FF`). Crisp typography, large rounded radii. - **Cupertino Beats**: Apple Music-inspired dark theme. Near-black base (`#1c1c1e`), frosted-glass sidebar and player bar with heavy `backdrop-filter`, red accent (`#fa243c`). Active nav links styled with `accent-dim` background. - All three themes added to the **Psysonic Themes — Mediaplayer** group in the theme picker. ### Fixed - **Favourite/Unfavourite toggle**: Right-clicking a song, album, or artist that is already starred now shows "Remove from Favourites" and calls `unstar()` correctly. Previously always showed "Add to Favourites" regardless of starred state. - `Track` interface gained `starred?: string` — propagated via `songToTrack()` and all inline track-object construction sites. - `starredOverrides: Record` added to `playerStore` — updated immediately on star/unstar so the context menu and tracklist star icons reflect changes without a page reload. - **Home page — Artist Discovery**: Replaced card grid (which loaded artist images and caused performance issues) with lightweight pill-buttons — same `artist-ext-link` style as the "Similar Artists" section on artist pages. No image loading, instant render. - **Now Playing page**: Queue sidebar is no longer automatically hidden when entering the Now Playing page. It now behaves like all other pages and respects the user's current queue visibility setting. - **Random Mix filter panel**: Background now correctly uses `--bg-card` instead of the undefined `--bg-elevated` token, which caused the panel to render transparent in most themes. ### Changed - **Home page layout**: Section order is now: Recently Added → Discover → Artist Discovery → Starred → Most Played. ## [1.9.0] - 2026-03-21 ### Added #### Three New Themes - **Neon Drift**: Deep midnight-blue background (`#12132c`) with electric cyan accent (`#00f2ff`) — subtle synthwave/cyberpunk aesthetic. Glowing player track name, cyan-glow nav active state, neon-lit primary buttons, glowing range slider thumb. - **Cupertino Light**: macOS Ventura-inspired light theme. Clean white base, Apple-grey sidebar (`#f2f2f7`), Apple blue accent (`#0071e3`). Frosted-glass sidebar and player bar with `backdrop-filter: blur`. Solid blue pill nav active (white text, no left border). - **Cupertino Dark**: macOS Ventura-inspired dark theme. Space Grey base (`#1e1e1f`), dark frosted sidebar, vibrant blue accent (`#007aff`). Same pill nav active as Cupertino Light. Solid blue Play/Pause button with glow. #### New Theme Group: Betriebssysteme - OS-aesthetic themes are now consolidated into one group: **Cupertino Light**, **Cupertino Dark**, **Aero Glass**, **Luna Teal**. - **Psysonic Themes** and **Psysonic Themes — Mediaplayer** moved to the top of the theme picker. #### Configurable Keybindings - New `keybindingsStore` with 10 bindable actions: Play/Pause, Next, Previous, Volume Up/Down, Seek ±10 s, Toggle Queue, Fullscreen Player, Native Fullscreen. - Rebind any action in **Settings → Keybindings** — click the key badge, press any key, saved immediately to `localStorage`. - Defaults: `Space` = Play/Pause, `F11` = Native Fullscreen. All other actions unbound by default. #### Font Picker - 10 UI fonts selectable in **Settings → Appearance**: Inter, Outfit, DM Sans, Nunito, Rubik, Space Grotesk, Figtree, Manrope, Plus Jakarta Sans, Lexend. - Persisted in `localStorage` (`psysonic_font`), applied via `data-font` attribute on ``. #### Home Page — Instant Play - **Album cards**: "Details" button replaced with a **Play** button — clicking plays the album immediately with a smooth 700 ms fade-out of the current track. - **Hero**: "Play Album" button now starts playback directly (with fade-out) instead of navigating to the album detail page. - Fade-out implemented via `playAlbum.ts` utility: fades volume to 0 over 700 ms, restores volume in the store (no Rust side-effect) before handing off to `playTrack`. #### Now Playing Page — Layout & Readability - **3-column hero layout**: album cover + info (left, `flex: 1`) — EQ bars (centre, fixed width) — tag cloud (right, `flex: 1`). EQ bars are now truly centred regardless of content length on either side. - **Background**: increased brightness from `0.25` to `0.55`, reduced overlay opacity from `0.55` to `0.38` — background art is now visible instead of near-black. - **Text contrast**: track times, card links (artist/album), and section title opacity all increased for better readability on the blurred background. ### Changed #### Theme Renames — Trademark-Safe Names All media-player and OS-themed theme IDs and labels have been renamed to avoid potential trademark conflicts: | Old Name | New Name | |---|---| | Classic Winamp | WnAmp | | Musicmatch Jukebox | Navy Jukebox | | WMP8 Classic | Cobalt Media | | PowerDVD Classic | Onyx Cinema | | Win7 Aero | Aero Glass | | WinXP Luna | Luna Teal | > **Note**: If you had one of these themes selected, your preference will reset to Mocha on first launch. Re-select your preferred theme in Settings. ### Fixed - **Linux — ALSA underruns**: `PIPEWIRE_LATENCY` (`4096/48000` ≈ 85 ms) and `PULSE_LATENCY_MSEC` (`85`) are now set before audio stream creation, reducing the frequency of ALSA `snd_pcm_recover` underrun events on PipeWire systems. Existing user-set values are respected. --- ## [1.8.0] - 2026-03-21 ### Added #### Three New Themes - **Poison**: Dark charcoal background (`#1a1a1a`) with phosphor green (`#1bd655`) accent — high-contrast, industrial aesthetic. LCD glow text-shadow on the now-playing track name. - **Nucleo**: Warm brass/cream light theme inspired by vintage hi-fi equipment. Warm white cards, gold/amber accents, brushed-metal bevel buttons, and a warm LCD glow on the player track name. `color-scheme: light`. - **Classic Winamp**: Cool gray-blue dark theme (`#2b2b3a`) channelling the classic Winamp 2.x skin. Yellow primary accent (`#d4cc46`), orange volume slider override (`--volume-accent: #de9b35`), Courier New monospace font with bright-green LCD glow for the track name. #### Psychowave Theme — Major Overhaul - Psychowave recoloured from loud neon pink/purple to a refined deep violet palette: background `#161428`, accent `#a06ae0`. All neon colours replaced with muted, tasteful variants. No longer marked as WIP. #### ThemePicker Redesign - Themes reorganised into semantic groups: **Catppuccin**, **Nord**, **Retro** (formerly Gruvbox), **Tokyo Night**, and a new **Psysonic Themes** section (Classic Winamp, Poison, Nucleo, Psychowave). The separate *Experimental* group is removed. - "Gruvbox" renamed to **Retro**. #### Image Lightbox - Clicking the **album cover** on an Album Detail page or the **artist avatar** on an Artist Detail page opens a full-screen lightbox showing the high-resolution image (up to 2000 px). Click outside or press Escape to close. - Both use a shared `CoverLightbox` component — consistent behaviour across the app. #### Queue Toolbar — Complete Redesign - The queue panel now has a **centred icon toolbar** with round buttons (border-radius 50%, solid accent fill when active): - **Shuffle** — Fisher-Yates shuffle, keeps current track at position 0 - **Save** — save queue as playlist - **Load** — load a playlist into the queue - **Clear** — remove all tracks from the queue - **Gapless** (∞ icon) — toggle gapless playback on/off - **Crossfade** (≋ icon) — toggle crossfade on/off; when inactive, clicking enables crossfade *and* opens a popover slider - **Crossfade popover**: a small overlay below the Crossfade button with a range slider (1–10 s) to configure the fade duration. Clicking the active Crossfade button disables crossfade and closes the popover. Closes on outside click. - **Queue header**: title enlarged to 16 px/700, track count and total duration shown inline next to the title in accent colour. Close (×) button removed. - **Tech info overlay**: codec and bitrate displayed as a frosted glass badge (`backdrop-filter: blur(4px)`) overlaid on the bottom edge of the cover art image. #### French & Dutch Translations - Full UI translation added for **French** (`fr`) and **Dutch** (`nl`) — all namespaces covered. - Language selector in Settings now lists all four languages sorted alphabetically (Dutch, English, French, German). #### Help Page — Layout & Content Update - **2-column grid layout** for the accordion — makes better use of horizontal space on widescreen displays. - New Q&A entry: **Crossfade & Gapless** (Playback section) — explains what each feature does, how to enable them, and their experimental status. - Updated entries: Themes (reflects all 21 themes), Languages (4 languages), Scrobbling (direct Last.fm), System browser links, Linux distribution (no AppImage). #### Settings — Experimental Labels - Crossfade and Gapless toggles in Settings → Playback now show an **"Experimental"** badge next to their label. ### Fixed - **Now Playing dropdown — refresh button**: The refresh icon spin was applied to the entire button, blocking clicks during the animation. Spin state is now separate from the background poll loading state — the button is always clickable, and the icon spins for a minimum of 600 ms for clear visual feedback. - **Crossfade popover positioning**: Popover was overflowing the right edge of the viewport. Now right-aligned relative to the Crossfade button and positioned below it. --- ## [1.7.2] - 2026-03-20 ### Fixed - **Last.fm**: Stability improvements for the authentication flow and session handling. - **Settings**: Minor display fixes in the Last.fm profile badge. --- ## [1.7.1] - 2026-03-20 ### Fixed - **Build**: TypeScript errors in Settings.tsx and Statistics.tsx that broke the release build. --- ## [1.7.0] - 2026-03-20 ### Added #### Last.fm Integration *(Beta)* - **Direct Last.fm scrobbling**: Tracks are scrobbled directly via the Last.fm API at 50% playback — no longer routed through Navidrome. Configure in Settings → Server with your Last.fm username and password. - **Now Playing updates**: Last.fm receives the currently playing track in real time. - **Love / Unlove**: Heart button in the Now Playing page and player bar syncs the loved state with Last.fm instantly. - **Last.fm profile badge** in Settings → Server: shows your scrobble count and member since year once connected. - ⚠️ **This feature is in beta.** Session management and edge cases are still being refined. #### Similar Artists - Artist detail pages now show a **Similar Artists** section below Top Tracks, sourced from Last.fm and filtered to artists actually present in your library. Shown as chip buttons — click to navigate directly to that artist's page. - Requires Last.fm to be configured. Hidden when Last.fm is not connected or no library matches are found. #### Statistics — Last.fm Stats - New **Last.fm Stats** section on the Statistics page (requires Last.fm): top artists, albums, and tracks with proportional play-count bars. - **Period filter**: switch between Last 7 Days, 1 Month, 3 Months, 6 Months, 12 Months, and Overall. - **Recent Scrobbles**: last 20 scrobbled tracks with relative timestamps and a "Now Playing" badge for the currently active entry. - **Genre Distribution removed**: replaced by the Last.fm stats sections. #### Psychowave Theme *(Work in Progress)* - New **Psychowave** theme: a deep purple/violet dark theme inspired by synthwave and retrowave aesthetics. - ⚠️ **Still in active development** — colors and details will continue to be refined in upcoming releases. #### Tooltip System — TooltipPortal - All tooltips now use a **React portal** rendered into `document.body` at `z-index: 99999`. Replaces the previous CSS `::after` pseudo-element system. - Fixes tooltip clipping inside `overflow: hidden` containers (player bar, queue panel, EQ). - Fixes black OS-native tooltip boxes that appeared on native `title=` attributes — all converted to `data-tooltip`. - Smart edge detection: tooltip flips position automatically when it would overflow the viewport. #### Custom Select Dropdowns - **Theme**, **Language**, and **EQ preset** selectors are now rendered as styled portal dropdowns — no more unstyled native `