edde746 f3795d49eb feat(player): answer transport keys with transient indicators, not the chrome
Pressing pause or seeking while the player's on-screen controls were hidden raised
the entire OSD, covering the subtitles the viewer was rewinding to read. Transport
keys now answer with a transient indicator and leave the chrome down; Select,
D-pad Center and a centre tap remain the deliberate way to bring the controls
back.

Play/pause confirms with an icon-only translucent disc at the centre of the frame,
72px around a 44px glyph, which grows and fades in, holds half a second at rest,
then runs the same motion in reverse. Seeking shows the amount plus a single
chevron on the same line at the edge it travels toward, with no backdrop at all:
anything large enough to read as a surface is large enough to cover picture and
subtitles, so legibility comes from shadows instead. Only the chevron moves, and
it eases outward across most of its cycle and returns briefly, holding a visible
opacity floor rather than blinking out. Type is scaled per platform, since a
television is read from across the room. The existing text pill stays for genuine
notices - rate changes, chapter titles, zoom, errors - because an earlier centred
pill overlapped ASS \an8 subtitle placement, which is the readability complaint
this feedback exists to answer.

Every relative seek entry point now shares one coalescing primitive. The keyboard
shortcuts fell through to KeyboardShortcutsService and previously reported
nothing, and both they and the remote's chapter fallback rebased each press off
player.state.position, so a burst against a slow backend pinned every request near
one step while the indicator climbed to a total that was never committed. A
released key commits its pending target immediately and resets the acceleration
tier, including on live TV where seeks bypass the accumulator. A chapter seek with
nowhere to go, past the last chapter or already at the start, no longer announces a
jump it does not perform.

Rewind-on-resume follows the resolved intent rather than the current state, so a
directed pause on an already-paused video neither resumes nor rewinds. Indicators
carry their own liveRegion semantics nodes: their labels previously merged into the
full-screen "show playback controls" target, corrupting its accessible name, and
they keep announcing "Paused"/"Playing" and the seek amount from icon-only visuals.

close #1676
2026-07-29 04:24:04 +02:00
2026-07-27 23:11:05 +00:00
2025-10-22 12:45:29 +02:00
2026-05-18 22:52:51 +02:00
2025-10-22 12:45:29 +02:00
2025-10-22 12:45:29 +02:00
2026-07-27 22:18:10 +00:00

Plezy Logo Plezy

A modern client for Plex and Jellyfin on desktop, mobile, and TV. Built with Flutter for native performance and a clean interface.

Website · Screenshots · Download · Contributing · License

Plezy mobile screenshots

Download

Download on the App Store Get it on Google Play Available at the Amazon App Store

Platform Download
Windows Installer (x64, arm64) · Portable x64 · Portable arm64
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
  • Discover hub — Continue Watching, Next Up, trending, and recommendations
  • Cross-server search
  • Filtering, sorting, and alphabetical jump navigation
  • Extras — trailers, deleted scenes, behind-the-scenes

Playback

  • Wide codec support (HEVC, AV1, VP9, and more)
  • HDR and Dolby Vision1
  • Full ASS/SSA subtitles with customizable styling
  • Online subtitle search & download2
  • Audio & subtitle choices remembered per title
  • Progress sync and resume
  • Auto-play next episode with skip intro / skip credits
  • Chapter navigation with thumbnail scrub previews
  • Playback speed, audio sync offset, sleep timer
  • Ambient lighting and GLSL shader presets3
  • Picture-in-Picture4
  • Refresh-rate matching5
  • External player launch (VLC, MX Player, etc.)

Live TV & DVR

  • Live TV channel browsing with favorites
  • DVR support with EPG guide, recording rules, and scheduled recordings2
  • Multi-server Live TV support where available

Downloads & Offline

  • Download media for offline viewing
  • Background queue with pause / resume
  • Sync rules for automatic downloads
  • Offline browsing with watch state sync-back on reconnect

Watch Together

  • Synchronized playback with friends
  • Real-time play / pause / seek sync

Integrations

  • Discord Rich Presence6
  • Trakt, MyAnimeList, AniList, and Simkl tracking & rating
  • Plezy Remote — control desktop and TV from mobile
  • Watch Next row

Platform & Customization

  • Desktop, mobile, and TV — full D-pad, keyboard, and gamepad support
  • Customizable keyboard shortcuts6
  • Metadata and artwork editing
  • Settings import/export
  • Localized in English plus 14 translations

Building from Source

Prerequisites

  • Flutter SDK 3.38.4+
  • A Plex account or Jellyfin 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

Contributing

See CONTRIBUTING.md for development workflow, formatting, tests, and translation guidelines.

License

Plezy is licensed under GPL-3.0.

Acknowledgments


  1. Not available on Linux. ↩︎

  2. Plex only. ↩︎

  3. Not available on iOS or tvOS. ↩︎

  4. Android, iOS, and macOS. ↩︎

  5. Windows, Android, and tvOS. ↩︎

  6. Desktop only. ↩︎

S
Description
Modern cross-platform Plex & Jellyfin client built with Flutter
Readme GPL-3.0
223 MiB
Languages
Dart 73.8%
GLSL 13.3%
Kotlin 4.3%
C++ 2.3%
Python 1.7%
Other 4.3%