π¬π§ English Β· πΈπ¦ Ψ§ΩΨΉΨ±Ψ¨ΩΨ©
- Overview
- Comparison
- Use cases
- Features
- Desktop support
- Installation
- Usage
- Architecture
- Project structure
- FAQ
- Documentation
- Contributing
- License
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.
| Capability | Spacedesk | Deskreen | Weylus | Sidecar | Orbiscreen |
|---|---|---|---|---|---|
| Linux host | β Windows only | β Web based | β Web based | β macOS only | β |
| Wayland and X11 | β | β | β 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 | β | β | β | β 4095 levels | |
| Reverse touch and mouse | β | β | β | β multi-touch | |
| Rootless on KDE, wlroots | N/A | β | β | N/A | β |
| Open source | β | β GPL-3.0 | β AGPL-3.0 | β | β GPL-3.0 |
- 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.
- 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
| Environment | Virtual second display | Capture | Input |
|---|---|---|---|
| KDE Plasma (Wayland) | β native, Portal Virtual or zkde-screencast, no root | β PipeWire | β RemoteDesktop portal, uinput |
| COSMIC (Wayland) | 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.
Ubuntu, Pop!_OS, Linux Mint (PPA):
sudo add-apt-repository ppa:shadow-x78/ppa -y
sudo apt update && sudo apt install orbiscreen -yFedora (COPR):
sudo dnf copr enable shadow-x78/orbiscreen -y
sudo dnf install orbiscreen -yArch Linux, Manjaro (PKGBUILD):
git clone https://github.com/shadow-x78/orbiscreen.git
cd orbiscreen
makepkg -siAppImage: 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.shAndroid: install orbiscreen-android-release.apk from GitHub Releases.
Start the daemon in the foreground, or enable the systemd user service:
orbiscreen start
systemctl --user enable --now orbiscreenCommands:
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 daemonOpen the Android app, pick the discovered host, and enter the session token (delivered over mDNS or read with orbiscreen doctor).
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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.
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)
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.
| 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 |
- Fork the repository and create a branch (
feature/,fix/,docs/,chore/). - Keep
cargo fmt --all --check,cargo clippy --workspace --all-targets -- -D warnings, and the test suite green. - Add a
CHANGELOG.mdentry. - Commit as
orbiscreen | <type>: <description>and open a pull request againstmain.
Read the Contributing Guidelines and the Code of Conduct. Report problems through GitHub Issues.
Distributed under the GPL-3.0 License.
Built by shadow-x78 Β· Changelog Β· Security
Β© 2026 Orbiscreen