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

busymote

v1.5.0

Published

Share localhost on a permanent public HTTPS link — one npx command, a password, and control from your phone. A simpler ngrok alternative.

Readme

Busymote

Put a port on your computer on a public HTTPS link — and control it from your phone.

npx busymote 3000

No install, no download, no signup wall to start. You get a link like beam.busymote.xyz that stays the same every time you run it — send it to a client once and stop re-sending a new URL after every restart.

$ npx busymote 3000
[busymote] localhost:3000 → https://beam.busymote.xyz
[busymote] control it from busymote.xyz/app — Ctrl-C to stop

▶ See the 60-second demo: https://busymote.xyz/demo

Why Busymote

  • Permanent link on the free plan — the same address across restarts, reboots, and days. (ngrok's free URL changes every session.)
  • Nothing to install — just npx. No agent, no authtoken to paste.
  • Password-protect any link — one word, and only people you trust get in.
  • Control from your phone — copy the link, show a QR code, set a password, share another port, or stop it, all from busymote.xyz/app on any device signed in to the same account.
  • A name you choose — beam, acme-demo, whatever's free.

Great for showing work-in-progress to a client, testing on a real phone, or pointing a webhook at your machine.

Sharing with a client? Build first, in one command

A dev server (npm run dev) is fine for a quick look, but over a public link it is fragile — it returns a 502 every time it recompiles, and shows the dev error overlay. For anything you leave up or show a client, share a production build.

--run does the whole thing for you: it runs your build-and-start command, waits until the port is actually listening, and only then opens the tunnel — so the first visitor never lands on a server that isn't up yet.

# Next.js
npx busymote 3000 --run "npm run build && npm start"

# Vite
npx busymote 4173 --run "npm run build && npm run preview"

Point Busymote at the port the built app serves on (not your dev port). Press Ctrl-C once and it stops both the tunnel and the command it started.

Login

npx busymote login     # once — enter your password, or leave it blank for an emailed code

Enter the password you signed up with and you're in. Leave it blank and we email you a 6-digit code instead — so accounts created with "Continue with Google" (which have no password) work the same as any other. Either way we save only a refresh token, never your password. For CI, set BUSYMOTE_EMAIL / BUSYMOTE_PASSWORD instead.

How it works

busymote runs a Cloudflare tunnel that dials out from your machine, so there is nothing to host and no inbound port to open. The web app reserves a hostname for each port you share and points it at your tunnel, which is why the link survives restarts — and why what your client sees in their address bar is the link you sent them, start to finish, with no redirect in the middle.

The web app writes what it wants (tunnels.desired_status) and this process makes it true — a browser can't reach your localhost by itself, so this command has to stay running.

Requires Node 18+. Downloads cloudflared on first run if it isn't on your PATH (on macOS: brew install cloudflared).

Troubleshooting & Reset

Quick Re-install / Updating to Latest Version

To force npx to run the newest version of Busymote without using old cached versions:

npm cache clean --force
npx busymote@latest 3000

If installed globally via npm:

npm uninstall -g busymote
npm install -g busymote@latest

Complete Reset (Uninstall & Clear Local Credentials)

To completely clear saved login credentials, tokens, and downloaded helper binaries:

  • Windows (PowerShell):
    Remove-Item -Recurse -Force "$env:USERPROFILE\.busymote"
  • macOS / Linux:
    rm -rf ~/.busymote

Security

A link with no password is public while the tunnel is live — anyone with it can reach your app, so add a password from the dashboard for anything that isn't a throwaway, and stop the tunnel when you're done. Only your own account can see or control your tunnels (enforced by Postgres row-level security).


Made by the team at busymote.xyz. Not affiliated with ngrok or Cloudflare.