Share Localhost with a Client (Demo Checklist)
Use case story: Read Share Localhost With a Client Without Staging for when and why to skip staging deploys.
Try it before the call
You do not need staging deployed to get a client link. Two commands:
npm run dev
npx localtolink
Send the HTTPS URL from your terminal. Your client sees live work-in-progress while you keep coding. When the call ends, stop the tunnel — the link goes offline. No cleanup on a remote server.
For a pre-call checklist, see client demo checklist.
When to use a tunnel for client previews
Deploying to staging for every review cycle is slow and expensive. A development tunnel lets you share live work-in-progress with clients, designers, or stakeholders while you iterate locally. They open a URL in their browser; you keep coding on your machine.
This works well for:
- Design reviews and responsive layout checks
- Walkthrough demos of new features
- Quick feedback loops before a staging deploy
- Showing integrations (OAuth flows, payment UI) that need HTTPS
It does not replace staging for multi-day reviews, load testing, or sign-off on production-like environments.
Quick setup
1. Start your dev server:
npm run dev
2. Start the tunnel:
npx localtolink --port 5173
3. Send the public URL to your client:
https://k7m2x9p4q1.localtolink.com
The URL works from any network — your client's office Wi-Fi, home, or cellular.
Before the review: checklist
| Task | Why |
|---|---|
| Confirm app loads through tunnel URL | Test yourself before sharing |
| Warn about the interstitial | Clients see a one-time LocalToLink warning page |
Use --port if multiple apps run | Avoid forwarding to the wrong server |
| Hide QR code in screen shares | Use --no-qr if the terminal art is distracting |
| Prepare fallback if session expires | Sessions last 2 hours on the free tier |
Best practices during the review
Keep the tunnel running for the entire session. If it stops, the URL goes dead immediately.
Stay on the same subdomain — restarting the tunnel generates a new random subdomain. Send an updated link if you restart.
Share context about limitations — this is a dev build, not production. Performance and error handling may differ.
Use screen share as backup — if the client has network restrictions blocking tunnel domains, fall back to a video call with screenshare.
Communicating the interstitial
When the visitor interstitial policy is enabled, browser visitors see Opening a shared link before your app. Tell clients:
"You'll see a brief LocalToLink safety screen — tap Continue once to view the preview."
They only need to continue once per subdomain you send. Webhook traffic from providers does not hit this page.
Limitations to communicate upfront
| Limit | Impact on client previews |
|---|---|
| 2-hour session | Schedule reviews within the window or restart and resend link |
| Random subdomain | URL changes on new session — send updated link |
| 1 GB bandwidth | Sufficient for UI review; not for media-heavy load testing |
| 10 req/s | Fine for normal browsing; not for stress testing |
| Single-region service | Adds latency vs production CDN; not for production traffic |
| No authentication persistence across sessions | New subdomain may reset cookies depending on app config |
Custom subdomains and extended session limits are not available on the free tier yet.
Mobile client reviews
Scan the terminal QR code so clients can open the preview on their phone:
npx localtolink --port 5173
This is ideal for responsive design reviews. See Test Localhost on Your Phone.
Alternatives for longer reviews
| Scenario | Better approach |
|---|---|
| Multi-day async review | Deploy to staging or record a Loom walkthrough |
| Formal sign-off | Staging environment with production-like config |
| Client needs a memorable URL | localtunnel --subdomain (reliability trade-offs) or staging deploy |
| Security-sensitive data | Do not expose via tunnel — use staging with access controls |
Troubleshooting during client calls
| Problem | Quick fix |
|---|---|
| Client sees "tunnel unavailable" | Confirm tunnel is running; restart if expired |
| Client stuck on warning page | Ask them to click Continue |
| Assets not loading | Check for hardcoded localhost in frontend code |
| OAuth login fails | Register tunnel URL in OAuth provider — see OAuth guide |
| Slow page loads | Expected — tunnel adds latency; set expectations |
FAQ
Can multiple clients view the same URL?
Yes. Up to 20 concurrent connections on the free tier.
Is the preview secure?
Anyone with the URL can access your dev server while the tunnel runs. Do not share publicly if the app contains real user data.
Can clients submit forms and test flows?
Yes, as long as your backend works locally. Webhooks from external services need the tunnel URL registered separately.
See Expose Localhost to the Internet for full tunnel setup.
Try it now
Start a tunnel from your project directory — no account required.
$ npx --yes localtolink@latest