open-mouse
v2.0.0
Published
Control your computer's mouse and keyboard from another device
Maintainers
Readme
Open Mouse
Turn any phone, tablet, or laptop into a wireless trackpad and keyboard for your computer. Run one command on the machine you want to control, open the printed URL on any other device on your network, and start controlling.
Open Mouse is free — no ads, no account, no companion app to install. Nothing passes through anyone's servers: your input goes directly from your browser to your computer over your own network.
Quick start
npm install -g open-mouse
open-mouseThen open the URL it prints (e.g. http://192.168.1.50:3000) on your phone. Both devices must be on the same network.
Features
- Trackpad gestures (from a phone or tablet):
- One finger — move the pointer, with speed-based acceleration
- Tap — left click
- Two-finger drag — smooth scrolling with inertia (flick and it glides)
- Two-finger tap — right click
- Double-tap and drag — click-and-drag / text selection
- Desktop client mode — open the page on another computer and click the trackpad to pointer-lock for 1:1 mouse control, with full keyboard passthrough (ESC to release)
- Clicks — left, middle, and right click buttons
- Keyboard — send text as you type (paste works too), plus Enter/Esc/Tab/arrows and media keys (volume, mute, play/pause)
- Settings — pointer speed, scroll speed, and natural-scrolling toggle, saved on the device
- Smooth scrolling everywhere — pixel-accurate deltas with fractional carry, converted to native scroll units per platform (pixel scrolling on macOS, high-resolution wheel-delta units on Windows, wheel clicks on Linux/X11)
- Built for low latency — compact binary input frames, same-tick sends, TCP_NODELAY, no compression, and a live round-trip-time readout in the status pill
- Cross-platform — macOS, Windows, and Linux servers; any modern browser as the client
How it works
Open Mouse runs a tiny local web server on the computer you want to control. Any device with a browser connects to it over your local network and gets a full-screen trackpad UI. Input events stream back over a WebSocket and are injected as real mouse and keyboard events via robotjs.
┌─────────────┐ WebSocket (LAN) ┌──────────────────┐
│ Your phone │ ──────────────────▶ │ Your computer │
│ (browser UI) │ mouse/keys/scroll │ (open-mouse + OS) │
└─────────────┘ └──────────────────┘No video streaming, no polling, no cloud relay — just a lightweight local event stream, so latency stays low even on modest Wi-Fi.
Why not a "remote mouse" app?
Most remote-mouse products route your input through their servers: an app on your phone, a second app on your computer, an account to create, and a subscription to keep it switched on. Your tap travels to a data center — possibly in another country — and back to a machine sitting a few feet away, adding latency for no technical reason.
Open Mouse removes both the phone app and the server. Your device already ships with a universal client — the browser — so the only software runs on the computer being controlled, and your input takes the shortest path between your two devices: your own Wi-Fi. Nothing is metered, so nothing is billed.
Requirements
- Node.js 14+ on the computer being controlled
- Build tools for the robotjs native module if a prebuilt binary isn't available for your platform (Xcode Command Line Tools on macOS,
build-essentialon Linux, windows-build-tools on Windows) - Optional, Windows only: Python 3 with
pyautogui(pip install pyautogui) — Open Mouse detects it automatically and uses it for much faster typing. Everything still works without it.
Run from source
Grab the package tarball from npm and run it directly:
npm pack open-mouse
tar -xzf open-mouse-*.tgz
cd package
npm install
npm startUsage tips
- Bigger trackpad: the keyboard panel is collapsed by default — toggle it with the ⌨ button in the header. Your choice is remembered.
- Scroll feel: open settings (gear icon) to adjust scroll speed or flip natural scrolling. "Natural" means the content follows your fingers, like scrolling on the phone itself.
- Dragging: double-tap and keep your finger down after the second tap, then move — the mouse button stays held until you lift.
- From another computer: scrolling with a mouse wheel or trackpad on the page works directly; click the pad to pointer-lock for full control including keyboard shortcuts.
Troubleshooting
The pointer doesn't move (macOS) Grant accessibility permission to the terminal app running the server: System Settings → Privacy & Security → Accessibility. You may need to restart the server afterwards.
robotjs fails to install
robotjs is a native module. Make sure you have build tools installed (see Requirements), then retry npm install. On Apple Silicon, ensure your Node and toolchain architectures match.
The page won't load from my phone
- Confirm both devices are on the same network (guest Wi-Fi networks often isolate clients)
- Use the LAN IP the server prints, not
localhost - Check that a firewall isn't blocking port 3000
- If port 3000 is taken by another app, stop it — the server will tell you on startup
Typing feels slow on Windows
Install the optional Python helper: pip install pyautogui, then restart the server. You should see Python helper ready in the console.
Security note
Open Mouse gives full mouse and keyboard control to anyone who can reach the page — there is no authentication. It's designed for trusted local networks only. Do not expose port 3000 to the internet or run it on networks you don't trust.
License
PolyForm Shield 1.0.0. In plain terms: download it, use it — personally or at work — modify it, and share it freely. What you may not do is sell it or offer a competing product built from it. See the LICENSE file for the exact terms.
