Android APK
Android 14+
Signed build for sideloading. Android will ask you to allow installing apps from this source the first time. Later versions install themselves from inside the app.
Personal project · Desktop application
Turn an Android phone into the controls for a Linux desktop
Two paired applications. A Python agent runs on the Linux machine as a systemd user service; a native Android client connects to it and turns the phone into a trackpad, a keyboard, a media remote, a dictation microphone and a viewer for the desktop screen.
Everything travels inside an SSH tunnel to the machine’s own sshd — no port is opened to the network and no separate account system exists. Authentication is a password or an SSH key that the app generates inside the Android Keystore, where the private half is non-exportable and every signature is produced by the phone’s secure hardware.
The control channel is a WebSocket carrying small JSON messages rather than one SSH command per event, because a mouse pointer cannot wait for a new shell each time it moves.
Android 14+
Signed build for sideloading. Android will ask you to allow installing apps from this source the first time. Later versions install themselves from inside the app.
Any platform
Both halves: the Python agent and the Android client, with their packaging scripts.
Open the APK from the Downloads notificationAndroid asks once for permission to install from this app, then installs normally. From then on the app checks for new versions itself on startup and offers to install them, so this is the only manual install.
cd desktop && ./packaging/install.shCreates a virtualenv under ~/.local/share/phone-master, installs a systemd user service and starts it. No root: it runs as you, because it needs your graphical session to control. --uninstall removes it again.
Add the computer in the app → connect with your password → “Pošalji SSH ključ”The app generates a key inside the Android Keystore and the agent installs the public half into ~/.ssh/authorized_keys. After that the password is no longer needed.
The repository is private. If you would like to look through the code, get in touch and I will grant access.