# ngrok Alternatives: 13 Ways to Share Localhost, Compared

> Free ngrok alternatives compared: which need no account, which keep your app off a public URL, and which skip the warning page. Every fact sourced.

Source: https://layerv.ai/compare/ngrok-alternatives/

---

[← All Comparisons](https://layerv.ai/compare/) 

# ngrok alternatives for sharing localhost

Thirteen tools that replace ngrok for sharing a local app, what each is best for, and what you give up.

For a public URL with no account, use a Cloudflare quick tunnel. To show one person or a coding agent your app without a public URL or an account, use qURL™: each link works once and expires within 24 hours. Inside a tailnet, use Tailscale Serve. Keep ngrok for webhooks and request replay.

Facts checked October 1, 2026, each value linked to its source. [Full dataset](https://layerv.ai/compare/localhost-tunnels/).

## Why people look for ngrok alternatives

- An account and authtoken before the first URL. ngrok’s quickstart starts with signing up, and the agent will not start an endpoint without the token.
- A warning page for your visitors. On the free plan, browser traffic sees ngrok’s ERR\_NGROK\_6024 page before it reaches your app.
- Free-plan limits: 3 endpoints, 1 GB a month out, and 20,000 HTTP requests a month, on one assigned dev domain.
- A public URL. Anyone who has the address can request your app unless you add a Traffic Policy, and the URL has no built-in expiry.

## The alternatives at a glance

__ngrok alternatives: what each is best for, and account needed before the first URL, who can reach it, link expiry__
| Tool                                                                                                                     | Best for                                                                         | Account needed before the first URL                                                                                                                                                            | Who can reach it                                                                                                                                                                                                | Link expiry                                                                                                                                                                                                                       |
| ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [qURL CLI](https://layerv.ai/compare/ngrok-alternatives/#alt-qurl)                                                       | Showing your app to a person or a coding agent with no account and no public URL | No. The first publish creates the device identity [our test](https://layerv.ai/research/qurl-behaviour)                                                                                        | No one until a link is opened; then the opener’s public IP for that session, including other devices behind that IP [layerv.ai](https://layerv.ai/docs/qurls.md)                                                | Yes. qurl share returned a 24-hour link in our no-account test; no-account links are capped at 24 hours [our test](https://layerv.ai/research/qurl-behaviour)                                                                     |
| [Cloudflare Quick Tunnel (trycloudflare.com)](https://layerv.ai/compare/ngrok-alternatives/#alt-cloudflare-quick-tunnel) | A throwaway public URL with no account                                           | No [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)                                                                                            | Public, unless --allowed-mail is set [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)                                                                           | No; the URL works until cloudflared stops [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)                                                                                        |
| [Microsoft dev tunnels](https://layerv.ai/compare/ngrok-alternatives/#alt-ms-dev-tunnels)                                | VS Code users who want a tunnel that is private by default                       | Yes: GitHub, Microsoft, or Entra ID [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/faq)                                                                   | Private by default; anonymous access is opt-in [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)                                                                    | Temporary tunnels end when the host disconnects; persistent tunnels are deleted after 30 days idle; anonymous access can be time-limited [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/faq) |
| [Tailscale Serve](https://layerv.ai/compare/ngrok-alternatives/#alt-tailscale-serve)                                     | Sharing with people whose devices are already on your tailnet                    | Yes: a tailnet with HTTPS certificates enabled [tailscale.com](https://tailscale.com/kb/1312/serve)                                                                                            | Authorized Tailscale users, including accepted machine-share recipients [tailscale.com](https://tailscale.com/docs/features/sharing)                                                                            | No; a foreground session runs until stopped, and --bg keeps it running across reboots [tailscale.com](https://tailscale.com/kb/1242/tailscale-serve)                                                                              |
| [Tailscale Funnel](https://layerv.ai/compare/ngrok-alternatives/#alt-tailscale-funnel)                                   | A stable public HTTPS address for a machine already on a tailnet                 | Yes: a tailnet with MagicDNS, HTTPS certificates, and the funnel node attribute [tailscale.com](https://tailscale.com/kb/1223/funnel)                                                          | Public: anyone on the internet [tailscale.com](https://tailscale.com/kb/1223/funnel)                                                                                                                            | No; runs until you turn it off [tailscale.com](https://tailscale.com/kb/1311/tailscale-funnel)                                                                                                                                    |
| [zrok (free)](https://layerv.ai/compare/ngrok-alternatives/#alt-zrok)                                                    | Private shares to other zrok accounts, including raw TCP and UDP                 | Yes: a free account, no card [zrok.io](https://zrok.io/pricing/)                                                                                                                               | Your choice per share: public shares are open to anyone with the URL; private shares only to zrok accounts you grant [netfoundry.io](https://netfoundry.io/docs/zrok/how-tos/shares/configure-permission-modes) | Ephemeral shares end with the process [netfoundry.io](https://netfoundry.io/docs/zrok/concepts/public-shares)                                                                                                                     |
| [Pinggy (free)](https://layerv.ai/compare/ngrok-alternatives/#alt-pinggy)                                                | Nothing to install beyond SSH, with basic auth or an IP allowlist                | No, to start [pinggy.io](https://pinggy.io/)                                                                                                                                                   | Public: anyone with the URL [pinggy.io](https://pinggy.io/)                                                                                                                                                     | Free tunnels time out after 60 minutes [pinggy.io](https://pinggy.io/)                                                                                                                                                            |
| [localtunnel](https://layerv.ai/compare/ngrok-alternatives/#alt-localtunnel)                                             | A one-line npx command in a Node.js project                                      | No [github.com](https://github.com/localtunnel/localtunnel)                                                                                                                                    | Public: anyone with the URL [github.com](https://github.com/localtunnel/localtunnel)                                                                                                                            | Active while the lt client stays connected; no expiry setting [github.com](https://github.com/localtunnel/localtunnel)                                                                                                            |
| [Cloudflare Tunnel (named)](https://layerv.ai/compare/ngrok-alternatives/#alt-cloudflare-named-tunnel)                   | A stable hostname on your own domain with Cloudflare Access in front             | Yes: account plus a domain on Cloudflare [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/) | Public unless you add a Cloudflare Access application [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)     | No per-link expiry; Access session settings apply [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/session-management/)                                               |
| [localhost.run (free)](https://layerv.ai/compare/ngrok-alternatives/#alt-localhost-run)                                  | An SSH one-liner with no account                                                 | No account for free domains (SSH key or the nokey user) [localhost.run](https://localhost.run/docs/)                                                                                           | Public: anyone with the URL [localhost.run](https://localhost.run/docs/)                                                                                                                                        | No expiry setting; the free domain rotates [localhost.run](https://localhost.run/docs/faq/)                                                                                                                                       |
| [Serveo (free)](https://layerv.ai/compare/ngrok-alternatives/#alt-serveo)                                                | An SSH one-liner with a custom subdomain                                         | No [serveo.net](https://serveo.net/)                                                                                                                                                           | Public: anyone with the URL [serveo.net](https://serveo.net/)                                                                                                                                                   | None documented for HTTP; anonymous public TCP ports last 10 minutes (30 with a registered key) [serveo.net](https://serveo.net/docs)                                                                                             |
| [bore (bore.pub)](https://layerv.ai/compare/ngrok-alternatives/#alt-bore)                                                | Forwarding a raw TCP port                                                        | No, for the public bore.pub server [github.com](https://github.com/ekzhang/bore)                                                                                                               | Public: anyone who connects to the port [github.com](https://github.com/ekzhang/bore)                                                                                                                           | bore.pub connections time out after 24 hours, per the maintainer [github.com, unofficial](https://github.com/ekzhang/bore/issues/150)                                                                                             |
| [Expose (free)](https://layerv.ai/compare/ngrok-alternatives/#alt-expose)                                                | PHP developers who already use Composer                                          | Yes: a free account for the auth token [expose.dev](https://expose.dev/docs/getting-started/authentication)                                                                                    | Public: anyone with the URL [expose.dev](https://expose.dev/docs/getting-started/authentication)                                                                                                                | Free connections are time-limited (length not documented) [expose.dev](https://expose.dev/docs/getting-started/authentication)                                                                                                    |

## Each alternative

1. ### qURL CLI Made by LayerV

**Best for:** Showing your app to a person or a coding agent with no account and no public URL.

**Trade-off vs ngrok:** Not for webhooks or public APIs; no raw TCP.  
Command to the first shareable URL `qurl publish http://127.0.0.1:3000 qurl share <CRID>`  
[All qURL CLI facts →](https://layerv.ai/compare/localhost-tunnels/#tool-qurl)
2. ### Cloudflare Quick Tunnel (trycloudflare.com)

**Best for:** A throwaway public URL with no account.

**Trade-off vs ngrok:** Public unless you set --allowed-mail; the hostname changes each run; no Server-Sent Events.  
Command to the first shareable URL `cloudflared tunnel --url http://localhost:8080`  
[qURL vs Cloudflare Quick Tunnel (trycloudflare.com) →](https://layerv.ai/compare/qurl-vs-cloudflare-quick-tunnels/)
3. ### Microsoft dev tunnels

**Best for:** VS Code users who want a tunnel that is private by default.

**Trade-off vs ngrok:** Needs a GitHub or Microsoft sign-in; visitors see an anti-phishing page first.  
Command to the first shareable URL `devtunnel user login devtunnel host -p 8080 --allow-anonymous`  
[qURL vs Microsoft dev tunnels →](https://layerv.ai/compare/qurl-vs-microsoft-dev-tunnels/)
4. ### Tailscale Serve

**Best for:** Sharing with people whose devices are already on your tailnet.

**Trade-off vs ngrok:** Viewers need a Tailscale account and client.  
Command to the first shareable URL `tailscale serve 3000`  
[qURL vs Tailscale Serve →](https://layerv.ai/compare/qurl-vs-tailscale-serve/)
5. ### Tailscale Funnel

**Best for:** A stable public HTTPS address for a machine already on a tailnet.

**Trade-off vs ngrok:** Needs a tailnet; ports 443, 8443, and 10000 only; machine names appear in Certificate Transparency logs.  
Command to the first shareable URL `tailscale funnel 3000`  
[qURL vs Tailscale Funnel →](https://layerv.ai/compare/qurl-vs-tailscale-funnel/)
6. ### zrok (free)

**Best for:** Private shares to other zrok accounts, including raw TCP and UDP.

**Trade-off vs ngrok:** Needs an account; public shares from unverified free accounts show a warning page.  
Command to the first shareable URL `zrok2 enable <TOKEN> zrok2 share public 8080`  
[qURL vs zrok (free) →](https://layerv.ai/compare/qurl-vs-zrok/)
7. ### Pinggy (free)

**Best for:** Nothing to install beyond SSH, with basic auth or an IP allowlist.

**Trade-off vs ngrok:** Free tunnels time out after 60 minutes and show a screening page.  
Command to the first shareable URL `ssh -p 443 -R0:localhost:8000 qr@free.pinggy.io`  
[qURL vs Pinggy (free) →](https://layerv.ai/compare/qurl-vs-pinggy/)
8. ### localtunnel

**Best for:** A one-line npx command in a Node.js project.

**Trade-off vs ngrok:** Public; visitors are asked for a tunnel password, per the maintainer.  
Command to the first shareable URL `npx localtunnel --port 8000`  
[qURL vs localtunnel →](https://layerv.ai/compare/qurl-vs-localtunnel/)
9. ### Cloudflare Tunnel (named)

**Best for:** A stable hostname on your own domain with Cloudflare Access in front.

**Trade-off vs ngrok:** Needs a Cloudflare account and a domain on Cloudflare.  
Command to the first shareable URL Create the tunnel in the dashboard, run the cloudflared install command it shows, then add a published application route  
[qURL vs Cloudflare Tunnel (named) →](https://layerv.ai/compare/qurl-vs-cloudflare-tunnel/)
10. ### localhost.run (free)

**Best for:** An SSH one-liner with no account.

**Trade-off vs ngrok:** Public; the free domain changes after a few hours.  
Command to the first shareable URL `ssh -R 80:localhost:8080 localhost.run`  
[qURL vs localhost.run (free) →](https://layerv.ai/compare/qurl-vs-localhost-run/)
11. ### Serveo (free)

**Best for:** An SSH one-liner with a custom subdomain.

**Trade-off vs ngrok:** Public; a warning page on the free tier.  
Command to the first shareable URL `ssh -R 80:localhost:3000 serveo.net`  
[qURL vs Serveo (free) →](https://layerv.ai/compare/qurl-vs-serveo/)
12. ### bore (bore.pub)

**Best for:** Forwarding a raw TCP port.

**Trade-off vs ngrok:** TCP only, with no TLS; anyone who connects to the port reaches it.  
Command to the first shareable URL `bore local 8000 --to bore.pub`  
[All bore (bore.pub) facts →](https://layerv.ai/compare/localhost-tunnels/#tool-bore)
13. ### Expose (free)

**Best for:** PHP developers who already use Composer.

**Trade-off vs ngrok:** Needs an account; free connections are time-limited.  
Command to the first shareable URL `expose token <TOKEN> expose share http://localhost:3000`  
[All Expose (free) facts →](https://layerv.ai/compare/localhost-tunnels/#tool-expose)

## When to keep ngrok

Keep ngrok when something other than a person must reach your app: a webhook from Stripe or GitHub, a public API, or raw TCP. Its web inspection interface on localhost:4040 shows every request and response and replays a request with one click, which none of the tools above match for webhook debugging.

## Frequently Asked Questions

What is the best free ngrok alternative? 

It depends on who must reach the app. For a public URL with no account, a Cloudflare quick tunnel. For one person or agent, with no account and no public URL, qURL. For people on your tailnet, Tailscale Serve. For webhooks, any tool that gives a public URL; qURL is not built for them.

Which ngrok alternatives work without an account? 

Cloudflare quick tunnels, localtunnel, Pinggy, Serveo, localhost.run, and bore.pub start without one, and so does the qURL CLI. Of these, qURL is the only one that does not give the app a public URL.

Is there an ngrok alternative without a warning page? 

A one-time qURL link opens the app without a tunnel warning page. bore has none because it forwards raw TCP. Microsoft dev tunnels, zrok public shares from unverified free accounts, Pinggy and Serveo free tunnels, and localtunnel all show one.

Can my coding agent share my app instead of me running ngrok? 

Yes. Point Claude Code, Cursor, or Windsurf at the qURL skill (https://layerv.ai/skills/qurl/SKILL.md) and ask it to share the app. It installs the CLI, publishes the app privately, and gives you an address to send. The agent applies the private access rules you choose. For named recipients, give it their email addresses so it can send invitations. Recipients verify their email in the browser and save a passkey; they never send you their email verification code. The agent checks policy support before sharing and keeps the app private if the deployment cannot support it. For one person right away, ask it for a one-time link instead. Codex starts with network access off, so save the skill file for it first.

Which ngrok alternative is private by default? 

Microsoft dev tunnels are private until you allow anonymous access, but need a GitHub or Microsoft sign-in. Tailscale Serve is private to your tailnet. qURL gives the app no public URL and needs no account; without one you can keep up to 3 active resources, with links that last up to 24 hours.

## Related Resources

[qURL vs ngrok →](https://layerv.ai/compare/qurl-vs-ngrok/) [Every localhost tunnel, compared →](https://layerv.ai/compare/localhost-tunnels/) [Guide: Share localhost without signing up →](https://layerv.ai/guides/share-localhost-without-signup/) [Vibe coding: share your app in one prompt →](https://layerv.ai/vibe-coding/) [Deploy a preview or share localhost? →](https://layerv.ai/compare/deploy-preview-vs-share-localhost/) [ngrok docs: Web inspection interface ↗](https://ngrok.com/docs/agent/web-inspection-interface/) [Open-source ngrok alternatives →](https://layerv.ai/compare/open-source-ngrok-alternatives/) [ngrok alternatives with authentication →](https://layerv.ai/compare/ngrok-alternatives-with-auth/) [Guide: switch from ngrok to qURL →](https://layerv.ai/guides/switch-from-ngrok/) [An ngrok alternative with no public URL ↗](https://qurl.link/private-ngrok-alternative)

## Built it with an agent? Let it share it.

One prompt points Claude Code, Cursor, or Windsurf at the qURL skill. Or install the CLI and publish the app yourself. No account either way.

[Get the prompt ↗](https://layerv.ai/vibe-coding/)

New to qURL? Start at [qurl.link ](https://qurl.link/)



---

*This markdown version is auto-generated from [https://layerv.ai/compare/ngrok-alternatives/](https://layerv.ai/compare/ngrok-alternatives/) for AI agents. Curated agent resources: [llms.txt](https://layerv.ai/llms.txt). For the full interactive experience, visit the HTML version.*

