Expose Localhost Without Installing Software
What "no install" actually means
"No install" in the tunnel world is often misleading. Every tool requires something on your machine — a binary, a package manager, or Node.js. What developers usually mean is no global install and no permanent footprint: run a command, get a URL, done.
LocalToLink fits that workflow. You run npx localtolink without installing anything globally. The first run downloads the package from npm; subsequent runs use the cache.
This is not zero dependencies — you need Node.js and a running dev server. It is zero permanent install.
Requirements
| Requirement | Details |
|---|---|
| Node.js | 22.14 or later |
| Local app | Dev server running on a detectable port |
| Network | Outbound HTTPS and WebSocket allowed |
Check your Node version:
node --version
# v22.14.0 or higher required
If Node is not installed, download it from nodejs.org or use your system package manager. LocalToLink does not bundle Node.
One-command tunnel
npx localtolink
LocalToLink auto-detects common dev ports (3000, 5173, 8080, etc.) and prints a public HTTPS URL. No config file, no account signup.
Specify a port manually:
npx localtolink --port 3000
No account needed
Anonymous tunnels require no signup. LocalToLink assigns a random 10-character subdomain automatically, e.g. https://k7m2x9p4q1.localtolink.com.
There are no API keys, no dashboard login, and no credit card for the free tier.
Compare install models
Different tunnel tools have different install requirements. This table compares honestly — no tool is truly "zero install" unless you already have its runtime.
| Tool | Install model | Account for free tier |
|---|---|---|
| LocalToLink | npx localtolink (needs Node ≥ 22.14) | No |
| localtunnel | npx localtunnel (needs Node) | No |
| ngrok | Binary download, brew, or npm | Yes (signup required) |
| Cloudflare Tunnel | cloudflared binary required | No for quick tunnels; yes for named tunnels |
If Node is already in your workflow (it is for most JavaScript projects), npx localtolink adds zero permanent footprint.
What npx does
npx is included with npm (Node 22+). It:
- Downloads the
localtolinkpackage if not cached - Runs it without a global install
- Caches the package for faster subsequent runs
Important: cached copies are not updated automatically. Use @latest (and --yes to skip the install prompt) when you want the current release:
npx --yes localtolink@latest --port 3000
Plain npx localtolink may keep running an older cached version until you refresh it.
npx cache vs installation.json
These are separate:
| npm / npx cache | installation.json | |
|---|---|---|
| Stores | The CLI package version | A local device UUID for abuse limits |
| Location | npm cache dir | e.g. ~/.config/localtolink/installation.json |
| Clearing cache | Next run may download a newer CLI | Does not change |
| Deleting the file | Does not affect npm cache | New device identity on next session |
Pin a version in CI when you need reproducibility; use @latest on your laptop when you want fixes and new features.
CI and scripts without global install
Use --json for machine-readable output in pipelines:
URL=$(npx localtolink --json --port 3000 | jq -r .url)
echo "Testing webhooks at $URL/api/webhooks"
Hide the QR code in headless environments:
npx localtolink --json --port 3000 --no-qr
Pinning versions in CI
Reproducible pipelines should pin the CLI package so npx does not pull an unexpected release:
npx localtolink@1.0.1 --json --port 3000 --no-qr
Combine with --json and --no-qr in headless runners. Session limits still apply — tear down the tunnel when the job finishes.
What you still need locally
A tunnel forwards traffic — it does not run your app. You always need:
- Your dev server running (
npm run dev,rails server, etc.) - Node.js installed (for
npx localtolink) - Outbound network access to LocalToLink's servers
When npm-based is not the right fit
| Situation | Alternative |
|---|---|
| No Node.js on the machine | ngrok binary or cloudflared |
| Need request inspector | ngrok (requires account) |
| Production ingress | Cloudflare Tunnel with named tunnel |
| Want free custom subdomain | localtunnel --subdomain (reliability varies) |
For a problem-first take on picking a tunnel (without competitor directories), see Expose Localhost in One Command and the step-by-step expose localhost guide.
Free tier limits
| Limit | Value |
|---|---|
| Session duration | 2 hours |
| Bandwidth | 1 GB per session |
| Rate limit | 10 requests/second |
| Tunnels per IP | 1 |
| Subdomain | Random 10-character |
Troubleshooting
| Problem | Fix |
|---|---|
command not found: npx | Install Node.js 22.14+ |
No local app detected | Start dev server first |
| Slow first run | npx downloads package — subsequent runs are faster |
| Corporate proxy blocks npm | Configure npm proxy or use ngrok binary |
FAQ
Is this the same as "no download"?
The npm package downloads on first run. Nothing stays installed globally unless you choose to npm install -g localtolink.
Can I use this on a machine without admin rights?
Yes, if Node.js is available in your user PATH. No admin install needed.
Does it work in Docker?
Yes, if the container has Node 22.14+ and network access. Forward to the container's dev server port.
See Expose Localhost to the Internet for the full walkthrough with troubleshooting and FAQ.
Try it now
Start a tunnel from your project directory — no account required.
$ npx --yes localtolink@latest