Marking a movie or episode watched left it sitting in Continue Watching with a checkmark, and the only way to shift it was to play it and skip to the end. Continue Watching membership on a MediaBrowser server is derived from UserData.PlaybackPositionTicks alone; Played is never consulted. Marking played normally zeroes that position as a side effect, so the row usually disappears and nothing ever checked that it had. When something writes a position back afterwards the item is left played *and* resumable, which the resume route happily keeps returning forever. markWatched now reads the UserItemDataDto the mark already returns and clears the bookmark itself when the server left one behind, so the postcondition holds however the item got into that state. The follow-up write costs a request only when the invariant is actually broken. The writer putting items there is our own offline queue. insertWatchAction already drops queued progress for an item when the mark is itself queued, but the online mark writes straight to the server and queues nothing, so a progress row recorded earlier survived and replayed afterwards — pending actions go out oldest first — restoring the very position the mark had cleared. The sync service now listens for watch-state events and discards queued progress for that item as the mark lands. Progress recorded after a mark is a rewatch and is queued later, so it is untouched. Plex never showed this because it forwards the recorded-at timestamp and lets the server discard a stale replay; the MediaBrowser stop report has nowhere to put one. Continue Watching also drops the row locally now instead of waiting a round trip for the refetch to confirm it, matching what removal events already did, and marking a season or show takes its on-deck episode with it. Watched items are deliberately still not filtered out of the shelf: Jellyfin keeps Played set when new progress arrives, so a rewatch in progress is indistinguishable from a stuck row, and filtering would hide it. close #1812
Plezy
A modern client for Plex, Jellyfin, and Emby on desktop, mobile, and TV. Built with Flutter for native performance and a clean interface.
Website · Screenshots · Download · Contributing · License
Download
| Platform | Download |
|---|---|
| macOS | DMG (x64, arm64) |
| Linux x64 | .deb · .rpm · .pkg.tar.zst · portable tar.gz |
| Linux arm64 | .deb · .rpm · .pkg.tar.zst · portable tar.gz |
Package managers:
- Nix - Community package by @mio-19 and @MiniHarinn
- Homebrew (macOS):
brew tap edde746/plezy https://github.com/edde746/plezy brew install --cask plezy - AUR (Arch Linux) - Community maintained by @jianglai:
yay -S plezy-bin - WinGet (Windows):
winget install edde746.Plezy
Features
Browse & Discover
- Libraries, collections, and playlists — video and audio
- Discover hub — Continue Watching, Next Up, trending, and recommendations
- Cross-server search across every connected Plex, Jellyfin, and Emby server
- Filtering, sorting, and alphabetical jump navigation
- Folder browsing and folder playback — home-video libraries open in folder view
- Resolution, HDR/Dolby Vision, and audio-format badges on cards and detail pages
- Favorites and unwatched library filters1
- Extras — trailers, deleted scenes, behind-the-scenes
Explore & Requests
- Explore tab — watchlist, trending, popular, and recommendation rows from Plex Discover2 , Trakt, MyAnimeList, AniList, Simkl, and Seerr3
- Search any connected catalog source
- Catalog titles matched back to your own libraries by external ID
- Seerr — request movies and shows with per-season, 4K, and advanced destination options, and see request status inline
- Watchlist sync — add and remove titles on Plex, Trakt, MyAnimeList, AniList, and Simkl from anywhere in the app
Playback
- Wide codec support (HEVC, AV1, VP9, and more)
- HDR and Dolby Vision4
- Direct play, or transcode presets from 240p/320 kbps to 1080p/20 Mbps
- Multi-version switching with per-version file details
- Full ASS/SSA subtitles with customizable styling
- Online subtitle search & download2
- Audio & subtitle choices remembered per title, or follow the server's per-episode selections
- Progress sync and resume
- Auto-play next episode with skip intro / skip credits
- Chapter navigation with thumbnail scrub previews
- Playback speed from 0.25x to 8x, audio sync offset, sleep timer (fixed durations or end of video)
- Video zoom 50-200% with pinch, presets, and hotkeys
- Audio passthrough5 , stereo downmix with center-channel boost, and loudness normalization
- File Info sheet — every version, file, and stream the server reports
- Ambient lighting and GLSL shader presets6
- Picture-in-Picture7
- Refresh-rate matching8
- External player launch (VLC, MX Player, etc.) with progress sync back9
Music
- Music libraries — artist, album, and track browsing with square artwork
- Album and artist screens with play, shuffle, and Instant Mix
- Gapless playback with a full play queue — reorder, remove, play next, add to queue
- Now Playing with synced lyrics10 , persistent mini-player, and sleep timer
- Background playback with lock-screen, media-key, and notification controls11
- Offline playback of downloaded albums and tracks
- Streaming quality presets — Original, 320, 192, or 128 kbps
Live TV & DVR
- Live TV channel browsing, tuning, and favorites
- EPG guide with What's On and per-show schedules
- DVR recording rules, scheduled recordings, and a rememberable recording target library2
- Multi-server Live TV support where available
Downloads & Offline
- Download movies, shows, and music for offline playback12
- Background queue with pause / resume
- Sync rules for automatic downloads, with per-show "Include Specials"
- Offline browsing with watch state sync-back on reconnect
Watch Together
- Synchronized playback with friends
- Real-time play / pause / seek sync
Integrations
- Discord Rich Presence13
- Trakt, MyAnimeList, AniList, and Simkl — ratings, watched sync, and real-time scrobbling14
- Plezy Remote — control desktop and TV from mobile
- Watch Next row and tvOS Top Shelf15
Platform & Customization
- Desktop, mobile, and TV — full D-pad, keyboard, and gamepad support
- Multiple servers at once — Plex, Jellyfin, and Emby side by side
- Profiles with per-profile downloads, watch state, and settings; Plex Home switching with PIN
- Jellyfin and Emby local-server discovery and multiple URLs per server; Quick Connect sign-in16
- TV layout options — corner spotlight backdrop, full-card artwork, and Force TV mode on desktop
- Customizable keyboard shortcuts13
- Metadata and artwork editing
- Settings import/export
- Localized in English plus 21 translations
Building from Source
Prerequisites
- Flutter SDK 3.44.0+
- A Plex account, or a Jellyfin or Emby server with user credentials
Setup
git clone https://github.com/edde746/plezy.git
cd plezy
flutter pub get
scripts/codegen.sh
flutter run
Code Generation
After modifying model classes or other generated sources:
scripts/codegen.sh
After modifying translations:
dart run slang
Local Checks
scripts/ci_checks.sh
To install the same pre-commit checks locally:
scripts/setup_hooks.sh
End-to-end tests (Android emulator plus a Dockerized Jellyfin fixture):
python3 scripts/run_maestro.py basic
Contributing
See CONTRIBUTING.md for development workflow, formatting, tests, and translation guidelines.
License
Plezy is licensed under GPL-3.0.
Acknowledgments
- Built with Flutter
- Supports Plex Media Server, Jellyfin, and Emby
- Playback powered by mpv, MPVKit, Android ExoPlayer, libass-android, and libmpv-android
-
Jellyfin and Emby only. ↩︎
-
Plex only. ↩︎
-
Requires connecting the service under Settings > Services. ↩︎
-
In-app HDR toggle on Windows, macOS, iOS, and tvOS. Dolby Vision on Android and Apple TV. ↩︎
-
Desktop, Android TV, and Apple TV. ↩︎
-
Requires the mpv player backend — unavailable on iOS and tvOS, and Android defaults to ExoPlayer. ↩︎
-
Android, iOS, and macOS — not on Android TV or Apple TV. ↩︎
-
Windows, Android, and tvOS. ↩︎
-
Progress sync on Android. ↩︎
-
Where your server provides lyrics. ↩︎
-
tvOS pauses music when the app is backgrounded. ↩︎
-
Not available on tvOS. ↩︎
-
Desktop only. ↩︎
-
Real-time scrobbling on Trakt and Simkl; MyAnimeList and AniList update on completion. ↩︎
-
Android TV / Fire TV and tvOS. ↩︎
-
Jellyfin only. ↩︎




