Control your PC from your phone - A two-sided application for remote PC control via virtual touchpad, keyboard, and media keys.
📱 Screen-Streaming Touchpad – Unlike other remote control apps, RemoteKeyboard streams a live screenshot of the area around your PC cursor directly to your phone's touchpad.
Why this matters: Control your PC when you can't see the screen:
- Music/podcasts with display off – Listen to YouTube, Spotify, or podcasts with the monitor/TV off; see what's playing on your phone and control it without turning the screen on
- Monitor out of view – PC connected to TV in another room or obscured location
- Quick adjustments – Change volume, skip tracks, or navigate without needing visual access to the display
RemoteKeyboard lets you control your PC (especially useful for PC connected to TV) from your Android or Windows phone using:
- Virtual Touchpad - Move cursor, click, scroll
- Virtual Keyboard - Type text on your PC
- Media Keys - Play/Pause, Next, Previous, Volume control
┌──────────────┐ ┌──────────────┐
│ Mobile │ WebSocket │ PC │
│ (Flutter) │◄───────────────────────►│ (Rust) │
│ │ (Local LAN) │ │
└──────────────┘ └──────────────┘
Touchpad Controls PC
Keyboard (mouse, keyboard,
Media Keys media keys)
- ✅ Automatic device discovery on local network (network scanning)
- ✅ Virtual touchpad with cursor control
- ✅ Tap-to-click (left/right click)
- ✅ Two-finger scroll
- ✅ Virtual keyboard for text input
- ✅ Media keys (Play/Pause, Next, Prev, Volume, Mute)
- ✅ Windows Firewall auto-configuration
- ✅ Low latency (< 50ms target)
- ✅ Auto-reconnect - Automatically reconnects on connection loss with exponential backoff
- ✅ Cold start reconnect - Automatically reconnects to last PC on app restart
- ✅ Connection monitoring - Heartbeat-based connection health monitoring
- ✅ Network permissions - Full Android network support
- ✅ Multi-monitor support - Smooth cursor movement across multiple monitors
- ✅ Physical cursor coordinates - True physical pixels for multi-DPI setups (enigo + xcap)
- ✅ Screen capture streaming - Stream screen area around cursor (5 FPS, configurable zoom)
- ✅ Mobile screen display - View PC screen in touchpad area with cursor indicator
- ✅ Cursor always centered - Capture follows cursor, red dot fixed at image center
- ✅ Aspect ratio preservation - No stretching, black letterboxing
- ✅ Bandwidth optimization - Server-side downscaling (max 400px, Triangle filter)
Get the latest pre-built binaries:
Or visit: https://github.com/vedran-/RemoteKeyboard/releases
| File | Description | Size |
|---|---|---|
RemoteKeyboard-Server-v*.exe |
PC Server (Windows) | ~3.3 MB |
RemoteKeyboard-Client-v*.exe |
Mobile Client (Windows) | ~30 MB |
RemoteKeyboard-Client-v*-arm64.apk |
Mobile Client (Android ARM64) | ~50 MB |
RemoteKeyboard-Client-v*-armv7.apk |
Mobile Client (Android ARMv7) | ~50 MB |
Download and run: RemoteKeyboard-Server-v*.exe
Or build from source:
cd pc
cargo run --releaseYou should see:
🎹 RemoteKeyboard PC
===================
🔒 Configuring Windows Firewall...
✅ Firewall rule configured: RemoteKeyboard-8765
📡 Starting mDNS advertiser...
✅ mDNS advertising: _remotekeyboard._tcp.local.
🔌 Starting WebSocket server...
✅ WebSocket server listening on port 8765
📱 Ready to receive commands from mobile!
Download and install: RemoteKeyboard-Client-v*.exe (Windows) or .apk (Android)
Or build from source:
cd mobile
flutter build windows --release # Windows
flutter build apk --release # Android-
Make sure both devices are on the same WiFi network
-
Find your PC's IP address:
ipconfig # Look for IPv4 Address, e.g., 192.168.1.100 -
On mobile app:
- Open app → Go to "Connect" tab
- Option A (Auto): Wait for network scan
- Option B (Manual): Tap "Add PC Manually" → Enter IP and port
8765 - Tap connect icon (🔌)
-
Start using:
- Touchpad: Drag to move cursor, tap to click
- Keyboard: Type text on PC
- Media: Control media playback
Check firewall:
netsh advfirewall firewall show rule name="RemoteKeyboard-8765"Add firewall rule manually (as Administrator):
netsh advfirewall firewall add rule name="RemoteKeyboard-8765" dir=in action=allow protocol=TCP localport=8765Check port is listening:
netstat -ano | findstr :8765PC:
rustup update && cargo clean && cargo build --releaseMobile:
flutter clean && flutter pub get && flutter build windows --releaseThis project uses Domain-Driven Design (DDD) with layered architecture:
- Domain Layer - Business logic, entities, commands
- Application Layer - Use cases, ports
- Infrastructure Layer - Adapters (WebSocket, mDNS, input simulation)
- Presentation Layer - UI (Flutter mobile, Rust console)
| Component | Technology |
|---|---|
| Mobile App | Flutter (Dart) |
| PC App | Rust |
| Input Simulation | enigo crate |
| Communication | WebSocket (TCP) |
| Discovery | mDNS / Network Scanning |
See Architecture Decision Records for rationale.
| Document | Description |
|---|---|
| SPECIFICATION.md | Requirements |
| ARCHITECTURE.md | System design |
| PROTOCOL.md | Message formats |
| ROADMAP.md | Development plan |
| DECISIONS.md | Architecture decisions |
| GITIGNORE.md | Git configuration |
| Component | Status | Tests |
|---|---|---|
| PC Server | ✅ Complete | 119 passing |
| Mobile Windows | ✅ Complete | 71 passing |
| Mobile Android | ✅ Complete | 71 passing |
Total: 190 tests passing ✅
- ✅ Screen streaming (5 FPS, multi-monitor, RGBA→RGB fix, no flickering)
- ✅ Server restart fix (streaming works multiple times per session)
- ✅ Aspect ratio preservation (no stretching, black letterboxing)
- ✅ Bandwidth optimization (server-side downscaling to max 400px)
- ✅ Client-controlled capture dimensions (WxH based on touchpad)
- ✅ Mobile screen display (touchpad shows PC screen capture)
- ✅ Multi-monitor mouse support (clamping workaround)
- ✅ Auto-reconnect with exponential backoff (1s → 2s → 3s → 4s → 5s)
- ✅ Cold start reconnect to last PC
- ✅ Heartbeat-based connection monitoring
- ✅ Android network permissions fix
- ✅ Smart notification system (dismissible, auto-dismiss)
- ✅ Comprehensive integration tests
PC:
- Rust 1.75+ (install)
Mobile:
- Flutter 3.x+ (install)
- Android Studio (for Android builds)
flutter config --enable-windows-desktop(for Windows builds)
# PC Server
cd pc && cargo build --release
# Mobile Windows
cd mobile && flutter build windows --release
# Mobile Android
cd mobile && flutter build apk --releaseSee full build instructions in README.md (this file has detailed sections).
Contributions are welcome!
How to help:
- Report bugs or feature requests
- Submit PRs (follow DDD architecture)
- Improve documentation
- Test on different devices
Guidelines:
- Follow DDD layer structure
- Write tests for domain logic
- Update docs when changing architecture
MIT License
Last Updated: 2026-03-01
Version: 1.0.0
Builds: Server 3.3 MB | Client Win 30 MB | Client Android 50-160 MB