# ngrok Alternative for Private App Links That Expire: qURL vs ngrok

> An ngrok alternative for private app links: no account or authtoken, no public URL or warning page, and links that expire and are single-use by default.

Source: https://layerv.ai/compare/qurl-vs-ngrok/

---

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

# qURL™ vs ngrok

No account. No public URL. Links that expire.

ngrok gives your local app a public URL after you sign up and add an authtoken, and on the free plan browser visitors see a warning page first. qURL needs no account: qurl publish keeps the app off the public internet, and qurl share prints a link that is single-use by default and expires within 24 hours.

Facts checked October 1, 2026 against each vendor’s documentation. [Download the data](https://layerv.ai/data/localhost-tunnels/tunnels.json)

Both tools make an app on your machine reachable by someone else. They differ in what the other person gets: ngrok gives the app a URL on the internet, and qURL gives each recipient their own access link to an app that has no public route.

## How qURL and ngrok differ

ngrok runs an agent that connects out to ngrok’s edge and gives your app a public endpoint. On the free plan that endpoint is one assigned dev domain on ngrok-free.app or ngrok-free.dev, and it stays the same between runs. Anyone who has the URL can request it unless you add a Traffic Policy with OAuth, OIDC, or basic auth. Browser traffic on the free plan first sees ngrok’s warning page (ERR\_NGROK\_6024), which ngrok uses against phishing.

qURL also connects out from your machine, but it gives the app no public endpoint. qurl publish registers the app and prints its CRID, the app’s stable ID. qurl share turns the CRID into an access link for one recipient. Opening the link admits that recipient’s network address for the session; by protocol design, other addresses get no response.

The link is the access control. With no flags it can be opened once and expires within 24 hours, so a quick share needs no separate policy or login page. Keep your app’s own sign-in for anything sensitive: a session admits the opener’s whole public IP address, so other devices on that network can reach the app while it lasts.

## From a running app to a link you can send

qURL CLI

```
qurl publish http://127.0.0.1:3000
qurl share <CRID>
```

ngrok (free plan)

```
ngrok config add-authtoken <TOKEN>
ngrok http 8080
```

## qURL and ngrok, side by side

__qURL CLI compared with ngrok (free plan), with the source for each value__
| Question                            | qURL CLI                                                                                                                                                                                        | ngrok (free plan)                                                                                                                                         |
| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Account needed before the first URL | No. The first publish creates the device identity [our test](https://layerv.ai/research/qurl-behaviour)                                                                                         | Yes: account and authtoken [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)                                                                 |
| 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)             | 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                    | 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)                                | Public: anyone with the URL [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)                                                                |
| Warning page shown to visitors      | None [our test](https://layerv.ai/research/qurl-behaviour)                                                                                                                                      | Yes, on free-plan browser traffic (ERR\_NGROK\_6024) [ngrok.com](https://ngrok.com/docs/errors/err%5Fngrok%5F6024)                                        |
| 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) | 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                         | 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)                                   | 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                    | Yes, the default for qurl share [our test](https://layerv.ai/research/qurl-behaviour)                                                                                                           | Not documented [ngrok.com](https://ngrok.com/docs/share-localhost/quickstart)                                                                             |
| Protocols                           | HTTP(S), WebSocket, SSE; no raw TCP [our test](https://layerv.ai/research/qurl-behaviour)                                                                                                       | HTTP(S); TCP after card verification [ngrok.com](https://ngrok.com/docs/gateway/endpoints/tcp)                                                            |
| 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)                      | 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)           |

## Which one to use

### Choose qURL to

Share a preview with a client, check a change on your phone, or hand an agent a private target without signing up to publish it or putting the app on a public URL. Each recipient gets a link that works once and expires on its own.

### When ngrok is the better choice

Choose ngrok when something other than a person or agent you hand a link to must reach the app: a webhook from Stripe or GitHub, a public API anyone can call, or raw TCP. ngrok also offers custom domains on paid plans, and its Traffic Policy can put OAuth or OIDC login in front of an endpoint.

## Frequently Asked Questions

Can I use ngrok without an account? 

No. ngrok’s quickstart starts with creating an account and adding its authtoken, and the agent needs that token to start an endpoint. The qURL CLI publishes without an account: the first qurl publish creates the device identity, and without an account you get up to 3 active resources, with links that last up to 24 hours.

How do I get past the ngrok browser warning page? 

ngrok shows the warning on free-plan browser traffic. Its docs list three ways past it: send an ngrok-skip-browser-warning header, send a non-standard User-Agent, or upgrade to a paid plan. A visitor who clicks through does not see it again on that domain for 7 days. qURL shows recipients no warning page; the access link opens the app.

Can qURL receive webhooks the way ngrok can? 

It is not built for them. qURL is for people and agents you hand a link to: a link has to be opened by a browser or a qURL SDK opener before requests reach the app, and webhook senders do neither. Use ngrok or another public endpoint for webhooks, and qURL for the people and agents you hand a link to.

Do WebSockets and hot reload work through qURL? 

Yes. In our test through a qURL link, WebSocket upgrades reached the local app, and Server-Sent Events and streamed responses arrived unbuffered, and Vite’s hot reload kept working once its server.allowedHosts included .qurl.site. The method and results are published with the test.

How is this different from a public tunnel? 

A public tunnel exposes an endpoint and can protect it with authentication. With LayerV, your local app stays hidden from public scans. You create a private, expiring way in for one resource at a time. A teammate or AI agent can use the app without a public deployment or access to your wider network.

Who can open a qURL link? 

Whoever holds it, once: with no flags, qurl share prints a single-use link. Opening it admits the network address it was opened from for the session, which lasts 1 hour by default for an app published from the CLI. Other devices on the same public IP address, such as an office or café network, can reach the app until the session ends, so keep your app’s own sign-in for anything sensitive. By default a link admits whoever opens it; access rules set through the API, such as IP allow and deny lists, can restrict that.

Can my coding agent share my app with qURL? 

Yes. Give Claude Code, Cursor, or Windsurf the qURL skill (https://layerv.ai/skills/qurl/SKILL.md) and ask it to share the app: it installs the qurl 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.

## Related Resources

[Every localhost tunnel, compared →](https://layerv.ai/compare/localhost-tunnels/) [Cloudflare Tunnel vs ngrok vs Tailscale Funnel →](https://layerv.ai/compare/cloudflare-tunnel-vs-ngrok-vs-tailscale-funnel/) [qURL vs Cloudflare Quick Tunnels →](https://layerv.ai/compare/qurl-vs-cloudflare-quick-tunnels/) [qURL vs Tailscale Funnel →](https://layerv.ai/compare/qurl-vs-tailscale-funnel/) [Guide: Share localhost without signing up →](https://layerv.ai/guides/share-localhost-without-signup/) [qURL CLI →](https://layerv.ai/cli/) [ngrok docs: Traffic Policy add-headers ↗](https://ngrok.com/docs/traffic-policy/actions/add-headers/) [ngrok docs: Quickstart ↗](https://ngrok.com/docs/share-localhost/quickstart) [ngrok docs: Free plan limits ↗](https://ngrok.com/docs/pricing-limits/free-plan-limits) [ngrok docs: ERR\_NGROK\_6024 ↗](https://ngrok.com/docs/errors/err%5Fngrok%5F6024) [ngrok alternatives →](https://layerv.ai/compare/ngrok-alternatives/) [Guide: Get past the ngrok browser warning →](https://layerv.ai/guides/skip-ngrok-browser-warning/) [Guide: switch from ngrok to qURL →](https://layerv.ai/guides/switch-from-ngrok/) [Open-source ngrok alternatives →](https://layerv.ai/compare/open-source-ngrok-alternatives/) [ngrok alternatives with authentication →](https://layerv.ai/compare/ngrok-alternatives-with-auth/) [An ngrok alternative with no public URL ↗](https://qurl.link/private-ngrok-alternative)

## Share your app without an account

Paste one prompt into your coding agent, or install the qURL CLI and publish the app yourself. No sign-up, no API key.

[Get the agent prompt ↗](https://layerv.ai/vibe-coding/) [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/qurl-vs-ngrok/](https://layerv.ai/compare/qurl-vs-ngrok/) for AI agents. Curated agent resources: [llms.txt](https://layerv.ai/llms.txt). For the full interactive experience, visit the HTML version.*

