The apps

There is one product, and it is a web page. Every phone app is a thin shell around that same page, and code is written natively only where a web page cannot do the job: the audio on Android, and the whole of the Apple TV, which has no web view at all.

One web app, everywhere

The server embeds a single-page web app (internal/webui/assets): app.js for the library, the player and settings, reader.js for books, and a small service worker. A browser on a computer, a phone's home screen, the Android app, the iPhone app and an Android TV all show exactly that page. A feature built once - a new radio station, a look for Now Playing, a category pill - arrives on every one of them the moment the server is updated.

Every "client app" multiplies the work: a feature has to be built once per platform from then on, and the versions drift apart. Television apps in particular are where projects like this go to die. So the rule is the opposite of the usual: the page is the product, and a shell only adds what the page physically cannot do from inside a browser.

What a page cannot do is mostly about audio. A browser tab can be stopped when the phone locks, cannot always keep a lock-screen player, and on Android a web view has no Media Session API at all. Those are the gaps the native code fills, and nothing else.

What each app is

AppWhat it isNative parts
Web appThe page itself, in any browser. Installable to a home screen (a PWA) from the secure address.None
AndroidA Kotlin shell around the page (android/)Songs play through Media3's ExoPlayer in a media session service; photo backup; the system bars and camera cutout
Android TV, Google TV, Fire TVThe same Android app; the page switches to a TV modeAs Android, plus a TV banner and launcher entry
iPhoneA Swift shell around the page (ios/SoundStorm)Saved servers, dialogs, status bar, photo backup; native audio is the planned next stage
Apple TVA native SwiftUI app (ios/SoundStormTV) talking to the same /apiEverything: tvOS has no web view

All of them sign in with the same session cookie and speak the same HTTP API. None of them ever talks to a backend directly; every song, film and picture comes through the SoundStorm server.

In this section

The web appTabs and pills, Home, holding and selecting, dropping files, offline downloads, the service worker, installing it. Now Playing and the looksQueue, swipes, lyrics, the play orb, fifteen looks, beats and lightning, gapless, leveling. The readerfoliate-js, positions as CFIs, untrusted book content, read-along following the audiobook. AndroidA web view shell with native audio, photo backup and the same app on TVs. iPhoneThe shell, why it is not a native rewrite, and what comes next. TVsThe page's TV mode on Android TV, and the native Apple TV app.