HTTPS with your own cert
Point certbot DNS-01 at your wildcard. Your server terminates TLS. No shared edge.
One binary on your VPS, one on your laptop. You get a real HTTPS URL
on your own subdomain, pointing straight at whatever you're running
on localhost.
If you pay for a VPS and own a domain, you already have everything a tunnel service charges you to unlock.
The client opens one long-lived TCP connection to your server's control
port and authenticates with a shared token. Your server allocates a
subdomain and replies. Public traffic hits :443 on your VPS,
the host header gets parsed, and the request is framed over that control
channel to the matching client. Your laptop dials localhost,
forwards the request, and streams the response back.
Point certbot DNS-01 at your wildcard. Your server terminates TLS. No shared edge.
Pin api.nowhere.example.com or let the server hand you a fresh one.
Run with --tui for a ratatui view of requests, status codes, and latency.
Shared secrets in a TOML file on the server. Revoke by removing a line, reload the unit.
Built with Rust and Tokio. Drop it on the server, drop it on your laptop. No runtime.
No phone-home, no SDK, no beacon. Your traffic belongs to your server and no one else's.
On your VPS, once. Wildcard DNS and a cert first.
cargo install --path .
sudo cp deploy/nowhere-server.toml /etc/nowhere/server.toml
# edit domain and token
sudo cp deploy/systemd.service /etc/systemd/system/nowhere.service
sudo systemctl enable --now nowhere
On your laptop. One login, then one command per session.
cargo install --path .
nowhere login nowhere.example.com:7000 --token <token>
nowhere 3000
nowhere 3000 --subdomain api
nowhere 3000 --tui
| nowhere | ngrok | bore | cloudflared | |
|---|---|---|---|---|
| Self-hosted | Yes | No | Yes | No |
| HTTPS on public side | Yes | Yes | No | Yes |
| HTTP host routing | Yes | Yes | No | Yes |
| Custom subdomains | Yes | Paid | No | Yes |
| Account required | No | Yes | No | Yes |
| Ads / interstitial | None | Yes | None | None |
| Open source | MIT | No | MIT | Partial |
I've been running my own servers since I was 17. By early 2024 I was tired of bouncing through ngrok just to show a friend a local dev build. Random subdomain on every restart, an account wall I didn't want, and an interstitial page in front of a project I was paying a VPS to host anyway.
So I wrote the smallest thing that would replace it: one Rust binary for the server, one for the laptop, a control channel, and a host-header router. It lives on a $6 box and does exactly what I need. If you already own a VPS and a domain, it'll probably do what you need too.
— Farkhad