Free ngrok alternatives for localhost tunneling
You need to share a local dev server with a teammate, a client, your phone, or a webhook provider — and ngrok's free tier just bounced you off the random-URL-every-restart hump. Here are four free alternatives that earn their keep, with the tradeoffs that decide which one fits your situation.
The shortlist
The honest one-line summaries:
| Tool | Free | Custom domain | TCP support | Auth required |
|---|---|---|---|---|
| Cloudflare Tunnel | Yes — unlimited | Yes (your domain) | Limited | Cloudflare account |
| localhost.run | Yes — random URL | Paid only | HTTP/HTTPS only | None (SSH key) |
| bore | Yes — self-hostable | If you self-host | Yes (raw TCP) | None |
| tailscale-funnel | Yes (3 funnels) | Tailscale subdomain | HTTPS only | Tailscale account |
| ngrok (free) | Yes | No | Yes (with limits) | ngrok account |
Cloudflare Tunnel — the default for most people
Cloudflare Tunnel (the daemon is cloudflared) is the strongest free option in 2026. It's free, unlimited, supports custom domains if you have one on Cloudflare, and runs as a long-lived daemon you can leave on.
The 30-second sharable URL form (no account, no domain) is one command:
brew install cloudflared
cloudflared tunnel --url http://localhost:3000
Output:
Your quick Tunnel has been created! Visit it at:
https://random-words-here.trycloudflare.com
The URL changes each restart. If you want a stable URL on your own domain, the named-tunnel flow is a one-time 5-minute setup.
Pick Cloudflare when: you want a free default that scales from "share a link in five seconds" to "production-grade tunnel on my own domain" without changing tools.
localhost.run — zero-install with just SSH
If you don't want to install anything, localhost.run is the answer. It uses SSH, which is preinstalled on macOS:
ssh -R 80:localhost:3000 nokey@localhost.run
You'll get a random *.lhr.life URL. Free tier is HTTP/HTTPS only and the URL is ephemeral.
Pick localhost.run when: you're on someone else's machine, can't install software, and just need the URL once.
bore — minimal and self-hostable
bore is a tiny Rust tunnel server. The hosted instance is free; you can also run your own on a $5 VPS in five minutes.
brew install bore-cli
bore local 3000 --to bore.pub
Unlike the HTTP-only options, bore tunnels raw TCP, which means it works for things like Postgres, Redis, or SSH itself.
Pick bore when: you need TCP (not just HTTP), or you want to run your own tunnel server with no fuss.
tailscale-funnel — the right pick if you're already on Tailscale
If you already have Tailscale set up, tailscale funnel exposes any local HTTPS service to the public internet on your *.ts.net subdomain. It's free (3 funnels per account) and stable across restarts.
tailscale funnel 3000
The URL stays the same forever, which is great for webhook endpoints during dev.
Pick tailscale-funnel when: you're already a Tailscale user and want a stable, no-extra-tool URL.
What about ngrok itself?
ngrok's free tier still works for quick demos. The catches in 2026:
- URL is random and changes per restart unless you upgrade.
- Bandwidth and request limits.
- Inspector and replay are paid features now.
If you need exactly the ngrok feature set (interactive request inspector, replay), it's still worth its tier. For "I just need a URL," any of the four above is simpler.
Decision flow
- Sharing an HTTP/HTTPS dev server with a teammate? Cloudflare Tunnel.
- One-off, can't install anything? localhost.run via SSH.
- Need raw TCP (Postgres, Redis, SSH)? bore.
- Already on Tailscale and want a stable URL? tailscale-funnel.
- Specifically want ngrok's request inspector? Stay with ngrok.
Security caveats — read this once
Every option here exposes a process running on your laptop to the internet. That means:
- Don't tunnel your
.envfile's secrets along with the app. Many dev servers serve/static/liberally. - If your app does file writes, scope them. A hostile request can fill your disk before you notice.
- Tear the tunnel down when you're done. Several of these tools auto-expire; some don't.
Manfath shows active tunnels in its menu bar so you can see at a glance what's still exposed.