Moonfin is a cross-platform media client built with Flutter, designed for Jellyfin and Emby users who want a modern, customizable experience across mobile, tablet, and desktop platforms.
| Server | Minimum Version | Status |
|---|---|---|
| Jellyfin | 10.8.0+ | Full support |
| Emby | 4.8.0.0+ | Full support |
| Platform | Minimum Version | Status |
|---|---|---|
| Android | 6.0 (API 23) | Full support |
| iOS | 13.0 | Full support |
| macOS | 10.15 (Catalina) | Full support |
| Windows | 10 | Full support |
| Linux | GTK 3 + CMake 3.13+ | Full support |
- Optimized for phones, tablets, and desktop environments from one Flutter codebase
- Responsive navigation patterns tuned for touch on mobile and larger layouts on desktop
- Platform-specific build/release scripts for Android, iOS, Linux, macOS, and Windows
All video and audio playback is powered by media_kit (libmpv) across every platform. This gives Moonfin broad codec coverage without relying on platform-specific media frameworks:
| Category | Supported Formats |
|---|---|
| Video | H.264, HEVC (H.265), VP8, VP9, AV1, MPEG-2, MPEG-4, VC-1 |
| Audio | AAC, MP3, FLAC, Opus, Vorbis, AC3 (Dolby Digital), EAC3 (Dolby Digital Plus), DTS, TrueHD, PCM (16-/24-bit), ALAC |
| Containers | MP4, MKV, WebM, AVI, MOV, TS / M2TS, WMV / ASF |
| Subtitles | SRT, ASS / SSA, VTT / WebVTT, TTML, SUB; bitmap (PGS, DVB, VobSub) on desktop |
| HDR | Dolby Vision, HDR10+, HDR10, HLG - automatic detection and signaling |
| HW Accel | VA-API, QSV, NVENC, VideoToolbox, V4L2, RKMPP |
Media can be downloaded in its original format (bit-for-bit copy) or server-transcoded to a smaller file before saving. Transcoded downloads use HEVC (H.265) video + AAC audio in an MP4 container, which delivers roughly 50% smaller files compared to H.264 at equivalent perceived quality.
| Preset | Resolution | Video Bitrate | Audio Bitrate | Est. Size/hr |
|---|---|---|---|---|
| Original | Source | Source | Source | Varies |
| High | 1080p | 4 Mbps | 192 kbps | ~1.8 GB |
| Medium | 720p | 2 Mbps | 128 kbps | ~950 MB |
| Low | 480p | 1 Mbps | 96 kbps | ~490 MB |
| Mobile | 360p | 500 kbps | 64 kbps | ~250 MB |
Downloaded files are organized automatically:
Movies/{Title (Year)}/
TV/{Series}/Season NN/
Music/{Artist}/{Album}/
Audiobooks/{Author}/{Collection}/
Books/{BookName}/
Android downloads are saved under the app's external storage directory (Android/data/com.moonfin.app/files/Moonfin/). This uses getExternalStorageDirectory(), which provides more space than internal app storage and avoids counting against the device's internal storage quota. If external storage is unavailable, it falls back to the app's internal documents directory.
iOS downloads are saved under the app's Documents directory (Documents/Moonfin/). This is the standard sandboxed location iOS provides for user-generated content. Files here are included in iCloud/iTunes backups by default and persist across app updates.
Desktop downloads are saved under the application support directory by default, but users can configure a custom download path in settings.
Resume position tracking, offline subtitle support, and full playback controls work identically for downloaded content.
Ebooks - Read EPUB, MOBI, AZW/AZW3, and PDF directly in-app. Comic archives (CBZ, CBR, CB7, CBT) render with two-page spread on desktop, zoom/pan, and page caching. Reader themes include Light, Dark, and Sepia.
Audiobooks - Play M4B and multi-file audiobooks with chapter navigation, position bookmarks, and resume tracking. Download entire audiobooks for offline listening with the same quality presets as video.
Books and audiobooks download in their original format - no transcoding.
- Native Google Cast, DLNA, and AirPlay integration paths
- Playback controls with track selection, delay adjustments, and picture-in-picture support
- Queue/next-up behavior that works across local and remote playback states
- Built-in admin dashboard screens directly in the client
- Server operations views for settings, users, libraries, logs, devices, and analytics
- Reduced context switching when managing a server from a mobile or desktop client
- Connect to multiple Jellyfin and/or Emby servers simultaneously under one UI
- Unified library view merges content from all servers - browse, search, and play without switching
- Libraries display as "Library Name (Server Name)" when multiple servers are active
- Aggregated Continue Watching, Next Up, and Latest rows pull from every connected server
- Toggle unified mode on or off per preference; works independently per server type
- Rotating featured hero content on the home screen with rich backdrop presentation
- Includes quick-glance metadata like ratings, genres, runtime, and overview
- Designed to highlight trending and library content without leaving the home flow
- Group watch support with synchronized playback across participants
- SyncPlay entry points are available in app navigation and settings-driven controls
- Built for shared viewing sessions while preserving local playback controls
- Optional MDBList ratings support with multiple rating sources shown in item details
- TMDB episode ratings support for episodic content where available
- Rating display can be customized through settings
- Trickplay preview support for improved scrubbing and seek navigation
- Media segment handling for intros, credits, and other detected segments
- Playback controls remain consistent across streaming and offline scenarios
- Built-in Live TV browsing and playback screens
- Electronic Program Guide (EPG) style scheduling views
- DVR recordings and schedule management interfaces integrated in-app
- Trailer playback support directly in-app from item detail contexts
- Uses resilient trailer source resolution for better playback reliability
- Lets users preview content without leaving the Moonfin experience
- Fine-grained subtitle and audio delay adjustment during playback
- Pre-playback track selection and ongoing track control support
- Includes features like still-watching flow support and next-up handling
- Reorder and toggle home sections (for example, Continue Watching, Next Up, Latest)
- Home row preferences are compatible with plugin-backed sync workflows
- Lets users tailor discovery layout to their personal viewing habits
- PIN code configuration support for sensitive settings/actions
- Parental controls include configurable content/rating restrictions
- Works alongside account and preference-level customization paths
- Built-in app update checks with configurable cadence behavior
- Surfaces update availability in-app to reduce manual version tracking
- Designed to keep clients current across supported platforms
Download platform artifacts from the Releases page.
- Primary output: APK (
Moonfin_Android_v<version>.apk) - Optional output: App Bundle (
Moonfin_Android_v<version>.aab) - Recommended for Android phones and tablets
- Signed IPA output:
Moonfin_iOS_v<version>.ipa - Unsigned IPA output (default workflow):
Moonfin_iOS_v<version>_unsigned.ipa
- Windows installer output:
Moonfin_Windows_v<version>.exe - macOS DMG output:
Moonfin_macOS_v<version>.dmg - Linux packaging via tarball/AppImage/deb/rpm/snap/flatpak (depending on tools)
- Linux package outputs:
Moonfin_Linux_v<version>.<ext> - macOS app bundle build support
- Flutter SDK: stable channel, 3.41+
- Dart SDK: 3.11+ (see
environment.sdkinpubspec.yaml)
git clone https://github.com/Moonfin-Client/Mobile-Desktop.git
cd Mobile-Desktop
flutter pub getUse these commands for contributor/local testing builds.
flutter build apk --releaseflutter build ios --debugflutter build linux --releaseflutter build macos --releaseflutter build windows --release- Use Flutter stable and keep dependencies up to date
- Validate changes with
flutter analyzebefore PRs - Test playback and navigation flows on at least one target platform
- Prefer small, focused commits for easier review
We welcome contributions to Moonfin.
- Check existing issues before opening new ones.
- Discuss major feature changes before implementation.
- Follow existing code style and project conventions.
- Test your changes on relevant platforms.
- Keep PR scope focused and clearly documented.
- Fork the repository.
- Create a branch (
git checkout -b feature/your-change). - Implement and test your changes.
- Run static checks (
flutter analyze). - Open a PR with context, screenshots/logs when useful, and test notes.
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Upstream Jellyfin: jellyfin.org
Moonfin is built on the work of:
- Jellyfin Project
- Jellyfin client contributors
- Moonfin contributors
- MakD - Original Jellyfin-Media-Bar concept that inspired our featured media bar
- MediaLyze The Admin analytics UI was inspired by this open-source project
This project is licensed under GPL v2. See LICENSE for details.
Moonfin is an independent project and is not affiliated with the Jellyfin project.
← Back to main Moonfin project

