Phone · Bluetooth · Windows laptop
Your laptop, from across the room.
Edgepad turns an Android phone into a trackpad, a media remote and a control panel for a Windows laptop, over a direct Bluetooth link with nothing in between. The two pair once, the way a headset does, and after that they talk straight to each other.
- No account
- No network
- No telemetry
- MIT licensed
- Transport
- Bluetooth Classic RFCOMM
- Protocol
- Version 4
- Phone
- Kotlin, Android 12+
- Laptop
- C# on .NET 10, Windows 10 2004+
Demo, 7:28
Every feature, from setup to how it works.
What it does
The whole phone screen is the control surface.
A touch is classified where it starts: inside a corner's zone it belongs to that dial for its whole life, on a media piece or a top button it is a button press, anywhere else it is the trackpad.
Corner dials
Each corner holds a dial drawn as a ruler that wraps the bend. Slide along it, clockwise to raise. Volume, brightness, media scrub, zoom, app switcher, microphone level or refresh rate — Settings picks what each corner does.
Trackpad
Everything between the corners moves the laptop's pointer. One finger moves and clicks, two scroll and pinch and right-click, three and four fingers do whatever you assign them.
Media
The track, the app playing it and where it is, with previous, play/pause and next. Drag the three pieces anywhere on the surface.
Keyboard
A full on-screen keyboard whose modifiers work held or tapped. It opens sideways, and its text size is a setting.
Gamepad
Install ViGEmBus on the laptop and the phone drives a real virtual Xbox controller, sticks and triggers analog, so games that only accept a controller can be played from across the room. Without the driver the same pad sends keyboard keys, and says which of the two it is in.
Your pad, your bindings
Add a control, bind it to any controller input or key that fits it, size it, label it, move it. Layouts are a library kept one per game, and the ones Edgepad ships with can never be renamed away.
Shapes
Press and hold on the trackpad until it ticks, then draw. The stroke runs the action or macro you bound to it. A stroke that matches nothing does nothing.
Macro buttons
Fifteen slots the laptop's tray menu names with an app, a document, a folder or a URL each; the phone sends the slot number and never what it opens. The grid sizes its buttons to the longest name and fits as many across as the screen allows.
Live state
The dials show the laptop's real volume, mute, brightness and playback position, and follow changes made on the laptop itself.
How it works
Two programs, one seam, nothing in the middle.
The alternatives are a remote app that only sends media keys, or a remote-desktop app that streams the whole screen and wants an account and a network round trip to change the volume. Edgepad is neither.
Phone
Recognises the touch
RFCOMM
Paired once, no network
Laptop
Runs the action
- 1
Pair once, like a headset
The phone and the laptop pair in Windows Settings > Bluetooth & devices. Edgepad has no pairing step of its own, no account to make and no network to join. The first phone to connect becomes the laptop's trusted phone; every other paired phone is refused until you forget it from the tray menu.
- 2
The phone recognises, the laptop executes
The phone turns a touch into a small semantic frame: move the pointer by so much, press a button, scroll, run action 3, set control 0 to 55, here is the whole state of a controller. The laptop owns the table of what each action does, so a phone can name an action but never invent one. It is not a containment boundary and is not offered as one: a paired phone is a trusted input device, and its keyboard screen sends raw key codes the way any keyboard does.
- 3
The laptop reports back
Volume, mute, brightness and what is playing come back the other way, so the dials show the laptop's real values and follow changes you make on the laptop itself rather than drifting out of step with it.
The transport
Bluetooth Classic RFCOMM: an ordered, encrypted byte stream between two already-paired devices, with no server, no discovery and no network anywhere in the product. Frames are 2 to 258 bytes and go out in a single write per batch; a backlog of pointer moves collapses into one before it is sent, so a slow link catches up instead of lagging.
The cost
What it will not do.
Bluetooth's own limits are the price of having no server in the middle. Nothing here is hidden because it is inconvenient.
- It is Bluetooth, so both ends need it, and it does not reach another room or the internet.
- The laptop half needs Windows 10 version 2004 or later, 64-bit. The phone half needs Android 12 or later.
- Edgepad.exe is not code-signed, so SmartScreen warns the first time you run it.
- The gamepad's virtual controller needs ViGEmBus, a third-party signed kernel driver you install yourself. It was archived by its author in November 2023 and receives no updates, though it remains signed and working. Without it the gamepad sends keyboard keys instead, and the laptop tells the phone which of the two it is in.
- Task Manager, and anything running as administrator, ignores the phone unless Edgepad runs as administrator too. The lock screen, UAC prompts and Ctrl+Alt+Del cannot be reached at all.
Get it
Both halves, from the same release.
Always install both from the same one: the two refuse each other at the handshake when their protocol versions differ, and say so. Protocol version 4 is what this release speaks.
- 1Download it. One self-contained 64-bit file; the laptop does not need .NET.
- 2Run it. SmartScreen asks first: More info, then Run anyway.
- 3It lives in the system tray, with macros, the log and Start with Windows in its menu.
- 4Optional: install ViGEmBus if you want the gamepad to drive a real controller. Everything else works without it.
- 1Download it and open it. Allow installing from this source if asked.
- 2Allow Nearby devices on first run. It reads the laptops already paired with the phone and never scans for new ones.
- 3Open it, tap the laptop, and the surface is there.
Free and MIT licensed. There is no account to make, no server to reach and nothing reported back: both halves are in the repository, and the release is built from it by GitHub Actions.