Skip to content

Releases: Psychotoxical/psysonic

Psysonic v1.45.0

05 May 07:49

Choose a tag to compare

Added

Themes — Kanagawa, Atom One and 1984 Palettes

By @Psychotoxical, PR #390

Open Source Classics gains three new theme families: Kanagawa, Atom One and 1984, adding nine new themes in total.

  • Kanagawa: Wave, Dragon and Lotus
  • Atom One: Dark and Light
  • 1984: Default, Cyberpunk, Light and Orwell

Each theme defines the full token set, including background, accent, text, Catppuccin compatibility, waveform, status and select-arrow tokens. This lets login, queue sidebar and subpages inherit the palette cleanly without component-specific overrides.

The theme picker now groups Open Source Classics by family with dedicated family headings. Theme scheduler dropdown labels are also family-prefixed, making it clearer which palette family a scheduled theme belongs to.

Audio Preview — Rust Preview Engine and Tracklist Rollout

By @Psychotoxical, PRs #392, #394

Psysonic now has a native Rust-powered preview engine for tracklist previews. Instead of using a separate HTML5 audio path, previews run through a parallel rodio sink on the existing output stream, with dedicated Tauri commands and engine events for preview start, progress and end.

When a preview starts, the main player pauses and only resumes automatically if it was playing beforehand. Starting normal playback, radio playback, resume or stop actions cancels any active preview first, so preview audio and main playback cannot overlap.

The new preview UI is rolled out across the main tracklist surfaces:

  • Albums
  • Playlist detail including suggestions
  • Favorites
  • Artist detail top tracks
  • Random Mix genre and filtered-song lists

Track numbers now stay stable on hover, while dedicated inline Play and Preview buttons handle playback actions from the title cell. Active playing rows keep the equalizer bars, including on hover; active paused rows fall back to a static accent-colored track number. SongRow is intentionally left untouched in this pass.

Settings → Audio now includes a preview section with a master toggle, configurable start position, configurable duration and per-location toggles. Users can keep previews enabled on discovery-heavy surfaces while hiding them on owned-content views. The preview progress ring follows the configured duration automatically.

Preview state is mirrored through a new previewStore, giving the UI one reliable source of truth for preview progress, active state and the currently previewing track metadata.

While a preview is playing, the player bar mirrors the previewed track with cover, title, artist, a dedicated Preview label and an accent top border. Actions that would otherwise target the queued track, such as rating, fullscreen hint and album/artist links, are suppressed during preview playback.

The main play button also reflects preview state with a stop-style preview control and progress ring. Its behavior matches the inline preview buttons: stopping the preview resumes the main player only if it was already playing before. The smaller Stop button uses silent preview stop semantics, cancelling the preview and leaving the main player paused so Stop always means silence.

Spacebar stops an active preview, media keys are ignored during previews, and tray actions cancel the preview before continuing with the requested player action.

Play Next in the context menu now uses a double-chevron icon, making it visually distinct from the Preview button.

The feature includes updated i18n coverage across all supported locales, including the new player-bar preview labels.

Tray — Now Playing Tooltip and Localized Menu Labels

By @Psychotoxical, PR #395, closes #383

The system tray now reflects the current playback state more clearly. On Windows and macOS, the tray tooltip shows the currently playing track as Artist – Title on play, pause and track changes, falling back to Psysonic when nothing is playing.

On Linux, where AppIndicator does not expose a hover-tooltip API, the same now-playing text is shown as a disabled entry at the top of the tray menu instead.

Tray menu labels are now localized across all supported languages, including Play/Pause, Next/Previous, Show/Hide, Exit and the Linux-only empty-state label. The frontend updates the tray labels on startup and whenever the app language changes, without rebuilding the tray icon.

Sidebar Discovery Indicators

By @cucadmuh, PR #397

Sidebar navigation now includes a dedicated unread indicator for New Releases, with persistence per server/library scope and delayed mark-as-seen behavior after opening the New Releases page.

Albums added within the last 48 hours now receive a localized New badge in both album cards and album detail header.

Adaptive Header Controls

By @cucadmuh, PR #397

The top header behavior was reworked for narrow widths: search, Live and Orbit controls now compress in a deterministic order with improved stability in edge-width ranges.

Waveform Wheel Seeking

By @cucadmuh, PR #397

Waveform mouse-wheel seeking now uses fixed step-based jumps with debounce smoothing for more predictable navigation and less jitter during rapid scrolling.

Queue Panel — Position Counter, Tri-State Duration Toggle, Collapsible Now Playing, EQ Indicator

By @kveld9, PR #419

The queue panel got a sweep of UX refinements. The header now shows the current position as (N/M) next to the queue title for at-a-glance context.

The clickable duration label in the header rotates through three modes per click instead of two: total queue time, remaining time, and estimated end-of-queue clock time (e.g. · 02:10). ETA updates every 30 seconds, is formatted in the user's locale, and is visually highlighted with the accent colour while playing.

A new chevron next to the queue title collapses the Now Playing section and queue toolbar, and the collapsed state is persisted across restarts, so users who treat the queue as a pure list can keep it that way.

The currently playing row in the queue list is now indicated by animated equalizer bars to the left of the track title; the bars freeze in place when playback is paused. The previous small play icon next to the title is removed since the EQ bars carry the same signal more clearly.

Queue — Drag Outside to Remove

By @cucadmuh, PR #420

You can remove a track from the play queue by dragging its row outside the queue sidebar (main window) or outside the mini player’s queue list. Drop targets still support reordering when you release inside the queue area.

The drag ghost shows a trash affordance only while the cursor is outside the queue bounds; inside the queue it behaves as a normal reorder drag. The mouse-event psy-drop path now carries cursor coordinates so removal can be detected when the drop target is not the queue panel itself.

Statistics — Shareable Top-Albums Card

By @Psychotoxical, PR #425

Statistics page can now export your most-played albums as a shareable PNG, accessible via a share icon next to the Most Played Albums section header. Three aspect ratios for different platforms (Story 9:16, Square 1:1, Twitter Card 16:9), three grid sizes (3×3, 4×4, 5×5), with each cover carrying a thin info strip showing rank + play count.

The card pulls the wordmark and accent color directly from the active theme, so a Catppuccin export looks Catppuccin and a Nord export looks Nord. Cover art reuses the existing IndexedDB cache, so no extra Subsonic round-trips on repeat exports. The header label is hardcoded English ("Top Albums") so a shared image stays legible to followers regardless of their language.

Saving uses the native OS save dialog — no silent dump into Downloads, the user picks the path each time. Data source is local-only (Subsonic getAlbumList(frequent)); Last.fm is intentionally not used. There is no time-window selector because Navidrome's API exposes only cumulative play counts, not per-event play history.

Shortcuts — Action Registry, Dynamic CLI Help, New Input Targets

By @cucadmuh, PR #435

Shortcut, keyboard, global-hotkey, mini-window and CLI inputs are now all routed through one TypeScript action registry — a single source of truth for what an action does, how it's labelled, and which input transports can fire it. CLI --player help is generated dynamically from the registry, so command coverage stays in sync with the action set automatically.

Nine new input actions were added (requested by zunoz on Discord): start search, start advanced search, toggle sidebar, mute, open / toggle equalizer, toggle repeat, open Now Playing, show lyrics, favorite current track. Help is bound to F1 by default and hidden from the Settings input list; existing users get the F1 binding back-filled into their persisted keybindings on next launch.

Translations for the new ...

Read more

Psysonic v1.45.0-rc.5

04 May 18:12

Choose a tag to compare

Psysonic v1.45.0-rc.5 Pre-release
Pre-release

Added

Themes — Kanagawa, Atom One and 1984 Palettes

By @Psychotoxical, PR #390

Open Source Classics gains three new theme families: Kanagawa, Atom One and 1984, adding nine new themes in total.

  • Kanagawa: Wave, Dragon and Lotus
  • Atom One: Dark and Light
  • 1984: Default, Cyberpunk, Light and Orwell

Each theme defines the full token set, including background, accent, text, Catppuccin compatibility, waveform, status and select-arrow tokens. This lets login, queue sidebar and subpages inherit the palette cleanly without component-specific overrides.

The theme picker now groups Open Source Classics by family with dedicated family headings. Theme scheduler dropdown labels are also family-prefixed, making it clearer which palette family a scheduled theme belongs to.

Audio Preview — Rust Preview Engine and Tracklist Rollout

By @Psychotoxical, PRs #392, #394

Psysonic now has a native Rust-powered preview engine for tracklist previews. Instead of using a separate HTML5 audio path, previews run through a parallel rodio sink on the existing output stream, with dedicated Tauri commands and engine events for preview start, progress and end.

When a preview starts, the main player pauses and only resumes automatically if it was playing beforehand. Starting normal playback, radio playback, resume or stop actions cancels any active preview first, so preview audio and main playback cannot overlap.

The new preview UI is rolled out across the main tracklist surfaces:

  • Albums
  • Playlist detail including suggestions
  • Favorites
  • Artist detail top tracks
  • Random Mix genre and filtered-song lists

Track numbers now stay stable on hover, while dedicated inline Play and Preview buttons handle playback actions from the title cell. Active playing rows keep the equalizer bars, including on hover; active paused rows fall back to a static accent-colored track number. SongRow is intentionally left untouched in this pass.

Settings → Audio now includes a preview section with a master toggle, configurable start position, configurable duration and per-location toggles. Users can keep previews enabled on discovery-heavy surfaces while hiding them on owned-content views. The preview progress ring follows the configured duration automatically.

Preview state is mirrored through a new previewStore, giving the UI one reliable source of truth for preview progress, active state and the currently previewing track metadata.

While a preview is playing, the player bar mirrors the previewed track with cover, title, artist, a dedicated Preview label and an accent top border. Actions that would otherwise target the queued track, such as rating, fullscreen hint and album/artist links, are suppressed during preview playback.

The main play button also reflects preview state with a stop-style preview control and progress ring. Its behavior matches the inline preview buttons: stopping the preview resumes the main player only if it was already playing before. The smaller Stop button uses silent preview stop semantics, cancelling the preview and leaving the main player paused so Stop always means silence.

Spacebar stops an active preview, media keys are ignored during previews, and tray actions cancel the preview before continuing with the requested player action.

Play Next in the context menu now uses a double-chevron icon, making it visually distinct from the Preview button.

The feature includes updated i18n coverage across all supported locales, including the new player-bar preview labels.

Tray — Now Playing Tooltip and Localized Menu Labels

By @Psychotoxical, PR #395, closes #383

The system tray now reflects the current playback state more clearly. On Windows and macOS, the tray tooltip shows the currently playing track as Artist – Title on play, pause and track changes, falling back to Psysonic when nothing is playing.

On Linux, where AppIndicator does not expose a hover-tooltip API, the same now-playing text is shown as a disabled entry at the top of the tray menu instead.

Tray menu labels are now localized across all supported languages, including Play/Pause, Next/Previous, Show/Hide, Exit and the Linux-only empty-state label. The frontend updates the tray labels on startup and whenever the app language changes, without rebuilding the tray icon.

Sidebar Discovery Indicators

By @cucadmuh, PR #397

Sidebar navigation now includes a dedicated unread indicator for New Releases, with persistence per server/library scope and delayed mark-as-seen behavior after opening the New Releases page.

Albums added within the last 48 hours now receive a localized New badge in both album cards and album detail header.

Adaptive Header Controls

By @cucadmuh, PR #397

The top header behavior was reworked for narrow widths: search, Live and Orbit controls now compress in a deterministic order with improved stability in edge-width ranges.

Waveform Wheel Seeking

By @cucadmuh, PR #397

Waveform mouse-wheel seeking now uses fixed step-based jumps with debounce smoothing for more predictable navigation and less jitter during rapid scrolling.

Queue Panel — Position Counter, Tri-State Duration Toggle, Collapsible Now Playing, EQ Indicator

By @kveld9, PR #419

The queue panel got a sweep of UX refinements. The header now shows the current position as (N/M) next to the queue title for at-a-glance context.

The clickable duration label in the header rotates through three modes per click instead of two: total queue time, remaining time, and estimated end-of-queue clock time (e.g. · 02:10). ETA updates every 30 seconds, is formatted in the user's locale, and is visually highlighted with the accent colour while playing.

A new chevron next to the queue title collapses the Now Playing section and queue toolbar, and the collapsed state is persisted across restarts, so users who treat the queue as a pure list can keep it that way.

The currently playing row in the queue list is now indicated by animated equalizer bars to the left of the track title; the bars freeze in place when playback is paused. The previous small play icon next to the title is removed since the EQ bars carry the same signal more clearly.

Queue — Drag Outside to Remove

By @cucadmuh, PR #420

You can remove a track from the play queue by dragging its row outside the queue sidebar (main window) or outside the mini player’s queue list. Drop targets still support reordering when you release inside the queue area.

The drag ghost shows a trash affordance only while the cursor is outside the queue bounds; inside the queue it behaves as a normal reorder drag. The mouse-event psy-drop path now carries cursor coordinates so removal can be detected when the drop target is not the queue panel itself.

Statistics — Shareable Top-Albums Card

By @Psychotoxical, PR #425

Statistics page can now export your most-played albums as a shareable PNG, accessible via a share icon next to the Most Played Albums section header. Three aspect ratios for different platforms (Story 9:16, Square 1:1, Twitter Card 16:9), three grid sizes (3×3, 4×4, 5×5), with each cover carrying a thin info strip showing rank + play count.

The card pulls the wordmark and accent color directly from the active theme, so a Catppuccin export looks Catppuccin and a Nord export looks Nord. Cover art reuses the existing IndexedDB cache, so no extra Subsonic round-trips on repeat exports. The header label is hardcoded English ("Top Albums") so a shared image stays legible to followers regardless of their language.

Saving uses the native OS save dialog — no silent dump into Downloads, the user picks the path each time. Data source is local-only (Subsonic getAlbumList(frequent)); Last.fm is intentionally not used. There is no time-window selector because Navidrome's API exposes only cumulative play counts, not per-event play history.

Shortcuts — Action Registry, Dynamic CLI Help, New Input Targets

By @cucadmuh, PR #435

Shortcut, keyboard, global-hotkey, mini-window and CLI inputs are now all routed through one TypeScript action registry — a single source of truth for what an action does, how it's labelled, and which input transports can fire it. CLI --player help is generated dynamically from the registry, so command coverage stays in sync with the action set automatically.

Nine new input actions were added (requested by zunoz on Discord): start search, start advanced search, toggle sidebar, mute, open / toggle equalizer, toggle repeat, open Now Playing, show lyrics, favorite current track. Help is bound to F1 by default and hidden from the Settings input list; existing users get the F1 binding back-filled into their persisted keybindings on next launch.

Translations for the new ...

Read more

Psysonic v1.45.0-rc.4 Experiment

04 May 16:00

Choose a tag to compare

Pre-release

Added

  • Performance Probe (diagnostics) — Modal at Ctrl+Shift+D (sidebar logo is decorative only). Collapsible Phase 1/2 and an open-by-default Phase 3 for the toggles used most in profiling. Flags persist in localStorage, map to data-perf-* on the document root, and can disable targeted subsystems (shell/network hooks, mainstage sections, PlayerBar waveform only, live progress UI, rail artwork, and similar) to isolate WebKit/WebProcess CPU on Linux.
  • Approximate live CPU (Linux) — Tauri command reading /proc (including WebKit helper process names) for rough host CPU share during tuning.
  • Playback progress snapshot APIgetPlaybackProgressSnapshot / subscribePlaybackProgress so time, seekbars, and lyrics can update without writing every tick into the persisted player store.

Changed

  • audio:progress (Rust) — Throttled by minimum interval and position delta, with immediate emit on pause transitions, to reduce IPC during playback.
  • Player store timelinecurrentTime / progress / buffered updates to the persisted store are coarse-grained; live UI reads the snapshot channel instead.
  • WaveformSeek — Still one <canvas> with 2D fillRect bar drawing (same style functions as before; not pre-rendered image layers or drawImage compositing). Progress is fed from the snapshot channel; sparse backend ticks are bridged with prediction/smoothing and capped repaint cadence; animated preview ticks no longer stop solely because the window lost focus while still visible.
  • MPRIS position — Driven from the progress snapshot with conservative timing.

Fixed

  • Hero — Auto-advance respects visibility in the app scroll viewport, pauses when the window is blurred, and recovers after returning on-screen or on focus/visibility changes.
  • Home AlbumRow / SongRail — Artwork visibility budget uses real card geometry so covers fill the viewport without requiring an initial horizontal scroll nudge.
  • Server switch menu — Portaled with fixed coordinates so it stacks above the sidebar.
  • Linux / NixPSYSONIC_ALLOW_NATIVE_GDK skips the default GDK_BACKEND=x11 pin when using the gdk-session wrapper; tauri:dev no longer forces GDK_BACKEND over nix develop defaults.

Added

Audio Preview — Rust Preview Engine and Tracklist Rollout

By @Psychotoxical, PRs #392, #394

Psysonic now has a native Rust-powered preview engine for tracklist previews. Instead of using a separate HTML5 audio path, previews run through a parallel rodio sink on the existing output stream, with dedicated Tauri commands and engine events for preview start, progress and end.

When a preview starts, the main player pauses and only resumes automatically if it was playing beforehand. Starting normal playback, radio playback, resume or stop actions cancels any active preview first, so preview audio and main playback cannot overlap.

The new preview UI is rolled out across the main tracklist surfaces:

  • Albums
  • Playlist detail including suggestions
  • Favorites
  • Artist detail top tracks
  • Random Mix genre and filtered-song lists

Track numbers now stay stable on hover, while dedicated inline Play and Preview buttons handle playback actions from the title cell. Active playing rows keep the equalizer bars, including on hover; active paused rows fall back to a static accent-colored track number. SongRow is intentionally left untouched in this pass.

Settings → Audio now includes a preview section with a master toggle, configurable start position, configurable duration and per-location toggles. Users can keep previews enabled on discovery-heavy surfaces while hiding them on owned-content views. The preview progress ring follows the configured duration automatically.

Preview state is mirrored through a new previewStore, giving the UI one reliable source of truth for preview progress, active state and the currently previewing track metadata.

While a preview is playing, the player bar mirrors the previewed track with cover, title, artist, a dedicated Preview label and an accent top border. Actions that would otherwise target the queued track, such as rating, fullscreen hint and album/artist links, are suppressed during preview playback.

The main play button also reflects preview state with a stop-style preview control and progress ring. Its behavior matches the inline preview buttons: stopping the preview resumes the main player only if it was already playing before. The smaller Stop button uses silent preview stop semantics, cancelling the preview and leaving the main player paused so Stop always means silence.

Spacebar stops an active preview, media keys are ignored during previews, and tray actions cancel the preview before continuing with the requested player action.

Play Next in the context menu now uses a double-chevron icon, making it visually distinct from the Preview button.

The feature includes updated i18n coverage across all supported locales, including the new player-bar preview labels.

Tray — Now Playing Tooltip and Localized Menu Labels

By @Psychotoxical, PR #395, closes #383

The system tray now reflects the current playback state more clearly. On Windows and macOS, the tray tooltip shows the currently playing track as Artist – Title on play, pause and track changes, falling back to Psysonic when nothing is playing.

On Linux, where AppIndicator does not expose a hover-tooltip API, the same now-playing text is shown as a disabled entry at the top of the tray menu instead.

Tray menu labels are now localized across all supported languages, including Play/Pause, Next/Previous, Show/Hide, Exit and the Linux-only empty-state label. The frontend updates the tray labels on startup and whenever the app language changes, without rebuilding the tray icon.

Themes — Kanagawa, Atom One and 1984 Palettes

By @Psychotoxical, PR #390

Open Source Classics gains three new theme families: Kanagawa, Atom One and 1984, adding nine new themes in total.

  • Kanagawa: Wave, Dragon and Lotus
  • Atom One: Dark and Light
  • 1984: Default, Cyberpunk, Light and Orwell

Each theme defines the full token set, including background, accent, text, Catppuccin compatibility, waveform, status and select-arrow tokens. This lets login, queue sidebar and subpages inherit the palette cleanly without component-specific overrides.

The theme picker now groups Open Source Classics by family with dedicated family headings. Theme scheduler dropdown labels are also family-prefixed, making it clearer which palette family a scheduled theme belongs to.

Sidebar Discovery Indicators

By @cucadmuh, PR #397

Sidebar navigation now includes a dedicated unread indicator for New Releases, with persistence per server/library scope and delayed mark-as-seen behavior after opening the New Releases page.

Albums added within the last 48 hours now receive a localized New badge in both album cards and album detail header.

Adaptive Header Controls

By @cucadmuh, PR #397

The top header behavior was reworked for narrow widths: search, Live and Orbit controls now compress in a deterministic order with improved stability in edge-width ranges.

Waveform Wheel Seeking

By @cucadmuh, PR #397

Waveform mouse-wheel seeking now uses fixed step-based jumps with debounce smoothing for more predictable navigation and less jitter during rapid scrolling.

Queue — Drag Outside to Remove

By @cucadmuh, PR #420

You can remove a track from the play queue by dragging its row outside the queue sidebar (main window) or outside the mini player’s queue list. Drop targets still support reordering when you release inside the queue area.

The drag ghost shows a trash affordance only while the cursor is outside the queue bounds; inside the queue it behaves as a normal reorder drag. The mouse-event psy-drop path now carries cursor coordinates so removal can be detected when the drop target is not the queue panel itself.

Statistics — Shareable Top-Albums Card

By @Psychotoxical, PR #425

Statistics page can now export your most-played albums as a shareable PNG, accessible via a share icon next to the Most Played Albums section header. Three aspect ratios for different platforms (Story 9:16, Square 1:1, Twitter Card 16:9), three grid sizes (3×3, 4×4, 5×5), with each cover carrying a thin info strip showing rank + play count.

The card pulls the wordmark and accent color directly from the active theme, so a Catppuccin export looks Catppuccin and a Nord export looks Nord. Cover art reuses the existing IndexedDB cache, so no extra Subsonic round-trips on repeat exports. The header label is hardcoded English ("Top Albums") so a shared image stays legible to followers regardless of their language.

Saving uses the native OS save dialog — no silent dump into Downloads, the user picks the path each time. Data source is local-only (Subsonic getAlbumList(frequent)); Last.fm is inte...

Read more

Psysonic v1.45.0-rc.3

02 May 23:08

Choose a tag to compare

Psysonic v1.45.0-rc.3 Pre-release
Pre-release

Added

Audio Preview — Rust Preview Engine and Tracklist Rollout

By @Psychotoxical, PRs #392, #394

Psysonic now has a native Rust-powered preview engine for tracklist previews. Instead of using a separate HTML5 audio path, previews run through a parallel rodio sink on the existing output stream, with dedicated Tauri commands and engine events for preview start, progress and end.

When a preview starts, the main player pauses and only resumes automatically if it was playing beforehand. Starting normal playback, radio playback, resume or stop actions cancels any active preview first, so preview audio and main playback cannot overlap.

The new preview UI is rolled out across the main tracklist surfaces:

  • Albums
  • Playlist detail including suggestions
  • Favorites
  • Artist detail top tracks
  • Random Mix genre and filtered-song lists

Track numbers now stay stable on hover, while dedicated inline Play and Preview buttons handle playback actions from the title cell. Active playing rows keep the equalizer bars, including on hover; active paused rows fall back to a static accent-colored track number. SongRow is intentionally left untouched in this pass.

Settings → Audio now includes a preview section with a master toggle, configurable start position, configurable duration and per-location toggles. Users can keep previews enabled on discovery-heavy surfaces while hiding them on owned-content views. The preview progress ring follows the configured duration automatically.

Preview state is mirrored through a new previewStore, giving the UI one reliable source of truth for preview progress, active state and the currently previewing track metadata.

While a preview is playing, the player bar mirrors the previewed track with cover, title, artist, a dedicated Preview label and an accent top border. Actions that would otherwise target the queued track, such as rating, fullscreen hint and album/artist links, are suppressed during preview playback.

The main play button also reflects preview state with a stop-style preview control and progress ring. Its behavior matches the inline preview buttons: stopping the preview resumes the main player only if it was already playing before. The smaller Stop button uses silent preview stop semantics, cancelling the preview and leaving the main player paused so Stop always means silence.

Spacebar stops an active preview, media keys are ignored during previews, and tray actions cancel the preview before continuing with the requested player action.

Play Next in the context menu now uses a double-chevron icon, making it visually distinct from the Preview button.

The feature includes updated i18n coverage across all supported locales, including the new player-bar preview labels.

Tray — Now Playing Tooltip and Localized Menu Labels

By @Psychotoxical, PR #395, closes #383

The system tray now reflects the current playback state more clearly. On Windows and macOS, the tray tooltip shows the currently playing track as Artist – Title on play, pause and track changes, falling back to Psysonic when nothing is playing.

On Linux, where AppIndicator does not expose a hover-tooltip API, the same now-playing text is shown as a disabled entry at the top of the tray menu instead.

Tray menu labels are now localized across all supported languages, including Play/Pause, Next/Previous, Show/Hide, Exit and the Linux-only empty-state label. The frontend updates the tray labels on startup and whenever the app language changes, without rebuilding the tray icon.

Themes — Kanagawa, Atom One and 1984 Palettes

By @Psychotoxical, PR #390

Open Source Classics gains three new theme families: Kanagawa, Atom One and 1984, adding nine new themes in total.

  • Kanagawa: Wave, Dragon and Lotus
  • Atom One: Dark and Light
  • 1984: Default, Cyberpunk, Light and Orwell

Each theme defines the full token set, including background, accent, text, Catppuccin compatibility, waveform, status and select-arrow tokens. This lets login, queue sidebar and subpages inherit the palette cleanly without component-specific overrides.

The theme picker now groups Open Source Classics by family with dedicated family headings. Theme scheduler dropdown labels are also family-prefixed, making it clearer which palette family a scheduled theme belongs to.

Sidebar Discovery Indicators

By @cucadmuh, PR #397

Sidebar navigation now includes a dedicated unread indicator for New Releases, with persistence per server/library scope and delayed mark-as-seen behavior after opening the New Releases page.

Albums added within the last 48 hours now receive a localized New badge in both album cards and album detail header.

Adaptive Header Controls

By @cucadmuh, PR #397

The top header behavior was reworked for narrow widths: search, Live and Orbit controls now compress in a deterministic order with improved stability in edge-width ranges.

Waveform Wheel Seeking

By @cucadmuh, PR #397

Waveform mouse-wheel seeking now uses fixed step-based jumps with debounce smoothing for more predictable navigation and less jitter during rapid scrolling.

Queue — Drag Outside to Remove

By @cucadmuh, PR #420

You can remove a track from the play queue by dragging its row outside the queue sidebar (main window) or outside the mini player’s queue list. Drop targets still support reordering when you release inside the queue area.

The drag ghost shows a trash affordance only while the cursor is outside the queue bounds; inside the queue it behaves as a normal reorder drag. The mouse-event psy-drop path now carries cursor coordinates so removal can be detected when the drop target is not the queue panel itself.

Statistics — Shareable Top-Albums Card

By @Psychotoxical, PR #425

Statistics page can now export your most-played albums as a shareable PNG, accessible via a share icon next to the Most Played Albums section header. Three aspect ratios for different platforms (Story 9:16, Square 1:1, Twitter Card 16:9), three grid sizes (3×3, 4×4, 5×5), with each cover carrying a thin info strip showing rank + play count.

The card pulls the wordmark and accent color directly from the active theme, so a Catppuccin export looks Catppuccin and a Nord export looks Nord. Cover art reuses the existing IndexedDB cache, so no extra Subsonic round-trips on repeat exports. The header label is hardcoded English ("Top Albums") so a shared image stays legible to followers regardless of their language.

Saving uses the native OS save dialog — no silent dump into Downloads, the user picks the path each time. Data source is local-only (Subsonic getAlbumList(frequent)); Last.fm is intentionally not used. There is no time-window selector because Navidrome's API exposes only cumulative play counts, not per-event play history.

Queue Panel — Position Counter, Tri-State Duration Toggle, Collapsible Now Playing, EQ Indicator

By @kveld9, PR #419

The queue panel got a sweep of UX refinements. The header now shows the current position as (N/M) next to the queue title for at-a-glance context.

The clickable duration label in the header rotates through three modes per click instead of two: total queue time, remaining time, and estimated end-of-queue clock time (e.g. · 02:10). ETA updates every 30 seconds, is formatted in the user's locale, and is visually highlighted with the accent colour while playing.

A new chevron next to the queue title collapses the Now Playing section and queue toolbar, and the collapsed state is persisted across restarts, so users who treat the queue as a pure list can keep it that way.

The currently playing row in the queue list is now indicated by animated equalizer bars to the left of the track title; the bars freeze in place when playback is paused. The previous small play icon next to the title is removed since the EQ bars carry the same signal more clearly.

Shortcuts — Action Registry, Dynamic CLI Help, New Input Targets

By @cucadmuh, PR #435

Shortcut, keyboard, global-hotkey, mini-window and CLI inputs are now all routed through one TypeScript action registry — a single source of truth for what an action does, how it's labelled, and which input transports can fire it. CLI --player help is generated dynamically from the registry, so command coverage stays in sync with the action set automatically.

Nine new input actions were added (requested by zunoz on Discord): start search, start advanced search, toggle sidebar, mute, open / toggle equalizer, toggle repeat, open Now Playing, show lyrics, favorite current track. Help is bound to F1 by default and hidden from the Settings input list; existing users get the F1 binding back-filled into their persisted keybindings on next launch.

Translation...

Read more

Psysonic v1.45.0-rc.2

01 May 21:08

Choose a tag to compare

Psysonic v1.45.0-rc.2 Pre-release
Pre-release

Added

Audio Preview — Rust Preview Engine and Tracklist Rollout

By @Psychotoxical, PRs #392, #394

Psysonic now has a native Rust-powered preview engine for tracklist previews. Instead of using a separate HTML5 audio path, previews run through a parallel rodio sink on the existing output stream, with dedicated Tauri commands and engine events for preview start, progress and end.

When a preview starts, the main player pauses and only resumes automatically if it was playing beforehand. Starting normal playback, radio playback, resume or stop actions cancels any active preview first, so preview audio and main playback cannot overlap.

The new preview UI is rolled out across the main tracklist surfaces:

  • Albums
  • Playlist detail including suggestions
  • Favorites
  • Artist detail top tracks
  • Random Mix genre and filtered-song lists

Track numbers now stay stable on hover, while dedicated inline Play and Preview buttons handle playback actions from the title cell. Active playing rows keep the equalizer bars, including on hover; active paused rows fall back to a static accent-colored track number. SongRow is intentionally left untouched in this pass.

Settings → Audio now includes a preview section with a master toggle, configurable start position, configurable duration and per-location toggles. Users can keep previews enabled on discovery-heavy surfaces while hiding them on owned-content views. The preview progress ring follows the configured duration automatically.

Preview state is mirrored through a new previewStore, giving the UI one reliable source of truth for preview progress, active state and the currently previewing track metadata.

While a preview is playing, the player bar mirrors the previewed track with cover, title, artist, a dedicated Preview label and an accent top border. Actions that would otherwise target the queued track, such as rating, fullscreen hint and album/artist links, are suppressed during preview playback.

The main play button also reflects preview state with a stop-style preview control and progress ring. Its behavior matches the inline preview buttons: stopping the preview resumes the main player only if it was already playing before. The smaller Stop button uses silent preview stop semantics, cancelling the preview and leaving the main player paused so Stop always means silence.

Spacebar stops an active preview, media keys are ignored during previews, and tray actions cancel the preview before continuing with the requested player action.

Play Next in the context menu now uses a double-chevron icon, making it visually distinct from the Preview button.

The feature includes updated i18n coverage across all supported locales, including the new player-bar preview labels.

Tray — Now Playing Tooltip and Localized Menu Labels

By @Psychotoxical, PR #395, closes #383

The system tray now reflects the current playback state more clearly. On Windows and macOS, the tray tooltip shows the currently playing track as Artist – Title on play, pause and track changes, falling back to Psysonic when nothing is playing.

On Linux, where AppIndicator does not expose a hover-tooltip API, the same now-playing text is shown as a disabled entry at the top of the tray menu instead.

Tray menu labels are now localized across all supported languages, including Play/Pause, Next/Previous, Show/Hide, Exit and the Linux-only empty-state label. The frontend updates the tray labels on startup and whenever the app language changes, without rebuilding the tray icon.

Themes — Kanagawa, Atom One and 1984 Palettes

By @Psychotoxical, PR #390

Open Source Classics gains three new theme families: Kanagawa, Atom One and 1984, adding nine new themes in total.

  • Kanagawa: Wave, Dragon and Lotus
  • Atom One: Dark and Light
  • 1984: Default, Cyberpunk, Light and Orwell

Each theme defines the full token set, including background, accent, text, Catppuccin compatibility, waveform, status and select-arrow tokens. This lets login, queue sidebar and subpages inherit the palette cleanly without component-specific overrides.

The theme picker now groups Open Source Classics by family with dedicated family headings. Theme scheduler dropdown labels are also family-prefixed, making it clearer which palette family a scheduled theme belongs to.

Sidebar Discovery Indicators

By @cucadmuh, PR #397

Sidebar navigation now includes a dedicated unread indicator for New Releases, with persistence per server/library scope and delayed mark-as-seen behavior after opening the New Releases page.

Albums added within the last 48 hours now receive a localized New badge in both album cards and album detail header.

Adaptive Header Controls

By @cucadmuh, PR #397

The top header behavior was reworked for narrow widths: search, Live and Orbit controls now compress in a deterministic order with improved stability in edge-width ranges.

Waveform Wheel Seeking

By @cucadmuh, PR #397

Waveform mouse-wheel seeking now uses fixed step-based jumps with debounce smoothing for more predictable navigation and less jitter during rapid scrolling.

Fixed

  • Settings → Audio no longer blanks the app on macOS (Issue #382, PR #384, by @Psychotoxical): Fixed a macOS-only crash where opening Settings → Audio could turn the whole app into a blank window. The Equalizer canvas now waits until it has valid layout dimensions before drawing, and redraws automatically once the section is visible.

  • Polish (PR #397, by @cucadmuh): multiple branch-local interaction fixes around sidebar drag/drop behavior, Live dropdown layering, queue-resize handle behavior during scroll/overlay-scrollbar interaction, and now-playing narrow-layout stability.

Psysonic v1.45.0-rc.1

30 Apr 19:10

Choose a tag to compare

Psysonic v1.45.0-rc.1 Pre-release
Pre-release

Fixed

  • Settings → Audio no longer blanks the app on macOS (Issue #382, PR #384, by @Psychotoxical): Fixed a macOS-only crash where opening Settings → Audio could turn the whole app into a blank window. The Equalizer canvas now waits until it has valid layout dimensions before drawing, and redraws automatically once the section is visible.

Psysonic v1.44.0

29 Apr 23:28
ef45b72

Choose a tag to compare

Highlights

  • Telegram Group — We have decided to set up a Telegram group in addition to the Discord channel. We will, of course, continue to be active on both platforms, but anyone who prefers Telegram is more than welcome to join the group: https://t.me/+GLBx1_xeH28xYTJi
  • Orbit Listening Sessions — synchronized multi-user listening for Psysonic users, including host/guest roles, queue mirroring, track suggestions, participant strip, host-presence handling and full in-app help.
  • Loudness Normalization — EBU R128 / LUFS analysis with persistent cache, configurable target level and improved waveform data from the same analysis pass.
  • Now Playing Dashboard — a richer, customizable dashboard with draggable and resizable cards, artist context, album tracklist, credits, tour dates and discography.
  • Tracks Hub — a new full-library track-level view with random discovery, searchable browsing and Navidrome-native sorting.
  • Smart Playlists — first-class Navidrome smart playlist creation, editing and management directly inside the Playlists page.
  • Share Links / Magic Strings — share servers, tracks, albums, artists and queues through Psysonic magic strings.
  • Lucky Mix — instant AudioMuse-powered mixes based on listening history, ratings and similar-song discovery.
  • Settings Overhaul — cleaner tab structure, accordion sections, in-page search and better grouping of integrations and personalization options.
  • Playlist Suggestion Preview — audition playlist suggestions with 30-second previews, explicit play-next controls and deliberate add-to-playlist actions.

Added / New Features

Orbit — Multi-User Listen-Together

By @Psychotoxical, PR #304

Orbit introduces synchronized listening sessions for multiple Psysonic users. A host starts a session, shares a magic-string invite, and guests can join to mirror the host's queue, current track and playback position.

Guests can suggest individual tracks instead of replacing the full queue. Hosts can approve suggestions manually or enable auto-approve. Orbit also includes a live participant strip in the queue, per-guest mute, host-presence detection, automatic handling of stalled sessions and a detailed 9-section in-app help modal.

Orbit is integrated across Psysonic's interactive song surfaces, including Tracks Hub, Albums, Playlists, Random Mix, Favorites, Artist pages, Search and Advanced Search. When a session is active, song actions are routed through Orbit so guests suggest tracks and hosts enqueue them correctly.

The feature includes full i18n coverage across all supported locales and end-to-end documentation in ORBIT.md.

Loudness Normalization — EBU R128 / LUFS

By @cucadmuh and @Psychotoxical, PRs #315, #317, #326, #333

Psysonic now supports integrated-loudness analysis using LUFS and applies per-track gain so material mastered at different levels lines up more consistently at a user-chosen target loudness.

Analysis results are cached in SQLite, so cold-cache analysis happens once per track and later playback reuses the stored measurement without repeating the heavy analysis work. The available LUFS targets are -16, -14, -12 and -10 LUFS, with -12 LUFS as the default.

Normalization now lives in one section under Settings → Audio → Normalization, with Off, ReplayGain and LUFS as mutually exclusive modes.

Until a track has a stored LUFS measurement, Psysonic applies pre-analysis attenuation using a -14 LUFS reference calibration in storage, while the active target is reflected as an effective dB value in both the audio engine and the UI. Legacy saved values are migrated on rehydrate.

Follow-up work stabilized the LUFS analysis loop, serialized CPU-heavy seed and analysis work, kept queue target, pre-trim and ReplayGain IPC in sync when the target or pre-analysis state changes, including reseeding when analysis was cleared but waveform cache data still existed, and refined queue/settings behavior and copy.

The same analysis path now also provides richer waveform data through mixed mean/peak waveform bins without requiring a second full decode.

Now Playing — Customizable Info Dashboard

By @Psychotoxical, PRs #266, #267

The Now Playing page has been rebuilt from a flat card list into a two-column info dashboard focused on context, metadata and discovery.

The page now includes a richer cover hero, release-age information, technical badges, Last.fm love state, lyrics toggle, star rating and per-user play count. The dashboard can show a sliding-window album tracklist, top songs by the same artist, OpenSubsonic credits, artist biography, discography and Bandsintown tour dates.

Cards are draggable and resizable, and the layout is persisted per user. The implementation also includes memoized cards and TTL caches for song metadata, artist info, top songs, discography, Bandsintown and Last.fm data to avoid unnecessary refetching during same-artist playback.

Tracks — Full Library Hub Page

By @Psychotoxical, PR #300, closes #299

Psysonic now has a dedicated Tracks page between All Albums and Build a Mix. Instead of browsing only through albums, users can explore the library directly at track level.

The page includes a rerollable “Track of the moment” hero, a random-pick rail and a virtualized, paginated browse list with search. On Navidrome, browsing uses the native /api/song?_sort=title&_order=ASC endpoint for proper A–Z sorting, with a graceful fallback for non-Navidrome servers.

A new enqueueAndPlay() helper appends a track to the queue and jumps to it instead of replacing the queue.

Genres — Tag Cloud Refactor

By @Psychotoxical, PR #311

The Genres page has been redesigned as a compact, flowing tag cloud. This replaces the previous large SVG-card grid, which could freeze the WebKitGTK renderer on large libraries.

Genre pills are sized by album count, use deterministic palette colors and open instantly even with hundreds of genres. Pagination is no longer needed.

Now Playing Info Tab in Queue Panel

By @Psychotoxical, PR #244

The right-side queue panel now includes a third tab next to Queue and Lyrics. The new Info tab shows context for the currently playing track.

It includes an artist card with biography and image from Subsonic getArtistInfo, song contributors from OpenSubsonic metadata, and optional Bandsintown tour dates. Bandsintown integration is opt-in and includes privacy information when disabled.

Discover Songs Rail on Mainstage

By @Psychotoxical, PR #301

The Home page now includes a new Discover Songs rail, surfacing fresh track-level recommendations alongside the existing album-focused sections.

ReplayGain — Auto Mode

By @Psychotoxical, PR #242

ReplayGain now has an Auto mode. Psysonic automatically chooses album gain when the current queue is a contiguous album and track gain for shuffled or mixed playback.

This removes the need to manually switch normalization behavior between full-album listening and mixed queues.

Settings — Refactor, Accordions and Search

By @Psychotoxical, PRs #259, #263, #264, closes #257

Settings have been reorganized into clearer thematic tabs: Servers, Library, Audio, Lyrics, Appearance, Personalisation, Integrations, Input, Storage, System and Users.

Tabs are now split into accordion sections for a calmer landing view. A new in-page search can expand matching sections automatically, search across tabs, support keyboard navigation and flash matching results.

Integrations such as Last.fm, Discord, Bandsintown and Now-Playing Share now live together in the Integrations tab. Sidebar, Artist and Home customizers live under Personalisation. Contributors are shown in a dedicated System section.

Playlists — Suggestion Preview UX

By @Psychotoxical, PR #365

Playlist suggestions introduce a dedicated preview workflow for auditioning recommended songs before adding them to a playlist or sending them to the queue.

Each suggestion includes a 30-second preview action with an animated progress ring. Previews play through a separate HTML5 audio element: the main player pauses during the preview, resumes when the preview ends, and cancels cleanly when playback is controlled manually.

An explicit Play Next button inserts the suggestion after the current queue item and starts playback there. Double-clicking a suggestion row adds it to the playlist, matching the existing plus button, while single-clicking the r...

Read more

Psysonic v1.43.0

20 Apr 22:02
1ce199e

Choose a tag to compare

Added

  • User Management — admin-gated tab in Settings (by @Psychotoxical): When the active server is Navidrome and the logged-in user is an admin, Settings gets a new "Users" tab. Lists every user with username, display name, email, last-access timestamp and assigned libraries. Add / edit / delete via Navidrome's native REST API (/api/user) using a Bearer token obtained from /auth/login — the Subsonic API doesn't expose this, so non-Navidrome servers don't get the tab.

  • User Management — per-user library assignment (by @Psychotoxical, PR #222): Mirrors the Navidrome web client. Non-admin users get a checkbox picker showing every library on the server; the picker is hidden for admins (Navidrome auto-grants them access to all libraries). Inline validation prevents saving a non-admin with zero libraries.

  • User Management — last-access timestamp per user (by @Psychotoxical): Each row shows when the user was last active, formatted as a localised relative time (vor 5 Min., 2h ago, etc.) using Intl.RelativeTimeFormat. Tooltip carries the absolute timestamp. Users who have never logged in show "Never".

  • Seekable streaming + instant local playback — first cut (by @Psychotoxical and @cucadmuh): New RangedHttpSource + LocalFileSource audio backends. Seek operations on remote tracks now issue HTTP Range requests instead of restarting the stream from byte 0, and locally cached files start playing instantly without going through the HTTP path at all. WaveformSeek commits the seek on mouseup (not during drag), and progress ticks during a drag are ignored so the playhead doesn't jitter back and forth. Note: the underlying seek/buffer behaviour is not fully sorted yet — expect follow-up changes in the next releases as edge cases (slow proxies, partial-content retries, codec-specific quirks) get ironed out.

  • Mini player — queue-style meta block, action toolbar, vertical volume slider (by @Psychotoxical): The mini's right column gets a richer track-info block matching the queue panel's styling. A dedicated action toolbar (love / queue / context menu) sits below the transport. The horizontal volume slider is replaced by a tall vertical one on the right edge for a more compact footprint.

  • Settings — compact spacing pass + row hover affordance (by @Psychotoxical, PR #223): Section margins, card padding and divider spacing all tightened — every Settings tab fits more content per viewport. Each toggle row gains a subtle accent-tinted hover background that bleeds to the card edges so the active row is visually obvious.

  • Floating player bar — toggleable variant (by @kveld9, PR #216): Settings → Appearance → "Floating player bar" turns the player bar into a floating, rounded panel that sits above the page content with a margin around all four edges. Off by default. Solid background, works with every theme.

  • Floating player bar — liquid-glass look on macOS and Windows (by @Psychotoxical): When the floating bar is enabled, macOS and Windows users get a gentler glass-effect background (subtle blur + tint) on top of @kveld9's solid variant. Linux keeps the solid look — WebKitGTK's backdrop-filter cost is too high for an always-visible panel. A new data-platform attribute on <html> is the generic platform-gate that other CSS can hook into.

  • NVIDIA proprietary driver — DMA-BUF auto-disabled on Linux (by @kveld9, PR #217, refactored by @Psychotoxical): Detects the NVIDIA proprietary driver at startup and sets WEBKIT_DISABLE_DMABUF_RENDERER=1 for the WebKitGTK process, avoiding rendering glitches that show up specifically on that combo. Confirmed via blind A/B testing — only the proprietary driver is targeted; Nouveau / AMD / Intel are not touched.

  • Lyrics — cubic ease-out scroll animator (by @kilyabin, PRs #214 / #215): The lyrics auto-scroll animation is replaced by a smoother cubic ease-out curve (renamed internally from springScroll to easeScroll). Active line transitions are noticeably less jerky on long line-spacing changes.

  • Fullscreen lyrics — fade bottom edge of plain lyrics scroll viewport (by @kilyabin): Plain (unsynced) lyrics in the fullscreen player now fade out at the bottom of the scroll viewport via a mask-image gradient, matching the existing fade on the synced-lyrics overlay.

Fixed

  • Mini player — main window minimises on open + width cap on non-tiling WMs (by @Psychotoxical): Opening the mini now reliably minimises the main window (previously hit-or-miss on some WMs), and the mini's width is capped on non-tiling Linux WMs so it doesn't open larger than its intended footprint when the user's WM hands it the full screen.

  • Artist page — Top Songs continues playback past the last track (by @kveld9, PR #220): Playing a song from the Artist page's Top Songs row no longer stops after the row's last track — the queue continues into the surrounding context as intended.

  • Padding fixes across several pages (by @kveld9, PR #221): Layout polish, mostly aligning content to the page-level container padding instead of the inner card padding.

  • Jayfin theme — WCAG AA contrast fixes for nav + primary buttons (by @Psychotoxical): Hover and active states on the Jayfin theme's sidebar nav items and primary buttons now pass WCAG AA contrast against the underlying background.

  • Lyrics — sidebar lyrics with YouLy+ source render as a single line (by @kilyabin): Lines from the YouLyrics+ source were being split across multiple visual lines in the QueuePanel lyrics pane. Now collapse onto one line as intended.

  • Settings → Lyrics Sources — drag-and-drop survives mode toggle (by @Psychotoxical): Reordering lyrics sources via drag-and-drop no longer resets when toggling the synced-vs-plain mode.

  • Folder browser — auto-contrast text on selected row (by @Psychotoxical): Selected rows in the folder browser now compute text colour from the row's background luminance, so light themes don't paint white-on-white text.

  • Titlebar — theme-independent traffic-lights + song pill (by @Psychotoxical): The macOS-style traffic-lights and the now-playing pill in the titlebar use fixed colours instead of theme tokens, so they stay legible on every theme without needing per-theme overrides.

Reverted

  • Reverted: fs-player WebKitGTK CPU-cut patch (by @Psychotoxical): An earlier perf patch in the Fullscreen Player that disabled compositing under WebKitGTK turned out to cause animation regressions in real-world use. Reverted; the original code path is back.

Changed

  • AudioMuse toggle — Alpha badge dropped (by @Psychotoxical): The AudioMuse-AI integration has been stable for several releases; the "Alpha" tag in Settings → Server is removed.

Psysonic v1.42.1

19 Apr 14:09

Choose a tag to compare

🚨 Critical bug fix for Windows users. On 1.42.0, opening the mini player on Windows could stall Tauri's event loop: the mini would appear as a blank white window, neither the main window nor the mini could be closed, and the only way out was killing the process via Task Manager. Please update immediately if you're on Windows 1.42.0. macOS and Linux were not affected.

Fixed

  • Mini player no longer hangs the app on Windows (@Psychotoxical): Creating the second WebView2 webview lazily from the open_mini_player invoke handler reliably froze the app on Windows — the mini opened blank, both windows became unresponsive, and the user had to kill the process from Task Manager. The builder + main.minimize() combo racing against WebView2's first paint was the trigger. The mini webview is now pre-built hidden in Tauri's .setup() on Windows, so the first open is a pure show/hide instead of creation + minimize. open_mini_player is simpler on all platforms, the minimize-main dance around show/hide is skipped on Windows, and Windows also goes back to the native window decorations (the earlier decorations: false mini titlebar was part of the hang surface).
  • Mini player syncs immediately on first open (@Psychotoxical): With the mini pre-created on Windows, the mount-time mini:ready event could race past the main window's bridge listener and leave the mini without a snapshot when the user actually opened it. The mini now also re-emits mini:ready on every window focus, so opening the mini always triggers a fresh sync regardless of startup ordering.

Added

  • Optional “Preload mini player” setting on Linux + macOS (@Psychotoxical): Settings → General → App behaviour. Off by default. When enabled, the mini player window is built hidden at app start so the first open is instant instead of waiting a few seconds for WebKit to boot + React to hydrate + the bridge snapshot to arrive. Costs one extra WebKit process in the background permanently (~50–100 MB RAM). Windows always preloads regardless of this toggle — it's how we work around the hang above, not an opt-in feature there.

Psysonic v1.42.0

19 Apr 11:57

Choose a tag to compare

🛠️ Note on the 1.41.0 jump: The 1.41.0 tag exists as an internal Draft release on GitHub — it was used to wire up and verify the Cachix substituter pipeline and never went public. 1.42.0 is the first public release after 1.40.0 and consolidates everything that was prepared for 1.41.0 plus the work landed on top in the days since.

❄️ Cachix is live for NixOS users. The psysonic.cachix.org substituter is now actually fed by every release. Earlier 1.40.x runs were silently skipping the cache push (see Fixed below), so the first user to ask for a given output paid the full compile cost. Starting with 1.42.0, nix run github:Psychotoxical/psysonic and the NixOS module both pull the prebuilt closure straight from Cachix — no local Rust + symphonia + libopus build required.

Added

  • Mini player — feature-complete second cut (Issue #162, by @Psychotoxical): The early-alpha mini from the internal 1.41.0 prep gets the rest of the workflow it was missing.

    • Expandable queue panel with full track list, search-style overlay scrollbar (no width-eating gutter), drag-to-reorder using the existing PsyDnD system, and a localized right-click context menu (Play now / Remove from queue / Open album / Go to artist / Favorite / Song info — all forwarded to the main window via Tauri events so the source-of-truth playerStore stays consistent).
    • Custom in-page titlebar on Windows + Linux with a drag region, the current track title and the queue / pin / open-main / close action icons. macOS keeps the native traffic-lights titlebar so the system look is preserved. The lower toolbar from the alpha is gone — its four buttons live in the titlebar now.
    • Persistent geometry: window position, expanded-queue height and queue-open state all survive an app restart. Position is written to <app_config_dir>/mini_player_pos.json on every move (throttled), and re-applied after each show — Linux WMs (Mutter/KWin) re-centre hidden windows on show, so without re-applying the position would be lost on the second open.
    • User-bindable keyboard shortcut in Settings → Shortcuts (open-mini-player, default unbound). The same chord toggles between main and mini regardless of which window has focus.
    • Layout polish: cover shrinks 112 → 84 px, the right column gets title / artist / transport in a single block, progress + toolbar take full width.
    • Live theme / font / language sync: changes in the main window propagate to an open mini via the shared localStorage storage event — no need to close + re-open the mini after rebinding a shortcut or switching themes.
    • Always-on-top reliability fix: WMs that silently ignore set_always_on_top(true) when the flag is "already true" (KWin, certain Mutter releases) get a forced false → true cycle so the constraint is actually re-evaluated. The frontend also re-asserts the pin state on mount and on focus, so the user no longer has to click the pin button twice for it to stick.
  • Player bar — click-to-toggle duration / remaining time (contributed by @kveld9, PR #212): Click the time read-out in the player bar to swap between total duration (3:45) and remaining time (-2:34). Updates live, persisted to themeStore.showRemainingTime. A small swap icon (⇄) and hover highlight signal the interaction.

  • Queue — ReplayGain in tech strip, expandable badge (Issue #195, originally by @cucadmuh in PRs #196 / #201 — UX iteration by @Psychotoxical on cucadmuh's feedback): Tracks with ReplayGain metadata now show a small RG ⌄ pill at the end of the codec/bitrate/sample-rate strip. Hover reveals the values via tooltip; click expands a second line ("ReplayGain · T -8.9 dB · A -11.0 dB · Peak 0.998") that is persisted across sessions. Hides itself for tracks without RG metadata.

  • Changelog — sidebar banner + dedicated /whats-new page (by @Psychotoxical): The auto-popup modal that nagged the user on first launch after each update is replaced by a discreet sidebar banner. Clicking it opens a full /whats-new page that renders the latest CHANGELOG section in app — no separate Markdown viewer, no broken links to GitHub.

  • Favorites — genre column + Top Favorite Artists row (Issue #87, by @Psychotoxical): The Favorites tracklist now has a toggleable Genre column (alongside the existing Album column and multi-genre filter). A new horizontally scrolling "Top Favorite Artists" row sits between Radio Stations and Songs, aggregated from starred tracks and sorted by star count. Clicking an artist card narrows the song list to that artist.

  • Compilation filter on All Albums (Issue #65, by @Psychotoxical): A tri-state toggle in the Albums page header (All / Only compilations / Hide compilations) that reads the OpenSubsonic isCompilation tag exposed by Navidrome 0.61+. Client-side filter, no additional server calls. Translated into all 8 supported locales.

  • Sticky header on Albums, New Releases, Artists (by @Psychotoxical): The header row with search/sort/genre/year controls now pins to the top while scrolling, so filters stay reachable without jumping back up. Works the same on all three browse pages.

  • Device Sync — album artist on both panels (by @Psychotoxical): Album entries in both the library (left) and on-device (right) panels now display Album · Artist inline, so sampler discs and self-titled albums are no longer guesswork. Playlists unchanged.

  • NixOS — first-class flake install guide (contributed by @cucadmuh, PRs #209 / #210): A new top-level nixos-install.md walks through adding Psysonic as a flake input, installing via environment.systemPackages / home.packages, and wiring up the public psysonic.cachix.org substituter so every NixOS user pulls prebuilt binaries. README links to it directly.

  • README — AppImage in the Linux install options + Cachix badge (by @Psychotoxical): The Linux install section now lists AppImage alongside .deb, .rpm, AUR and Nix flakes. A Cachix badge on the README header signals that NixOS users get prebuilt binaries.

Changed

  • Genre filter — portal popover (by @Psychotoxical): The inline tagbox + dropdown (capped at 60 entries, ate header space when expanded) is replaced by a compact button that opens a portal-rendered popover with a search field and the full scrollable list of genres. Selected genres sort to the top. Used on Albums, New Releases, Random Albums and Favorites.

  • Year filter — portal popover (by @Psychotoxical): The From/To number inputs in the Albums header became a single button with a popover mirroring the genre filter pattern. When the filter is active, the button shows the range (e.g. 2020–2024) in accent colour.

  • Sort picker — portal dropdown (by @Psychotoxical): The two sort buttons on Albums (A–Z (Album), A–Z (Artist)) collapse into one dropdown button showing the current choice. Generic SortDropdown component, reusable for other pages.

  • Device Sync — album/playlist meta inline (by @Psychotoxical): BrowserRow renders secondary info inline with a · separator in muted colour instead of a separate right-aligned column, matching the on-device panel's format.

  • README — Arch/AUR fold-up (by @Psychotoxical): The Arch / AUR install instructions are folded into the Linux install section so the README stops scrolling forever.

Fixed

  • Player bar — black-flash on WebKitGTK (by @Psychotoxical): Linux users occasionally saw the entire player bar paint fully black for one frame when an unrelated layer elsewhere on the page invalidated. contain: layout paint makes the bar its own paint boundary so it can no longer be pulled into a surrounding dirty rect. No-op on platforms that don't exhibit the flash (Wayland-with-GPU, Chromium webviews on Windows / macOS).

  • Player bar — time-toggle tooltip uses the in-app TooltipPortal (follow-up to PR #212, by @Psychotoxical): The new time-swap control was rendering the native browser title= tooltip (unstyled OS popup, ignored by every other control). Switched to data-tooltip="…" so it matches every other player-bar tooltip.

  • Fullscreen player — lyrics menu toggle + readability (by @Psychotoxical): Re-clicking the mic icon now actually closes the lyrics settings panel instead of the outside-click handler closing it and the click re-opening it — the trigger button is excluded from the outside-check. The panel itself is now a solid surface (no backdrop blur, near-opaque background, higher-contrast button text) so settings remain readable over the busy fullscreen background.

  • i18n — ArtistCardLocal album count *(contributed by @cucadmuh)...

Read more