remote-clicker
v1.0.0
Published
Turns your laptop into a simple remote clicker for slide presentations
Maintainers
Readme
Remote Clicker
A small Node.js app that turns your laptop into a simple remote clicker for slide presentations. Run it on your laptop, open the web UI on your phone over Wi‑Fi, and tap Back or Next to send Left/Right Arrow keypresses to Keynote, PowerPoint, PDF viewers, or any app that advances slides with the keyboard.
What it does
- HTTP API:
POST /api/nextandPOST /api/prevtrigger system-wide Right Arrow and Left Arrow keypresses on the laptop. - Web remote: Open
/remotein a browser on your phone to get two large, touch-friendly buttons that call those endpoints. - No GUI framework: Headless service you start with
node server.js; no Electron or Tauri.
Install and run
Global install (run from anywhere):
npm install -g remote-clicker
remote-clickerLocal install (in a project folder):
npm install remote-clicker
npx remote-clickerOr clone and run from source:
npm install
npm startThen:
- Health check: http://localhost:38472/
- Remote UI: http://localhost:38472/remote
Use a different port with the PORT environment variable:
PORT=8080 npm startOpening the remote from your phone
- Ensure your phone and laptop are on the same Wi‑Fi network.
- When you start the server, it prints something like:
On phone: http://192.168.1.x:38472/remote. - Open that URL in your phone’s browser and use the Back / Next buttons.
If the IP isn’t shown, find your laptop’s local IP (e.g. in System Settings → Network) and use: http://<laptop-ip>:38472/remote.
macOS: Accessibility permission
For key simulation to work on macOS, the process running Node must have Accessibility permission:
- Open System Settings (or System Preferences) → Privacy & Security → Privacy → Accessibility.
- Add your terminal app (Terminal, iTerm, etc.) or Node if you run the app directly.
- Restart the server after granting permission.
Without this, the app will run but keypresses will not be sent to other applications.
Configuration
- PORT — HTTP port (default:
38472). - NEXT_KEY / PREV_KEY — Key names for next/prev (optional). Supported values in
inputController.jsinclude:Right,Left,Space,PageDown,PageUp,B. Defaults areRightandLeft.
Online mode (Firebase)
When direct connection is blocked (e.g. port blocked, different network, or WebSocket unavailable), you can run the app in online mode so commands go through Firebase Realtime Database instead of direct HTTP.
Create a Firebase project and enable Realtime Database. In the Firebase Console, get your project’s Web config (apiKey, authDomain, databaseURL, etc.) and download a service account key (JSON) for the Admin SDK.
Add config in the project root:
- Copy
config.example.jsontoconfig.json. - Fill in
firebase.server.databaseURLandfirebase.server.serviceAccountPath(path to the service account JSON file). - Fill in
firebase.clientwith the Web app config from the Firebase Console so the remote UI can write commands. - Optionally set
firebase.commandPath(default:remoteClicker/command).
- Copy
Start with the
--onlineflag:node server.js --onlineThe server will listen on Firebase for commands at the configured path. The remote page still loads from your server; when you open
/remote, it fetches/api/config, seesonline: true, and sends Back/Next/touchpad actions to Firebase. The server (running on your laptop) receives them via a Firebase real-time listener and runs the same actions (keys, mouse move, click).Realtime Database rules: Restrict read/write to your command path as needed (e.g. allow authenticated users or a secret path). For quick testing you can allow read/write on
remoteClicker; tighten rules before using on untrusted networks.
Online mode is a bit slower than direct HTTP but works when the phone cannot reach the laptop’s port directly.
Security note
This is an early version intended for trusted home/office networks. The server binds to 0.0.0.0 and has no authentication. Before using on untrusted networks, you should:
- Restrict binding to
127.0.0.1if you only need local access, or - Add a simple shared-secret token check on the API endpoints.
See comments in server.js for where to add these.
Publishing (maintainers)
GitHub: Create a new repo on GitHub, then:
git remote add origin https://github.com/crownemmanuel/remoteClicker.git git branch -M main git push -u origin mainRepository: github.com/crownemmanuel/remoteClicker.
npm: After logging in with
npm login:npm publishUsers can then install with
npm install -g remote-clickerand runremote-clicker.
License
MIT
