π¬π§ English Β· πΈπ¦ Ψ§ΩΨΉΨ±Ψ¨ΩΨ©
- What is Orbiscreen?
- Why Orbiscreen Exists
- Highlights
- Status
- Quick Start
- Commands
- Android App
- Architecture
- Documentation
- Contributing
- License
Orbiscreen turns a spare Android tablet or phone into a real second monitor for your Linux desktop. Unlike X11-only or browser-only workarounds, Orbiscreen creates a kernel-level virtual display via DisplayLink's evdi, which appears as a genuine monitor to both X11 and Wayland compositors, and streams it using MPEG-TS/H.264 with reverse touch input natively on Android.
| Problem | Other Projects | Orbiscreen |
|---|---|---|
| No Linux host support | β spacedesk refuses officially | β Real kernel-level virtual display |
| X11-only workaround | β VirtScreen unmaintained since 2018 | β X11 and Wayland via evdi/DRM |
| Wayland second screen missing | β Weylus caps it to X11 | β Full Wayland path via ashpd + PipeWire |
| Manual IP configuration | β Most projects | β mDNS discovery + live network scan + manual add |
| Single-purpose client | β spacedesk only | β Native Android screen + host control panel |
- Real virtual display via
evdi(X11 and Wayland) - Material 3 Android client - Jetpack Compose, Catppuccin Mocha / Latte brand palette, light/dark theme
- Live discovery - NSD scan of nearby hosts, manual
host:portentry, optional subnet scanner - Native streaming - ExoPlayer with
OkHttpDataSource+DefaultLoadControlfor low-latency MPEG-TS / H.264 - Reverse touch - absolute pointer / keyboard / stylus / wheel events flow Android β host
- Host control panel - keyboard, lock, blank, Ctrl+Alt+Del, file manager, and retry actions
- USB transport via
adb reverse, no special drivers - Hardware encoding - VAAPI, NVENC, x264 software fallback
- Cryptographic signing of every Linux and Android artifact
| Phase | Goal | State |
|---|---|---|
| 0 | Workspace scaffolding + evdi feasibility | β Completed |
| 1 | Display + capture + encode + input (X11) | β Completed |
| 2 | Android client + USB transport + mDNS | β Completed |
| 3 | Wayland capture + portal fallback + input | β Completed |
| 4 | Packaging + GTK4 GUI + D-Bus service + Standalone installation | β Completed |
| 5 | Material 3 UI + live discovery + control panel | β Completed |
See
CHANGELOG.mdfor the complete release history.
Download pre-built packages from GitHub Releases:
-
Debian / Ubuntu (
.deb):sudo dpkg -i orbiscreen_amd64.deb || sudo apt-get install -f -
Fedora / RHEL (
.rpm):Note: Our RPM packages are cryptographically signed. You must import the public key first.
sudo rpm --import https://raw.githubusercontent.com/shadow-x78/orbiscreen/main/orbiscreen.asc sudo dnf install ./orbiscreen_x86_64.rpm
-
Universal AppImage (
.AppImage):chmod +x orbiscreen-x86_64.AppImage ./orbiscreen-x86_64.AppImage
-
Standalone Tarball (
.tar.gz):tar -xzvf orbiscreen-linux-x86_64.tar.gz cd release-bundle && ./install.sh
-
Android (
.apk): Installorbiscreen-android-release.apk(cryptographically signed release build to bypass Play Protect warnings).
# Clone the repository
git clone https://github.com/shadow-x78/orbiscreen.git ~/Orbiscreen
cd ~/Orbiscreen
# One-command installation for Linux
./scripts/install.sh
# Probe local capture, input, and display backends
orbiscreen probe
# Start the Orbiscreen daemon (EVDI DRM or Wayland Portal auto-fallback)
orbiscreen start| Command | Description |
|---|---|
orbiscreen start |
Create the virtual display and start streaming |
orbiscreen start --no-mdns |
Start without mDNS advertising |
orbiscreen list-displays |
List configured virtual displays |
orbiscreen probe |
Report capture / input / display backends |
orbiscreen print-config |
Print the resolved configuration |
orbiscreen uninstall |
Remove the daemon, systemd service, and desktop entries |
orbiscreen --config orbiscreen.toml --verbose probeTo remove everything, including saved config and evdi module state:
orbiscreen uninstall && ./scripts/uninstall.shThe Android client is a Material 3 + Jetpack Compose single-Activity app with three screens wired through Compose Navigation:
| Screen | What it does |
|---|---|
| Discovery | Live NSD scan of _orbiscreen._tcp. hosts, quick-connect chips, manual host:port entry, USB mode via adb reverse, recent host pinned on top |
| Stream | Full-screen ExoPlayer (MPEG-TS over HTTP) with a floating control toolbar: keyboard, lock, blank, Ctrl+Alt+Del, files, retry |
| Settings | Theme (System / Light / Dark), force software decoder, advanced subnet scanner, recent host, about |
Reverse touch works out of the box: InputDispatcher maps Android touch to absolute host coordinates over the /input endpoint, debounced so the network never backs up during a fast drag.
The client talks to the daemon through three lightweight JSON endpoints in addition to /stream and /input:
| Endpoint | Method | Purpose |
|---|---|---|
/api/info |
GET | Display resolution, encoder, and version |
/api/control |
POST | Host-side actions (blank, lock, ctrl-alt-del, open) |
/health |
GET | Liveness probe |
orbiscreen/
βββ crates/
β βββ orbiscreen-core/ # types, config, errors
β βββ orbiscreen-display/ # evdi-backed virtual displays
β βββ orbiscreen-capture/ # X11 (x11rb) + Wayland (ashpd + PipeWire)
β βββ orbiscreen-encode/ # GStreamer pipeline (VAAPI / NVENC / x264)
β βββ orbiscreen-input/ # evdevil + ashpd RemoteDesktop
β βββ orbiscreen-transport/ # axum + mDNS + /api/info + /api/control
β βββ orbiscreen-daemon/ # CLI binary wiring every layer together
βββ clients/
β βββ web/ # browser MPEG-TS client (HTML / CSS / JS)
β βββ android/ # Material 3 Compose app
β βββ app/src/main/java/com/orbiscreen/android/
β βββ MainActivity.kt
β βββ data/ # PrefsStore (recent host + settings)
β βββ net/ # DiscoveryService, SubnetScanner, HostApi
β βββ player/ # PlayerHolder, StreamUrl
β βββ input/ # InputDispatcher
β βββ ui/
β βββ theme/ # Material 3 colour, typography, theme
β βββ nav/ # Compose Navigation graph
β βββ discovery/ # DiscoveryScreen + ViewModel
β βββ stream/ # StreamScreen, PlayerSurface, ControlToolbar
β βββ settings/ # SettingsScreen
βββ packaging/{flatpak,appimage,debian}/
βββ scripts/{setup-dev-env.sh,test-evdi.sh,install.sh,uninstall.sh}
βββ .github/{workflows/,ISSUE_TEMPLATE/,dependabot.yml}
βββ .editorconfig, .gitignore, .gitattributes, deny.toml, rustfmt.toml
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β orbiscreen-daemon (CLI, clap) β
β ββββββββββββββββ ββββββββββββββββ βββββββββββββββββββββ β
β β display β β capture β β encode β β
β β evdi crate β β x11rb/ashpd β β gstreamer-rs β β
β ββββββββββββββββ ββββββββββββββββ βββββββββββββββββββββ β
β ββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββ β
β β input β β transport β β
β β evdevil/ashpdβ β axum + mdns-sd + adb β β
β β β β + /api/info + /api/control + /health β β
β ββββββββββββββββ ββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β core: shared types, config, errors β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β
βΌ βΌ βΌ
/dev/dri/... X11 / Wayland Network (mDNS + HTTP)
| Document | Description |
|---|---|
| docs/ARCHITECTURE.md Β· AR | System topology, zero-copy pipeline & D-Bus architecture |
| docs/INSTALL.md Β· AR | Multi-distro installation walkthroughs |
| docs/PACKAGING.md Β· AR | Multi-distro packaging specs (.deb, .rpm, AppImage, Flatpak) |
| docs/DBUS_SPEC.md Β· AR | D-Bus Session Bus IPC interface specifications |
| docs/TROUBLESHOOTING.md Β· AR | Common issues, diagnostics & hardware acceleration fixes |
| SECURITY.md | Security model, transport safety & network policies |
| CHANGELOG.md | Full release history |
| CONTRIBUTING.md | Guidelines for contributing and building from source |
Please read our Contributing Guidelines for details on how to set up the development environment, format your code, and submit Pull Requests.
When committing, follow the convention:
orbiscreen | <scope>: <message>
For example:
orbiscreen | android | player: retry on transient network errors
orbiscreen | docs | readme: clarify mDNS discovery flow
orbiscreen | v0.10.3 | release: host-input protocol alignment
Distributed under the GPL-3.0 License.
Built by shadow-x78 Β· Changelog Β· Security
Β© 2026 Orbiscreen