Skip to content

Latest commit

Β 

History

383 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Orbiscreen banner

Orbiscreen

Secondary monitor for Linux, powered by an Android tablet or phone.

Version License Rust Platform


Language

πŸ‡¬πŸ‡§ English Β· πŸ‡ΈπŸ‡¦ Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ©


Table of Contents


Overview

Orbiscreen turns a spare Android tablet or phone into a secondary display for a Linux desktop. The host creates a virtual monitor, either as a kernel display through DisplayLink's evdi (COSMIC, GNOME, X11) or as a compositor-native output on KDE Plasma and wlroots compositors, with no root and no share dialog. The display is encoded as H.264 and streamed to Android or to a web browser, with reverse control from touch, mouse, keyboard, and a pressure-sensitive stylus.

Comparison

Capability Spacedesk Deskreen Weylus Sidecar Orbiscreen
Linux host ❌ Windows only βœ… Web based βœ… Web based ❌ macOS only βœ…
Wayland and X11 ❌ ⚠️ dummy plug ⚠️ mirror only ❌ βœ… native
Extended display βœ… Windows only ❌ HDMI dummy ❌ mirror only βœ… Apple only βœ… virtual monitor
Native Android client βœ… ❌ browser ❌ browser ❌ iPad βœ… Compose
Hardware encoding βœ… ❌ ⚠️ βœ… βœ… NVENC, VA-API
Measured latency ~50-80 ms ~150-300 ms ~80-120 ms ~30 ms ~25-40 ms
Stylus pressure and tilt ❌ ❌ ⚠️ pen only βœ… βœ… 4095 levels
Reverse touch and mouse βœ… ❌ ⚠️ pen only βœ… βœ… multi-touch
Rootless on KDE, wlroots N/A βœ… ❌ N/A βœ…
Open source ❌ βœ… GPL-3.0 βœ… AGPL-3.0 ❌ βœ… GPL-3.0

Use cases

  • Second screen for an Android tablet (Samsung Galaxy Tab, Xiaomi Pad, Lenovo Tab) without buying a portable monitor.
  • Drawing tablet with pressure and tilt in Krita, GIMP, Blender, and Inkscape.
  • Portrait monitor, rotated with the device, for terminals, documentation, and chat.
  • Wired operation: USB carries the stream over Android Open Accessory, with no Wi-Fi and no adb reverse.

Features

  • Virtual display creation through the XDG Desktop Portal on GNOME 46+ and KDE Plasma 6+, through compositor IPC on wlroots, and through EVDI on X11 and COSMIC
  • Stylus support: 4095 pressure levels, tilt, and in-air hover, exposed as a Linux input tablet through uinput
  • Touchpad mode with double-tap drag, constrained to the virtual display bounds
  • Low-latency encoding: H.264 via NVENC, VA-API, or x264, with GOP and rate control tuned for LAN play
  • Transports: UDP Annex-B with Reed-Solomon FEC, WebTransport for browsers, USB AOA bulk, and HTTP MPEG-TS as fallback
  • Discovery with mDNS, manual entry, and an optional subnet scanner
  • Web client: no install, runs in Chromium browsers over WebTransport and WebCodecs
  • Material 3 Android client with light and dark themes
  • Host control over an authenticated API: lock, blank, unblank, Ctrl+Alt+Del
  • D-Bus service and CLI (orbiscreen start, stop, doctor) with a systemd user unit
  • Cryptographic signing of Linux and Android release artifacts

Desktop support

Environment Virtual second display Capture Input
KDE Plasma (Wayland) βœ… native, Portal Virtual or zkde-screencast, no root βœ… PipeWire βœ… RemoteDesktop portal, uinput
COSMIC (Wayland) ⚠️ via EVDI (doctor --fix) βœ… Portal ScreenCast (PipeWire) βœ… uinput, RemoteDesktop
Sway / Hyprland / wlroots βœ… headless output via compositor IPC, no root βœ… wlr-screencopy βœ… virtual-pointer, virtual-keyboard
GNOME (Wayland) βœ… Portal Virtual (GNOME 46+) or EVDI βœ… Portal ScreenCast (PipeWire) βœ… RemoteDesktop portal, persisted
XFCE / MATE / LXQt / Cinnamon (X11) βœ… via EVDI βœ… XShm root mirror βœ… XTEST, uinput
Anything else βœ… via EVDI best available best available

orbiscreen doctor prints the detected compositor, the capture plan, and anything missing. orbiscreen doctor --fix installs the EVDI kernel module on detected distributions. Details: Desktop Environment Support.

Installation

Ubuntu, Pop!_OS, Linux Mint (PPA):

sudo add-apt-repository ppa:shadow-x78/ppa -y
sudo apt update && sudo apt install orbiscreen -y

Fedora (COPR):

sudo dnf copr enable shadow-x78/orbiscreen -y
sudo dnf install orbiscreen -y

Arch Linux, Manjaro (PKGBUILD):

git clone https://github.com/shadow-x78/orbiscreen.git
cd orbiscreen
makepkg -si

AppImage: download orbiscreen-x86_64.AppImage from GitHub Releases and run it.

From source:

git clone https://github.com/shadow-x78/orbiscreen.git ~/Orbiscreen
cd ~/Orbiscreen && ./scripts/install.sh

Android: install orbiscreen-android-release.apk from GitHub Releases.

Usage

Start the daemon in the foreground, or enable the systemd user service:

orbiscreen start
systemctl --user enable --now orbiscreen

Commands:

orbiscreen start                              # run with auto environment detection
orbiscreen start --width 1920 --height 1080 --fps 60
orbiscreen start --encoder nvenc              # nvenc, vaapi, or x264
orbiscreen doctor                             # diagnostics
orbiscreen doctor --fix                       # install missing dependencies
orbiscreen stop                               # stop a running daemon

Open the Android app, pick the discovered host, and enter the session token (delivered over mDNS or read with orbiscreen doctor).

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      orbiscreen-daemon                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ orbiscreen-display β”‚  β”‚ orbiscreen-capture             β”‚  β”‚
β”‚  β”‚ (evdi kernel/DRM)  β”‚  β”‚ (kwin-virtual / wlr / portal)  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚             β”‚                            β”‚                   β”‚
β”‚             β–Ό                            β–Ό                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ orbiscreen-encode (GStreamer NVENC/VAAPI/x264)         β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                              β”‚                               β”‚
β”‚                              β–Ό                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ orbiscreen-transport: HTTP, UDP, WebTransport, AOA     β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Reverse input returns through orbiscreen-input (uinput, XTEST, wlroots virtual devices, or the RemoteDesktop portal). The full specification is in docs/ARCHITECTURE.md.

Project structure

orbiscreen/
β”œβ”€β”€ crates/
β”‚   β”œβ”€β”€ orbiscreen-core/        # shared types, config, errors
β”‚   β”œβ”€β”€ orbiscreen-display/     # evdi-backed virtual displays
β”‚   β”œβ”€β”€ orbiscreen-capture/     # KWin/wlroots virtual outputs, portal/X11 capture
β”‚   β”œβ”€β”€ orbiscreen-encode/      # GStreamer pipeline (VAAPI / NVENC / x264)
β”‚   β”œβ”€β”€ orbiscreen-input/       # uinput tablet and touch, RemoteDesktop portal
β”‚   β”œβ”€β”€ orbiscreen-transport/   # axum, UDP/WebTransport, AOA USB, mDNS
β”‚   β”œβ”€β”€ orbiscreen-daemon/      # daemon binary, D-Bus service, CLI
β”‚   └── orbiscreen-gui/         # Tauri v2 desktop control center
β”œβ”€β”€ clients/
β”‚   β”œβ”€β”€ web/                    # browser client (WebTransport + WebCodecs)
β”‚   └── android/                # Material 3 Compose app
β”œβ”€β”€ assets/
β”‚   └── logo/                   # SVG and PNG icons, banners
β”œβ”€β”€ data/                       # desktop entry, RPM spec, systemd service
β”œβ”€β”€ scripts/                    # install, packaging, dev tooling
└── docs/                       # bilingual guides (EN + AR)

FAQ

Is this a true extended display or a mirror?
It is an independent virtual monitor placed next to your physical displays. Windows can be moved onto it, and the resolution is configurable up to 4K.
Does it work on Wayland without root?
On KDE Plasma and wlroots compositors the virtual monitor is created by the compositor itself, with no root and no kernel module. On GNOME, COSMIC, and X11 the EVDI kernel module provides the virtual display.
Can I draw in Krita or GIMP with a stylus?
Stylus pressure (up to 4095 levels), tilt, and hover are injected as a Linux input tablet through `uinput`, so applications see a real drawing device.
Can I connect over USB instead of Wi-Fi?
Plug in the cable and accept the accessory permission dialog. The host switches the device to Android Open Accessory mode and streams H.264 over USB bulk endpoints. USB debugging and `adb reverse` are not required.
What latency should I expect?
On a 5 GHz network with hardware encoding, transport delay measures 2 to 4 ms between host send and client assemble. End to end (glass to glass) is typically 25 to 40 ms on a tuned Wi-Fi connection.

Documentation

Document Description
ARCHITECTURE.md System topology, frame pipeline, crate layout
UDP_TRANSPORT.md UDP Annex-B video path, packet types, DPLPMTUD
FRAME_TRANSPORT.md I/P/IDR/GOP terms, AU flow, loss recovery
DE_SUPPORT.md Per-desktop support matrix and capture plans
PACKAGING.md Packaging specifications (deb, rpm, AppImage)
DBUS_SPEC.md D-Bus session interface specification
TROUBLESHOOTING.md Common issues and fixes

Contributing

  1. Fork the repository and create a branch (feature/, fix/, docs/, chore/).
  2. Keep cargo fmt --all --check, cargo clippy --workspace --all-targets -- -D warnings, and the test suite green.
  3. Add a CHANGELOG.md entry.
  4. Commit as orbiscreen | <type>: <description> and open a pull request against main.

Read the Contributing Guidelines and the Code of Conduct. Report problems through GitHub Issues.

License

Distributed under the GPL-3.0 License.


Built by shadow-x78 Β· Changelog Β· Security

Β© 2026 Orbiscreen

About

High-performance, ultra-low latency virtual secondary display for Linux (Wayland & X11) streamed to Android tablets and phones.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

34 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages