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.
Connect a server
Scheme, host and port as three separate boxes. What “Find my music” sweeps, why a server on a different subnet needs the second field, and what to do when a hostname resolves on your desktop but not your phone.
Install
Android 7.0 and up, from Google Play. What the free tier covers, and what the one-time $6.99 Solomorph+ unlock costs and buys.
First run
The Connect screen’s three doors, and when the 30-day trial clock genuinely starts — which is later than you would expect, on purpose.
Troubleshooting
Every heading quotes the app’s own error message exactly. Certificate refusals, “the server answered, but not in Subsonic’s language”, and how to pull an error report with the credentials already masked out.
Audiobooks and podcasts
Why long-form audio gets its own shelf instead of turning up in shuffle, and the one tagging habit that controls it — genre, not folders.
Downloads and offline
What “plays without the network” means, downloading a whole album from the hero rather than twelve menus, and why the covers travel with the audio. Solomorph+ or the trial.
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.