- Kotlin 55.9%
- Swift 37.5%
- Rust 5.2%
- Python 0.7%
- PowerShell 0.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github/workflows | ||
| app | ||
| audio-engine | ||
| design | ||
| desktop | ||
| desktop-design | ||
| docs/images | ||
| fdroid | ||
| gradle | ||
| ios | ||
| scripts | ||
| shared/core | ||
| subsonic | ||
| tools | ||
| .gitattributes | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| README.md | ||
| settings.gradle.kts | ||
Octo is a proxy that adds discovery to your Navidrome server and works with any Subsonic app. These are players made to go with it: the music Octo finds sits beside your library, and keeping a song is just Add to library.
With Octo
- Add songs to your library. Press + on a song, an album or a search result, and it joins your library.
- One search for everything. Your music comes first, then what Octo found, and all of it plays straight away.
- Whole albums. Every track shows, the ones you have are marked, and one press adds the rest.
- Stations on Home, each with its own painted cover, and radio that reaches past your library.
- Honest labels. A song you don't own is marked as such until you add it.
- Import your lists. Bring playlists and liked songs from Spotify, Apple Music and more as a TuneMyMusic file, or add a public Spotify playlist or album link, to see what your library has of each list, keep one as a playlist, and let Octo fetch the rest a few songs an hour. On the desktop it is in the sidebar; on the phone, under Settings, Server. Needs an Octo with imports.
These need Octo 2026.09.29 or newer.
With any Subsonic server
With Navidrome or any Subsonic server, both apps are full players for the music you have:
- Browse by artist, album, song, genre or folder, with favorites, ratings and playlists shared with your other apps.
- Synced lyrics, gapless playback, an equalizer with presets, ReplayGain and a sleep timer.
- A queue that follows you between the desktop and the phone, and plays reported to your server.
The desktop app
For Windows and Linux. Several servers with one-click switching, a song table you can sort and resize, Ctrl+K to search or run a command from anywhere, live lists built from rules, Library health, a mini player, and media keys.
![]() An album, with the songs you have marked | ![]() The full player |
![]() Search: your music, then what Octo found | ![]() An artist |
![]() Live lyrics, word by word | ![]() The queue beside an album |
![]() Albums | ![]() Ctrl+K from anywhere |
![]() A live list | ![]() Library health |
![]() A station with its painted cover | ![]() Genres |
The Android app
For Android 10 and newer. Your phone's music and your server's make one library. Download songs, albums and playlists for offline, set streaming quality for Wi-Fi and mobile data, and use the notification, lock screen and widgets.
![]() Home | ![]() Search | ![]() An album | ![]() Songs you can add |
![]() An artist found online | ![]() The player | ![]() Live lyrics | ![]() Up next |
![]() Albums | ![]() An artist in your library | ![]() Library health |
Install
Download the latest release:
- Octo for Windows and Linux: an
.msior portable zip for Windows, and a.deb,.rpmor portable zip for Linux. The Windows installer needs no administrator rights. It isn't code signed yet, so Windows asks the first time you open Octo. - Octo for Android: an
.apkfor Android 10 and newer. Allow your browser or file manager to install apps when Android asks. - Or add Octo's F-Droid repository in F-Droid, Droid-ify or Neo Store, and the Android app updates there like any other.
New versions appear on the Octo Releases page, tagged desktop-v and android-v.
Build from source
You need JDK 17. The Android app also needs the Android SDK (platform 37). The desktop app plays through its own audio engine, written in Rust, so it needs Rust 1.88 or newer and:
- Windows: the MSVC build tools.
- Linux:
libasound2-devandpkg-config(Fedora:alsa-lib-devel), plusfakerootandrpmto build packages.
git clone https://github.com/winters27/octo-player.git
cd octo-player
# Android: a debug APK, which installs beside a release build
./gradlew :app:assembleDebug
# Desktop: run it
./gradlew :desktop:run
# Desktop installers, each on its own system
./gradlew :desktop:packageMsi :desktop:packagePortableZip # Windows
./gradlew :desktop:packageDeb :desktop:packageRpm :desktop:packagePortableZip # Linux
# Tests
./gradlew :shared:core:allTests :app:testDebugUnitTest :desktop:test
(cd audio-engine && cargo test)
- The debug APK lands in
app/build/outputs/apk/debug/, and desktop installers indesktop/build/compose/binaries/main/. ./gradlew :app:assembleReleasesigns the APK whenOCTO_ANDROID_KEYSTORE,OCTO_ANDROID_KEYSTORE_PASSWORD,OCTO_ANDROID_KEY_ALIASandOCTO_ANDROID_KEY_PASSWORDare set, and leaves it unsigned otherwise.-Pocto.noSystemShim=truebuilds the desktop app without its media-controls helper, which is also written in Rust.
| Folder | What's there |
|---|---|
app/ |
the Android app |
desktop/ |
the desktop app |
shared/core/ |
what both apps share: lyrics, sound, queue rules, song matching, covers, updates |
subsonic/ |
the Subsonic and OpenSubsonic client, with Octo's extensions |
design/, desktop-design/ |
colours, type, icons and fonts |
audio-engine/ |
the desktop audio engine (Rust) |
License
Credits
- Inter by Rasmus Andersson, under the SIL Open Font License 1.1 (licence).
- Phosphor Icons, under the MIT License (licence).
























