playbridge

Introduction: Open-source casting suite (alpha) — browse on your phone, play on the big screen: Android TV, Apple TV, or desktop (macOS/Windows/Linux). Local-network, GPLv3.
More: Author   ReportBugs   OfficialWebsite   
Tags:

Status: Alpha License: GPLv3 Latest release Discord Community Support me on Ko-fi

Find content on your phone, play it on your TV

PlayBridge is an open-source casting suite: browse on your phone, play on the big screen. Find your content on your phone — in the built-in browser or your media library — and bridge it to Android TV / Fire TV, Apple TV, a desktop receiver (macOS, Windows, Linux), or any DLNA-capable TV with nothing installed on it. Local-network only, no account, no cloud.

[!WARNING] PlayBridge is in alpha. It's under active early development — expect bugs, incomplete features, and breaking changes between releases. Feedback and issue reports are very welcome.

Table of Contents

Installation & Store Listings

Official Store Listings

The PlayBridge senders and extensions are available on official store registries:

Receiver & Manual Installation

  • Android TV / Fire TV (receiver):
    • Open the Downloader app on your TV and enter code 9557748 to install the TV Player directly, or
    • download the latest tv-player APK from GitHub Releases and sideload it.
    • Note: on first launch the TV app asks for "Display over other apps" — required for the receiver to come to the foreground when a cast arrives.
    • Optional: the ad-blocked TV Browser APK (GeckoView + uBlock Origin) extends the player with web browsing (download from TV Browser Releases).
  • Apple TV (receiver): no prebuilt binary yet — build and deploy from Xcode; see the TV README.
  • Desktop (receiver): download the build for your OS from GitHub Releases (playbridge-desktop-windows-*.zip, -linux-*.tar.gz, -macos-*.zip). Linux needs libmpv2; the macOS build is unsigned (right-click → Open on first launch).
  • CLI (sender & receiver): on macOS or Linux, run curl -fsSL https://raw.githubusercontent.com/playbridgeapp/playbridge/main/cli/install.sh | sh. Windows and manual archives are on GitHub Releases.
  • DLNA TVs: nothing to install — the phone discovers renderers on your network automatically.
  • Staying up to date: the phone and TV apps can check for new releases and install updates from within the app, so sideloaded builds don't go stale.

How to connect & cast

PlayBridge provides multiple ways to discover receivers and cast media — using your phone, browser extension, Desktop app, or command-line CLI.

1. Connect on the same Wi-Fi

Ensure your sender device (Phone, Desktop app, Browser Extension, or Rust CLI) and target receiver (Android TV, Apple TV, Desktop app, or DLNA Smart TV) are connected to the same local Wi-Fi network.

2. Discover & Pair Receivers

  • Automatic Discovery: Open PlayBridge on your phone or Desktop app. Tap the device chip to see automatically discovered receivers on your network (via mDNS & UPnP).
  • Manual IP Connect: If a receiver isn't listed automatically, enter the receiver's IP address (displayed on its home screen).
  • Secure 6-Digit Pairing: On your first connection to a PlayBridge receiver (Android TV, Apple TV, Desktop), a 6-digit pairing PIN appears on the receiver screen. Enter it on your sender to establish a secure, encrypted connection (wss://). Paired devices auto-reconnect on future sessions.
  • DLNA / UPnP Smart TVs: Discovered automatically on your local network without requiring a pairing PIN.

3. Choose your Sender

  • 📱 Phone App (Android / iOS): Browse video sites in the built-in ad-blocked browser, cast movies/episodes from your Stremio library and add-ons, load IPTV playlists, or stream local phone files.
  • 🖥️ Desktop App (Receiver & Sender): Plays incoming casts from phone and extension senders. Also acts as a sender to cast local video files (with drag-and-drop) or stream URLs to TVs.
  • 🧩 Browser Extension (Firefox & Chrome): Detects streams in active browser tabs and casts them to your TV via the Desktop app.
  • 💻 Rust CLI (playbridge): Discover receivers and send local files or URLs directly from your terminal:
    playbridge discover               # Discover local network receivers
    playbridge send video.mp4         # Send a local file or stream URL to a receiver
    playbridge receiver               # Receive casts using the installed mpv
    

Screenshots

Browse & cast from your phone

Console hub Library & discovery Library detail screen Built-in browser
Console hub — connected to the TV Library and discovery Library detail screen Built-in browser with cast

Your phone is the remote

Context-aware remote Touchpad remote D-Pad remote Keyboard remote
Context-aware remote Touchpad mode D-Pad mode Keyboard input mode

Android TV receiver

Pairing screen Player & details Settings
Android TV pairing screen Android TV player and details Android TV settings screen
Favorites History
Android TV favorites Android TV history

Apple TV receiver

Pairing screen Player & details Settings
Apple TV pairing screen Apple TV player and details Apple TV settings screen
Favorites History
Apple TV favorites Apple TV history

Desktop receiver

Pairing screen Player & details Settings
Desktop pairing screen Desktop player and details Desktop settings screen
Favorites History
Desktop favorites Desktop history

Browser extension

Connected Streams detected Subtitles detected Open URL options
Extension connected Video streams detected Subtitles detected Open URL options

Features

  • Browse & detect: a full phone browser (GeckoView, with built-in ad-blocking) that detects videos on the page — direct files, HLS, DASH, and MSE/blob players — and casts them with one tap.
  • Library & discovery: a Stremio-style library with catalogs, add-ons (including sandboxed JavaScript scrapers), a watchlist, and Collections; pick an episode and send it straight to the TV.
  • Cast anywhere: native receivers for Android TV / Fire TV, Apple TV, and desktop — or cast to any DLNA/UPnP renderer without installing anything on it.
  • Binge-ready: episode queue with lazy auto-advance, watch-progress tracking, and resume ("Resume · 23:14") that actually seeks the TV to where you left off.
  • Phone as remote: touchpad, D-pad, keyboard, and transport controls, context-aware for the browser and player.
  • Local files & IPTV: cast videos from your phone's storage to any receiver, and load M3U/IPTV playlists.
  • Downloads: save streams to your phone with a WorkManager-backed queue, on-the-fly HLS→MP4 transmuxing, and publishing to your gallery.
  • Dual player engines: ExoPlayer and MPV on the TV, with automatic fallback when a stream misbehaves.
  • Secure pairing: connections are verified with a short 6-digit code and encrypted over wss:// with certificate pinning.
  • Private by design: everything stays on your local network — no account, no cloud, GPLv3.

Sender feature matrix

Feature Android phone iPhone / iPad Desktop app Browser extension
Supported platforms Android iOS, iPadOS macOS, Windows, Linux Firefox and Chromium browsers
Receiver targets PlayBridge receivers and DLNA / UPnP renderers PlayBridge receivers PlayBridge receivers Receiver selected in Desktop, or Desktop itself
Secure receiver pairing Handled by Desktop
Built-in browser and stream detection GeckoView; direct files, HLS, DASH, and MSE / blob players WKWebView; direct files, HLS, and DASH Via the browser extension Detects direct files, HLS, DASH, and MSE-backed players in browser tabs
Stream quality selection Via the browser extension HLS quality selection
Subtitle detection and attachment Detection only; attachment is not relayed to Desktop yet
Local file casting ✓, including drag-and-drop and multi-file playlists
Library, discovery, and add-ons
Debrid integrations ✓ in supported builds
IPTV and custom collections
Downloads
Ad blocking uBlock Origin WebKit content blocker with EasyList and custom rules
Queue support ✓, including episode auto-advance Multi-file playlists Single detected item
Remote controls Full remote: transport, seek, volume, D-pad, touchpad, keyboard, and track selection Transport, seek, D-pad, touchpad, and track selection Transport, seek, and playlist navigation Use Desktop or a phone remote
Play on the sender device Browser preview only Plays through Desktop when no receiver is selected
Companion app required No No No PlayBridge Desktop

Browser detection depends on what each browser exposes. Protected streams may require captured request headers, and some MSE / blob players cannot be replayed outside their original page.

Receiver feature matrix

Feature Android TV / Fire TV Apple TV Desktop DLNA / UPnP TV
Supported platforms Android TV, Fire TV tvOS macOS, Windows, Linux Compatible smart TVs and renderers
Receiver installation PlayBridge TV app PlayBridge TV app (build from source) PlayBridge Desktop app None
Playback engines Media3 / ExoPlayer + MPV AVPlayer + VLC + MPV MPV TV's built-in player
Direct streams, HLS, DASH, and local files Renderer-dependent; the phone proxies local files and header-protected HLS
Verified, encrypted pairing N/A — standard local-network DLNA
Phone playback controls Full controls, including seek, volume, and track selection Transport, seek, and track selection Full controls, including seek, system volume, and track selection Play, pause, stop, and seek; no volume or track selection
Episode queue and auto-advance Phone-managed; the phone must remain active
Resume and watch-progress tracking ✓, when the renderer reports usable playback status
External subtitles and audio/subtitle selection Not exposed through PlayBridge
Receiver history and favorites No receiver UI; progress remains on the phone
Web playback on the receiver Optional GeckoView plugin or system WebView Browser-extension bridge
In-app updates N/A

Media and codec support ultimately depends on the selected playback engine, operating system, and device hardware. DLNA behavior varies the most between TV manufacturers and models.

Installation

  • Android TV / Fire TV (receiver)
    • Open the Downloader app on your TV and enter code 9557748 to install the TV Player directly, or
    • download the latest tv-player APK from Releases and sideload it.
    • Note: on first launch the TV app asks for "Display over other apps" — required for the receiver to come to the foreground when a cast arrives.
    • Optional: the ad-blocked TV Browser APK (GeckoView + uBlock Origin) extends the player with web browsing.
  • Apple TV (receiver): no prebuilt binary yet — build and deploy from Xcode; see the TV README.
  • Desktop (receiver): download the build for your OS from Releases (playbridge-desktop-windows-*.zip, -linux-*.tar.gz, -macos-*.zip). Linux needs libmpv2; the macOS build is unsigned (right-click → Open on first launch).
  • DLNA TVs: nothing to install — the phone discovers renderers on your network automatically.
  • Android Phone (sender):
  • Browser Extension (sender):
    • Chrome Web Store
    • Firefox Add-ons
  • Staying up to date: the phone and TV apps can check for new releases and install updates from within the app, so sideloaded builds don't go stale.

Store Listings

The PlayBridge senders and extensions are available on official store registries:

How to connect & cast

  1. Connect your phone and receiver to the same Wi-Fi network, and open the PlayBridge app on both.
  2. On the phone, tap the device chip (top of the Library and browser cast screens) — it lists discovered receivers. Tap yours to connect.
    • Not discovered? Tap "All devices & manual connect" and enter the receiver's IP address (shown on its screen).
  3. On first connect, the receiver displays a 6-digit pairing code. Enter it on the phone to verify and secure the connection — devices you've already paired reconnect automatically.
  4. Browse any video site in the phone browser, play a video, and tap cast when PlayBridge detects the stream — or send a movie/episode directly from the Library.

Components

PlayBridge is a monorepo; each component has its own documentation:

  1. Phone App (mobile/) — The sender: browser, library, video detection, remote. Changelog
  2. TV Apps (tv/) — Receivers for Android TV (player + browser APKs) and Apple TV. Changelog · tvOS changelog
  3. Desktop App (desktop/) — A Flutter desktop receiver that plays casts via libmpv. Changelog
  4. Browser Extension (extension/) — A Firefox and Chromium extension that casts media from desktop browser tabs.
  5. Rust Cast (cast/core/, cast/receiver/, cast/ffi/) — Portable discovery/casting core, secure reusable receiver runtime, and UniFFI/C/JNI/Dart bindings.
  6. Rust Stream Proxy (stream-proxy-rust/) — High-performance Rust streaming proxy and MediaFlow AES-256 encryption.
  7. Rust CLI (cli/) — Command-line client binary (playbridge) for Rust Core.
  8. Shared Module (shared/) — Kotlin Multiplatform logic, player engines, and protocol bindings.
  9. Protocol (protocol/) — AsyncAPI WSS contract, detailed connection flow, and retained protobuf bindings.

Documentation

Comprehensive project documentation is available:

  • Design System: Visual language, color tokens, typography, and component specifications.
  • Contributing: Setup instructions and contribution guidelines.
  • Security Policy: Security considerations and vulnerability reporting.
  • WSS Protocol Flow: Discovery, TLS pinning, SAS pairing, authentication, commands, status events, and compatibility rules. See also the machine-readable AsyncAPI contract.

Cast demo page

Sites can cast directly into PlayBridge via the injected window.playbridge.cast() page bridge. A live demo that exercises all payload shapes (single video, HLS, playlist with startIndex, bare array) plus the browser's video detection paths is hosted at playbridge.app/cast-demo — open it in the PlayBridge phone browser. Source: web/site/static/cast-demo/.

Build Instructions

Prerequisites

  • Android apps: Android Studio Ladybug or later, JDK 17+, Android SDK 26+
  • Desktop: Flutter SDK (Dart ^3.6) and libmpv
  • Apple TV: Xcode with CocoaPods (see tv/)
  • Browser Extension: Node.js and pnpm
  • Rust Core & Proxy: Rust 1.85+ (cargo)

Building

# Phone app
cd mobile/android && ./gradlew :app:assembleDebug

# TV player & browser
cd tv/android && ./gradlew :player:app:assembleDebug :browser:app:assembleDebug

# Desktop
cd desktop && flutter pub get && flutter run    # -d macos | windows | linux

# Browser extension
cd extension && pnpm install && pnpm build

# Rust core & stream proxy
cargo build --workspace
cargo test --workspace

Contributing

Contributions are welcome — see CONTRIBUTING.md for setup and guidelines.

AI Policy

This project is built with the help of AI-assisted tools. We welcome similar contributions, provided you take full ownership of the code you submit. Every pull request—regardless of the tools used—is subject to the same standard of review and testing.

  • Responsibility: You must fully understand, test, and be able to explain all parts of your changes.
  • Reviewability: Keep PRs focused and readable. Avoid large, undocumented dumps of generated code.

Acknowledgments

PlayBridge was inspired by — and learned from — these excellent open-source projects. Huge thanks to their authors and communities:

All trademarks and copyrights belong to their respective owners.

License

This project is licensed under the GNU General Public License v3.0 (GPLv3). See the LICENSE file for details.

It also bundles third-party software under their own (GPLv3-compatible) licenses — including GeckoView (MPL-2.0), FFmpeg and mpv/libmpv (LGPL/GPL), and uBlock Origin (GPL-3.0). See THIRD_PARTY_LICENSES.md for the full list.

Contact

For questions, feedback, or support, please reach out to us at playbridgeapp@gmail.com.

If you'd like to support development, you can buy us a coffee on Ko-fi (kofi).

For security-related issues, please refer to our Security Policy.

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools
AI Daily Digest