Psychotoxical 104c76f523 fix(library): separate "appears on" from an artist's main discography (#1341)
* fix(library): separate "appears on" from an artist's main discography

Artist detail derives every album from the artist's own tracks, so Various
Artists compilations, split releases, and other artists' albums the artist
only guests on were landing in the main discography. Split them into a new
appears_on_albums set rendered under "Also Featured On".

An album stays in the main discography when it credits the artist as its
album artist -- including the artist's own best-of compilations, which the
release-type grouping files under "Compilation". Only releases the artist
does not head (Various Artists, guest spots, splits) move to appears-on.
When an album carries no album-artist tag (S2 ingest) the credit falls back
to the track artist and a compilation signal still routes it to appears-on.

The split is computed locally from the scoped album set, so it stays correct
under multi-server scopes and needs no network search (the old featured-albums
path was network-only and disabled for multi-server).

* fix(library): harden the appears-on split for real catalogues

Follow-up hardening for the discography split, from review passes and a
run of the real code path against a large production catalogue.

- Credit matching goes through the cluster normalisation and ignores a
  leading article, so two spellings of one artist ("Royksopp" vs
  "Röyksopp", "Beatles" vs "The Beatles") no longer empty the whole
  discography into appears-on.
- A collaboration join has to be whitespace-separated, and a bracketed
  "(feat. ...)" counts as one, so "Air Supply" is not credited to "Air"
  while "Artist (feat. Guest)" still is.
- An album carrying no album-artist tag is no longer judged by name: its
  tracks already carry this artist's id, and a server's artist row and
  its track tags routinely differ in spelling. Only a compilation signal
  routes such an album away.
- The album-artist tag is read across the whole album and keyed on the
  dedup group, so the result no longer depends on which physical copy
  won, and scope is filtered without scanning the scope CTE.
- The compilation predicate is guarded against malformed and non-array
  raw_json; a single bad row previously aborted the entire query.
- Various Artists pages skip both split inputs, and the header album
  count now follows the split.

* fix(artist): keep appears-on albums reachable outside the discography

Splitting them out of `albums` narrowed the album list for every consumer
of the artist detail read, not just the discography grid. Listing and
lookup paths union both sets again: the offline artist index, the folder
browser listing and its now-playing reveal, and "more by this artist" on
the album page. Without that, revealing a track played off a compilation
silently found nothing.

On the artist page the appears-on section is forced visible while the
discography is empty, so an artist whose local catalogue is only guest
spots still shows their releases.

* docs(changelog): note the artist discography split (#1341)

* fix(library): address the appears-on discography split review

Resolves the findings from the #1341 core-team review:

- Recognise the Navidrome-native tags.releasetype compilation form in the
  split predicate, not only top-level releaseTypes.
- Build the appears-on card credit (name and id) from a scope-priority-ordered
  whole-album projection instead of the viewed artist's guest-track row, so the
  card shows and links the album's headliner. The classification and the
  displayed credit now come from the same priority-consistent value.
- Derive the header album count from the rendered discography unconditionally,
  so a cross-server union of own releases and a label-linked VA page no longer
  keep one server's local count.
- Return the own / appears-on split from the local index and playback loaders
  instead of pre-unioning, so the artist page keeps its "appears on" section in
  the offline and network-failure fallbacks; legacy all-album consumers (related
  albums, Now Playing discography, the resolve facade) union the two arrays.

Adds behavioural tests for each and guards the multi-scope payload against a
missing appears-on field.

* test(library): cover a sibling-recovered album-artist id on an appears-on card

The representative row can carry the album-artist label while only a sibling
track holds `albumArtistId` — a partial credit the viewed artist has no row for.
The existing appears-on test starts from an untagged representative, so a fix
that recovers only the label would pass it; this one leaves the label correct
and removes just the id.

Verified by neutralising `overlay_album_artist_links`: the assertion then reports
the guest performer's id instead of the album artist's.
2026-07-26 01:38:44 +02:00
2026-06-28 23:20:22 +02:00

Psysonic Logo

A modern desktop client for self-hosted music libraries

Fast. Native. Beautiful. Built for people who actually care about their music collection.

Psysonic is built primarily for Navidrome and also works with Gonic, Airsonic, LMS and other Subsonic-compatible servers, depending on the features supported by your server.


Latest Release GitHub Stars License GPLv3 Tauri v2

Discord Community Telegram Community Support Psysonic on Ko-fi

AUR psysonic AUR psysonic-bin Cachix WinGet psysonic



Available languages: English, German, Spanish, French, Norwegian Bokmål, Dutch, Romanian, Russian, Chinese, Japanese, Hungarian and Polish.

More translations are added over time.

No telemetry • Native performance • Navidrome-first • Community driven


Psysonic Screenshot


What is Psysonic?

Psysonic is a desktop music client for self-hosted music libraries. It is designed for people who want the freedom of their own server without giving up the comfort, polish and speed of a modern music app.

It is built with Rust, Tauri v2 and React, with a strong focus on responsiveness, customization, practical music-library workflows and a user interface that does not require a manual before you can press play.

Psysonic is optimized first and foremost for Navidrome, and it leans into that on purpose: instead of being one more generic Subsonic client, it is the Navidrome-first desktop client that does things no other client does. Other Subsonic-compatible servers can work well too, but advanced features may depend on server-side support.


Key Features

These are the things that set Psysonic apart. To our knowledge, no comparable self-hosted desktop client ships them.

🪐 Orbit — Shared Listening

Listen together, in sync, over your own server.

Orbit brings real-time synchronized group listening into Psysonic. Start a session, invite people with a link, and everyone hears the same thing at the same time — with host-controlled playback, a shared queue and guest song suggestions.

The clever part: Orbit rides entirely on your own Navidrome. There is no external relay, no third-party service and no extra accounts. The session lives on your server, where it belongs. It is built for real-world music sharing without turning your self-hosted setup into a social-media circus.

Orbit shared listening

Local Library — Instant, and Almost Offline

A local index of your whole collection, so the app stays fast no matter what your connection does.

Psysonic keeps a local library of your collection's metadata right on your machine. Because the app already knows your tracks inside out, browsing, searching and starting playback are instant — even a 500 MB FLAC starts the moment you hit play, because nothing has to be fetched or parsed first.

It also means the connection to your server stops being a bottleneck. Even on a slow, flaky or distant link, Psysonic stays responsive and behaves almost like an offline player, whatever the network is doing.

And it's the foundation everything else is built on: the local library is what makes on-device analysis, smart audio and snappy navigation possible in the first place.

🧠 On-Device Audio Analysis

One of the most powerful things Psysonic does — entirely on your own machine.

Built on top of the local library, Psysonic analyzes your tracks locally — loudness, waveform and tempo — with no cloud service and no required server-side plugin. That analysis is what powers content-aware AutoDJ transitions, LUFS-based loudness normalization and playback-speed control.

This is a deep, genuinely useful layer that most clients simply don't have, and because it runs locally, it works exactly the same whether you're fully online or barely connected.

🎧 AutoDJ — Content-Aware Crossfade

A DJ that listens to the music, not a stopwatch.

Most players do fixed-time crossfade: blend the last N seconds into the next N seconds, dead air and all. AutoDJ uses Psysonic's own audio analysis to trim the silence at the edges of a track and blend out of the actual music — for transitions that sound deliberate instead of mechanical. It is a standalone playback mode with smooth skip/interrupt handling and a configurable overlap.

🔗 Navidrome-Native, Deeply

Not a generic Subsonic client wearing a Navidrome hat.

Psysonic binds Navidrome's native capabilities directly: server-side smart-playlist create/edit, playback reporting and OpenSubsonic capability probing. Most clients in this space stay Subsonic-generic. Psysonic goes deeper, so Navidrome users get the features their server can actually deliver.

🎨 Community Theme Store

A real marketplace for themes — installable and schedulable.

Beyond a big set of built-in themes, Psysonic has a first-party theme registry: browse community themes, install them in-app, and let the Theme Scheduler switch looks automatically between day and night.


Built to be trusted

We take an enterprise-grade approach to development — continuously improving our automated testing and maintaining strict contracts between the backend and the frontend. Releases are cut from green CI, not vibes.


More Highlights

Features that go well beyond the basics. Not all of these are unique to Psysonic, but few clients bring this many together.

Audio & Loudness

  • LUFS-based Smart Loudness Normalization
  • ReplayGain support and loudness-aware playback
  • 10-band Equalizer with presets
  • AutoEQ headphone correction
  • Per-device EQ and output optimization
  • Adjustable playback speed

Lyrics & Listening

  • Synced lyrics with seek support, from multiple providers (YouLy+, LRCLIB, NetEase)
  • Auto-scrolling sidebar lyrics and a fullscreen lyric mode
  • Last.fm scrobbling, similar artists, loved tracks and listening stats
  • Smart Radio sessions and an Infinite Queue
  • AudioMuse-AI support for sonic-similarity discovery (requires an AudioMuse-AI server)

Artwork & Visuals

  • Optional external artist imagery via fanart.tv — opt-in, shown on the artist page, fullscreen player and home hero (Navidrome stays the canonical cover-art source)
  • Cover art surfaced across the app, OS media controls and Discord Rich Presence

Library & Playlists

  • Smart Playlists
  • Drag & drop playlist management
  • Multi-select bulk actions

Sharing

  • Magic Strings sharing for albums, artists and queues
  • Navidrome user-management helpers for fast account sharing

Offline, Sync & Deployment

  • Offline playback and downloads
  • USB / portable sync
  • LAN / remote auto-switching
  • Custom HTTP headers for reverse-proxy-gated servers (e.g. Cloudflare Access, Pangolin)
  • Backup and restore settings
  • In-app auto updater

Personalization & Accessibility

  • Font customization and zoom controls
  • Keybind remapping
  • Colorblind-friendly theme options
  • Keyboard-friendly navigation

Power-User Extras

  • CLI controls

The Basics, Done Right

The things you simply expect from a serious music player — and Psysonic does them well.

  • Gapless playback and crossfade
  • Fast search across large libraries
  • Browse albums, artists, tracks and genres
  • Ratings
  • Queue management
  • Keyboard navigation
  • Media key support
  • Low memory usage and native performance compared to heavy web-first clients
  • Built for large self-hosted collections

Platforms

OS Support
Windows Native installer / WinGet
macOS Signed DMG
Linux AppImage / DEB / RPM / AUR (psysonic, psysonic-bin) / NixOS

Install

Linux

curl -fsSL https://raw.githubusercontent.com/Psychotoxical/psysonic/main/scripts/install.sh | sudo bash

Linux builds are also available through GitHub Releases, AUR and Cachix/Nix.

AppImage runs under X11/XWayland — it pins GDK_BACKEND=x11 for a stable WebKitGTK stack. For a native-Wayland launch, use the .deb, .rpm, AUR, or Nix packages, which follow your session's display server.

Windows

Download the latest installer from the GitHub Releases.
or,
install via Windows Package Manager (WinGet):

winget install Psysonic

You can also browse and install it on winstall.app.

macOS

Download the signed DMG from the GitHub Releases.


Development

Contributor expectations (PRs, CI, Tauri boundary, UI): CONTRIBUTING.md.

git clone https://github.com/Psychotoxical/psysonic.git
cd psysonic
npm install
npm run tauri:dev

Build release:

npm run tauri:build

Privacy

Psysonic is built for self-hosted music collections. Your library is yours.

  • No telemetry
  • No spyware nonsense
  • No analytics harvesting
  • No hidden tracking

See TELEMETRY.md for the telemetry stance and PRIVACY.md for how each opt-in integration handles data.


Reviews


Community & Support

Join the community, report bugs, suggest features, share themes and help shape the future of Psysonic.


License

Psysonic is licensed under the GNU GPL v3.0.


Forks and Attribution

Psysonic is free and open-source software under the GPLv3. You are welcome to fork it, modify it and build upon it under the terms of the license.

If you publish a modified or rebranded version, please make it clear that your project is based on Psysonic and preserve proper attribution to the original project.

That is not about preventing forks. Forks are part of open source. It is about being honest with users and contributors about where the work comes from.

Features, design work and implementation ideas developed in Psysonic should not be presented as unrelated original work in downstream projects.


Own your music. Enjoy the client too.

Psysonic brings a modern desktop experience to self-hosted music libraries.

Languages
TypeScript 69.1%
Rust 26.3%
CSS 3.9%
JavaScript 0.4%
Shell 0.2%