The best native music player for your Jellyfin or Emby server - on macOS, Windows, Linux, iOS(including CarPlay) and Android.
JellyBox is an unofficial, audio-only client for Jellyfin and Emby. It focuses on doing one thing well: making your own music library feel like a modern streaming app - fast browsing, offline downloads, lyrics, and artwork-driven theming - with a UI built for each platform rather than a single stretched layout.
Important
JellyBox is a client, not a server. You need access to a running Jellyfin or Emby server with a music library on it.
| Platform | Format | |
|---|---|---|
| iOS / iPadOS / macOS | App Store | |
| macOS | .dmg (signed & notarized) |
Latest release |
| Windows | Installer .exe or portable .zip |
Latest release |
| Linux | .AppImage, .deb, .rpm or .tar.gz bundle (x64 & arm64) |
Latest release |
| Android | Google Play | |
| Android | .apk (sideload) |
Latest release |
![]() |
![]() |
| Home | Time-synced lyrics |
![]() |
![]() |
![]() |
![]() |
![]() |
| Home | Now playing | Lyrics | Artist | Downloads |
Library & browsing
- Connect to Jellyfin or Emby servers, and switch between them without signing out
- Jellyfin Quick Connect - sign in from your phone or desktop without typing a password
- Browse albums, artists, genres, playlists and songs across multiple music libraries
- Search everything at once, or filter to playlists, albums, artists or songs
- Artist pages with biography and full discography
- Favourite tracks, synced back to your server
- Create playlists and add tracks to them from anywhere in the app
- Genre mixes on the home page, built from the genres you actually play - see Normalizing your music genres if your genre tags are messy
- Home page with recently played, recently added and personalised mixes
Playback
- Playback memory - app remembers your queue and playback position between restarts
- Time-synced lyrics overlay
- Queue management with shuffle, repeat and a randomised "surprise me" queue
- Per-connection streaming profiles with automatic transcoding when a codec isn't supported natively
- Audio quality badge, so you always know whether you're getting the original file
- Landscape now-playing layout on phones
Offline
- Download albums and tracks for offline listening
- Full offline mode - access to your downloaded tracks even if you're on plane.
Look & feel
- Colour scheme generated from the current album artwork
- Studio Mode - a full screen animated mode for aesthetic feel(see screenshots)
Desktop & system integration
- Media keys and global keyboard shortcuts
- MPRIS support on Linux (works with GNOME/KDE media widgets and
playerctl) - Windows media overlay - now playing with artwork and transport controls in the system media popup, plus media key support
- AirPlay and system output routing on macOS and iOS
- Cast to DLNA / UPnP renderers (smart TVs, network speakers and receivers)
- Lock screen and notification controls on iOS and Android
- In-app changelog, so you can see what landed in each release
- Apple CarPlay - currently in beta stage.
- Android Auto - in development
macOS does not let an app read media keys without permission. On first use JellyBox will point you at System Settings → Privacy & Security → Accessibility; enable JellyBox there. If it isn't in the list, add it with the + button.
The installer is unsigned, so SmartScreen will warn on first run - choose More info → Run anyway. The portable zip has no installer and can be run from anywhere.
Install from Google Play, or sideload the APK from the releases page. For the APK you'll need to allow installs from your browser or file manager.
The release bundle expects a few shared libraries. On Debian/Ubuntu:
sudo apt-get install libmpv-dev mpv libsecret-1-dev libsqlite3-dev libjsoncpp-dev libcurl4-openssl-dev libdbus-1-devNote: Recently I bundled libs with app, but I need more folks to actually test it on different distros.
Prerequisites - Flutter with Dart SDK 3.8 or newer, plus the toolchain for whichever platform you're targeting (Xcode, Android Studio, or the Linux packages above).
git clone https://github.com/avdept/JellyBoxPlayer.git
cd JellyBoxPlayer
flutter pub get
dart run build_runner build --delete-conflicting-outputs # freezed, json_serializable, retrofit
flutter run # then pick a target deviceRun the tests with flutter test, and the analyzer with flutter analyze - CI runs both on every push.
Codegen is needed whenever you touch a model, DTO or API client; those *.g.dart and *.freezed.dart files are generated, not hand-edited.
Bug reports, feature requests and pull requests are all welcome - see CONTRIBUTING.md for the workflow.
GNU AGPL-3.0 © ProdigyTech Inc.













