Best ngrok Alternatives (2026)
Overview
Developers need a public URL pointing to localhost for webhooks, OAuth, client previews, and mobile testing. Here are the main options in 2026 — each with different trade-offs.
Comparison table
| Tool | Install | Free tier | Custom subdomain | Request inspector | Best for |
|------|---------|-----------|------------------|-------------------|----------|
| LocalToLink | npx localtolink | Yes (2h, 1GB) | No (v1.5 Pro) | No | Zero-config npm tunnel |
| ngrok | Binary / package | Limited | Paid | Yes | Inspection + replay |
| localtunnel | npx localtunnel | Yes | Free (shared) | No | Quick one-off shares |
| Cloudflare Tunnel | cloudflared | Yes | Via CF account | No | Production ingress |
| Tailscale Funnel | Tailscale app | Limited | No | No | Private network sharing |
LocalToLink
npx localtolink
Pros: No account, npm-native, WebSocket support, auto port detection, terminal QR code
Cons: No request inspector, random subdomain only (v1.0), 2-hour sessions
ngrok
Industry standard with the best request inspection and replay tooling.
Pros: Request inspector, replay, custom domains, mature ecosystem
Cons: Free tier limits, account required, paid features for serious dev work
Best when you need to inspect and replay HTTP requests.
localtunnel
npx localtunnel --port 3000
Pros: Simple, free custom subdomains on shared infrastructure
Cons: Reliability varies (503 errors), shared public server
Cloudflare Tunnel
cloudflared tunnel --url http://localhost:3000
Pros: Cloudflare network, production-grade, free tier generous
Cons: More setup, account required, overkill for quick local dev
Is Cloudflare Tunnel overkill? →
How to choose
| Your need | Start with | |-----------|------------| | Quick webhook test, no account | LocalToLink or localtunnel | | Debug request payloads visually | ngrok | | Production service ingress | Cloudflare Tunnel | | Share with client for 30 minutes | LocalToLink | | Custom subdomain (free) | localtunnel (with reliability caveats) |
LocalToLink limitations (v1.0)
We state these explicitly:
- No request inspector or replay
- No custom subdomains (v1.5 Pro)
- No user accounts
- 2-hour sessions, 1 GB, 10 req/s, 1 tunnel per IP
Try it now
Start a tunnel from your project directory — no account required.
$ npx localtolink