Put your local app on a public URL.
Securely expose a web server on localhost to the internet, even from behind a NAT or firewall, with secure tunnels.
Then, inspect and replay every request in real-time.
Stop context switching and turn “how do I trigger that webhook again?” into a single click to replay.
The fastest way to put anything on the internet.
Deliver traffic to any service on your local machine through a lightweight agent and outbound secure tunnel.
Demo without redeploying
Give your local app a public URL to work with collaborators directly from your dev machine, then protect it with auth.
Build webhook integrations faster
Send webhooks to your local machine to inspect, debug, and iterate. We'll even verify signatures with your signing key.
Connect ChatGPT & Claude to local MCP servers
Let cloud LLMs pull data from your local machine. Debug MCPs with exact request payloads and hit replay to iterate quickly.
Test mobile apps against development backends
Configure your app to use the ngrok URL that points at your local backend—it won’t change between home, work, or a coffee shop.
Get a public URL for your app right now.
ngrok is a standalone executable with zero runtime dependencies that works on every OS.
Install the ngrok agent
brew install ngrokAdd your authtoken
ngrok config add-authtoken $YOUR_AUTHTOKENStart an endpoint
ngrok http 80Open your URL at https://your-assigned-url.ngrok.app
That’s it! You didn’t need to open ports, provision a TLS certificate, or run your own reverse proxy.
Secure your URL with authentication.
Instead of sharing localhost with the whole internet, lock it down to just the people or requests you authorize.
ngrok http 80 --traffic-policy-file policy.ymlon_http_request:
# redirect users to Google to log in
- actions:
- type: oauth
config:
provider: google
# allow logins *only* from acme.com
- expressions:
- "!actions.ngrok.oauth.identity.email.endsWith('@acme.com')"
actions:
- type: deny
Simple to start,
flexible when you need it.
Any protocol, not just web services
Developing on databases, Kafka, gRPC, WebSockets, WebRTC, SSH? If it speaks TCP, you can go online in one line.
$ ngrok tcp 22$ ngrok http 80$ ngrok tls 5432Packaged for your stack
The ngrok agent also comes as Docker container, Docker Desktop extension, and Kubernetes Ingress + Gateway controller. Or embed ngrok in your app with native SDKs.
~ docker pull ngrok/ngrok~ npm install @ngrok/ngrok~ helm install ngrok-operator ...Bring your own domain
Create a DNS CNAME record to use your own domain name for your endpoint URL.
ngrok http 8080 --url https://app.acme.comWildcard endpoints
Does your app have multiple subdomains? No problem, handle traffic for all of them with a single command.
ngrok http 8080 --url https://*.app.acme.comAutomate with APIs
Automate your dev environment by importing ngrok into your scripts to control it programmatically. See our SDK docs.
const ngrok = require("@ngrok/ngrok");
const srv = http.createServer(handler);
await ngrok.listen(srv);
console.log(`devenv ingress at: ${srv.listener.url()}`);Modify traffic, not your app
Add headers, rewrite URLs, redirect paths and replace body text. All without changing your code.
on_http_request:
- type: add-headers
config:
headers:
host: "site.dev"
- type: url-rewrite
config:
from: /products/?(.*)
to: /products.php?query=$1
Security and control without slowing down your devs.
- Standardize auth on every endpoint.
- Send all request logs to your SIEM.
- Lock down what developers can expose with ACLs.
So easy it feels like magic.
Get a public URL for localhost in less time than it took you to read this page. Just like 13 million other devs.
ngrok is so effing amazing
Spent 3 hours looking for a good ngrok alternative. Let me save you some time: there isn’t a better ngrok alternative.
OMG life changer. I can’t imagine how I lived without ngrok.
PS, it can be this easy in prod too...
No need to “upgrade” to a hodgepodge of ELBs, NLBs, firewall rules, DNS updates, nginx configs, and Cloudflare.