# ngrok Alternatives: Every Way to Share Localhost, Compared

> qURL, ngrok, Cloudflare quick tunnels, Tailscale Funnel, localtunnel, and 18 more compared on accounts, public URLs, link expiry, and limits, with sources.

Source: https://layerv.ai/compare/localhost-tunnels/

---

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

# Every way to share localhost, compared

qURL™ and 22 tunnel tools, side by side, with a source for every value.

Most localhost tunnels give your app a public URL: ngrok and Tailscale Funnel after you create an account, and Cloudflare quick tunnels, localtunnel, and SSH services such as Pinggy without one. qURL is the only tool here that needs no account or server of your own and gives the app no public URL: each recipient gets an access link that is single-use by default and expires within 24 hours.

Facts checked October 1, 2026 against each vendor’s documentation or our tests. Licensed CC BY 4.0.

[Download JSON ↓](https://layerv.ai/data/localhost-tunnels/tunnels.json) [Download CSV ↓](https://layerv.ai/data/localhost-tunnels/tunnels.csv)

## Which tool fits, at a glance

__Localhost sharing tools compared on accounts, reachability, link expiry, single-use links, warning pages, and free-tier limits__
| Tool                                                                                                       | Account needed before the first URL                                                                                                                                                            | Who can reach it                                                                                                                                                                                                | Link expiry                                                                                                                                                                                                                       | Single-use links                                                                                                                                                     | Warning page shown to visitors                                                                                                                                                        | Free-tier limits                                                                                                                                                                                                                                          |
| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [qURL CLI](https://layerv.ai/cli/)                                                                         | 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)                                                                     | Yes, the default for qurl share [our test](https://layerv.ai/research/qurl-behaviour)                                                                                | None [our test](https://layerv.ai/research/qurl-behaviour)                                                                                                                            | Without an account: up to 3 active resources, with links that last up to 24 hours [github.com](https://github.com/layervai/qurl-integrations/blob/main/apps/cli/README.md)                                                                                |
| [ngrok (free plan)](https://layerv.ai/compare/qurl-vs-ngrok/)                                              | Yes: account and authtoken [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)                                                                                                      | Public: anyone with the URL [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)                                                                                                                      | No built-in expiry; free endpoints have no timeout and stay up while the agent runs [ngrok.com](https://ngrok.com/docs/pricing-limits/free-plan-limits)                                                                           | Not documented [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)                                                                                        | Yes, on free-plan browser traffic (ERR\_NGROK\_6024) [ngrok.com](https://ngrok.com/docs/errors/err%5Fngrok%5F6024)                                                                    | 3 endpoints, 1 GB/month out, 20,000 HTTP requests/month, 4,000 requests/min [ngrok.com](https://ngrok.com/docs/pricing-limits/free-plan-limits)                                                                                                           |
| [Cloudflare Quick Tunnel (trycloudflare.com)](https://layerv.ai/compare/qurl-vs-cloudflare-quick-tunnels/) | 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/)                                                                                        | Not documented [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)                                                      | Not documented [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)                                                                       | 200 in-flight requests; no uptime guarantee; for testing and development [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)                                                                                 |
| [Cloudflare Tunnel (named)](https://layerv.ai/compare/qurl-vs-cloudflare-tunnel/)                          | 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/)                                               | Not documented [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/) | Not documented [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)                  | Available on all plans; 1,000 tunnels per account, 25 replicas per tunnel [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/account-limits/)                                                                                   |
| [Tailscale Funnel](https://layerv.ai/compare/qurl-vs-tailscale-funnel/)                                    | 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)                                                                                                                                    | No [tailscale.com](https://tailscale.com/kb/1311/tailscale-funnel)                                                                                                   | Not documented [tailscale.com](https://tailscale.com/kb/1223/funnel)                                                                                                                  | Available on all plans; non-configurable bandwidth limits, not published; beta [tailscale.com](https://tailscale.com/kb/1223/funnel)                                                                                                                      |
| [Tailscale Serve](https://layerv.ai/compare/qurl-vs-tailscale-serve/)                                      | 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)                                                                              | No [tailscale.com](https://tailscale.com/kb/1312/serve)                                                                                                              | Not documented [tailscale.com](https://tailscale.com/kb/1312/serve)                                                                                                                   | Free Personal plan: up to 6 users, unlimited user devices [tailscale.com](https://tailscale.com/pricing)                                                                                                                                                  |
| [localtunnel](https://layerv.ai/compare/qurl-vs-localtunnel/)                                              | 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)                                                                                                            | Not documented [github.com](https://github.com/localtunnel/localtunnel)                                                                                              | Reminder page that asks for a tunnel password (the creator’s public IP), per the service’s maintainer [github.com, unofficial](https://github.com/localtunnel/localtunnel/issues/598) | Not documented [github.com](https://github.com/localtunnel/localtunnel)                                                                                                                                                                                   |
| [Pinggy (free)](https://layerv.ai/compare/qurl-vs-pinggy/)                                                 | 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/)                                                                                                                                                            | Not documented [pinggy.io](https://pinggy.io/)                                                                                                                       | Yes, a one-time browser screening page on free tunnels; non-browser clients skip it; none on Pro [pinggy.io](https://pinggy.io/docs/http%5Ftunnels/screening/)                        | 60-minute tunnel timeout [pinggy.io](https://pinggy.io/)                                                                                                                                                                                                  |
| [Serveo (free)](https://layerv.ai/compare/qurl-vs-serveo/)                                                 | 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)                                                                                             | Not documented [serveo.net](https://serveo.net/)                                                                                                                     | Yes on the free tier; removed on Pro [serveo.net](https://serveo.net/)                                                                                                                | 3 active tunnels; anonymous TCP: 1 port, 10 minutes, 2 connections, 256 KiB/s [serveo.net](https://serveo.net/docs)                                                                                                                                       |
| [localhost.run (free)](https://layerv.ai/compare/qurl-vs-localhost-run/)                                   | 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/)                                                                                                                                       | Not documented [localhost.run](https://localhost.run/docs/)                                                                                                          | Not documented [localhost.run](https://localhost.run/docs/)                                                                                                                           | Free domain names change regularly; speed limit [localhost.run](https://localhost.run/docs/forever-free)                                                                                                                                                  |
| [Microsoft dev tunnels](https://layerv.ai/compare/qurl-vs-microsoft-dev-tunnels/)                          | 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) | Not documented [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)                                                         | Yes, an anti-phishing page on first visit [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)                                               | 5 GB a month and 10 tunnels per user; 1,500 HTTP requests a minute per port; public preview, no SLA [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#dev-tunnels-limits) |
| [zrok (free)](https://layerv.ai/compare/qurl-vs-zrok/)                                                     | 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)                                                                                                                     | Not documented [netfoundry.io](https://netfoundry.io/docs/zrok/concepts/public-shares)                                                                               | Yes, an anti-phishing page on the first visit to public shares from unverified free accounts; adding a card removes it [zrok.io](https://zrok.io/pricing/)                            | 5 GB/day; 7,500 requests per share per 5 minutes [netfoundry.io](https://netfoundry.io/docs/zrok/myzrok/service-limits/)                                                                                                                                  |
| bore (bore.pub)                                                                                            | 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)                                                                                             | No [github.com](https://github.com/ekzhang/bore)                                                                                                                     | None (raw TCP) [github.com](https://github.com/ekzhang/bore)                                                                                                                          | 24-hour timeout and a per-source-IP connection limit on bore.pub, per the maintainer; no uptime guarantee [github.com, unofficial](https://github.com/ekzhang/bore/issues/196)                                                                            |
| Expose (free)                                                                                              | 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)                                                                                                    | Not documented [expose.dev](https://expose.dev/docs/getting-started/authentication)                                                                                  | Not documented [expose.dev](https://expose.dev/docs/getting-started/authentication)                                                                                                   | Per-connection time limit (length not published); single EU server (Germany); random URLs [expose.dev](https://expose.dev/)                                                                                                                               |
| [frp](https://layerv.ai/compare/qurl-vs-frp/)                                                              | No; you run frps on your own server [github.com](https://github.com/fatedier/frp)                                                                                                              | Public: anyone who reaches the server port or domain; STCP/XTCP proxies only to visitors with the secret key [github.com](https://github.com/fatedier/frp)                                                      | Not documented [github.com](https://github.com/fatedier/frp)                                                                                                                                                                      | Not documented [github.com](https://github.com/fatedier/frp)                                                                                                         | Not documented [github.com](https://github.com/fatedier/frp)                                                                                                                          | No service tier; you run frps on your own server [github.com](https://github.com/fatedier/frp)                                                                                                                                                            |
| [LocalXpose (free)](https://layerv.ai/compare/qurl-vs-localxpose/)                                         | Yes: a free account and access token [localxpose.io](https://localxpose.io/docs)                                                                                                               | Public: anyone with the URL [localxpose.io](https://localxpose.io/docs/tunnels/http)                                                                                                                            | Free tunnels are time-limited (length not published) [localxpose.io](https://localxpose.io/pricing)                                                                                                                               | Not documented [localxpose.io](https://localxpose.io/docs/tunnels/http/http-plugins)                                                                                 | Yes, an interstitial warning page on the free Starter plan [localxpose.io](https://localxpose.io/pricing)                                                                             | 2 active HTTP/HTTPS tunnels; time limits; interstitial warning page [localxpose.io](https://localxpose.io/pricing)                                                                                                                                        |
| [Pangolin](https://layerv.ai/compare/qurl-vs-pangolin/)                                                    | Yes: a Pangolin Cloud account, or the admin account on your own server [docs.pangolin.net](https://docs.pangolin.net/about/pangolin-cloud-vs-self-hosted)                                      | Visitors who pass the resource's authentication; Pangolin SSO is on by default [docs.pangolin.net](https://docs.pangolin.net/manage/resources/public/authentication)                                            | Yes. Share links take an expiration or never expire; deleting a link revokes it [docs.pangolin.net](https://docs.pangolin.net/manage/access-control/links)                                                                        | Not documented [docs.pangolin.net](https://docs.pangolin.net/manage/access-control/links)                                                                            | A Pangolin login page for unauthenticated visitors [docs.pangolin.net](https://docs.pangolin.net/manage/resources/public/authentication)                                              | Cloud Basic: 5 users, 5 sites, 5 domains, 15 public resources; Community Edition is free to self-host [pangolin.net](https://pangolin.net/pricing)                                                                                                        |
| sish                                                                                                       | No, on your own server; your SSH public key goes in its pubkeys directory [github.com](https://github.com/antoniomika/sish)                                                                    | Public: anyone with the URL; TCP aliases only to authenticated SSH users [docs.ssi.sh](https://docs.ssi.sh/forwarding-types)                                                                                    | Optional per-tunnel deadline (deadline=15m or a timestamp) [docs.ssi.sh](https://docs.ssi.sh/cheatsheet)                                                                                                                          | Not documented [github.com](https://github.com/antoniomika/sish)                                                                                                     | Not documented [github.com](https://github.com/antoniomika/sish)                                                                                                                      | No free hosted tier; self-host, or use the managed tuns.sh with pico+ [pico.sh](https://pico.sh/tuns)                                                                                                                                                     |
| chisel                                                                                                     | No; you run chisel server yourself [github.com](https://github.com/jpillora/chisel)                                                                                                            | Anyone who can reach the reverse port on your server [github.com](https://github.com/jpillora/chisel)                                                                                                           | Not documented [github.com](https://github.com/jpillora/chisel)                                                                                                                                                                   | Not documented [github.com](https://github.com/jpillora/chisel)                                                                                                      | None (raw TCP) [github.com](https://github.com/jpillora/chisel)                                                                                                                       | No service tier; you run chisel server (the public demo server is gone) [github.com](https://github.com/jpillora/chisel)                                                                                                                                  |
| rathole                                                                                                    | No; you run the rathole server yourself [github.com](https://github.com/rathole-org/rathole)                                                                                                   | Public: anyone who connects to the port [github.com](https://github.com/rathole-org/rathole)                                                                                                                    | Not documented [github.com](https://github.com/rathole-org/rathole)                                                                                                                                                               | Not documented [github.com](https://github.com/rathole-org/rathole)                                                                                                  | None (raw TCP) [github.com](https://github.com/rathole-org/rathole)                                                                                                                   | No service tier; you need your own server with a public IP [github.com](https://github.com/rathole-org/rathole)                                                                                                                                           |
| Tunnelmole                                                                                                 | No [tunnelmole.com](https://tunnelmole.com)                                                                                                                                                    | Public: anyone with the URL [github.com](https://github.com/robbie-cahill/tunnelmole-client)                                                                                                                    | Not documented [github.com](https://github.com/robbie-cahill/tunnelmole-client)                                                                                                                                                   | Not documented [github.com](https://github.com/robbie-cahill/tunnelmole-client)                                                                                      | Not documented [github.com](https://github.com/robbie-cahill/tunnelmole-client)                                                                                                       | Not published; paid plans list custom subdomains and no tunnel timeouts [dashboard.tunnelmole.com](https://dashboard.tunnelmole.com)                                                                                                                      |
| boringproxy                                                                                                | No; boringproxy server creates the admin login on first run [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)                                             | Public: anyone with the URL, unless the tunnel is password-protected [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)                                                     | Not documented [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)                                                                                                                             | Not documented [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)                                                                | Not documented [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)                                                                                 | No service tier; the public demo instance is down [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/index.md)                                                                                                                  |
| inlets (inlets Pro)                                                                                        | Yes: a paid subscription and license key [github.com](https://github.com/inlets/inlets-pro)                                                                                                    | Public: anyone with the URL, unless OAuth or an IP allowlist is set [inlets.dev](https://inlets.dev/pricing)                                                                                                    | Not documented [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)                                                                                                                                         | Not documented [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)                                                                            | Not documented [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)                                                                                             | No free tier; Personal is $25/month for up to 5 tunnels, no commercial use [inlets.dev](https://inlets.dev/pricing)                                                                                                                                       |

## The command to a first shareable URL

__What each tool needs installed and the commands to a first shareable URL__
| Tool                                        | What you install                                                                                           | Command to the first shareable URL                                                                                                                                                                                                                                  |
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| qURL CLI                                    | qurl CLI (Homebrew or release download)                                                                    | qurl publish http://127.0.0.1:3000 qurl share <CRID>                                                                                                                                                                                                                |
| ngrok (free plan)                           | ngrok agent                                                                                                | ngrok config add-authtoken <TOKEN> ngrok http 8080                                                                                                                                                                                                                  |
| Cloudflare Quick Tunnel (trycloudflare.com) | cloudflared                                                                                                | cloudflared tunnel --url http://localhost:8080                                                                                                                                                                                                                      |
| Cloudflare Tunnel (named)                   | cloudflared                                                                                                | Create the tunnel in the dashboard, run the cloudflared install command it shows, then add a published application route                                                                                                                                            |
| Tailscale Funnel                            | Tailscale client 1.38.3 or later (an open-source variant on macOS)                                         | tailscale funnel 3000                                                                                                                                                                                                                                               |
| Tailscale Serve                             | Tailscale client, for you and every viewer                                                                 | tailscale serve 3000                                                                                                                                                                                                                                                |
| localtunnel                                 | Node.js package                                                                                            | npx localtunnel --port 8000                                                                                                                                                                                                                                         |
| Pinggy (free)                               | Nothing beyond an SSH client                                                                               | ssh -p 443 -R0:localhost:8000 qr@free.pinggy.io                                                                                                                                                                                                                     |
| Serveo (free)                               | Nothing beyond an SSH client                                                                               | ssh -R 80:localhost:3000 serveo.net                                                                                                                                                                                                                                 |
| localhost.run (free)                        | Nothing beyond an SSH client                                                                               | ssh -R 80:localhost:8080 localhost.run                                                                                                                                                                                                                              |
| Microsoft dev tunnels                       | devtunnel CLI or VS Code                                                                                   | devtunnel user login devtunnel host -p 8080 --allow-anonymous                                                                                                                                                                                                       |
| zrok (free)                                 | zrok2 CLI (zrok 2.0)                                                                                       | zrok2 enable <TOKEN> zrok2 share public 8080                                                                                                                                                                                                                        |
| bore (bore.pub)                             | bore binary                                                                                                | bore local 8000 --to bore.pub                                                                                                                                                                                                                                       |
| Expose (free)                               | expose CLI (PHP PHAR or Composer)                                                                          | expose token <TOKEN> expose share http://localhost:3000                                                                                                                                                                                                             |
| frp                                         | frps on a server with a public IP; frpc on your machine (release binaries)                                 | ./frps -c ./frps.toml (on the server) ./frpc -c ./frpc.toml                                                                                                                                                                                                         |
| LocalXpose (free)                           | loclx CLI or GUI (binary, snap, or npm)                                                                    | loclx account login loclx tunnel http                                                                                                                                                                                                                               |
| Pangolin                                    | Pangolin CLI or Newt as the site connector; self-hosting adds a Linux server with a public IP and a domain | pangolin up site --id <ID> --secret <SECRET> --endpoint https://app.pangolin.net Then add a public HTTPS resource in the dashboard                                                                                                                                  |
| sish                                        | Nothing beyond an SSH client; the sish server (Docker or binary) on your host                              | docker run ... antoniomika/sish:latest --domain=example.com (on your server) ssh -p 2222 -R 80:localhost:8080 example.com                                                                                                                                           |
| chisel                                      | chisel binary (client and server in one)                                                                   | chisel server --port 8080 --reverse (on your server) chisel client http://<server>:8080 R:3000:localhost:3000                                                                                                                                                       |
| rathole                                     | rathole binary or Docker image, on a server with a public IP and on your machine                           | ./rathole server.toml (on the server) ./rathole client.toml                                                                                                                                                                                                         |
| Tunnelmole                                  | Node.js package or prebuilt tmole binary                                                                   | npx tunnelmole 3000                                                                                                                                                                                                                                                 |
| boringproxy                                 | boringproxy binary (server and client in one); OpenSSH 7.8 or later                                        | boringproxy server -admin-domain <domain> (on the server) boringproxy client -server <domain> -user <user> -token <token> -client-name <name> Then add a tunnel in the web UI                                                                                       |
| inlets (inlets Pro)                         | inlets-pro binary (client and server in one); inletsctl to create the tunnel server                        | inletsctl create --provider digitalocean --region lon1 --access-token-file <key-file> --letsencrypt-domain <domain> Point a DNS A record for <domain> at the server IP inlets-pro http client --url <URL> --token <TOKEN> --upstream <domain>=http://127.0.0.1:3000 |

## Head-to-head comparisons

[Cloudflare Tunnel vs ngrok vs Tailscale Funnel →](https://layerv.ai/compare/cloudflare-tunnel-vs-ngrok-vs-tailscale-funnel/) [qURL vs ngrok →](https://layerv.ai/compare/qurl-vs-ngrok/) [qURL vs Cloudflare Quick Tunnels →](https://layerv.ai/compare/qurl-vs-cloudflare-quick-tunnels/) [qURL vs Cloudflare Tunnel + Access →](https://layerv.ai/compare/qurl-vs-cloudflare-tunnel-access/) [qURL vs Tailscale Funnel →](https://layerv.ai/compare/qurl-vs-tailscale-funnel/) [qURL vs localtunnel →](https://layerv.ai/compare/qurl-vs-localtunnel/) [qURL vs Microsoft Dev Tunnels →](https://layerv.ai/compare/qurl-vs-microsoft-dev-tunnels/) [qURL vs Pinggy →](https://layerv.ai/compare/qurl-vs-pinggy/) [qURL vs zrok →](https://layerv.ai/compare/qurl-vs-zrok/) [qURL vs Cloudflare Tunnel →](https://layerv.ai/compare/qurl-vs-cloudflare-tunnel/) [qURL vs localhost.run →](https://layerv.ai/compare/qurl-vs-localhost-run/) [qURL vs Serveo →](https://layerv.ai/compare/qurl-vs-serveo/) [qURL vs Tailscale Serve →](https://layerv.ai/compare/qurl-vs-tailscale-serve/) [qURL vs frp →](https://layerv.ai/compare/qurl-vs-frp/) [qURL vs LocalXpose →](https://layerv.ai/compare/qurl-vs-localxpose/) [qURL vs Pangolin →](https://layerv.ai/compare/qurl-vs-pangolin/) [ngrok alternatives →](https://layerv.ai/compare/ngrok-alternatives/) [Cloudflare Tunnel alternatives →](https://layerv.ai/compare/cloudflare-tunnel-alternatives/) [Open-source ngrok alternatives →](https://layerv.ai/compare/open-source-ngrok-alternatives/) [ngrok alternatives with authentication →](https://layerv.ai/compare/ngrok-alternatives-with-auth/) [Tailscale alternatives for sharing apps →](https://layerv.ai/compare/tailscale-alternatives/)

## Each tool in detail

### qURL CLI

LayerV · facts checked October 1, 2026 · [layerv.ai/cli](https://layerv.ai/cli)

Account needed before the first URL

No. The first publish creates the device identity [our test](https://layerv.ai/research/qurl-behaviour)

What you install

qurl CLI (Homebrew or release download) [layerv.ai](https://layerv.ai/cli)

Command to the first shareable URL

qurl publish http://127.0.0.1:3000 qurl share <CRID> [our test](https://layerv.ai/research/qurl-behaviour)

What the URL looks like

A qurl.link access link per recipient; the app answers at r\_<id>.qurl.site, a name absent from Certificate Transparency logs [our test](https://layerv.ai/research/qurl-behaviour)

Who can reach it

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)

Warning page shown to visitors

None [our test](https://layerv.ai/research/qurl-behaviour)

Visitor access control

Single-use access link by default; link and session lifetimes. IP allow and deny lists and other rules can gate links through the API, not the CLI [layerv.ai](https://layerv.ai/docs/qurls.md)

Link expiry

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)

Single-use links

Yes, the default for qurl share [our test](https://layerv.ai/research/qurl-behaviour)

Protocols

HTTP(S), WebSocket, SSE; no raw TCP [our test](https://layerv.ai/research/qurl-behaviour)

Free-tier limits

Without an account: up to 3 active resources, with links that last up to 24 hours [github.com](https://github.com/layervai/qurl-integrations/blob/main/apps/cli/README.md)

### ngrok (free plan)

ngrok · facts checked October 1, 2026 · [ngrok.com](https://ngrok.com)

Account needed before the first URL

Yes: account and authtoken [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)

What you install

ngrok agent [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)

Command to the first shareable URL

ngrok config add-authtoken <TOKEN> ngrok http 8080 [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)

What the URL looks like

One assigned dev domain per account (ngrok-free.app / ngrok-free.dev), stable [ngrok.com](https://ngrok.com/docs/gateway/domains)

Who can reach it

Public: anyone with the URL [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)

Warning page shown to visitors

Yes, on free-plan browser traffic (ERR\_NGROK\_6024) [ngrok.com](https://ngrok.com/docs/errors/err%5Fngrok%5F6024)

Visitor access control

Traffic Policy: OAuth, OIDC, basic auth, IP restrictions (free plan: 3 OAuth/OIDC users a month) [ngrok.com](https://ngrok.com/docs/share-localhost/auth)

Link expiry

No built-in expiry; free endpoints have no timeout and stay up while the agent runs [ngrok.com](https://ngrok.com/docs/pricing-limits/free-plan-limits)

Single-use links

Not documented [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)

Protocols

HTTP(S); TCP after card verification [ngrok.com](https://ngrok.com/docs/gateway/endpoints/tcp)

Free-tier limits

3 endpoints, 1 GB/month out, 20,000 HTTP requests/month, 4,000 requests/min [ngrok.com](https://ngrok.com/docs/pricing-limits/free-plan-limits)

### Cloudflare Quick Tunnel (trycloudflare.com)

Cloudflare · facts checked October 1, 2026 · [try.cloudflare.com](https://try.cloudflare.com)

Account needed before the first URL

No [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

What you install

cloudflared [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Command to the first shareable URL

cloudflared tunnel --url http://localhost:8080 [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

What the URL looks like

Temporary \*.trycloudflare.com hostname; changes each run [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Who can reach it

Public, unless --allowed-mail is set [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Warning page shown to visitors

Not documented [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Visitor access control

Optional --allowed-mail email one-time PIN (browsers only; change it by restarting cloudflared) [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Link expiry

No; the URL works until cloudflared stops [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Single-use links

Not documented [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Protocols

HTTP(S); Server-Sent Events not supported [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

Free-tier limits

200 in-flight requests; no uptime guarantee; for testing and development [developers.cloudflare.com](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)

### Cloudflare Tunnel (named)

Cloudflare · facts checked October 1, 2026 · [www.cloudflare.com/products/tunnel/](https://www.cloudflare.com/products/tunnel/)

Account needed before the first URL

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/)

What you install

cloudflared [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)

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 [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)

What the URL looks like

Stable hostname on your own domain [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)

Who can reach it

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/)

Warning page shown to visitors

Not documented [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)

Visitor access control

Cloudflare Access policies; service tokens for machines [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/)

Link expiry

No per-link expiry; Access session settings apply [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/session-management/)

Single-use links

Not documented [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)

Protocols

HTTP(S); TCP, SSH, RDP, SMB with cloudflared on the client [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/protocols/)

Free-tier limits

Available on all plans; 1,000 tunnels per account, 25 replicas per tunnel [developers.cloudflare.com](https://developers.cloudflare.com/cloudflare-one/account-limits/)

### Tailscale Funnel

Tailscale · facts checked October 1, 2026 · [tailscale.com/kb/1223/funnel](https://tailscale.com/kb/1223/funnel)

Account needed before the first URL

Yes: a tailnet with MagicDNS, HTTPS certificates, and the funnel node attribute [tailscale.com](https://tailscale.com/kb/1223/funnel)

What you install

Tailscale client 1.38.3 or later (an open-source variant on macOS) [tailscale.com](https://tailscale.com/kb/1223/funnel)

Command to the first shareable URL

tailscale funnel 3000 [tailscale.com](https://tailscale.com/kb/1223/funnel)

What the URL looks like

Stable machine-name.tailnet-name.ts.net; machine names are published in Certificate Transparency logs [tailscale.com](https://tailscale.com/kb/1153/enabling-https)

Who can reach it

Public: anyone on the internet [tailscale.com](https://tailscale.com/kb/1223/funnel)

Warning page shown to visitors

Not documented [tailscale.com](https://tailscale.com/kb/1223/funnel)

Visitor access control

None on Funnel traffic; Funnel requests carry no Tailscale identity headers [tailscale.com](https://tailscale.com/kb/1312/serve)

Link expiry

No; runs until you turn it off [tailscale.com](https://tailscale.com/kb/1311/tailscale-funnel)

Single-use links

No [tailscale.com](https://tailscale.com/kb/1311/tailscale-funnel)

Protocols

HTTPS proxy, TCP, TLS-terminated TCP; ports 443, 8443, and 10000 only [tailscale.com](https://tailscale.com/kb/1311/tailscale-funnel)

Free-tier limits

Available on all plans; non-configurable bandwidth limits, not published; beta [tailscale.com](https://tailscale.com/kb/1223/funnel)

### Tailscale Serve

Tailscale · facts checked October 1, 2026 · [tailscale.com/kb/1312/serve](https://tailscale.com/kb/1312/serve)

Account needed before the first URL

Yes: a tailnet with HTTPS certificates enabled [tailscale.com](https://tailscale.com/kb/1312/serve)

What you install

Tailscale client, for you and every viewer [tailscale.com](https://tailscale.com/kb/1312/serve)

Command to the first shareable URL

tailscale serve 3000 [tailscale.com](https://tailscale.com/kb/1312/serve)

What the URL looks like

machine-name.tailnet-name.ts.net; machine names are published in Certificate Transparency logs [tailscale.com](https://tailscale.com/kb/1153/enabling-https)

Who can reach it

Authorized Tailscale users, including accepted machine-share recipients [tailscale.com](https://tailscale.com/docs/features/sharing)

Warning page shown to visitors

Not documented [tailscale.com](https://tailscale.com/kb/1312/serve)

Visitor access control

Tailscale access rules; Tailscale-User-Login identity headers for the app [tailscale.com](https://tailscale.com/kb/1312/serve)

Link expiry

No; a foreground session runs until stopped, and --bg keeps it running across reboots [tailscale.com](https://tailscale.com/kb/1242/tailscale-serve)

Single-use links

No [tailscale.com](https://tailscale.com/kb/1312/serve)

Protocols

HTTP(S) proxy, files, directories, plain text, TCP, TLS-terminated TCP [tailscale.com](https://tailscale.com/kb/1242/tailscale-serve)

Free-tier limits

Free Personal plan: up to 6 users, unlimited user devices [tailscale.com](https://tailscale.com/pricing)

### localtunnel

localtunnel (open source) · facts checked October 1, 2026 · [github.com/localtunnel/localtunnel](https://github.com/localtunnel/localtunnel)

Account needed before the first URL

No [github.com](https://github.com/localtunnel/localtunnel)

What you install

Node.js package [github.com](https://github.com/localtunnel/localtunnel)

Command to the first shareable URL

npx localtunnel --port 8000 [github.com](https://github.com/localtunnel/localtunnel)

What the URL looks like

Random \*.loca.lt subdomain (optional --subdomain, not guaranteed) [loca.lt](https://loca.lt/)

Who can reach it

Public: anyone with the URL [github.com](https://github.com/localtunnel/localtunnel)

Warning page shown to visitors

Reminder page that asks for a tunnel password (the creator’s public IP), per the service’s maintainer [github.com, unofficial](https://github.com/localtunnel/localtunnel/issues/598)

Visitor access control

Not documented [github.com](https://github.com/localtunnel/localtunnel)

Link expiry

Active while the lt client stays connected; no expiry setting [github.com](https://github.com/localtunnel/localtunnel)

Single-use links

Not documented [github.com](https://github.com/localtunnel/localtunnel)

Protocols

HTTP(S) [github.com](https://github.com/localtunnel/localtunnel)

Free-tier limits

Not documented [github.com](https://github.com/localtunnel/localtunnel)

### Pinggy (free)

Pinggy · facts checked October 1, 2026 · [pinggy.io](https://pinggy.io)

Account needed before the first URL

No, to start [pinggy.io](https://pinggy.io/)

What you install

Nothing beyond an SSH client [pinggy.io](https://pinggy.io/)

Command to the first shareable URL

ssh -p 443 -R0:localhost:8000 qr@free.pinggy.io [pinggy.io](https://pinggy.io/)

What the URL looks like

Random URL that changes on reconnect; persistent subdomains on Pro [pinggy.io](https://pinggy.io/)

Who can reach it

Public: anyone with the URL [pinggy.io](https://pinggy.io/)

Warning page shown to visitors

Yes, a one-time browser screening page on free tunnels; non-browser clients skip it; none on Pro [pinggy.io](https://pinggy.io/docs/http%5Ftunnels/screening/)

Visitor access control

Basic auth, bearer token, IP allowlist [pinggy.io](https://pinggy.io/)

Link expiry

Free tunnels time out after 60 minutes [pinggy.io](https://pinggy.io/)

Single-use links

Not documented [pinggy.io](https://pinggy.io/)

Protocols

HTTP(S), TCP, TLS over SSH; UDP needs the Pinggy CLI [pinggy.io](https://pinggy.io/docs/udp%5Ftunnels/)

Free-tier limits

60-minute tunnel timeout [pinggy.io](https://pinggy.io/)

### Serveo (free)

Serveo · facts checked October 1, 2026 · [serveo.net](https://serveo.net)

Account needed before the first URL

No [serveo.net](https://serveo.net/)

What you install

Nothing beyond an SSH client [serveo.net](https://serveo.net/)

Command to the first shareable URL

ssh -R 80:localhost:3000 serveo.net [serveo.net](https://serveo.net/)

What the URL looks like

\*.serveo.net subdomain; custom subdomain available [serveo.net](https://serveo.net/)

Who can reach it

Public: anyone with the URL [serveo.net](https://serveo.net/)

Warning page shown to visitors

Yes on the free tier; removed on Pro [serveo.net](https://serveo.net/)

Visitor access control

Not documented for visitors [serveo.net](https://serveo.net/)

Link expiry

None documented for HTTP; anonymous public TCP ports last 10 minutes (30 with a registered key) [serveo.net](https://serveo.net/docs)

Single-use links

Not documented [serveo.net](https://serveo.net/)

Protocols

HTTP(S); raw TCP (random port) and private TCP/SSH aliases over SSH; UDP only via paid WireGuard [serveo.net](https://serveo.net/docs)

Free-tier limits

3 active tunnels; anonymous TCP: 1 port, 10 minutes, 2 connections, 256 KiB/s [serveo.net](https://serveo.net/docs)

### localhost.run (free)

localhost.run · facts checked October 1, 2026 · [localhost.run](https://localhost.run)

Account needed before the first URL

No account for free domains (SSH key or the nokey user) [localhost.run](https://localhost.run/docs/)

What you install

Nothing beyond an SSH client [localhost.run](https://localhost.run/docs/)

Command to the first shareable URL

ssh -R 80:localhost:8080 localhost.run [localhost.run](https://localhost.run/docs/)

What the URL looks like

Free domains change after a few hours; custom domains on paid plans [localhost.run](https://localhost.run/docs/faq/)

Who can reach it

Public: anyone with the URL [localhost.run](https://localhost.run/docs/)

Warning page shown to visitors

Not documented [localhost.run](https://localhost.run/docs/)

Visitor access control

Not documented [localhost.run](https://localhost.run/docs/)

Link expiry

No expiry setting; the free domain rotates [localhost.run](https://localhost.run/docs/faq/)

Single-use links

Not documented [localhost.run](https://localhost.run/docs/)

Protocols

HTTP with automatic HTTPS; TLS passthrough and non-HTTP need a paid custom domain [localhost.run](https://localhost.run/docs/http-tunnels)

Free-tier limits

Free domain names change regularly; speed limit [localhost.run](https://localhost.run/docs/forever-free)

### Microsoft dev tunnels

Microsoft · facts checked October 1, 2026 · [learn.microsoft.com/en-us/azure/developer/dev-tunnels/overview](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/overview)

Account needed before the first URL

Yes: GitHub, Microsoft, or Entra ID [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/faq)

What you install

devtunnel CLI or VS Code [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/overview)

Command to the first shareable URL

devtunnel user login devtunnel host -p 8080 --allow-anonymous [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/cli-commands)

What the URL looks like

\*.devtunnels.ms; persistent when created with devtunnel create [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)

Who can reach it

Private by default; anonymous access is opt-in [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)

Warning page shown to visitors

Yes, an anti-phishing page on first visit [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)

Visitor access control

Tenant, GitHub organization, or anonymous; 24-hour access tokens [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)

Link expiry

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)

Single-use links

Not documented [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)

Protocols

HTTP(S) and WebSocket via the web URL; other TCP via devtunnel connect [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security)

Free-tier limits

5 GB a month and 10 tunnels per user; 1,500 HTTP requests a minute per port; public preview, no SLA [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#dev-tunnels-limits)

### zrok (free)

NetFoundry · facts checked October 1, 2026 · [zrok.io](https://zrok.io)

Account needed before the first URL

Yes: a free account, no card [zrok.io](https://zrok.io/pricing/)

What you install

zrok2 CLI (zrok 2.0) [netfoundry.io](https://netfoundry.io/docs/zrok/get-started/install-zrok2)

Command to the first shareable URL

zrok2 enable <TOKEN> zrok2 share public 8080 [netfoundry.io](https://netfoundry.io/docs/zrok/get-started/create-share)

What the URL looks like

\*.share.zrok.io; random and ephemeral by default, or a reserved name [netfoundry.io](https://netfoundry.io/docs/zrok/concepts/namespaces)

Who can reach it

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)

Warning page shown to visitors

Yes, an anti-phishing page on the first visit to public shares from unverified free accounts; adding a card removes it [zrok.io](https://zrok.io/pricing/)

Visitor access control

Basic auth; OAuth with an email pattern; private shares [github.com](https://github.com/openziti/zrok/blob/main/cmd/zrok2/sharePublic.go)

Link expiry

Ephemeral shares end with the process [netfoundry.io](https://netfoundry.io/docs/zrok/concepts/public-shares)

Single-use links

Not documented [netfoundry.io](https://netfoundry.io/docs/zrok/concepts/public-shares)

Protocols

HTTP(S) on public shares; raw TCP, UDP, and SOCKS on private shares [netfoundry.io](https://netfoundry.io/docs/zrok/concepts/private-shares)

Free-tier limits

5 GB/day; 7,500 requests per share per 5 minutes [netfoundry.io](https://netfoundry.io/docs/zrok/myzrok/service-limits/)

### bore (bore.pub)

bore (open source) · facts checked October 1, 2026 · [github.com/ekzhang/bore](https://github.com/ekzhang/bore)

Account needed before the first URL

No, for the public bore.pub server [github.com](https://github.com/ekzhang/bore)

What you install

bore binary [github.com](https://github.com/ekzhang/bore)

Command to the first shareable URL

bore local 8000 --to bore.pub [github.com](https://github.com/ekzhang/bore)

What the URL looks like

bore.pub:<random port> [github.com](https://github.com/ekzhang/bore)

Who can reach it

Public: anyone who connects to the port [github.com](https://github.com/ekzhang/bore)

Warning page shown to visitors

None (raw TCP) [github.com](https://github.com/ekzhang/bore)

Visitor access control

Optional shared secret between client and server, not visitors [github.com](https://github.com/ekzhang/bore)

Link expiry

bore.pub connections time out after 24 hours, per the maintainer [github.com, unofficial](https://github.com/ekzhang/bore/issues/150)

Single-use links

No [github.com](https://github.com/ekzhang/bore)

Protocols

TCP only, no TLS [github.com](https://github.com/ekzhang/bore)

Free-tier limits

24-hour timeout and a per-source-IP connection limit on bore.pub, per the maintainer; no uptime guarantee [github.com, unofficial](https://github.com/ekzhang/bore/issues/196)

### Expose (free)

Beyond Code · facts checked October 1, 2026 · [expose.dev](https://expose.dev)

Account needed before the first URL

Yes: a free account for the auth token [expose.dev](https://expose.dev/docs/getting-started/authentication)

What you install

expose CLI (PHP PHAR or Composer) [expose.dev](https://expose.dev/docs/getting-started/installation)

Command to the first shareable URL

expose token <TOKEN> expose share http://localhost:3000 [expose.dev](https://expose.dev/docs/getting-started/sharing-your-first-site)

What the URL looks like

Random subdomain per connection on the free plan [expose.dev](https://expose.dev/docs/getting-started/authentication)

Who can reach it

Public: anyone with the URL [expose.dev](https://expose.dev/docs/getting-started/authentication)

Warning page shown to visitors

Not documented [expose.dev](https://expose.dev/docs/getting-started/authentication)

Visitor access control

Basic auth (--basicAuth); pricing lists access control under Pro [expose.dev](https://expose.dev/docs/client/basic-authentication)

Link expiry

Free connections are time-limited (length not documented) [expose.dev](https://expose.dev/docs/getting-started/authentication)

Single-use links

Not documented [expose.dev](https://expose.dev/docs/getting-started/authentication)

Protocols

HTTP(S); TCP port sharing is Pro [expose.dev](https://expose.dev/docs/client/sharing)

Free-tier limits

Per-connection time limit (length not published); single EU server (Germany); random URLs [expose.dev](https://expose.dev/)

### frp

fatedier (open source) · facts checked October 14, 2026 · [github.com/fatedier/frp](https://github.com/fatedier/frp)

Account needed before the first URL

No; you run frps on your own server [github.com](https://github.com/fatedier/frp)

What you install

frps on a server with a public IP; frpc on your machine (release binaries) [github.com](https://github.com/fatedier/frp)

Command to the first shareable URL

./frps -c ./frps.toml (on the server) ./frpc -c ./frpc.toml [github.com](https://github.com/fatedier/frp)

What the URL looks like

Your server's IP and remotePort for TCP/UDP; your own domain (customDomains or subdomain) for HTTP/HTTPS [github.com](https://github.com/fatedier/frp)

Who can reach it

Public: anyone who reaches the server port or domain; STCP/XTCP proxies only to visitors with the secret key [github.com](https://github.com/fatedier/frp)

Warning page shown to visitors

Not documented [github.com](https://github.com/fatedier/frp)

Visitor access control

HTTP basic auth (httpUser/httpPassword) on http proxies; secretKey for STCP/XTCP visitors; token or OIDC authenticates clients, not visitors [github.com](https://github.com/fatedier/frp)

Link expiry

Not documented [github.com](https://github.com/fatedier/frp)

Single-use links

Not documented [github.com](https://github.com/fatedier/frp)

Protocols

TCP, UDP, HTTP, HTTPS; secret STCP and peer-to-peer XTCP modes [github.com](https://github.com/fatedier/frp)

Free-tier limits

No service tier; you run frps on your own server [github.com](https://github.com/fatedier/frp)

### LocalXpose (free)

LocalXpose · facts checked October 14, 2026 · [localxpose.io](https://localxpose.io)

Account needed before the first URL

Yes: a free account and access token [localxpose.io](https://localxpose.io/docs)

What you install

loclx CLI or GUI (binary, snap, or npm) [localxpose.io](https://localxpose.io/docs)

Command to the first shareable URL

loclx account login loclx tunnel http [localxpose.io](https://localxpose.io/docs)

What the URL looks like

Unique subdomain on the free plan; custom subdomains and custom domains on Pro [localxpose.io](https://localxpose.io/pricing)

Who can reach it

Public: anyone with the URL [localxpose.io](https://localxpose.io/docs/tunnels/http)

Warning page shown to visitors

Yes, an interstitial warning page on the free Starter plan [localxpose.io](https://localxpose.io/pricing)

Visitor access control

Basic auth (--basic-auth), key auth with an X-TOKEN header (--key-auth), IP whitelist (--ip-whitelist) [localxpose.io](https://localxpose.io/docs/tunnels/http/http-plugins)

Link expiry

Free tunnels are time-limited (length not published) [localxpose.io](https://localxpose.io/pricing)

Single-use links

Not documented [localxpose.io](https://localxpose.io/docs/tunnels/http/http-plugins)

Protocols

HTTP(S) on the free plan; TCP, TLS, UDP on Pro [localxpose.io](https://localxpose.io/pricing)

Free-tier limits

2 active HTTP/HTTPS tunnels; time limits; interstitial warning page [localxpose.io](https://localxpose.io/pricing)

### Pangolin

Fossorial · facts checked October 14, 2026 · [pangolin.net](https://pangolin.net)

Account needed before the first URL

Yes: a Pangolin Cloud account, or the admin account on your own server [docs.pangolin.net](https://docs.pangolin.net/about/pangolin-cloud-vs-self-hosted)

What you install

Pangolin CLI or Newt as the site connector; self-hosting adds a Linux server with a public IP and a domain [docs.pangolin.net](https://docs.pangolin.net/about/pangolin-cloud-vs-self-hosted)

Command to the first shareable URL

pangolin up site --id <ID> --secret <SECRET> --endpoint https://app.pangolin.net Then add a public HTTPS resource in the dashboard [docs.pangolin.net](https://docs.pangolin.net/manage/sites/install-site)

What the URL looks like

A hostname on a domain you add; provided domains (.hostlocal.app, .tunneled.to) on paid Cloud plans [docs.pangolin.net](https://docs.pangolin.net/manage/domains)

Who can reach it

Visitors who pass the resource's authentication; Pangolin SSO is on by default [docs.pangolin.net](https://docs.pangolin.net/manage/resources/public/authentication)

Warning page shown to visitors

A Pangolin login page for unauthenticated visitors [docs.pangolin.net](https://docs.pangolin.net/manage/resources/public/authentication)

Visitor access control

SSO and identity providers, users and roles, PIN, passcode, email OTP, header auth, share links, IP/geo/path rules [docs.pangolin.net](https://docs.pangolin.net/manage/resources/public/authentication)

Link expiry

Yes. Share links take an expiration or never expire; deleting a link revokes it [docs.pangolin.net](https://docs.pangolin.net/manage/access-control/links)

Single-use links

Not documented [docs.pangolin.net](https://docs.pangolin.net/manage/access-control/links)

Protocols

HTTP(S), browser SSH/RDP/VNC; raw TCP/UDP on self-hosted servers, without Pangolin authentication [docs.pangolin.net](https://docs.pangolin.net/manage/resources/public/raw-resources)

Free-tier limits

Cloud Basic: 5 users, 5 sites, 5 domains, 15 public resources; Community Edition is free to self-host [pangolin.net](https://pangolin.net/pricing)

### sish

sish (open source) · facts checked October 14, 2026 · [github.com/antoniomika/sish](https://github.com/antoniomika/sish)

Account needed before the first URL

No, on your own server; your SSH public key goes in its pubkeys directory [github.com](https://github.com/antoniomika/sish)

What you install

Nothing beyond an SSH client; the sish server (Docker or binary) on your host [github.com](https://github.com/antoniomika/sish)

Command to the first shareable URL

docker run ... antoniomika/sish:latest --domain=example.com (on your server) ssh -p 2222 -R 80:localhost:8080 example.com [github.com](https://github.com/antoniomika/sish)

What the URL looks like

Chosen or random subdomain of your sish domain; host:port for TCP [docs.ssi.sh](https://docs.ssi.sh/forwarding-types)

Who can reach it

Public: anyone with the URL; TCP aliases only to authenticated SSH users [docs.ssi.sh](https://docs.ssi.sh/forwarding-types)

Warning page shown to visitors

Not documented [github.com](https://github.com/antoniomika/sish)

Visitor access control

HTTP basic auth per forwarded host; server-wide IP and country allowlists; TCP aliases limited to listed SSH key fingerprints [docs.ssi.sh](https://docs.ssi.sh/cli)

Link expiry

Optional per-tunnel deadline (deadline=15m or a timestamp) [docs.ssi.sh](https://docs.ssi.sh/cheatsheet)

Single-use links

Not documented [github.com](https://github.com/antoniomika/sish)

Protocols

HTTP(S), WS(S), TCP, TCP aliases, SNI passthrough [github.com](https://github.com/antoniomika/sish)

Free-tier limits

No free hosted tier; self-host, or use the managed tuns.sh with pico+ [pico.sh](https://pico.sh/tuns)

### chisel

chisel (open source) · facts checked October 14, 2026 · [github.com/jpillora/chisel](https://github.com/jpillora/chisel)

Account needed before the first URL

No; you run chisel server yourself [github.com](https://github.com/jpillora/chisel)

What you install

chisel binary (client and server in one) [github.com](https://github.com/jpillora/chisel)

Command to the first shareable URL

chisel server --port 8080 --reverse (on your server) chisel client http://<server>:8080 R:3000:localhost:3000 [github.com](https://github.com/jpillora/chisel)

What the URL looks like

<server>:<port> on your chisel server [github.com](https://github.com/jpillora/chisel)

Who can reach it

Anyone who can reach the reverse port on your server [github.com](https://github.com/jpillora/chisel)

Warning page shown to visitors

None (raw TCP) [github.com](https://github.com/jpillora/chisel)

Visitor access control

Not documented for visitors; --auth and --authfile authenticate tunnel clients [github.com](https://github.com/jpillora/chisel)

Link expiry

Not documented [github.com](https://github.com/jpillora/chisel)

Single-use links

Not documented [github.com](https://github.com/jpillora/chisel)

Protocols

TCP and UDP over HTTP, encrypted with SSH; SOCKS5 [github.com](https://github.com/jpillora/chisel)

Free-tier limits

No service tier; you run chisel server (the public demo server is gone) [github.com](https://github.com/jpillora/chisel)

### rathole

rathole (open source) · facts checked October 14, 2026 · [github.com/rathole-org/rathole](https://github.com/rathole-org/rathole)

Account needed before the first URL

No; you run the rathole server yourself [github.com](https://github.com/rathole-org/rathole)

What you install

rathole binary or Docker image, on a server with a public IP and on your machine [github.com](https://github.com/rathole-org/rathole)

Command to the first shareable URL

./rathole server.toml (on the server) ./rathole client.toml [github.com](https://github.com/rathole-org/rathole)

What the URL looks like

Your server's address and the service's bind\_addr port [github.com](https://github.com/rathole-org/rathole)

Who can reach it

Public: anyone who connects to the port [github.com](https://github.com/rathole-org/rathole)

Warning page shown to visitors

None (raw TCP) [github.com](https://github.com/rathole-org/rathole)

Visitor access control

Not documented for visitors; a mandatory per-service token authenticates clients [github.com](https://github.com/rathole-org/rathole)

Link expiry

Not documented [github.com](https://github.com/rathole-org/rathole)

Single-use links

Not documented [github.com](https://github.com/rathole-org/rathole)

Protocols

TCP and UDP; client-server transport over TCP, TLS, or Noise [github.com](https://github.com/rathole-org/rathole)

Free-tier limits

No service tier; you need your own server with a public IP [github.com](https://github.com/rathole-org/rathole)

### Tunnelmole

Tunnelmole (open source) · facts checked October 14, 2026 · [tunnelmole.com](https://tunnelmole.com)

Account needed before the first URL

No [tunnelmole.com](https://tunnelmole.com)

What you install

Node.js package or prebuilt tmole binary [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Command to the first shareable URL

npx tunnelmole 3000 [tunnelmole.com](https://tunnelmole.com)

What the URL looks like

Random tunnelmole.net subdomain that contains your IP address; custom subdomains are paid [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Who can reach it

Public: anyone with the URL [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Warning page shown to visitors

Not documented [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Visitor access control

Not documented [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Link expiry

Not documented [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Single-use links

Not documented [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Protocols

HTTP(S) [github.com](https://github.com/robbie-cahill/tunnelmole-client)

Free-tier limits

Not published; paid plans list custom subdomains and no tunnel timeouts [dashboard.tunnelmole.com](https://dashboard.tunnelmole.com)

### boringproxy

boringproxy (open source) · facts checked October 14, 2026 · [github.com/boringproxy/boringproxy](https://github.com/boringproxy/boringproxy)

Account needed before the first URL

No; boringproxy server creates the admin login on first run [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

What you install

boringproxy binary (server and client in one); OpenSSH 7.8 or later [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/installation.md)

Command to the first shareable URL

boringproxy server -admin-domain <domain> (on the server) boringproxy client -server <domain> -user <user> -token <token> -client-name <name> Then add a tunnel in the web UI [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

What the URL looks like

A domain you point at the server, such as a subdomain of a wildcard DNS record [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

Who can reach it

Public: anyone with the URL, unless the tunnel is password-protected [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

Warning page shown to visitors

Not documented [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

Visitor access control

Optional HTTP basic auth per tunnel (Password Protect) [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

Link expiry

Not documented [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

Single-use links

Not documented [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

Protocols

HTTP(S); raw TCP with Allow External TCP [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md)

Free-tier limits

No service tier; the public demo instance is down [github.com](https://github.com/boringproxy/boringproxy.io/blob/master/pages/index.md)

### inlets (inlets Pro)

OpenFaaS Ltd · facts checked October 14, 2026 · [inlets.dev](https://inlets.dev)

Account needed before the first URL

Yes: a paid subscription and license key [github.com](https://github.com/inlets/inlets-pro)

What you install

inlets-pro binary (client and server in one); inletsctl to create the tunnel server [github.com](https://github.com/inlets/inlets-pro)

Command to the first shareable URL

inletsctl create --provider digitalocean --region lon1 --access-token-file <key-file> --letsencrypt-domain <domain> Point a DNS A record for <domain> at the server IP inlets-pro http client --url <URL> --token <TOKEN> --upstream <domain>=http://127.0.0.1:3000 [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)

What the URL looks like

Your own domain, with a Let's Encrypt certificate on your tunnel server [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)

Who can reach it

Public: anyone with the URL, unless OAuth or an IP allowlist is set [inlets.dev](https://inlets.dev/pricing)

Warning page shown to visitors

Not documented [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)

Visitor access control

OAuth on HTTP tunnels (Personal: GitHub, Signet); IP allowlist [inlets.dev](https://inlets.dev/pricing)

Link expiry

Not documented [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)

Single-use links

Not documented [docs.inlets.dev](https://docs.inlets.dev/tutorial/automated-http-server/)

Protocols

HTTP(S), WebSockets, SSE, gRPC; TCP [inlets.dev](https://inlets.dev/pricing)

Free-tier limits

No free tier; Personal is $25/month for up to 5 tunnels, no commercial use [inlets.dev](https://inlets.dev/pricing)

## What changed

- 2026-09-30 Cloudflare's quick tunnel documentation adds --allowed-mail, an optional email one-time PIN in front of a quick tunnel. [source](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/)
- 2024-06-13 ngrok requires card verification before free accounts can open TCP endpoints, citing reports of its agent being bundled into malware. [source](https://ngrok.com/blog/tcp-endpoints-require-verification)
- 2023-02-28 ngrok describes the anti-phishing measures applied to free accounts, including the browser warning page. [source](https://ngrok.com/blog/how-ngrok-actively-combats-phishing-attacks)

## Frequently Asked Questions

Which localhost tunnels work without an account? 

Cloudflare quick tunnels, localtunnel, Pinggy, Serveo, localhost.run, bore.pub, Tunnelmole, and the qURL CLI start without an account. frp, sish, chisel, rathole, and boringproxy need no service account but require your own server. ngrok, Cloudflare named tunnels, Tailscale Funnel and Serve, Microsoft dev tunnels, zrok, Expose, LocalXpose, Pangolin, and inlets need an account or license first. qURL needs no account or server of your own and gives the app no public URL.

Which tunnel keeps my local app private? 

Microsoft dev tunnels are private by default but require a GitHub or Microsoft sign-in, and Tailscale Serve is private to your tailnet. Cloudflare quick tunnels can add an emailed PIN with --allowed-mail. qURL keeps the app off the public internet and admits each recipient through their own access link, with no account on either side.

Do any tunnels offer links that expire or work once? 

Microsoft dev tunnels can grant time-limited anonymous access, Pangolin share links can expire, sish supports a per-tunnel deadline, and Pinggy’s free tunnels time out after 60 minutes. qURL is the only tool here that documents single-use links: with no flags, qurl share prints a link that can be opened once and expires within 24 hours. Opening it admits the opener’s network address for the session, so other devices on that public IP can reach the app until it ends.

Why do some tunnels show a warning page? 

ngrok’s free plan, Microsoft dev tunnels, zrok, and localtunnel say their warning or reminder pages are there to fight phishing, and Pinggy, Serveo, and LocalXpose show one on free tunnels too. qURL shows recipients no warning page; the access link opens the app.

Can I reuse this data? 

Yes. The dataset is published under CC BY 4.0 as JSON and CSV. Every value links the vendor document or test it came from, and each tool records the date its facts were last checked. Please credit LayerV and link this page.

## Related Resources

[Guide: Share localhost without signing up →](https://layerv.ai/guides/share-localhost-without-signup/) [Deploy a preview or share localhost? →](https://layerv.ai/compare/deploy-preview-vs-share-localhost/) [How we tested qURL →](https://layerv.ai/research/qurl-behaviour/) [Research and datasets →](https://layerv.ai/research/)

## Share your app without an account

Install the qURL CLI, then publish the app you have running.

[Install the CLI ↗](https://layerv.ai/cli/)

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



---

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

