Skip to main content

📱 Laptop Remote (Remote Deck)

CI PyPI version PyPI downloads License: MIT Python 3.10+ Platform

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.

Laser Pointer & Trackpad Demo

⚠️ 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
Media Controls Touch Trackpad Virtual Mouse Presentation
👀 View Real-World & Desktop Companion Preview
Laptop Terminal Server Phone Controlling Laptop
Laptop Terminal Phone Remote

✨ 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)

  1. Download LaptopRemote-CLI.exe from GitHub Releases.
  2. Double-click LaptopRemote-CLI.exe (or run it in Command Prompt / PowerShell).
  3. 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, and OK (Enter) buttons, plus ESC, TAB, ⇧ TAB, and Backspace.
  • 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 (or Ctrl+F5 when 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.bat to build dist/LaptopRemote-CLI.exe.
  • Linux: Run ./build.sh to build dist/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.

Metadata

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)

Source distribution for laptop-remote 1.0.4
File Size Uploaded
laptop_remote-1.0.4.tar.gz 101.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for laptop-remote 1.0.4
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

1.0.4 This release

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page