Skip to content

Latest commit

Β 

History

263 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Orbiscreen - Turn any Android tablet or phone into a low-latency second monitor for Linux



Orbiscreen: Turn Android into a Second Monitor for Linux

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

Version License Rust Platform Stars


Share on Reddit Share on X Share on Hacker News


🌐 Language

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


πŸ“‹ Table of Contents


πŸ€” What is Orbiscreen?

Orbiscreen turns a spare Android tablet or phone into a genuine secondary monitor for your Linux desktop. It creates an independent kernel-level virtual display via DisplayLink's evdi (COSMIC, GNOME, X11), or a compositor-native virtual monitor on KDE Plasma and wlroots with zero root required and no screen-share dialogs, streamed as MPEG-TS/H.264 with reverse multi-touch, mouse, keyboard, and pressure-sensitive stylus control natively on Android.

πŸ†š How Does Orbiscreen Compare to Alternatives?

Feature / Capability Spacedesk Deskreen Weylus Apple Sidecar Orbiscreen
Linux Host Support ❌ (Windows only) βœ… (Web based) βœ… (Web based) ❌ (macOS only) βœ… Linux-first
Wayland & X11 Support ❌ ⚠️ (Requires dummy plug) ⚠️ (Mirror only) ❌ βœ… Native Wayland & X11
True Extended Display βœ… (Windows only) ❌ (Needs HDMI dummy) ❌ (Screen mirror only) βœ… (Apple only) βœ… Real Virtual Monitor
Native Android Client βœ… ❌ (Browser only) ❌ (Browser only) ❌ (iPad only) βœ… Native Jetpack Compose
Hardware Encoding βœ… ❌ ⚠️ βœ… βœ… NVENC & VA-API
Ultra-Low Latency ~50-80ms ~150-300ms ~80-120ms ~30ms ⚑ ~25-40ms
Stylus Pressure & Tilt ❌ ❌ ⚠️ (Stylus only) βœ… βœ… 4095 Levels (Krita/GIMP)
Reverse Touch & Mouse βœ… ❌ ⚠️ (Stylus only) βœ… βœ… Multi-touch, Mouse & Keys
Zero Root (KDE & wlroots) N/A βœ… ❌ N/A βœ… Rootless (KWin / wlroots)
Open Source ❌ (Proprietary) βœ… (GPL-3.0) βœ… (AGPL-3.0) ❌ (Closed source) βœ… GPL-3.0 (100% Free)

🎯 Popular Use Cases

  • πŸ“± Repurpose Spare Tablets & Phones: Don't let your older Android tablet (Samsung Galaxy Tab, Xiaomi Pad, Lenovo Tab) gather dust. Turn it into a high-utility second screen.
  • 🎨 Digital Drawing Tablet (Graphic Digitizer): Connect your tablet and stylus (S-Pen, capacitive, active stylus) to paint with native pressure sensitivity and tilt in Linux creative software like Krita, GIMP, Blender, and Inkscape.
  • πŸ’» Dual Monitor On the Go: Travel light without carrying fragile external monitors. Extend your Linux laptop screen at coffee shops, flights, coworking spaces, or hotel desks.
  • πŸ–₯️ Auto-Rotating Portrait Monitor: Rotate your device to vertical orientation for reading code, API documentation, terminal logs, or keeping Discord/Slack visible.
  • ⚑ Zero Wi-Fi Latency via USB: Plug in a USB cable; Orbiscreen's automatic ADB reverse tunnel delivers interference-free, ultra-low latency performance.

✨ Highlights

  • XDG Desktop Portal Virtual Display API: Rootless virtual display creation on GNOME 46+ and KDE Plasma 6+ via ScreenCast SourceType::Virtual, with automatic EVDI fallback
  • Graphic Digitizer with Stylus Hover & Pressure: 4095 pressure levels, tilt tracking, and in-air hover cursor tracking mapped to Linux uinput for Krita, GIMP, and Blender
  • Touchpad Drag-and-Drop Gesture: Double-tap and drag in Touchpad mode for seamless window moving and file selection, with strict multi-monitor boundary confinement
  • Ultra-Low Latency 5GHz Wi-Fi Tuning: 6-frame GOP (100ms keyframe interval) with sub-50ms buffer pipeline for instantaneous recovery and zero-lag responsiveness
  • Chromebook CM3001 & ChromeOS Support: Auto-probing internal ADB route (100.115.92.2:5555) for plug-and-play USB streaming on ChromeOS ARC++
  • Session Token Security & Bootstrap: Session token generation with strict 0o600 permissions and automated discovery delivery, supporting #token= URL hash for direct links
  • Connection Lifecycle & Fast Recovery: Explicit disconnect detection, 500ms /health probe, and capped reconnection attempts
  • Real virtual display via evdi (X11 and Wayland), or zero root on KDE Plasma / wlroots: KWin virtual monitor or compositor headless output without kernel modules
  • Material 3 Android client: Jetpack Compose, Catppuccin Mocha / Latte brand palette, light/dark theme
  • Auto-Orientation Resolution Adaptation: Automatically swaps width and height when your phone/tablet rotates between landscape and portrait
  • 3-Row Spacious Keyboard Overlay: Top-docked layout ensuring bottom taskbars, terminals, and prompts stay 100% visible
  • Built-in web client: Watch from any browser at http://<host>:8788/ (MSE via locally bundled mpegts.js, no CDN)
  • Live discovery: NSD scan of nearby hosts, manual host:port entry, optional subnet scanner
  • Native streaming: ExoPlayer with OkHttpDataSource + tuned load control for ultra-low latency MPEG-TS / H.264
  • Host control panel: Keyboard, lock, blank, Ctrl+Alt+Del, and retry actions
  • USB transport via adb reverse: Hot-plug detection picking up newly connected devices within two seconds
  • Hardware encoding: NVIDIA NVENC, Intel/AMD VA-API, and x264 software fallback
  • Cryptographic signing of every Linux and Android artifact

πŸ–₯️ Desktop Support

Environment Virtual second display Capture Input
KDE Plasma (Wayland) βœ… Native (Portal Virtual / zkde-screencast, no root) βœ… PipeWire βœ… RemoteDesktop portal / uinput
COSMIC (Wayland) ⚠️ Via EVDI (guided by doctor --fix) βœ… Portal ScreenCast (PipeWire) βœ… uinput (multi-touch & stylus) / RemoteDesktop
Sway / Hyprland / wlroots βœ… Headless output via compositor IPC (no root) βœ… wlr-screencopy (no dialog) βœ… virtual-pointer / virtual-keyboard (no portal)
GNOME (Wayland) βœ… Portal Virtual (GNOME 46+) / EVDI βœ… Portal ScreenCast (PipeWire) βœ… RemoteDesktop portal: persisted
XFCE / MATE / LXQt / Cinnamon (X11) βœ… Via EVDI βœ… XShm mirrored root (pooled, duplicate frames skipped) βœ… XTEST (rootless), uinput fallback
Anything else βœ… Via EVDI (guided by orbiscreen doctor --fix) Best available backend Best available backend

orbiscreen doctor reports the detected compositor, the exact capture plan auto will follow, and what is missing on the system; orbiscreen doctor --fix installs the EVDI kernel module on detected distros. Full details in Desktop Environment Support.


πŸš€ Quick Start

1. Installation

  • Ubuntu / Pop!_OS / Linux Mint (Launchpad 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
  • Universal AppImage (.AppImage): Download orbiscreen-x86_64.AppImage from GitHub Releases:

    chmod +x orbiscreen-x86_64.AppImage
    ./orbiscreen-x86_64.AppImage
  • One-Command Automated Installer:

    git clone https://github.com/shadow-x78/orbiscreen.git ~/Orbiscreen
    cd ~/Orbiscreen
    ./scripts/install.sh
  • Android App (.apk): Download orbiscreen-android-release.apk from GitHub Releases.

2. Running Orbiscreen

  • From Terminal (Foreground Daemon):

    orbiscreen start
  • As Background Service (systemd user unit):

    systemctl --user start orbiscreen
    # To enable automatically on login:
    systemctl --user enable orbiscreen

βš™οΈ Commands

# Start virtual display daemon with auto environment detection
orbiscreen start

# Start with custom resolution and framerate
orbiscreen start --width 1920 --height 1080 --fps 60

# Force specific hardware encoder (nvenc, vaapi, x264)
orbiscreen start --encoder nvenc

# Run diagnostics and view capture pipeline details
orbiscreen doctor

# Automatically install missing kernel modules or dependencies
orbiscreen doctor --fix

# Gracefully stop running daemon
orbiscreen stop

πŸ“± Android App Features

  • Instant mDNS Discovery: Automatically discovers Linux hosts on your Wi-Fi network.
  • USB Cable Hot-Plug: Connect with a single USB cable for zero-latency, zero-interference streaming via ADB reverse.
  • Chromebook & ChromeOS ARC++ Ready: Auto-probing internal ADB route on 100.115.92.2:5555 for Chromebook CM3001 and ChromeOS devices.
  • Graphic Digitizer Support: Stylus in-air hover cursor tracking, pressure sensitivity (4095 levels), and tilt angle support for drawing in Krita and GIMP.
  • Touchpad Drag-and-Drop: Double-tap and drag gesture for smooth window dragging, file movement, and text selection.
  • Ultra-Low Latency Wi-Fi Tuning: 40-120ms tuned buffer profile paired with 6-frame GOP encoding for instant live edge tracking on 5GHz networks.
  • Fast Disconnect Detection: Instant 500ms health checking and capped reconnection preventing infinite retry loops.
  • Dynamic Auto-Rotation: Rotating your device automatically synchronizes virtual screen aspect ratio.
  • Top-Docked Keyboard Overlay: 3-row layout with function keys, shortcuts, and navigation that never obscures your workspace.
  • Streamlined Display Settings: Dedicated pointer speed slider and instant resolution picker.

πŸ›οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      orbiscreen-daemon                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ orbiscreen-display β”‚  β”‚ orbiscreen-capture             β”‚  β”‚
β”‚  β”‚ (evdi kernel/DRM)  β”‚  β”‚ (zkde-screencast/wlr/ashpd)    β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚             β”‚                            β”‚                   β”‚
β”‚             β–Ό                            β–Ό                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ orbiscreen-encode (GStreamer NVENC/VAAPI/x264)         β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                              β”‚                               β”‚
β”‚                              β–Ό                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ orbiscreen-transport (HTTP MPEG-TS + mDNS + ADB USB)   β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ—οΈ Project Structure

orbiscreen/
β”œβ”€β”€ crates/
β”‚   β”œβ”€β”€ orbiscreen-core/        # shared types, config, errors
β”‚   β”œβ”€β”€ orbiscreen-display/     # evdi-backed virtual displays
β”‚   β”œβ”€β”€ orbiscreen-capture/     # X11 (x11rb) + Wayland (zkde-screencast / ashpd PipeWire)
β”‚   β”œβ”€β”€ orbiscreen-encode/      # GStreamer pipeline (VAAPI / NVENC / x264)
β”‚   β”œβ”€β”€ orbiscreen-input/       # uinput tablet & touch + ashpd RemoteDesktop
β”‚   β”œβ”€β”€ orbiscreen-transport/   # axum + mDNS + ADB reverse USB
β”‚   └── orbiscreen-daemon/      # CLI binary wiring every layer together
β”œβ”€β”€ clients/
β”‚   β”œβ”€β”€ web/                    # browser MPEG-TS client (HTML / CSS / JS)
β”‚   └── android/                # Material 3 Compose app
β”œβ”€β”€ assets/
β”‚   └── logo/                  # Vector SVG and PNG icon & banner set
β”œβ”€β”€ data/                      # desktop entry, RPM spec, systemd service
β”œβ”€β”€ scripts/                   # install, packaging (deb / rpm / AppImage), dev tooling
└── docs/                      # bilingual guides (EN + AR)

❓ Frequently Asked Questions (FAQ)

Can I use my Android tablet as a true extended display, not just screen mirroring?
Yes! Unlike screen-mirroring apps, Orbiscreen creates an independent, native virtual monitor on your Linux desktop (via KDE Plasma KWin virtual display, wlroots headless output, or EVDI kernel driver). You can position it anywhere relative to your physical monitors, drag application windows to it, and adjust resolution up to 4K.
Does Orbiscreen work on Wayland without root permissions?
Yes! On modern Linux desktop environments like KDE Plasma (Wayland) and wlroots compositors (Sway, Hyprland), Orbiscreen creates native virtual monitors rootlessly without any kernel modules or screen-share authorization dialogs. On COSMIC, GNOME, and X11, Orbiscreen uses EVDI for kernel-level display support.
Can I use my tablet as a drawing tablet with pressure sensitivity in Krita or GIMP?
Yes! Orbiscreen intercepts stylus pressure (up to 4095 levels) and tilt angles from active styluses (such as Samsung S-Pen or capacitive styluses) and injects them as a genuine Linux tablet digitizer. You can sketch and paint naturally in Krita, GIMP, Blender, and Inkscape.
How does Orbiscreen compare to other solutions?
Unlike proprietary solutions restricted to specific operating systems and ecosystems, Orbiscreen delivers a high-performance, open-source extended monitor experience built specifically for Linux hosts and compatible with any Android tablet, phone, or web browser.
Can I connect via USB cable instead of Wi-Fi?
Yes! Orbiscreen features built-in automatic ADB reverse tunneling over USB. Simply enable USB Debugging on your Android device and plug it in; Orbiscreen automatically establishes a zero-interference USB connection within two seconds.
What is the latency during streaming?
With hardware encoding enabled (NVIDIA NVENC or Intel/AMD VA-API on Linux, and MediaCodec hardware decoding on Android), latency is imperceptible and near-zero, making it snappy and responsive for coding, reading, browsing, and media consumption.

πŸ“š Documentation

Document Description
ARCHITECTURE.md System topology, frame pipeline & D-Bus architecture
UDP_TRANSPORT.md UDP Annex-B video path, packet types, DPLPMTUD & test hooks
DE_SUPPORT.md Per-desktop support matrix, capture plans & troubleshooting
PACKAGING.md Multi-distro packaging specs (.deb, .rpm, AppImage)
DBUS_SPEC.md D-Bus Session Bus IPC interface specifications
TROUBLESHOOTING.md Common issues, diagnostics & hardware acceleration fixes

⭐ Support the Project & Spread the Word

If Orbiscreen has made your workflow smoother or saved you from buying a costly portable monitor:

  • ⭐ Star this repository on GitHub - every star boosts discoverability in GitHub Search and Google!
  • πŸ“’ Share with the community on Reddit (r/linux, r/android, r/kde), Mastodon, or X/Twitter.
  • πŸ› Report issues or suggest features via GitHub Issues.
  • πŸ’‘ Contribute code or translations via Pull Requests.

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/my-feature
  3. Commit your changes: orbiscreen | <type>: <description>
  4. Push to the branch
  5. Open a Pull Request

Please read our Contributing Guidelines and Code of Conduct for community standards, development workflow, and the release process.


πŸ“œ License

Distributed under the GPL-3.0 License.


Built by shadow-x78 Β· Changelog Β· Code of Conduct Β· 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

22 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages