Solomorph
Pricing Build log

what it connects to Subsonic + OpenSubsonic Android

An Android client for Navidrome, Subsonic, and any OpenSubsonic server.

Solomorph speaks the Subsonic and OpenSubsonic API. If your server speaks it, Solomorph is a client for it — whether or not you ever buy anything from us. This page is the long answer: which servers, what “works” means for each one, what the OpenSubsonic extensions actually buy you, and the things it genuinely cannot do.

protocol
Subsonic REST API, v1.16.1 · OpenSubsonic fields read when the server sends them
platform
Android 7.0 (API 24) and newer, from Google Play
free tier
one server, uncapped · no song limit, no trial clock, no expiry
not supported
Plex · Jellyfin · Emby — different protocols, said plainly further down

which servers

Two columns, because “works” means two different things.

run daily means we use it, every day, and the behavior on this page was verified against it. speaks the API means it implements the protocol Solomorph is a client for and should work — and that we have not run it ourselves, so we are not going to tell you we have. The port column is the preset chip on the Connect screen; tapping one fills in scheme and port and leaves the host to you.

server default status what that means
Navidrome http · 4533 run daily The development library, 1,941 albums. Every app screenshot on this site came off it, and it is the server every behavior on this page was verified against. It sends the OpenSubsonic fields the truth strip reads — bit depth and sample rate — so a FLAC shows 16/44.1 next to its codec.
Solomorph Server http · 4533 run daily Our own server, sold separately and optional forever. Same Subsonic API as everything else here, plus two things only it does: connecting to a licensed one carries the paid client layer onto that device, and the phone prefers asking it to look up lyrics rather than asking lrclib.net directly — “prefers”, not “never”, since a server that cannot answer still falls through.
Gonic http · 4747 speaks the API Has its own preset chip on the Connect screen. Not tested by us yet.
Airsonic · Airsonic-Advanced http · 4040 speaks the API Has its own preset chip on the Connect screen. Not tested by us yet.
Subsonic http · 4040 speaks the API The original, and the protocol everything else on this list implements. Preset chip on the Connect screen. Not tested by us yet.
Funkwhale type it in speaks the API No preset chip — use the manual form. Not tested by us yet.
Ampache type it in speaks the API No preset chip — use the manual form. Not tested by us yet.
Lyrion · LMS type it in speaks the API No preset chip — use the manual form. Not tested by us yet.
Supysonic type it in speaks the API No preset chip — use the manual form. Not tested by us yet.

There is a sixth chip, HTTPS · tunnel, and it is not a fallback for when the others fail — it is the first-class way to reach a home server from outside your LAN, through a reverse proxy or a tunnel. A blank port on https just uses the scheme default. The Connect page has the rest of it, including why the address is three boxes rather than one.

opensubsonic

Extensions are read when they arrive, and nothing breaks when they don’t.

Solomorph does not negotiate a capability list with your server — there is no handshake and no extensions call. Each field below is read if the server sent it and skipped if it did not, per song, every time. That is why an older Subsonic server is not a degraded mode here: it is simply a server that sends fewer fields, and the surfaces that would have used them show less rather than showing something invented.

field when your server sends it when it doesn’t
bitDepth · samplingRate The truth strip carries the full rung — the codec, then bit depth over sample rate, then the bitrate your server reported. A FLAC reads FLAC · 16/44.1 · and its own bitrate rather than just FLAC. The strip drops that rung and shows what is left. It never fills in a number the server did not send, and a server reporting 0 for a field it cannot know counts as not sending it.
getLyricsBySongId Synced, LRC-timed captions straight out of your own library, several languages per song if you have them. Your server answers first and its documents paint first. The call resolves to nothing and nothing breaks. With captions switched on, the app falls through to lrclib.net — artist, title, album and duration, named in full on the privacy page. With captions off, that request is never made at all.
type (music · podcast · audiobook) A server that already sorts its own library is simply believed, and audiobooks and podcast episodes land on the bookshelf instead of turning up in a shuffle. Classification falls to the genre tag, which is the signal that works today. Navidrome 0.62 answers music for every track, so this is the ordinary case rather than the edge one.
genres[] Genre browse and the bookshelf read the same name from the array. The legacy genre string is read first regardless, so nothing depends on the array being there.
path A third classifier for long-form audio, on a server that reports where a file actually sits. Navidrome builds path out of tags rather than reading the filesystem, so a folder named Audiobooks never reaches the client. Tag the genre instead of reorganising folders.

THE TRUTH STRIP NEVER INVENTS A NUMBER.

Codec, bit depth, sample rate, bitrate — every one of them comes off what your server actually reported for that track, set in monospace because a machine measured it. A field the server omits is a field the strip leaves out, and a server answering 0 for something it cannot know counts as an omission. Nothing on that line is a guess dressed up as a reading.

no extensions required

What works against every server on the list.

These are plain Subsonic calls. They write to your server, not to a copy on the phone, which is the whole reason they survive you replacing this app with a different one.

hearts star / unstar written to the server, so every other client sees them and they outlive us
ratings setRating 0–5 server-side, distinct from the heart
playlists create · rename · add · remove · delete · public real edits, written to your server — not a local copy
play counts scrobble called on playback. Navidrome counts nothing from a raw stream request, so without this your recently-played and frequent shelves sit frozen
resume position createBookmark · getBookmarks server-side, so the book you left on the sofa is where you left it on the phone. Verified round-tripping against Navidrome 0.62
rescan startScan · getScanStatus a server without these just carries on with its own scheduled scan — nothing blocks
auth token · md5(password + salt) the password itself never leaves the device, and credentials live in the Android Keystore rather than a settings file

One server is what the free tier overlays, uncapped — no song limit and no clock. Connecting more than one and browsing them as a single merged library, with search reaching across all of them, is part of the $6.99 Solomorph+ unlock, as are offline downloads, the advanced EQ layer, and the music already on your phone as its own source. A track queued from a second server keeps playing and keeps its artwork either way, because every item knows which server it came from.

the honest part

What it does not do.

The noes are the reason to trust the yeses. If one of these is a dealbreaker for you, it is better that you find it on this page than three screens into a setup.

Plex · Jellyfin · Emby Not supported. They do not speak Subsonic. If you run Plex today, Solomorph will not see your library — this is the sentence we would rather you read here than discover after paying $6.99.
folder-tree browse Not built. If you organise by directory and distrust tags, this is not the client you want yet. It belongs on the free tier and that is where it will land; use a free client until then.
a flat all-tracks list Not built. The library axes today are artist, album, genre and playlist. A–Z jump scroll shipped in the 0.10 line; the ungrouped track list did not.
direct Last.fm · ListenBrainz scrobbling Not built. Play counts reach your server today, which is a different thing from posting to Last.fm yourself, and this row is about the second one.
smart playlists · internet radio Not built. Wanted, ranked in public, not in this build.
self-signed certificates Refused. A certificate your browser has been told to trust is still refused here, because Solomorph does not inherit a browser exception — it is not a browser. The error says so in those words.
transcoding requests The stream request carries an id and nothing else — no bitrate parameter, no format parameter. Solomorph never asks your server to transcode, and there is no in-app quality setting to change that. Whatever your server does by default for a client named solomorph is what you get.
indexing SMB, WebDAV or cloud drives from the phone A decision, not a backlog item. Scanning network shares from the phone makes the phone the server: your library, play counts and ratings end up on one device and no two devices in a household ever agree.
iOS Not built. Android today, with Windows and Linux from the same codebase lagging the phone build. The platform table on the home page is the honest version and it changes there first.

PLEX, JELLYFIN AND EMBY ARE NOT SUPPORTED.

They do not speak Subsonic. Supporting them is real work and it is on the v2 list, not in this build. If you run Plex today, Solomorph will not see your library. We would rather tell you here than take $6.99 and let you find out.

from here

The part where you actually point it at something.

Running something on this page? Tell us what worked and what broke — [email protected]. A row that is wrong for your setup gets corrected, and the correction shows up dated in the build log. If a month goes by with no entry there, that is real information and you should use it.