Your own tunnel.
Your own domain.
A self-hosted ngrok replacement. Run the edge on your own VPS, point your own domain at it, and keep every request off someone else’s servers.
Everything ngrok does. None of the strings attached.
Built for developers who’d rather own the whole path from browser to laptop than rent a slice of someone else’s.
One connection, dialed from your side
The agent on your laptop reaches out to your VPS — never the other way around. That single connection carries every request.
Browser
https://api.yourdomain.com
HTTPS request
Your VPS edge
:443 · wildcard TLS · ngstoned
dialed outbound from the agent
one TLS 1.3 / yamux connection — traffic flows both ways once established
Your laptop
ngstone agent → localhost:3000
A browser asks for your subdomain
A request for https://api.yourdomain.com hits your VPS on port 443, terminated with a wildcard TLS certificate that ngstoned already holds.
The edge routes it down the tunnel
ngstoned looks up the subdomain, finds the matching agent session, and forwards the request as a new stream on that session.
Your local app answers, unaware
The agent receives the stream and proxies it to localhost:3000. The response streams back the same way it came — no buffering, no polling.
Watch every request land, live
The design: a local web UI at localhost:4040 showing every request and response as it happens, with headers, bodies, and timing — and letting you replay any of them straight to your app. This is on the roadmap, not in your hands today.
Headers
content-type: application/json user-agent: curl/8.6.0 x-forwarded-for: 203.0.113.42 authorization: Bearer •••••••••••
Body
{
"id": "ord_7f3a9c",
"status": "created",
"total": 42.5
}From clone to public URL in three commands
No dashboard, no account creation. Just a binary on your server and a binary on your laptop.
- 1
Point DNS at your VPS, and start the edge
Add a wildcard A record for *.yourdomain.com pointing at your server, generate a token, then run the edge binary there.
$ TOKEN=$(openssl rand -base64 32 | tr '+/' '-_' | tr -d '=') $ HASH=$(printf '%s' "$TOKEN" | shasum -a 256 | cut -d' ' -f1) $ ngstoned --domain yourdomain.com --cert-email you@yourdomain.com \ --cf-api-token "$CF_API_TOKEN" --token-sha256 "$HASH" - 2
Install the agent, and authenticate
Install the agent on your dev machine, then verify the plaintext token from step one against your edge.
$ brew install emilio-kariuki/tap/ngstone $ ngstone auth "$TOKEN"
- 3
Start tunneling
Point the agent at any local port. Add --subdomain to pick your own name instead of a random one.
$ ngstone port 3000 → https://amber-fox-42.yourdomain.com $ ngstone port 3000 --subdomain api → https://api.yourdomain.com
Stop renting your own tunnel.
Two binaries, one domain you already own. Point ngstoned at your VPS, point ngstone at your laptop, and you’re done.