Port do App do OpenDisplay para Android
37
stars
168
commits
Kotlin
primary language
Sep 8, 2026
updated
Turn your spare Android tablet into a second monitor for your Mac — free, open source, no subscription. A Duet Display, Sidecar and Spacedesk alternative for anyone who already owns an Android tablet or phone and wants a real extended display, not just screen mirroring.
Unofficial Android client for OpenDisplay, filling the role of Sidecar/Duet Display: a real extended display (not just mirroring), low-latency H.264, over WiFi or USB, with touch and scroll input — speaking the same network protocol as the official app, with no changes required on the Mac side.
Website & download · How it works · Screenshots · Features · Compare · Install · Build · Usage · License
The original OpenDisplay project only ships an iOS/iPadOS client. This repository is the Android
version: the wire protocol, framing and Annex-B handling are ported from the upstream Swift
client, while the Android UI and MediaCodec pipeline are written fresh in Kotlin.
MAC (sender, original project, unmodified) ANDROID (this project)
CGVirtualDisplay
→ ScreenCaptureKit → VideoToolbox H.264
→ TCP [4-byte length BE][Annex-B frame] ══════→ listens on port 9000
→ MediaCodec (Surface) → SurfaceView
← control JSON (hello, touch, scroll, ping) ════
The Android device listens and the Mac connects — that's what lets it work over WiFi with zero
manual setup, via mDNS/Bonjour discovery (_opensidecar._tcp).

No staged mockups — real hardware, real WiFi connection. More shots (settings, mid-session mirroring, the Mac's Displays panel) on the website.
MediaCodec (hardware decoding), straight to a Surface.For using an Android tablet as an external monitor, against the best-known alternatives:
| OpenDisplay Android | Duet Display | Spacedesk | |
|---|---|---|---|
| Price | Free | Paid | Free (core) |
| Open source | GPL-3.0 | No | No |
| Account required | No | Yes | No |
| Same protocol as OpenDisplay Mac | Yes | No | No |
| Central server | None | Yes | No |
WindowMetrics.getDensity() was gated behind the wrong API level; fixed in
v0.0.8, use that or newer (reported by @gaeaearth, fixed by
@edoardomich in #5).adb forward — see below).Download the latest APK from GitHub Releases
and sideload it (adb install, or copy it to the device and enable "unknown sources").
The Google Play version is in closed testing — want in as a tester? Email josepacelli@gmail.com.
./gradlew assembleDebug # build
./gradlew installDebug # install on a connected device/emulator
adb logcat -s OpenDisplay:* # app logs
Requires the Android SDK installed, with ANDROID_HOME/local.properties pointing to it.
To produce a signed release APK, set up a release keystore and a keystore.properties file at
the repo root (both kept out of version control) — see app/build.gradle.kts for the expected
format, then run ./gradlew assembleRelease.
extend mode (WiFi) and pick the Android
device from the list.USB connection details (via adb forward, without requiring usbmuxd) are covered in
peetzweg/opendisplay's Mac/OpenSidecarMacApp.swift —
the Mac app dials plain TCP to a configured host/port override when set, which adb forward
can tunnel over USB to this app's existing listener on port 9000.
This is an independent client, maintained separately, that implements the same network protocol
as OpenDisplay (peetzweg/opendisplay) to interoperate
with the original Mac app without requiring any change to it. It is not affiliated with the
original project's author.
adb dance required.One-person side project, built evenings and weekends, not a company. If it saved you from buying a monitor, a tip on Ko-fi helps keep it maintained and free for everyone.
GPL-3.0, the same license as the original project. See LICENSE and
NOTICE for copyright notices.
Kotlin
100.0%
Port do App do OpenDisplay para Android
37
stars
168
commits
Kotlin
primary language
Sep 8, 2026
updated
Turn your spare Android tablet into a second monitor for your Mac — free, open source, no subscription. A Duet Display, Sidecar and Spacedesk alternative for anyone who already owns an Android tablet or phone and wants a real extended display, not just screen mirroring.
Unofficial Android client for OpenDisplay, filling the role of Sidecar/Duet Display: a real extended display (not just mirroring), low-latency H.264, over WiFi or USB, with touch and scroll input — speaking the same network protocol as the official app, with no changes required on the Mac side.
Website & download · How it works · Screenshots · Features · Compare · Install · Build · Usage · License
The original OpenDisplay project only ships an iOS/iPadOS client. This repository is the Android
version: the wire protocol, framing and Annex-B handling are ported from the upstream Swift
client, while the Android UI and MediaCodec pipeline are written fresh in Kotlin.
MAC (sender, original project, unmodified) ANDROID (this project)
CGVirtualDisplay
→ ScreenCaptureKit → VideoToolbox H.264
→ TCP [4-byte length BE][Annex-B frame] ══════→ listens on port 9000
→ MediaCodec (Surface) → SurfaceView
← control JSON (hello, touch, scroll, ping) ════
The Android device listens and the Mac connects — that's what lets it work over WiFi with zero
manual setup, via mDNS/Bonjour discovery (_opensidecar._tcp).

No staged mockups — real hardware, real WiFi connection. More shots (settings, mid-session mirroring, the Mac's Displays panel) on the website.
MediaCodec (hardware decoding), straight to a Surface.For using an Android tablet as an external monitor, against the best-known alternatives:
| OpenDisplay Android | Duet Display | Spacedesk | |
|---|---|---|---|
| Price | Free | Paid | Free (core) |
| Open source | GPL-3.0 | No | No |
| Account required | No | Yes | No |
| Same protocol as OpenDisplay Mac | Yes | No | No |
| Central server | None | Yes | No |
WindowMetrics.getDensity() was gated behind the wrong API level; fixed in
v0.0.8, use that or newer (reported by @gaeaearth, fixed by
@edoardomich in #5).adb forward — see below).Download the latest APK from GitHub Releases
and sideload it (adb install, or copy it to the device and enable "unknown sources").
The Google Play version is in closed testing — want in as a tester? Email josepacelli@gmail.com.
./gradlew assembleDebug # build
./gradlew installDebug # install on a connected device/emulator
adb logcat -s OpenDisplay:* # app logs
Requires the Android SDK installed, with ANDROID_HOME/local.properties pointing to it.
To produce a signed release APK, set up a release keystore and a keystore.properties file at
the repo root (both kept out of version control) — see app/build.gradle.kts for the expected
format, then run ./gradlew assembleRelease.
extend mode (WiFi) and pick the Android
device from the list.USB connection details (via adb forward, without requiring usbmuxd) are covered in
peetzweg/opendisplay's Mac/OpenSidecarMacApp.swift —
the Mac app dials plain TCP to a configured host/port override when set, which adb forward
can tunnel over USB to this app's existing listener on port 9000.
This is an independent client, maintained separately, that implements the same network protocol
as OpenDisplay (peetzweg/opendisplay) to interoperate
with the original Mac app without requiring any change to it. It is not affiliated with the
original project's author.
adb dance required.One-person side project, built evenings and weekends, not a company. If it saved you from buying a monitor, a tip on Ko-fi helps keep it maintained and free for everyone.
GPL-3.0, the same license as the original project. See LICENSE and
NOTICE for copyright notices.
Kotlin
100.0%