📱 Laptop Remote (Remote Deck)
Turn your smartphone into a powerful, low-latency remote control for your laptop. Control media playback, stream a high-precision trackpad, navigate with a virtual D-Pad and keyboard, and present with a real-time screen laser pointer.
⚠️ LAN-only tool. Designed for trusted local networks (home Wi-Fi / hotspot). Do not expose it to the public internet — see SECURITY.md.
📸 Screenshots
| Media Controls | Touch Trackpad | Virtual Mouse | Presentation Deck |
|---|---|---|---|
👀 View Real-World & Desktop Companion Preview
| Laptop Terminal Server | Phone Controlling Laptop |
|---|---|
✨ Features at a Glance
- ⚡ Terminal / Headless Edition: A lightweight, no-GUI server that prints a QR code and pairing PIN directly in the terminal.
- 🌐 Zero-Config Discovery: Connect instantly via QR code scan, local IP, or mDNS (
http://remotedeck.local:5000). - 🔒 Secure PIN Pairing: Protected with 6-digit rolling PIN verification, session Bearer tokens, and brute-force IP rate limiting.
- 🎵 Smart Media Deck: Context-aware media controls for YouTube, Netflix, Disney+ Hotstar, Prime Video, VLC, and web players.
- 🔍 Auto-Profile Detection: Automatically detects the active foreground window and switches key mappings on the fly.
- 🖱️ Low-Latency Trackpad: Smooth mouse movement powered by WebSockets, native OS input simulation, DPI scaling, tap-to-click, and 2-finger inertia scrolling.
- ⌨️ Keyboard & Navigation Keypad: Send text input/search queries directly to your laptop, use a 5-way D-Pad, and trigger 1-touch hotkey tiles (skip intro, cycle audio tracks, speed +/-).
- 📊 Presentation Mode with Laser Pointer: Projects a red laser dot across your laptop screen in real time, with slide controls, blackout mode, and an elapsed presentation timer.
- 📱 Progressive Web App (PWA): Installable to your phone's home screen for a distraction-free, full-screen remote experience.
- 🔋 Host Status: Live laptop battery percentage and active profile indicators.
🚀 Quick Start
1. From Prebuilt Executable (Windows — No Python Needed)
- Download
LaptopRemote-CLI.exefrom GitHub Releases. - Double-click
LaptopRemote-CLI.exe(or run it in Command Prompt / PowerShell). - Connect your phone on the same Wi-Fi by scanning the printed QR code!
2. Via pip or pipx (Cross-Platform)
# Standard install (Windows, macOS, Linux):
pip install laptop-remote
laptop-remote
# Modern Linux (Ubuntu/Debian) with pipx:
pipx install laptop-remote
laptop-remote
# Or run without installing:
pipx run laptop-remote
# Windows with native master volume support:
pip install "laptop-remote[windows]"
3. From Source (Developers / Git Clone)
git clone https://github.com/Sathyabalan6/laptop-remote.git
cd laptop-remote
# Install in editable mode
pip install -e .
# Run with an auto-generated PIN and ASCII QR code
laptop-remote
# Run with a custom PIN or different port
laptop-remote --pin 123456 --port 5000
# Enable HTTPS/WSS (self-signed cert auto-generated)
laptop-remote --ssl
Linux users can also use the launcher script:
./run.sh
🛠️ Remote Deck Controls & Tabs
🎵 1. Media Tab
- Active Profile: Auto-detects or lets you manually switch between YouTube / Hotstar, VLC Media Player, and Universal (Netflix / Prime / Web).
- Playback Controls: Play / Pause toggle, Skip Backward 10s (
⏪), Skip Forward 10s (⏩), Fast Skip 30s (⏭️). - Navigation & View: Previous / Next episode/track, Fullscreen toggle (
⛶). - 🔊 OS-Level Audio Controls: Volume Up, Volume Down, and Mute buttons adjust the host system volume directly — ensuring 100% reliability regardless of browser focus or scrolling.
- 💬 Subtitles & Tracks: One-tap toggle for closed captions, subtitle sync delay/advance (
Z/Shift+Z/G/H), and multi-language audio stream cycling.
🖱️ 2. Mouse & Trackpad Tab
- High-Precision Trackpad: Move cursor with one finger. Backed by native OS cursor calls (
win32api/ macOS Quartz) with DPI-scaled acceleration curves for smooth, responsive movement. - Tap-to-Click: Tap trackpad surface for instant left-click.
- Physical Click Buttons: Dedicated Left Click and Right Click pads.
- 2-Finger Momentum Scroll: Drag with two fingers to scroll web pages, documents, or timelines with natural physics decay.
- Sensitivity Slider: Fine-tune cursor speed and acceleration response directly from your phone.
⌨️ 3. Keyboard & Keypad Tab
- Live Search & Text Typing: Type queries or URLs on your phone and press Search to send them to the active text field on your laptop (supports rapid clipboard pasting).
- Targeted Focus:
/ Focus Search: Focuses in-page search bars on YouTube, streaming sites, and web apps.Ctrl+L URL Bar: Immediately jumps focus to the browser's address bar.
- 5-Way D-Pad & Navigation: Dedicated
Up,Down,Left,Right, andOK(Enter) buttons, plusESC,TAB,⇧ TAB, andBackspace. - Streaming & Quick Hotkey Grid:
Hotkey Tile Shortcut Action Supported Apps Skip Intro ( S)Skips intros & recaps Netflix, Prime, Hotstar Theater Mode ( T)Expands player view YouTube, Twitch Miniplayer ( I)Picture-in-Picture mode YouTube, Browsers Audio Dub ( A/B)Cycle audio language tracks VLC, Streaming Speed +/- ( >/<)Speed up / slow down playback YouTube, VLC Sub Sync +/- Shift subtitle timing forward/back VLC, Media Players Next Tab ( Ctrl+Tab)Cycle forward through browser tabs Chrome, Firefox, Edge Reload ( F5)Refresh current web page All Browsers Sub Size +/- Increase or decrease caption font size Supported Players
📊 4. Present Tab
- Screen Laser Pointer: Touch and drag your finger across the pad to project a smooth, hardware-rendered red laser dot over your laptop screen in real time.
- Slide Navigation: Dedicated Next Slide and Previous Slide buttons.
- Auto-Start Presentation: Mapped to
F5(orCtrl+F5when Google Slides, Canva, Prezi, or Docs are active). - Blackout Screen: Blank the laptop display with one tap during presentations or breaks.
- Slide Counter & Live Timer: Track slide numbers and presentation duration automatically from first touch.
🔒 Security & Connection Details
- Rolling One-Time PIN: A fresh 6-digit PIN is generated upon startup and regenerated after each successful pairing or manual revocation.
- Brute-Force Protection: IP-based lockout triggers automatically after 5 consecutive incorrect PIN attempts (30-second escalating lockout).
- Bearer Token Authorization: Paired devices receive a cryptographically secure 48-character session token stored locally on your device.
- Dual Transport: High-frequency mouse coordinates and laser pointer positions stream over WebSockets for minimal latency, with automatic fallback to REST endpoints if required.
- Offline Self-Contained: Socket.IO client library and assets are fully bundled locally — no internet connection or CDN required.
⚙️ Configuration & Custom Presets
Key mappings are defined in presets.json. You can customize or add hotkeys for your favorite applications:
{
"youtube_hotstar": {
"play_pause": "space",
"skip_forward": "l",
"skip_back": "j",
"skip_forward_30": ["l", "l", "l"],
"next": ["shift", "n"],
"fullscreen": "f",
"subtitles": "c",
"speed_up": ["shift", "."]
},
"universal": {
"play_pause": "space",
"skip_forward": "right",
"skip_back": "left",
"fullscreen": "f"
}
}
💻 Developer Setup & Building Executables
Prerequisites
- Python 3.10+ installed and added to your system
PATH.
Running from Source
# Install the package in editable mode (pulls in all dependencies)
pip install -e .
# Run the server (terminal edition)
python -m laptop_remote
Compiling a Standalone Executable (.exe)
- Windows: Double-click
build.batto builddist/LaptopRemote-CLI.exe. - Linux: Run
./build.shto builddist/LaptopRemote-CLI.
📁 Project Structure
laptop-remote/
├── pyproject.toml # Packaging metadata & dependencies
├── requirements.txt # Runtime dependencies
├── run.sh / build.sh # Linux launcher / builder
├── build.bat / build_cli.bat # Windows builders
├── setup_linux.sh # One-time Wayland (ydotool) setup on Linux
├── presets.json # Keyboard shortcut profiles (user-editable)
├── logo.ico # App icon
├── src/
│ └── laptop_remote/ # Main application package
│ ├── __init__.py
│ ├── __main__.py # python -m laptop_remote
│ ├── server/ # Flask + SocketIO server package
│ │ ├── __init__.py # public API (app, socketio, main)
│ │ ├── _app.py # app construction & shared runtime state
│ │ ├── state.py # build_state()
│ │ ├── routes_auth.py # pairing, revoke, QR
│ │ ├── routes_input.py # mouse/key/text/pointer/volume
│ │ ├── websocket.py # Socket.IO handlers
│ │ ├── discovery.py # mDNS + preset monitor
│ │ └── main.py # main() entry point
│ ├── cli.py # Terminal/headless entry point
│ ├── core/ # Platform backends & utilities
│ │ ├── input.py # Mouse/keyboard drivers (Windows/macOS/X11/Wayland)
│ │ ├── keys.py # Key-name → Linux input-event keycode mapping
│ │ ├── auth.py # PIN generation, bearer tokens, rate limiting
│ │ ├── config.py # Presets JSON loader & path resolver
│ │ ├── network.py # Local IP resolution & SSL certificate setup
│ │ ├── overlay.py # Platform selection and Windows overlay
│ │ ├── overlay_x11.py # Linux X11 SHAPE overlay
│ │ ├── power.py # Battery status monitor
│ │ ├── window.py # Foreground window detection & auto-preset
│ │ ├── audio.py # Cross-platform volume control
│ │ └── tray.py # System tray icon manager
│ └── static/ # Web frontend (served as the remote UI)
│ ├── index.html
│ ├── css/ # tokens.css, base.css, components.css
│ └── js/ # app.js, transport.js, trackpad.js, ...
├── docs/ # Design notes & research
├── tests/ # pytest test suite
└── README.md
🖥️ Platform Support
| Platform | Mouse / Keyboard | Presentation Laser Pointer |
|---|---|---|
| Windows | ✅ Native (win32api) |
✅ Red dot overlay |
| macOS | ✅ Native (Quartz) |
❌ Not yet |
| Linux (X11) | pyautogui / XTest | X11 SHAPE 1.1 overlay |
| Linux (Wayland) | ydotool / dotool; one-time setup_linux.sh | XWayland only when DISPLAY and SHAPE 1.1 are available |
Laser pointer note: Windows uses its native Tk overlay. Linux uses an X11 SHAPE 1.1 window with an empty input shape so mouse and touch events pass through. A direct Wayland session is not supported. XWayland availability depends on its display exposing SHAPE 1.1; if initialization fails, the app reports the pointer unavailable and keeps the laser pad hidden. macOS support is not yet implemented.
🧪 Running Tests
# Python backend tests (82 tests)
pip install -e ".[dev]"
pytest
# Frontend unit tests (17 Vitest tests)
npm install
npm test
Tests run automatically on Linux, Windows, and macOS via GitHub Actions.
🤝 Contributing
Contributions are very welcome! See CONTRIBUTING.md for setup instructions, coding guidelines, and platform testing notes. Please also read our Code of Conduct.
🔐 Security
This is a LAN-only tool. Please read SECURITY.md before reporting vulnerabilities or deploying it.
📄 License
This project is licensed under the MIT License — see LICENSE. Free to use, modify, and distribute for personal and commercial purposes.
Release files for laptop-remote 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| laptop_remote-1.0.4.tar.gz | 101.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| laptop_remote-1.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 202.1 kB
Release files / laptop_remote-1.0.4.tar.gz
| Download URL | laptop_remote-1.0.4.tar.gz |
|---|---|
| Size | 101.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c041180e4a1e67124a70881ec2386f4ba333d4ba927ae324bdc40f16145744eb
|
|
BLAKE2b-256 checksum How to use checksums |
ca1ffd5cba781091a11e8ff4c4e3a63a80fc966ad85b299e8e0ce5155756d57d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Release files / laptop_remote-1.0.4-py3-none-any.whl
| Download URL | laptop_remote-1.0.4-py3-none-any.whl |
|---|---|
| Size | 100.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ed756356cf2add08076c0c75629c7346cd13c5e999c7e803ce67b624d38cdb3f
|
|
BLAKE2b-256 checksum How to use checksums |
bb5c7ee1999f2cc6e83ca773d504e32317f196230d31c3a00d521f66cbaa62d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|