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.
Maintainers
Readme
Busymote
Put a port on your computer on a public HTTPS link — and control it from your phone.
npx busymote 3000No 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 codeEnter 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 3000If installed globally via npm:
npm uninstall -g busymote
npm install -g busymote@latestComplete 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.
