A modern reactive media player for GNOME, built with Rust and Relm4 for performance and reliability.
Warning
Relm4 Migration In Progress (~85% Complete): Reel is being migrated to a fully reactive Relm4 architecture. Core functionality is working but expect some UI polish issues and missing features as we complete the transition.
Reel is a native Linux media player that brings your Plex and Jellyfin libraries to the GNOME desktop. Written entirely in Rust with a reactive Relm4 UI, it leverages the language's performance and memory safety to deliver a fast, reliable media experience without the overhead of web technologies.
| Main Window | Show Details |
|---|---|
| Video Player |
|---|
| Feature | Description |
|---|---|
| 📴 Offline-First | Full library metadata synced to local SQLite - browse your entire collection without internet (downloads coming soon) |
| 🦀 Pure Rust + Relm4 | Reactive UI with AsyncComponents, Factory patterns, and Worker components for background tasks |
| 🔌 Multi-Backend | Simultaneous Plex and Jellyfin with connection monitoring, PIN profiles, and database credential storage |
| 💾 Intelligent Cache | Database-driven chunk cache with progressive streaming, smart cleanup, and replay of watched content |
| 🔍 Full-Text Search | Tantivy-powered instant search across all media with lazy-loaded cast/crew metadata |
| 🎥 Dual Players | MPV (Linux default) and GStreamer (macOS/fallback) with skip intro/credits and progress sync |
| ⚙️ Live Config | Hot-reload configuration without restart, hardware acceleration support |
| 🎨 Native GNOME | Relm4/libadwaita with responsive design and seamless desktop integration |
This project uses Nix flakes to manage the development environment, ensuring all dependencies (including GStreamer plugins) are properly configured.
- Nix with flakes enabled
- Git
# Clone the repository
git clone https://github.com/arsfeld/reel.git
cd reel
# Enter the Nix development shell
nix develop
# Build the Rust project
cargo build
# Run the application
cargo runInside the Nix shell:
# Format Rust code
cargo fmt
# Run Clippy lints
cargo clippy
# Run test suite
cargo test
# Build optimized release binary
cargo build --releaseDownload the latest release from the Releases page.
Warning
AppImage Support Temporarily Removed: AppImage builds have been removed due to packaging bugs. The application binary is fully functional and can be used as-is, provided you have the required dependencies installed (GTK4, libadwaita, GStreamer, and libmpv2 on Linux). Contributions to restore AppImage support are welcome!
Note
Pre-built packages are experimental: These packages are automatically generated and may not be thoroughly tested. If you encounter issues, consider building from source using the Nix development environment.
- Ubuntu/Debian: Ubuntu 24.04 LTS or newer (packages built against Ubuntu 24.04)
- Fedora: Fedora 40 or newer
- Other distros: Use the standalone binary or build from source for maximum compatibility
| Library | Minimum Version | Notes |
|---|---|---|
| libadwaita | 1.5 | UI toolkit |
| Relm4 | 0.10.0 | Reactive UI framework |
| GStreamer | 1.20+ | Media framework with plugins-bad |
| MPV | libmpv2 0.29+ | Primary video player backend (Linux only) |
| glibc | 2.35+ | With 64-bit time_t support |
| OpenSSL | 3.0+ | TLS/SSL support |
Note
For older distributions: If your system doesn't meet these requirements (e.g., Ubuntu 22.04, Fedora 39), you can use the standalone binary with manually installed dependencies, or build from source using the Nix development environment.
# Download the latest standalone binary (using getbin.io)
curl -fsSL https://getbin.io/arsfeld/reel?os=linux -o reel
chmod +x reel
./reel
# Note: Requires GTK4, libadwaita, and GStreamer to be installed
# MPV (libmpv2) is only required on Linux# Download and install the latest .deb package (requires Ubuntu 24.04+)
# Get the latest release URL and download
curl -s https://api.github.com/repos/arsfeld/reel/releases/latest \
| grep "browser_download_url.*amd64\.deb" \
| cut -d '"' -f 4 \
| xargs wget -O reel.deb
sudo dpkg -i reel.deb
sudo apt-get install -f # Install dependencies if needed# Download and install the latest .rpm package (requires Fedora 40+)
# Get the latest release URL and download
curl -s https://api.github.com/repos/arsfeld/reel/releases/latest \
| grep "browser_download_url.*x86_64\.rpm" \
| cut -d '"' -f 4 \
| xargs wget -O reel.rpm
sudo dnf install ./reel.rpm
# or for older systems:
sudo rpm -i reel.rpm# Run directly with Nix flakes
nix run github:arsfeld/reelFlatpak support is available! You can build and install Reel using Flatpak for universal Linux compatibility.
# Build and install using the included script
./scripts/build-flatpak.sh
# Or manually:
flatpak-builder --user --install --force-clean build-dir dev.arsfeld.Reel.json
# Run the application
flatpak run dev.arsfeld.ReelReel is being prepared for official Flathub distribution. See docs/FLATHUB_SUBMISSION.md for submission guidelines and requirements.
Note
📦 Flathub Coming Soon - Once submitted and approved, Reel will be available for easy installation via Flathub on all Linux distributions.
Click to see architecture diagram
Reel uses a pure Relm4 reactive architecture:
UI Layer (src/ui/)
├── AsyncComponents (Pages with data loading)
├── Factory Components (Dynamic collections)
├── Dialogs (Modal interactions)
└── Main Window & Sidebar (Navigation)
↓
Worker Components (src/workers/)
├── ConnectionMonitor (Health checks)
├── SyncWorker (Background sync)
├── SearchWorker (Search operations)
└── ImageLoader (Async image loading)
↓
Service Layer (src/services/)
├── MessageBrokers (Inter-component communication)
├── Commands (Structured async operations)
└── Core Services (Auth, Media, Sync, Source)
↓
Repository Layer (src/db/)
├── SeaORM Entities (Type-safe models)
└── Repository Pattern (CRUD operations)
↓
Backend Trait (src/backends/)
├── MediaBackend Interface
└── Implementations (Plex, Jellyfin, Local)
Key Patterns:
- AsyncComponents: Data-heavy pages with built-in loading states
- Factory Pattern: Efficient virtual scrolling for media grids
- Worker Components: Isolated background tasks (sync, image loading)
- Command Pattern: Type-safe async operations with proper lifecycle
- Tracker Pattern: Minimal re-renders through fine-grained change tracking
- MessageBroker: Replacing custom EventBus for component communication
The entire codebase leverages Rust's type system and ownership model to prevent common bugs at compile time, while the Relm4 reactive system ensures responsive UI updates without manual state management.
Migration Progress: ~85% complete
- Relm4 UI Foundation - ~85% complete migration to reactive component architecture
- Multi-Backend Support - Simultaneous Plex and Jellyfin with OAuth/credential auth
- Media Playback - MPV (Linux) and GStreamer (macOS/fallback) backends with OSD controls and keyboard shortcuts
- Library Browsing - Movies and TV shows with virtual scrolling and pagination
- Continue Watching - Progress tracking and resume functionality
- Offline-First - SQLite metadata cache for instant startup and offline browsing
- File Cache - Chunk-based progressive download with priority queue and fast seeking to any position
- Source Management - Add/remove/test/sync sources with automatic connection failover
- GNOME Integration - Native Relm4/libadwaita UI with proper NavigationSplitView
- macOS: Full support available (GStreamer backend), but pre-built binary coming soon - build from source using Nix for now
- GStreamer has subtitle color artifacts (use MPV player instead on Linux)
- Local files backend is 10% implemented (structure only)
- Some features require server-side support (e.g., Jellyfin chapter markers)
- Downloads - Download media for offline playback on demand
- Transcoding - Server-side transcoding for incompatible formats
- macOS Binary - Pre-built macOS application bundle
- Language: Rust 2021 edition
- UI Framework: Relm4 + libadwaita
- Database: SQLite with SeaORM and typed IDs
- Async Runtime: Tokio with MessageBroker for component communication
- HTTP Client: Reqwest with HTTP/2
- Video Playback: MPV (Linux default) via libmpv2, GStreamer (macOS default, fallback) via gstreamer-rs
- Caching: Three-tier (Memory LRU → SQLite → Backend API)
- Serialization: Serde
- Security: Encrypted SQLite credential storage with legacy keyring migration support
Contributions are welcome! This project uses Backlog.md for task management. To see available tasks and contribute, use the backlog CLI tool after entering the development environment.
- Run
cargo fmtto format your code - Run
cargo clippyto check for common issues - Ensure all tests pass with
cargo test - Update documentation if needed
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
Built with excellent Rust crates and GNOME technologies: