WBeam turns an Android phone/tablet into a USB-connected second screen for Linux.
WBeam has two sides:
- Host (Linux): daemon/service + desktop app
- Client (Android APK): receives stream over USB/ADB path
Tip
Status now (simple):
- EVDI is the working path and supports around 60 FPS.
- Wayland portal is still very glitchy on some setups.
- If stream feels bad, use EVDI path first and check that
evdimodule is loaded.
Android debug menu:
- in the APK, hold
VOL+andVOL-together for about2 seconds
This is the simplest local flow currently used in development:
- Clone repo and enter it.
- Connect Android by USB (ADB must see device in
devicestate). - Run full local redeploy:
This builds host + desktop, deploys APK to connected device(s), runs version checks, and launches desktop UI.
./redeploy-local
- If needed, start desktop manually:
./desktop.sh
- Ensure host service is installed and running (from desktop UI or CLI):
./wbeam service install ./wbeam service start
- Click Connect in desktop app.
- Ensure EVDI module is available on host:
sudo modprobe evdi
./wbeam --help
./wbeam host build
./wbeam android deploy-all
./desktop.sh- Connect Android with USB.
- Run
./redeploy-localto build and deploy everything. - Run
./desktop.shif desktop is not already open. - Install/start service, then click Connect.
- Make sure
evdiis loaded (sudo modprobe evdi). - If Wayland portal is glitchy, use EVDI path.
Use the interactive tuner to benchmark and generate a reusable profile:
./wbeam host tunerIn Run Config:
- set
ObjectiveandWorkload - choose Use prerendered scenes for training
- enabled: trains on deterministic synthetic scenes (
display_mode=benchmark_game) - disabled: trains on virtual desktop (
display_mode=virtual_monitor) - Note: Wayland virtual monitor capture is capped at ~60 fps by the compositor (KDE/GNOME ScreenCast limitation). For training at higher frame rates use prerendered scenes.
- enabled: trains on deterministic synthetic scenes (
- set Child train time (seconds)
- this is the full time budget per child
- default is 5s (e.g. set 10 => each child runs for 10s)
- provide a profile name and start evolution
When a run completes, the tuner shows a Final profile settings summary box with score and winner details (bitrate/fps/intra, source mode, child train time, reason). Saved profiles are written to:
~/.config/wbeam/trained_profiles.json
Committed example profiles are available in:
config/trainer-profiles/examples/
android/- Android domain (client app + decode runtime)host/- host domain boundarydesktop/- desktop domain boundaryshared/- shared contracts/protocol boundary
Structure source of truth:
docs/repo-structure.md
./wbeam- canonical CLI./wbgui- terminal UI wrapper./devtool- developer helper./start-remote- remote session bootstrap
