# qURL vs Tailscale Serve: Private App Sharing, Just a Browser

> Share a private app with qURL: recipients need only a browser. Compare Tailscale Serve, which requires its client, even for invited users outside your tailnet.

Source: https://layerv.ai/compare/qurl-vs-tailscale-serve/

---

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

# qURL™ vs Tailscale Serve

Get feedback on your app. Skip the VPN setup for your reviewers.

Send your client a private app, not a VPN setup task. With qURL, you publish from the CLI and they open a link in their browser. No account or client install for them. Tailscale Serve requires an account and client, even through machine sharing. qURL links work once and expire within 24 hours.

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

Your customer wants to review the app, not set up network software. qURL keeps your app off the public internet and lets them open it in a browser. Share a demo, get feedback, and keep building, without asking the reviewer to install Tailscale.

## How qURL and Tailscale Serve differ

tailscale serve 3000 proxies a local port on the machine’s tailnet name (machine-name.tailnet-name.ts.net). Tailscale access rules decide who can reach it; the app receives Tailscale-User-Login identity headers. It runs until stopped, and --bg keeps it running across reboots. Machine names appear in Certificate Transparency logs. For public access, Tailscale Funnel makes the same address public.

qURL connects out from your machine too, but it gives the app no public address. 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.

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

qURL CLI

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

Tailscale Serve

```
tailscale serve 3000
```

## qURL and Tailscale Serve, side by side

__qURL CLI compared with Tailscale Serve, with the source for each value__
| Question                            | qURL CLI                                                                                                                                                                                        | Tailscale Serve                                                                                                                                              |
| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Account needed before the first URL | No. The first publish creates the device identity [our test](https://layerv.ai/research/qurl-behaviour)                                                                                         | Yes: a tailnet with HTTPS certificates enabled [tailscale.com](https://tailscale.com/kb/1312/serve)                                                          |
| 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)             | 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                    | 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)                                | Authorized Tailscale users, including accepted machine-share recipients [tailscale.com](https://tailscale.com/docs/features/sharing)                         |
| Warning page shown to visitors      | None [our test](https://layerv.ai/research/qurl-behaviour)                                                                                                                                      | Not documented [tailscale.com](https://tailscale.com/kb/1312/serve)                                                                                          |
| 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) | Tailscale access rules; Tailscale-User-Login identity headers for the app [tailscale.com](https://tailscale.com/kb/1312/serve)                               |
| 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; 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                    | Yes, the default for qurl share [our test](https://layerv.ai/research/qurl-behaviour)                                                                                                           | No [tailscale.com](https://tailscale.com/kb/1312/serve)                                                                                                      |
| Protocols                           | HTTP(S), WebSocket, SSE; no raw TCP [our test](https://layerv.ai/research/qurl-behaviour)                                                                                                       | HTTP(S) proxy, files, directories, plain text, TCP, TLS-terminated TCP [tailscale.com](https://tailscale.com/kb/1242/tailscale-serve)                        |
| 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)                      | Free Personal plan: up to 6 users, unlimited user devices [tailscale.com](https://tailscale.com/pricing)                                                     |

## Which one to use

### Choose qURL to

Share with someone outside your tailnet, such as a client, a contractor or a hosted agent, without asking them to install anything or join your network, and without making the app public.

### When Tailscale Serve is the better choice

Choose Tailscale Serve when everyone who needs the app is already on your tailnet: it gives them a stable address, identity headers your app can read, and TCP as well as HTTP.

## Frequently Asked Questions

Can someone outside my tailnet open a Tailscale Serve address? 

Yes. Tailscale machine sharing lets invited users outside your tailnet reach Serve, but they still need a Tailscale account and client. With qURL, send a single-use link instead: the recipient needs only a browser, with no account or software to install.

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

[Tailscale alternatives for sharing apps →](https://layerv.ai/compare/tailscale-alternatives/) [qURL vs Tailscale Funnel →](https://layerv.ai/compare/qurl-vs-tailscale-funnel/) [Cloudflare Tunnel vs ngrok vs Tailscale Funnel →](https://layerv.ai/compare/cloudflare-tunnel-vs-ngrok-vs-tailscale-funnel/) [LayerV vs Tailscale →](https://layerv.ai/compare/layerv-vs-tailscale/) [Let one person open your local app ↗](https://qurl.link/share-with-one-person) [Tailscale Serve ↗](https://tailscale.com/kb/1312/serve)

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

