A modern, cross-platform Jellyfin + Jellyseerr client built with Flutter.
Jellyfish is a cross-platform client for Jellyfin with native integration of Jellyseerr for content requests. Designed to deliver a smooth, polished and complete experience on mobile, tablet, desktop and web.
Important
The Jellyfish Bridge Jellyfin server plugin is required for full functionality. Jellyfish does not talk directly to Jellyseerr / Radarr / Sonarr — every call is proxied server-side by the Bridge plugin behind your Jellyfin auth. Without it the app still works as a pure Jellyfin client, but you'll lose: Jellyseerr requests, the "Other titles" rails on details pages, the actor / person filmography augmented with TMDB credits, missing-season pickers, search results from outside the library, and the admin Radarr / Sonarr views. Install it on your Jellyfin server from the Jellyfish-Client repository (one-click via the plugin catalog).
- Native, performant player powered by
media_kit(mpv) with multi-track audio / subtitle support - Chromecast support targeting the official Jellyfin receiver: device discovery, mini-player, full Now Playing screen, audio/subtitle switching from the receiver tracks
- Picture-in-Picture automatic on iOS / Android
- MediaSession integration: lock-screen controls, Bluetooth headsets, CarPlay / Android Auto
- Auto-skip intro / outro via Jellyfin Media Segments
- Subtitle offset, audio sync, gesture-based brightness & volume
- Background playback and smart resume
- Modular Home view: Continue Watching, Next Up, Recent, Favorites, Hidden Gems & custom rails
- Relevance-ranked search (movies & series prioritized, seasons/episodes excluded)
- Rich details: cast, recommendations, streaming providers, ratings
- Calendar of upcoming releases
- Favorites, watched / unwatched marking with multi-client sync
- Background downloads (
background_downloader) - Local Drift database for metadata, sync queue and playback state
- Full offline mode: browse, play and mark items offline, queue replay on reconnection
Jellyseerr integration (requires the Bridge plugin)
- Request movies & series from within the app
- Track requests and their status
- Actor / person pages augmented with TMDB filmography
- Admin dashboard to manage requests (10 admin modules)
- Manage multiple servers and users
- Fast switching between accounts
- Secure storage via
flutter_secure_storage(Keychain / Keystore)
| Area | Tooling |
|---|---|
| UI | Flutter 3.32+, Material 3, google_fonts |
| State | Riverpod 2 (manual pattern, no Riverpod codegen) |
| Routing | go_router |
| Networking | dio, generated Jellyfin & Jellyseerr SDKs (OpenAPI) |
| Storage | drift (SQLite), flutter_secure_storage, shared_preferences |
| Media | media_kit, audio_service, floating (PiP), wakelock_plus |
| Downloads | background_downloader, workmanager |
| Notifications | flutter_local_notifications, timezone |
| Lints | very_good_analysis (strict) |
lib/
├── app/ # Bootstrap, theme, routes
├── core/ # Cross-cutting layers
│ ├── jellyfin/ # Jellyfin client + SDK wrappers
│ ├── seerr/ # Jellyseerr client
│ ├── downloads/ # Download engine + Drift
│ ├── sync/ # Offline → online sync queue
│ ├── playback/ # Player backend, preferences
│ ├── auth/ # Sessions, accounts, secure storage
│ └── ... # cache, network, platform, storage, etc.
├── features/ # Screens grouped by domain
│ ├── home/ library/ search/ details/
│ ├── player/ downloads/ requests/ admin/
│ ├── settings/ accounts/ calendar/ onboarding/
│ └── watch_provider/
├── shared/ # Shared widgets (cards, sheets, etc.)
└── l10n/ # Localization
- Flutter 3.32+ and Dart 3.11+
- Xcode 15+ (iOS / macOS), Android Studio (Android), CMake (Linux/Windows)
- A reachable Jellyfin server with the Jellyfish Bridge plugin installed — required for Jellyseerr / Radarr / Sonarr features (the app falls back to Jellyfin-only mode without it)
- (Optional) a Jellyseerr instance reachable from the Jellyfin host so the Bridge can proxy requests to it
# 1. Clone
git clone https://github.com/<your-user>/jellyfish.git
cd jellyfish
# 2. Dependencies
flutter pub get
# 3. Codegen (Drift, Freezed, json_serializable)
dart run build_runner build --delete-conflicting-outputs
# 4. Run
flutter rundart run flutter_launcher_icons
dart run flutter_native_splash:create| Platform | Status |
|---|---|
| Android | Supported |
| iOS | Supported |
| macOS | Supported |
| Windows | Supported |
| Linux | Supported |
| Web | Experimental |
flutter analyze # Strict lint (very_good_analysis)
flutter test # Unit & widget tests
flutter test integration_test/ # Integration testsSee V1_PLAN.md for the detailed v1 plan.
This project is an unofficial third-party client. Jellyfin and Jellyseerr are independent projects under their own licenses.
Built with flutter and a lot of coffee ☕
