Type on your PC from your phone. Pair by QR, send text, hotkeys, and media keys —
encrypted end to end, and confirmed the moment they land.
Android client. Needs the desktop host → keybridge-server
KeyBridge turns your phone into a real input device for your computer. Scan the QR your desktop shows, and the keystrokes you send are typed on the PC as if they came from a keyboard plugged into it — full text, modifier combos, function keys, and media controls.
It's built around one rule: input you send is never assumed delivered. The phone holds your text until the host acknowledges it, shows progress while long pastes stream across, and surfaces failure instead of pretending a dropped message went through.
- Confirmed delivery, not fire-and-forget. Every message is acknowledged by the host
per chunk. The app shows
sending → delivered → failedas a real state — your text is retained and the failure is shown if a send drops, never silently cleared. - Pairing with no shared secret in the app. The key lives only in the QR. Scanning it is what authorizes the session; there is no password baked into the build and nothing sensitive crosses the network during the handshake.
- Encrypted per session. After pairing, every message is AES-256-GCM encrypted under a key unique to that connection. A message that doesn't authenticate is rejected — there is no plaintext fallback.
- Install and run keybridge-server on your computer — it shows a QR code.
- Open KeyBridge, go to Scanner, and point the camera at that QR (or enter the
ws://URL by hand). - Tap Connect. Once the status reads Ready, type in the text box or use the key grid — it lands on your PC.
Phone and PC must be on the same Wi-Fi network.
Light, dark, or follow the system — the choice persists across launches. Typing delay, key repeat rate, haptics, Mac-style modifier labels, and auto-connect are all adjustable, and every control is reachable by screen reader; animations honor the system "remove animations" setting.
Kotlin · Jetpack Compose · Material 3 · MVVM with StateFlow · CameraX + ML Kit (QR) · DataStore. Minimum Android 7.0 (API 24).
Input travels in a small versioned envelope, and the host acknowledges every chunk it
applies — which is how the app shows confirmed delivery and tracks progress. A type
message looks like:
{ "v": 1, "id": "…", "seq": 0, "total": 1, "type": "type",
"payload": { "text": "Hello, world" } }The full contract — envelope fields, input types, the acknowledgement shape, chunking, and bounded idempotent retry — is in PROTOCOL.md.
Supported keys
| Category | Keys |
|---|---|
| Modifiers | ctrl, alt, shift, cmd |
| Navigation | up, down, left, right, home, end, page_up, page_down |
| Actions | tab, enter, space, backspace, delete, esc, insert |
| Function | f1 – f12 |
| System | caps_lock, num_lock, scroll_lock, menu, pause, print_screen |
| Media | media_play_pause, media_next, media_previous, media_volume_up, media_volume_down, media_volume_mute |




