// ngrok troubleshooting
ngrok URL keeps changing — how to keep one stable URL on the free plan
On ngrok's free plan, the public subdomain rotates every restart. Webhook providers and OAuth callbacks break each time. Here's how to handle it without paying for a static domain.
What it means
ngrok generates a fresh random subdomain on each free-plan session. Stripe / GitHub / Auth0 only let you set one webhook URL at a time, so each restart breaks the integration.
Common causes
- Free plan policy — paid plans get reserved subdomains.
- Workaround attempts (passing --subdomain) require a paid plan.
How to fix it on ngrok
1. Upgrade to ngrok Pro to claim a reserved subdomain.
2. Or update the webhook URL on every dev session
Tedious; some providers (Stripe) can be scripted via API to update on each ngrok start.
// the same workflow on lrok
lrok's free plan includes one reserved subdomain that lives forever. Reserve it once and ship it as a Stripe / GitHub webhook URL that survives every restart.
1. Reserve a name
$ lrok reserve mysite2. Tunnel with --hint
$ lrok http 3000 --hint mysite3. URL is permanent
https://mysite.lrok.io is yours until you release it — across days, restarts, machines.