playbridge
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
- Screenshots
- Features
- Installation
- How to connect & cast
- Components
- Documentation
- Build Instructions
- Contributing
- AI Policy
- Acknowledgments
- License
- Contact
Screenshots
Browse & cast from your phone
| Console hub | Library & discovery | Library detail screen | Built-in browser |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Your phone is the remote
| Context-aware remote | Touchpad remote | D-Pad remote | Keyboard remote |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
Android TV receiver
| Pairing screen | Player & details | Settings |
|---|---|---|
![]() |
![]() |
![]() |
| Favorites | History |
|---|---|
![]() |
![]() |
Apple TV receiver
| Pairing screen | Player & details | Settings |
|---|---|---|
![]() |
![]() |
![]() |
| Favorites | History |
|---|---|
![]() |
![]() |
Desktop receiver
| Pairing screen | Player & details | Settings |
|---|---|---|
![]() |
![]() |
![]() |
| Favorites | History |
|---|---|
![]() |
![]() |
Browser extension
| Connected | 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.
Installation
- Android TV / Fire TV (receiver)
- Open the Downloader app on your TV and enter code
9557748to install the TV Player directly, or - download the latest
tv-playerAPK 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.
- Open the Downloader app on your TV and enter code
- 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 needslibmpv2; 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): download the latest
phoneAPK from Releases and install it. - 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.
Closed Testing (Google Play)
To participate in the Google Play closed testing track, you need to first join the Google Group and then opt-in as a tester using the links below:
- Android Phone (Sender)
- Group invite: pbphoneclosedtesters Google Group
- Apply to be a tester: Google Play Opt-in
- Download app: Google Play Store
- Android TV (Player)
- Group invite: pbtvclosedtesters Google Group
- Apply to be a tester: Google Play Opt-in
- Download app: Google Play Store
How to connect & cast
- Connect your phone and receiver to the same Wi-Fi network, and open the PlayBridge app on both.
- 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).
- 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.
- 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 README:
- Phone App (
mobile/) — the sender: browser, library, video detection, remote. Changelog - TV Apps (
tv/) — receivers for Android TV (player + browser APKs) and Apple TV. Changelog · tvOS changelog - Desktop App (
desktop/) — a Flutter desktop receiver that plays casts via libmpv. Changelog - Browser Extension (
extension/) — a Firefox extension that casts media from desktop browser tabs. - Shared Module (
shared/) — Kotlin Multiplatform logic, player engines, and protocol bindings. - Protocol (
protocol/) — protobuf wire-format definitions (git submodule).
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.
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
[!IMPORTANT]
protocol/is a git submodule — clone withgit clone --recursive, or rungit submodule update --initin an existing checkout, or the builds will fail.
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/)
Building
# Phone app
cd mobile/android && ./gradlew :app:assembleDebug
# TV player
cd tv/android && ./gradlew :player:app:assembleDebug
# TV browser
cd tv/android && ./gradlew :browser:app:assembleDebug
# Desktop
cd desktop && flutter pub get && flutter run # -d macos | windows | linux
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.



























