Share Localhost With a Client Without Deploying to Staging
"Can you send me a link?"
Your client wants to see the feature you built this afternoon. Staging is down, the PR is not merged, and deploying just for a 20-minute review feels wasteful.
You need a public URL that shows exactly what is on your laptop right now.
The fix
npm run dev
npx localtolink
Send the HTTPS URL from your terminal:
https://k7m2x9p4q1.localtolink.com
Your client opens it in their browser. They see your local dev server. When you stop the tunnel, the link dies. No cleanup on a staging server.
Why this beats a staging deploy for quick reviews
| Approach | Time to link | Shows latest local changes | Cleanup |
|---|---|---|---|
| Staging deploy | 10–30+ minutes | After push + deploy | Leaves artifacts |
| Screenshot/video | 5 minutes | Static snapshot only | None |
| Dev tunnel | ~10 seconds | Live, as you edit | Stop tunnel |
For a design review, flow walkthrough, or "does this feel right?" call, a tunnel link wins on speed and fidelity.
Before you share: 30-second checklist
- Your app is running — tunnel forwards to localhost; dead app = blank page
- Use HTTPS URL — some OAuth and cookie flows break on HTTP public links
- No real user data — seed with test accounts; do not demo production DB copies
- Warn about the warning page — first-time visitors may see a brief interstitial; click through once
- Session limit — free tier runs 2 hours; enough for most calls; restart if needed
Mobile testing for your client
LocalToLink prints a QR code in the terminal. Your client can scan it on their phone during a video call — no typing long URLs.
For your own device testing, see test localhost on phone.
How to send the link (copy that works)
Avoid technical jargon in the message. A template that sets expectations:
Here is a live preview of today's work: https://YOUR-SUB.localtolink.com
First visit may show a brief security notice — click Continue once.
This link works while I am on the call; refresh if I push an update.
That single message prevents three common support interruptions: interstitial confusion, localhost vs HTTPS mix-ups, and "the link died" when the tunnel stops.
Same-day review vs staging deploy
Staging exists for a reason — persistent URLs, environment parity, team access without your laptop. But staging has costs: CI time, merge conflicts blocking deploy, stale data, and "staging is down" on Friday afternoon.
A dev tunnel trades persistence for fidelity to your current branch. The client sees uncommitted work, hot-reloaded changes, and the exact state of your local .env test data. For "does this button placement feel right?" or "walk through the new checkout flow," that fidelity beats a staging build from yesterday's main.
Document internally when your team uses tunnels vs staging so PMs know a tunnel link expires when the developer closes their laptop.
Prepare test data before the call
Seed accounts the client will use:
- Login with
[email protected]/ password you control - Disable or mock payment flows that hit production APIs
- Pre-fill forms so the demo is not typing-heavy
- If auth uses OAuth, complete the flow yourself through the tunnel URL first
Five minutes of seeding prevents twenty minutes of "let me fix that real quick" on the call.
What can go wrong (and fixes)
Client sees blank page — your dev server crashed or hot-reload broke. Refresh after fixing locally.
Client sees old version — hard refresh (Cmd+Shift+R) or disable aggressive caching in dev.
Link stopped working mid-call — tunnel session expired (2h) or you closed the terminal. Restart and send the new URL.
Client on corporate VPN blocks tunnel — rare; try mobile hotspot as fallback.
When not to use a dev tunnel for client work
- Demos requiring custom domain branding (
preview.yourclient.com) - Reviews lasting multiple days without your machine running
- Apps handling real customer data
- Production-like load testing
For those cases, staging or a preview deploy is appropriate. For a same-day WIP review, a tunnel is the pragmatic choice.
Honest limits
- Random subdomain — new URL on restart
- 2-hour sessions on free tier
- Your laptop must stay on and connected
- Not a permanent hosting solution
FAQ
Do clients need to install anything?
No. They open a normal HTTPS link in a browser.
Can multiple clients view at once?
Yes, while the tunnel runs. Rate limit is 10 req/s — fine for a small review audience.
Is it secure?
The URL is public while the tunnel runs. Do not share links in public channels if the app contains sensitive data. Stop the tunnel when done.
Next steps
- Share localhost with a client — detailed walkthrough
- Client demo checklist — prepare before the call
- Expose localhost in one command — setup basics
Try it now
Start a tunnel from your project directory — no account required.
$ npx localtolink