plezy-relay

plezy-relay

Docker app from BBergle's Repository

Overview

Self-hosted relay server for Plezy's "Watch Together" feature. Plezy is a cross-platform Plex & Jellyfin client. Watch Together syncs playback between viewers through a small relay server, and this container runs your own instead of using the public one. This container has NO web interface. After starting it, open Plezy on each device and set Settings - Watch Together Relay to: http://YOUR-Unraid-IP:9977 The URL must be http:// or https://. To watch together, everyone must be using the same relay. To reach the relay from outside your LAN, put a reverse proxy with TLS in front of it (it has no TLS of its own), give clients the proxy's https:// address, and set TRUSTED_PROXY_CIDRS so rate limiting sees real client IPs. Image tags mirror Plezy app releases: tag 2.19.1 is the relay as shipped with Plezy 2.19.1. Upstream advises deploying the updated relay BEFORE updating your clients. Use the Repository dropdown to pin a specific version. UNOFFICIAL: this is a community build of the server/ directory of github.com/edde746/plezy. Not affiliated with or endorsed by the Plezy project.

Plezy Logo 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

Plezy mobile screenshots

Download

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

Platform Download
macOS DMG (x64, arm64)
Linux x64 .deb · .rpm · .pkg.tar.zst · .flatpak · portable tar.gz
Linux arm64 .deb · .rpm · .pkg.tar.zst · .flatpak · portable tar.gz
Install with a package manager

macOS — Homebrew

brew tap edde746/plezy https://github.com/edde746/plezy
brew install --cask plezy

Windows — WinGet

winget install edde746.Plezy

Linux — Flatpak

Install Flatpak with your distribution's package manager, download the bundle for your architecture above, then run:

flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --user flathub org.freedesktop.Platform//25.08
flatpak install --user ./plezy-linux-x64.flatpak
flatpak run com.edde746.plezy

On arm64, install plezy-linux-arm64.flatpak.

Sandbox, playback, and folder access
  • Not on Flathub — the remote supplies the Freedesktop runtime only.
  • Video playback needs a Wayland session; a pure X11 session shows the interface but cannot create the video plane.
  • No host or home filesystem access; app data lives in ~/.var/app/com.edde746.plezy/. Add host folders through the desktop file chooser portal, and keep download folders writable.
  • Network, display, audio, and device access are enabled. --device=all (Flatpak 1.14 compatibility) exposes more than GPUs and controllers; session-bus access stays filtered.

Arch Linux — Pacman

Distribution package.

sudo pacman -S plezy

Fedora / Red Hat — DNF

Installation instructions · Community repository by @aldobarr.

Nix

Community package maintained by @mio-19 and @MiniHarinn.

aerynOS — Moss

Distribution package.

sudo moss it 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 filters[^mb]
  • Extras — trailers, deleted scenes, behind-the-scenes

Explore & Requests

  • Explore tab — watchlist, trending, popular, and recommendation rows from Plex Discover[^plex], Trakt, MyAnimeList, AniList, Simkl, and Seerr[^connect]
  • 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 Vision[^hdr]
  • 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 & download[^plex]
  • 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 passthrough[^pass], 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 presets[^mpv]
  • Picture-in-Picture[^pip]
  • Refresh-rate matching[^rrm]
  • External player launch (VLC, MX Player, etc.) with progress sync back[^android]

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 lyrics[^lyrics], persistent mini-player, and sleep timer
  • Background playback with lock-screen, media-key, and notification controls[^bgaudio]
  • 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 library[^plex]
  • Multi-server Live TV support where available

Downloads & Offline

  • Download movies, shows, and music for offline playback[^dl]
  • 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
  • Host handoff when the relay and every connected peer support safe transfers
  • Automatic reconnect authenticates retained room membership; it never silently joins a reused room code.

Self-hosted relays must support authenticatedResume for recovery. Deploy the updated relay before updating clients. Older relays still accept explicit create/join, but failed recovery requires joining or creating a room again.

Integrations

  • Discord Rich Presence[^desktop]
  • Trakt, MyAnimeList, AniList, and Simkl — ratings, watched sync, and real-time scrobbling[^rt]
  • Plezy Remote — control desktop and TV from mobile
  • Watch Next row and tvOS Top Shelf[^shelf]

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-in[^jf]
  • TV layout options — corner spotlight backdrop, full-card artwork, and Force TV mode on desktop
  • Customizable keyboard shortcuts[^desktop]
  • Metadata and artwork editing
  • Settings import/export
  • Localized in English plus 21 translations

[^jf]: Jellyfin only. [^mb]: Jellyfin and Emby only. [^plex]: Plex only. [^connect]: Requires connecting the service under Settings > Services. [^hdr]: In-app HDR toggle on Windows, macOS, iOS, tvOS, and Linux — Linux needs a colour-managed Wayland compositor. Dolby Vision on Android and Apple TV. [^pass]: Desktop, Android TV, and Apple TV. [^mpv]: Requires the mpv player backend — unavailable on iOS and tvOS, and Android defaults to ExoPlayer. [^pip]: Android, iOS, and macOS — not on Android TV or Apple TV. [^rrm]: Windows, Android, and tvOS. [^android]: Progress sync on Android. [^lyrics]: Where your server provides lyrics. [^bgaudio]: tvOS pauses music when the app is backgrounded. [^dl]: Not available on tvOS. [^desktop]: Desktop only. [^rt]: Real-time scrobbling on Trakt and Simkl; MyAnimeList and AniList update on completion. [^shelf]: Android TV / Fire TV and tvOS.

Building from Source

Prerequisites

  • Flutter SDK 3.47.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
Packaging a Flatpak bundle

Packages an already fully resolved Linux release bundle — pinned libmpv and bundled libraries included, not a Flathub source-build manifest. Run it on Linux, on the same architecture as the bundle, after following the bundle preparation steps in the Linux release workflow: flutter build linux alone does not produce all the required bundled libraries.

Install the packaging tools (Debian/Ubuntu shown) plus the native-architecture SDK and runtime:

sudo apt-get update
sudo apt-get install -y flatpak flatpak-builder imagemagick
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --user flathub org.freedesktop.Platform//25.08 org.freedesktop.Sdk//25.08

BUNDLE_DIR=build/linux/x64/release/bundle
python3 linux/packaging/build-flatpak.py --bundle "$BUNDLE_DIR" --arch x64 --output "$PWD"

That writes plezy-linux-x64.flatpak, installable with the Flatpak commands above; on arm64, use the prepared arm64 bundle directory and --arch arm64. Package from the checkout matching the bundle, since the version comes from pubspec.yaml.

Cross-architecture packaging needs native Flatpak tools, a registered binfmt interpreter, and the target SDK/runtime installed with flatpak install --user --arch=x86_64 (or aarch64) — never run Flatpak's namespace tools under emulation. Pass --arch x64 or --arch arm64 to the checker and the matching Flatpak architecture to flatpak run --arch=....

Check the installed package against the runtime (not just the SDK), then launch it on a Wayland desktop and exercise streaming, audio, downloads/offline playback, and file chooser portals:

python3 linux/packaging/check-flatpak.py

The check fails on a non-executable entry point or an unresolved bundled ELF dependency. A container without a GPU can use flatpak run --env=GALLIUM_DRIVER=softpipe com.edde746.plezy for software-rendered verification; this is not a hardware-decoding or HDR test.

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/maestro/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

Install plezy-relay on Unraid in a few clicks.

Find plezy-relay in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for plezy-relay Review the template variables and paths Click Install

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/bbergle/plezy-relay:latest
Last Updated2026-09-17
First Seen2026-09-17

Runtime arguments

Network
bridge
Privileged
false

Template configuration

Port: RelayPorttcp

Host port for the relay. Set Plezy's Watch Together relay to http://YOUR-UNRAID-IP:THIS-PORT (base URL only, no path). Defaults to 9977 to stay clear of the many Unraid containers that want 8080; change it only if something else already uses 9977.

Target
8080
Default
9977
Value
9977
Path: /dataPathrw

Persistent storage for room state (rooms.json), uploaded client logs, and Discord poster artifacts. Room state here lets in-progress Watch Together sessions survive a container restart.

Target
/data
Default
/mnt/user/appdata/plezy-relay
Value
/mnt/user/appdata/plezy-relay
TRUSTED_PROXY_CIDRSVariable

LEAVE BLANK unless this container sits behind a reverse proxy. Comma-separated CIDRs whose X-Forwarded-For header is trusted when identifying client IPs for rate limiting, e.g. 172.17.0.0/16. WARNING: an invalid value makes the relay exit immediately on startup.

OAUTH_BASE_URLVariable

Optional. Public base URL of this relay, used only by the MyAnimeList/AniList OAuth proxy for TV and headless sign-in, e.g. https://relay.example.com. Leave blank to disable /auth (it then returns 503). Watch Together does not need this.

MAL_CLIENT_IDVariable

Optional. MyAnimeList OAuth client ID. Only used when OAUTH_BASE_URL is set.

ANILIST_CLIENT_IDVariable

Optional. AniList OAuth client ID. Only used when OAUTH_BASE_URL is set.

ANILIST_CLIENT_SECRETVariable

Optional. AniList OAuth client secret. Only used when OAUTH_BASE_URL is set.