Stream Deck-like keyboard shortcut controller - Mobile control over local network
Local Desk transforms your mobile device (iOS/Android) into a wireless shortcut controller for your desktop computer. With a Stream Deck-like interface, you can easily trigger keyboard shortcuts for OBS, video editing, game streaming, and general productivity.
- Automatically finds devices on the network via UDP broadcast
- mDNS/Bonjour support
- No internet connection required
- Works on local network
- Pairing system on first connection
- Requires approval from desktop
- Trusted device list
- Automatic reconnection
- Uses Windows SendInput API
- C++ Native addon
- Compatible with all applications (OBS, Premiere, games, etc.)
- Detected as physical keyboard
- Colorful button grid
- Customizable icons
- Drag-and-drop editing
- Page/category support
- Changes made on desktop appear instantly on mobile
- Real-time updates via Socket.IO
- Bidirectional communication
┌─────────────────┐ ┌─────────────────┐
│ │ │ │
│ 📱 Mobile App │ ←──── WiFi ────→ │ 🖥️ Desktop │
│ React Native │ │ Electron │
│ │ │ │
│ • Discovery │ │ • HTTP Server │
│ • Socket.IO │ │ • Socket.IO │
│ • Button Grid │ │ • C++ Addon │
│ │ │ • SendInput │
└─────────────────┘ └─────────────────┘
LocalDesk/
├── desktop/ # Electron desktop application
│ ├── main.js # Electron main process
│ ├── preload.js # IPC bridge
│ ├── server/ # Node.js backend
│ │ ├── index.js # Socket.IO server
│ │ ├── discovery.js # UDP + mDNS
│ │ └── keyboard-addon/ # C++ SendInput module
│ └── ui/ # HTML/CSS/JS interface
│
└── LocalDesk/ # React Native mobile app
├── App.jsx # Main application
└── src/
├── hooks/ # Custom hooks
├── components/ # UI components
└── screens/ # Screens
Desktop:
- Node.js 20+
- Windows (for keyboard addon)
- Visual Studio Build Tools 2019+
Mobile:
- Node.js 20+
- React Native CLI
- iOS: Xcode 14+ (macOS)
- Android: Android Studio + JDK 17
cd desktop
# Install dependencies
npm install
# Build C++ Addon
cd server/keyboard-addon
npm install
cd ../..
# Or directly
npm run rebuild
# Start the application
npm startcd LocalDesk
# Install dependencies
npm install
# For iOS
cd ios && pod install && cd ..
npm run ios
# For Android
npm run android- Open Local Desk Desktop on Windows
- UDP and mDNS services start automatically
- Device name and status appear in the top left corner
- Make sure you're on the same WiFi network
- The app automatically finds your desktop device
- Select your device from the list
- When you select a device on mobile, a pairing request is sent
- Click "Approve" on the popup that appears on desktop
- Connection is established and shortcuts are downloaded
- Stream Deck-style button grid appears on mobile screen
- Press any button to trigger the keyboard shortcut
- Desktop detects it as if real keyboard keys were pressed
- Click "➕ Add New Shortcut" in the desktop application
- Select label, keys, and color
- Save - appears instantly on mobile
{
"label": "Start/Stop Recording",
"keys": ["CONTROL", "ALT", "R"],
"color": "#f44336"
}{
"label": "Render",
"keys": ["CONTROL", "M"],
"color": "#9c27b0"
}{
"label": "Discord Mute",
"keys": ["CONTROL", "SHIFT", "M"],
"color": "#5865F2"
}{
"label": "Screenshot",
"keys": ["WIN", "SHIFT", "S"],
"color": "#00C853"
}- HTTP/Socket.IO: 3100
- UDP Discovery: 45454
- mDNS: Automatic
desktop/server/data/
├── config.json # Device settings
├── shortcuts.json # Shortcut list
├── trusted.json # Trusted devices
└── icons/ # Custom icons
Desktop:
NODE_ENV=development npm start
# DevTools opens automaticallyMobile:
npm start -- --reset-cache
# Shake device > Debugcd desktop/server/keyboard-addon
npm run rebuild- ✅ Successful operations
- 📡 Network events
- ⌨️ Keyboard inputs
- 🔐 Pairing operations
- ❌ Errors
⚠️ Warnings
Request (Broadcast):
LOCALDESK_DISCOVER_REQUEST
Response:
{
"type": "LOCALDESK_DISCOVER_RESPONSE",
"deviceId": "desktop-uuid-here",
"deviceName": "Desktop-PC",
"deviceType": "desktop",
"port": 3100,
"timestamp": 1234567890
}Pairing:
// Client → Server
emit('pair-request', {
deviceId: 'mobile-xxx',
deviceName: 'iPhone 15',
deviceType: 'ios'
})
// Server → Client
emit('pair-response', {
success: true,
message: 'Pairing approved'
})Execute Shortcut:
// Client → Server
emit('execute-shortcut', {
shortcutId: 1,
keys: ['CONTROL', 'ALT', 'O']
})
// Server → Client
emit('execute-result', {
success: true,
shortcutId: 1
})Synchronization:
// Server → Client
emit('shortcuts-update', [
{ id: 1, label: '...', keys: [...], color: '...' }
])- ✅ Works on local network (no internet required)
- ✅ Manual approval on first connection
- ✅ Trusted device system
- ✅ Permission check for each command
⚠️ SSL/TLS not used (not necessary for local network)
- Make sure you're on the same WiFi network
- Firewall should allow ports 3100 and 45454
- Check that desktop application is running
- Restart mobile application
- If you approved pairing on desktop
- Check if you're in the trusted devices list
- Clear trusted devices on mobile and try again
- Restart both applications
- Make sure C++ Addon is built:
npm run rebuild - Check if Windows Build Tools is installed
- Check desktop logs
- Make sure target application is in focus
- Check if there's heavy traffic on the same network
- Check WiFi signal strength
- Don't leave mobile app in background
- Check if other heavy processes are running on desktop
Add icons to desktop/server/data/icons/ folder:
{
"label": "OBS",
"icon": "obs.png",
"keys": ["CONTROL", "ALT", "O"],
"color": "#1F6FEB"
}For desktop UI desktop/ui/style.css:
:root {
--bg-primary: #1e1e1e;
--accent-blue: #1F6FEB;
/* ... */
}For mobile UI LocalDesk/src/components/ButtonGrid.jsx:
const styles = StyleSheet.create({
button: {
backgroundColor: '#252526',
// ...
}
});- Macro recording system
- Multiple page/category support
- Custom icon upload interface
- Haptic feedback
- Widget support (iOS/Android)
- Theme support (light/dark)
- macOS/Linux support
- Web interface
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'feat: Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License - See LICENSE file for details
|
Harun Selçuk Çetin 🔗 LinkedIn • |
- Electron
- React Native
- Socket.IO
- LocalSend - Inspiration for discovery logic
⭐ If you liked the project, don't forget to give it a star!