Turn a tablet browser into a secondary Hyprland display.
This project creates a virtual Hyprland output and serves it to another device over the local network. Open the server URL on a tablet, phone, or second laptop and it becomes a lightweight secondary display viewer.
The current implementation is intentionally simple:
grimcaptures the selected Hyprland output.- Rust/Axum serves the latest frame as
/frame.jpg. - The browser client refreshes frames and shows a live FPS counter.
- Setup scripts create/configure a
TABLET-1headless output.
It is a practical multi-device workflow prototype, not a production WebRTC stack yet.
src/main.rs Axum HTTP server
src/capture.rs Hyprland/grim frame capture and JPEG resize
static/index.html tablet browser viewer
scripts/setup-hyprland.sh
scripts/start-server.sh
.env.example local output/resolution settings
- Linux desktop running Hyprland.
- Rust toolchain.
grimfor Wayland output capture.- Tablet or phone on the same network.
Arch packages:
sudo pacman -S rust grimClone and build:
git clone https://github.com/dakshdoesdev/Multi-Device-Orchestration.git
cd Multi-Device-Orchestration
cargo build --releaseCreate local config:
cp .env.example .envCreate the Hyprland virtual display:
./scripts/setup-hyprland.shStart the server:
./scripts/start-server.shOpen the printed network URL on your tablet, usually:
http://YOUR_LAPTOP_IP:8080
If the virtual output already exists:
TABLET_OUTPUT=TABLET-1 cargo run --releaseHealth check:
curl http://localhost:8080/statusFrame endpoint:
curl -o frame.jpg http://localhost:8080/frame.jpg- The current stream is JPEG frame polling, not true WebRTC video.
- Touch input relay is not implemented.
- Hardware video encoding is not wired into the active path.
- Performance depends on Wi-Fi, capture cost, and target resolution.
The unused WebRTC/signaling modules are kept as a direction for the next version, but the shipped demo path is the simpler browser frame viewer.
cargo check
bash -n scripts/*.shLatest local check:
cargo check passed
