Runic

Runic plays a self-hosted music library from Navidrome, Jellyfin, Airsonic, or any other OpenSubsonic-compatible server. It is a native Android app — Kotlin and Jetpack Compose — rather than a web wrapper, and it is built around the way a personal library is actually browsed.

Library and navigation

Albums, artists, playlists, genres, music folders, and favourites each have their own view. Search is available across the library, and every list can be sorted and filtered client-side: recent, frequent, random, newest, starred, A–Z, or by genre.

Pinch-to-zoom changes the density continuously, from compact lists to large grids, and settles into whichever layout is closest when the gesture ends. A small toolbar on each library page holds sort, filter, and view-mode controls. The interface follows Material 3, with light, dark, and system themes.

Playback

Playback uses Media3 / ExoPlayer with background support and a media session for notification and lock-screen controls. A mini-player is present on every screen; Now Playing adds a seek bar, queue, lyrics, and a clear-queue action. The queue is persisted on the server, so it survives reinstall and moves between devices. Star, rating, and scrobbling are written back to the server.

Discovery

“Similar playlists” builds a queue from similar artists, using Last.fm or ListenBrainz as the seed source with an optional auto-extend mode. When the similar-artist source runs dry, it falls back to the server’s own similar songs, then to artists, albums, and genres already in the queue. Internet radio stations can be added, edited, and played from the same app.

Compatibility

Runic targets Android 7.0 and later, compiles against SDK 36, and speaks the OpenSubsonic REST API with token authentication. It works with Navidrome, Jellyfin, Airsonic, and other compatible servers.

Built with

  • Kotlin
  • Jetpack Compose
  • Media3 / ExoPlayer
  • OpenSubsonic API
← All projects