What it ships with.
Unlimited tunnels, persistent URLs
No session timeouts, no rotating URLs. Tunnels stay alive as long as you need — no 2-hour expiry.
Automatic SSL via Caddy
Every tunnel gets HTTPS automatically. Caddy handles Let's Encrypt — HTTP-01 for path mode, DNS-01 via Cloudflare for subdomain mode.
Two routing modes
Path mode (yourdomain.com/t/tunnel-id) with one DNS record, or subdomain mode (tunnel-id.yourdomain.com) for cleaner URLs with a wildcard.
Self-hosted on your infra
Deploy on any VPS with Docker. Your webhook payloads, API traffic and dev data never touch a third-party server. Zero telemetry.
Single Go binary
The client compiles to a single binary for Linux, macOS and Windows. No runtime dependencies. Cross-compile with one command.
MIT-licensed
Full source on GitHub. Fork, audit, extend. No lock-in, no surprise pricing, no ToS traps.
Tunnelr vs ngrok vs Cloudflare Tunnel.
| Feature | Tunnelr | ngrok | Cloudflare Tunnel |
|---|---|---|---|
| Self-hosted | Yes | No | No |
| Unlimited tunnels | Yes | Paid | Yes |
| Persistent URLs | Yes | No | Yes |
| Custom domains | Yes | Paid | Yes |
| Automatic SSL | Yes | Yes | Yes |
| No account needed | Yes | No | No |
| Open source | Yes | No | No |
| Zero telemetry | Yes | No | No |
| Data stays on your infra | Yes | No | No |
| Free forever | Yes | No | Yes |
FAQ
01What is Tunnelr?+
A free, open-source, self-hosted localhost tunnel built in Go. Expose local dev servers through your own domain — like ngrok, but you own and control the infrastructure. Uses Caddy for automatic SSL and WebSockets for persistent tunnel connections.
02How is it different from ngrok?+
ngrok routes traffic through their servers, limits free users to one tunnel with 2-hour session expiry, and charges for custom domains and persistent URLs. Tunnelr runs on your infrastructure with unlimited tunnels, persistent URLs, custom domains and zero time limits — all free.
03How do I deploy the server?+
Docker Compose on any VPS. Clone the repo, copy .env.example to .env, set your domain and SSL email, then `docker compose up -d`. That gives you Caddy (reverse proxy + SSL), the Go tunnel server, and everything wired together. ~5 minutes.
04How do I connect from my local machine?+
Build the CLI with `go build -o tunnelr ./cmd/cli` then run `TUNNELR_SERVER=wss://yourdomain.com/ws tunnelr connect 3000` to expose local port 3000. You'll get a public URL like yourdomain.com/t/a1b2c3 immediately.
05What are the routing modes?+
Path mode (yourdomain.com/t/tunnel-id/endpoint) — single DNS A record, HTTP-01 SSL. Subdomain mode (tunnel-id.yourdomain.com) — wildcard DNS, DNS-01 via Cloudflare.
06Can I use it for production webhooks?+
Yes. Persistent WebSocket connections with no session timeouts make it reliable for webhook development, API testing and staging environments that need stable public URLs.
07System requirements?+
Server: any Linux VPS with Docker and a public IP (512MB RAM is enough). Client: Go 1.21+ to build the CLI binary, or pre-built binaries for Linux/macOS/Windows.
08Is it really free?+
Yes — MIT-licensed. You only pay for the VPS you host the server on. A $5/month droplet handles most team workloads.
Ship it on your infra.
MIT-licensed. Self-hostable on any VPS. Pull the repo and be serving tunnels in five minutes.
