Your app runs on localhost:3000. Stripe, GitHub, a client on a call, or your phone on
another network need to reach it. localhost means nothing outside your machine — what
you need is a tunnel: a public URL that forwards every request down to your dev
server.
When you actually need a tunnel
- Webhooks — payment providers, Git hosts and messaging platforms only deliver to public HTTPS URLs. This is the big one; the full workflow is in testing webhooks locally.
- Demos — show work-in-progress to a client without deploying anywhere.
- Real-device testing — open your dev build on an actual phone, not an emulator.
- Integrations that call you back — OAuth redirect URIs, payment return URLs and third-party callbacks all want a reachable address.
The free options, honestly
SchemaClient — tunneling is built into the API client, free with no usage limits, so the tool that sends your requests also exposes your server and shows you the traffic hitting it in a real-time monitor. One window for the whole loop. The trade-off: it is a desktop app — if you want tunneling in a CI script, use a CLI tool.
ngrok — the household name, with a capable CLI. The free tier gives random URLs that change every restart, session limits, and an interstitial page your visitors click through. Fine for one-offs; the limits are the product. Full breakdown: free ngrok alternative.
cloudflared — Cloudflare's tunnel CLI is free and robust, but it is infrastructure-grade: config files, DNS setup, a Cloudflare account. Excellent for permanently exposing a homelab; heavy for "let Stripe reach my laptop for an hour".
localtunnel — open source and npm-installable, but community-run relay servers come and go. Good for a quick experiment, not for anything you rely on.
Tunneling localhost with SchemaClient
- Download SchemaClient — free, no account needed to start.
- Start a tunnel and point it at your local port (say
3000). - Copy the public
https://…schemaclient.comURL and give it to the webhook provider, your client, or your phone. - Watch requests arrive live in the traffic monitor — method, headers, body, timing — as documented in the tunneling guide.
Sensible precautions
A tunnel is a door: open it deliberately. Expose only your dev server's port, share the URL only with the people or services that need it, and close the tunnel when the session ends. For webhook work, verify provider signatures in your handler — the tunnel does not change that requirement.
Need the client and the tunnel together? That is the point: get SchemaClient free and skip running a second tool.