npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ownremote

v1.0.2

Published

Control your Windows PC from your phone: trackpad, live keyboard and screen preview over LAN or Cloudflare Tunnel.

Readme

OwnRemote

Control your Windows PC from your phone: trackpad, live keyboard and an opt-in screen preview, over your Wi-Fi or from anywhere through Cloudflare Tunnel. No app to install on the phone, no account, no native modules.

npm platform license

🚀 Install in one line

npm i -g ownremote

Then just type ownremote in Command Prompt, PowerShell or Windows Terminal. Requires Windows 10/11 and Node.js 18+

▶ Watch the full trailer (48 s, MP4)


Features

| | | |---|---| | 🖱️ Trackpad | Move, tap to click, two-finger tap for right click, two-finger scroll, hold-and-drag, physical-style Left / Middle / Right buttons. | | ⌨️ Live keyboard | Everything you type appears on the PC letter by letter, including emoji, accents, autocorrect and swipe typing. Sticky Ctrl / Alt / Shift / Win, arrows, Esc, Tab, F-keys, shortcuts (Ctrl+C/V/X/Z/A/S, Alt+Tab, Win+D) and media keys. | | 🖥️ Screen preview | Off by default. Turn it on to see your PC screen with a virtual cursor that sits exactly where the real one is (measured error ≈ 0.05 px), zoom 1× / 2× / 3× that follows the cursor, 1–15 fps, adjustable resolution and quality, and identical frames skipped so a still screen costs ≈ 0 KB/s. | | 🗂️ Several PCs | The phone keeps a dashboard of every PC you paired, shows which ones are online, and lets you switch between them with one tap. | | 🧑‍💻 CLI dashboard | Numbered menus to run in the terminal or in the background, manage paired devices, change settings and set up the tunnel. | | 🪟 Windows integration | Background mode with a tray icon, start with Windows (with an optional delay), Windows Firewall helper. | | 🌍 Cloudflare Tunnel | Quick tunnel (random *.trycloudflare.com URL, no account) or a named tunnel on your own domain. | | 🔐 Pairing & sessions | 6-digit pairing code, per-device tokens, revoke any device, lock pairing, per-IP and global brute-force limits. |

Screenshots

Screenshots use demo data.

Requirements

  • Windows 10 or 11 (uses the built-in Windows PowerShell 5.1 and .NET Framework, nothing to compile)
  • Node.js 18 or newer
  • A phone with a modern browser (Chrome, Safari, Samsung Internet, Firefox) on the same Wi-Fi, or anywhere with Cloudflare Tunnel
  • Optional: cloudflared for internet access (winget install --id Cloudflare.cloudflared)

Quick start

npm i -g ownremote
ownremote

That's it: ownremote opens the dashboard from any Command Prompt, PowerShell or Windows Terminal window. Update later with npm i -g ownremote@latest.

git clone https://github.com/Adytm404/ownremote.git
cd ownremote
npm install
npm start

Or double-click start.bat (it installs dependencies on the first run).

  1. Choose [1] Run in this terminal or [2] Run in the background.
  2. On your phone, open the address shown under Open on phone (or scan the QR code in Session management; it fills the code in for you).
  3. Enter the 6-digit code. The phone is remembered, so next time it connects straight away.

If the phone cannot open the page, use Settings → Allow port in Windows Firewall.

Using it

Your PCs (dashboard)

The first time you open the page it pairs with the PC that served it. After that, the phone opens a Your PCs dashboard:

  • Each saved PC shows Online, Offline or Needs pairing again (when it was removed on that PC). Tap one to control it, and use the ‹ button on the trackpad (or ⚙ → Switch PC) to go back.
  • Add a PC asks for that PC's address and pairing code, both shown in its OwnRemote CLI. 192.168.1.20 becomes http://192.168.1.20:8787; a tunnel address such as calm-river.trycloudflare.com uses HTTPS.
  • The ⋮ button renames a PC on this phone, pairs it again or removes it (which also unpairs the phone on that PC).

Every PC needs OwnRemote running. The list is stored in the phone's browser, so one bookmarked page can reach all your PCs. A page opened over HTTPS (tunnel) cannot reach plain http:// Wi-Fi addresses because browsers block it; open the dashboard from a Wi-Fi address to mix both.

Trackpad

| Gesture | Action | |---|---| | Slide one finger | Move the cursor | | Tap | Left click | | Two-finger tap | Right click | | Three-finger tap | Middle click | | Slide two fingers / the strip on the right | Scroll (vertical and horizontal) | | Hold ~0.5 s, then slide | Drag | | Left / Right buttons | Click; hold a button while sliding on the pad to drag |

Speed, acceleration, scroll speed, natural scrolling and haptics are in the ⚙ panel.

Keyboard

Tap ⌨. Type in the box and the text appears on the PC live. Tap Ctrl / Alt / Shift / Win once, then a key or letter, for a shortcut (Ctrl, then c = Ctrl+C). Hold arrows, Backspace or Del to repeat.

Screen preview

Tap 🖥. The preview only streams while it is on and pauses automatically when the phone screen turns off.

| Preset | Frames | Width | Typical data while the screen changes | |---|---|---|---| | Saver | 2 fps | 640 px | ≈ 30–60 KB/s | | Normal (default) | 5 fps | 960 px | ≈ 100–200 KB/s | | Sharp | 8 fps | 1280 px | ≈ 300–500 KB/s |

Fine-tune frames per second (1–15), resolution and image quality in ⚙ → PC screen preview. The cursor position is sent separately about 60 times a second and predicted locally while your finger moves, so the virtual cursor stays smooth even at low frame rates. When the page is opened over the internet, it starts on the saver preset.

CLI

ownremote              interactive menu
ownremote run          run the server in this terminal
ownremote start        run the server in the background
ownremote stop         stop the server
ownremote status       show status, address and pairing code
ownremote --help       all commands and the data folder

Main menu: run in terminal / background, session & device management, stop, and Settings (port, pairing code, firewall rule, server log, data folder, Advanced settings and Cloudflare Tunnel).

Advanced settings

| Setting | What it does | |---|---| | Start with Windows | Runs the server in the background at every sign-in (a hidden launcher in the Startup folder) | | Startup delay | Waits 0–600 s after sign-in, e.g. for Wi-Fi to connect | | Show tray icon | Tray icon in background mode: address and code (click to copy), open the menu, new code, lock pairing, stop | | Notify when a device connects | Windows notification when a phone connects or starts viewing the screen | | Auto-lock pairing after a new device | Rejects further devices as soon as one has paired | | Allow screen preview on phone | Turns the screen preview feature off completely | | Reset all devices & pairing code | Every phone has to pair again |

Cloudflare Tunnel

Use OwnRemote from mobile data or any other network, over HTTPS, without port forwarding.

  • Quick tunnel: Settings → Cloudflare Tunnel → Quick tunnel. A random https://*.trycloudflare.com URL appears in the dashboard, the tray menu and as a QR code. A new URL can take up to a minute before it opens, and it changes every time the server starts.
  • Named tunnel (your own domain): in the Cloudflare dashboard, Zero Trust → Networks → Tunnels → Create a tunnel, choose Cloudflared, copy the token, and add a public hostname pointing to http://localhost:8787. Then set the token and public URL in the CLI and pick Named tunnel.

OwnRemote starts and supervises cloudflared itself (restarting it with back-off if it exits).

Security

  • New devices need the 6-digit pairing code. After 5 wrong codes an IP is blocked for 60 s; after 20 wrong codes from any addresses within 10 minutes, pairing is blocked for 10 minutes (a new code lifts it).
  • Each phone gets its own random token; only a SHA-256 hash is stored. Revoke devices any time from Session management.
  • The admin API used by the CLI only answers on 127.0.0.1, requires a secret token, and rejects anything that arrives through Cloudflare or another proxy.
  • The phone API (/api/pair, /api/check, /api/unpair) allows cross-origin requests so one dashboard can talk to several PCs. It uses no cookies, so another website gains nothing: it would still need the pairing code (with the limits above) or a device token.
  • Behind the tunnel, the real client IP comes from CF-Connecting-IP (trusted only for connections from localhost).
  • On your LAN the connection is plain HTTP, so use it on networks you trust, or use the tunnel (HTTPS). When the PC is reachable from the internet, enable Auto-lock pairing.
  • The screen preview is off until the phone turns it on, the tray shows a notification when it starts, the CLI marks the device with ◉ screen, and you can disable the feature entirely.

How it works

phone browser  ──HTTP + WebSocket──►  Express server (Node.js)
                                         ├─ input-helper.ps1   SetCursorPos / mouse_event / SendInput (C# via Add-Type)
                                         ├─ screen-helper.ps1  CopyFromScreen → JPEG, cursor position at ~60 Hz
                                         ├─ tray-helper.ps1    WinForms NotifyIcon (background mode)
                                         └─ cloudflared        optional tunnel
CLI (cli.js)  ──localhost admin API──►  status, sessions, settings

The helpers are long-running PowerShell processes that compile small C# classes at start-up, so there are no native Node modules and no Visual Studio Build Tools. They are DPI-aware per monitor, so coordinates are physical pixels even with display scaling.

Configuration

Settings, paired devices and the log live in %APPDATA%\OwnRemote (config.json, devices.json, server.log), so updating the package keeps your phones paired. A source checkout that already has a data/ folder keeps using it. Set OWNREMOTE_DATA_DIR to use another folder (for a second instance, for example). ownremote --help prints the folder in use.

Troubleshooting

  • The phone cannot open the page: allow the port in the firewall (Settings → 3). If you once pressed Cancel on the Node.js firewall prompt, Windows created a Block rule for node.exe; remove it in Windows Defender Firewall → Advanced settings → Inbound Rules. Guest Wi-Fi networks often isolate clients.
  • Input does not reach a window: windows running as Administrator (and UAC prompts) ignore input from normal processes; run OwnRemote as Administrator to control them.
  • The screen preview says the screen cannot be captured: Windows does not allow capturing the lock screen or a UAC prompt; it resumes when you unlock. DRM-protected video shows black.
  • The address changed: the current address is always on the main menu and in the tray menu.

Project structure

cli.js                  CLI menus
start.bat               double-click launcher
public/                 phone web app (trackpad, keyboard, screen preview)
src/server.js           Express + WebSocket server, admin API
src/input.js            mouse & keyboard controller   (input-helper.ps1)
src/screen.js           screen streaming               (screen-helper.ps1)
src/tray.js             tray icon                      (tray-helper.ps1)
src/tunnel.js           Cloudflare Tunnel manager
src/startup.js          Start with Windows / hidden background launcher
src/daemon.js           background entry point
src/logo.js             ASCII logo
docs/                   screenshots and trailer

License

MIT