I Got Frustrated with ngrok and Built My Own Self-Hosted Tunneling Tool
Source: Dev.to
I’ve been running side projects and local dev environments for years. Every time I needed to expose a local service — test a webhook, share a WIP with a teammate, demo something to a client — I’d reach for ngrok. And every time, I’d hit the same walls.
The free tier gives you 1 GB of bandwidth, one active tunnel, and a random subdomain that changes every session. Want a stable URL? That’s $10 / month. Want more than one tunnel? Pay more. Want to use your own domain? Enterprise tier. For something that’s essentially forwarding TCP packets to my machine, it felt like I was renting someone else’s infrastructure for a problem I could solve myself.
The Alternatives Weren’t Great Either
frp has over 100 k GitHub stars, so I tried it first. Technically solid, but the TOML configuration is genuinely painful. I spent more time debugging my config file than actually tunneling. It works — but it doesn’t respect your time.
Cloudflare Tunnel is free and powerful, but you’re locked into Cloudflare’s ecosystem. Their ToS restricts what traffic you can route, and when they had that 2.5‑hour outage in June 2025, a lot of people (myself included) realized that depending on a single provider for access to your own services is a real risk.
bore and chisel are clean and minimal, but they’re basic — no custom domains, no multi‑tunnel management, no dashboard.
Pangolin (YC 2025) started promising but has scope‑crept into a full zero‑trust network access platform — WireGuard, OIDC, RBAC, multi‑site management. Great if you’re a sysadmin building enterprise infrastructure. Overkill if you just want to expose port 3000 on your domain.
What I wanted was simple: run one command, get a tunnel on my own domain, done.
So I Built Proxly
Proxly is a self‑hosted tunneling tool that lets you expose local services through subdomains on your own VPS. Install it with npm and the interactive wizard walks you through everything:
npm install -g @a1tem/proxly
proxly
On first run, Proxly prompts you for your username, relay host, and secret token — then asks you to set up your first project and tunnels. Pick a name, point it at a port (or a full URL), and you’re live at yourname‑myapp.yourdomain.com.
Need to manage projects later? The CLI keeps it simple:
proxly add # create a new project
proxly delete # remove one
proxly reset # start fresh
Running proxly again auto‑launches if you have one project, or gives you a picker if you have several.
The Architecture: Keep It Stupid Simple
The request flow is straightforward:
Browser → Nginx (TLS on your VPS) → Relay server → WebSocket → Proxly CLI on your machine → your local dev server
The wire protocol uses JSON messages over WebSocket, supporting HTTP requests, WebSocket connections, and binary data.
You need three things on the server side:
- A VPS with a public IP.
- A domain with wildcard DNS (
*.yourdomain.com) pointing at the VPS. - Node.js 18+ (and Nginx for TLS termination).
On your local machine you only need Node.js and the Proxly CLI.
Each tunnel maps a subdomain to a local port or target URL. Your config stays on your machine — set up once, and proxly just works every time you run it. If you’re on a team, everyone gets their own username namespace, so multiple developers can tunnel the same project without stepping on each other.
What Makes It Different
| Feature | Proxly | ngrok | frp | Cloudflare Tunnel | Pangolin |
|---|---|---|---|---|---|
| Self‑hosted | ✅ | ❌ (cloud) | ✅ | ❌ (cloud) | ✅ (enterprise‑focused) |
| Custom domain | ✅ | ✅ (paid) | ✅ | ✅ (via Cloudflare) | ✅ |
| No bandwidth caps | ✅ | ❌ (free tier) | ✅ | ✅ | ✅ |
| Setup time | ~60 s | minutes + login | minutes + TOML | minutes + Cloudflare account | hours (enterprise) |
| Vendor lock‑in | ❌ | ✅ | ❌ | ✅ | ✅ |
| Multi‑tunnel UI | Simple CLI | Dashboard | Config files | Dashboard | Full portal |
Proxly isn’t trying to be a platform; it’s a tunneling tool focused on developer experience.
What’s Next
Proxly is open‑source and the self‑hosted version will always be free. I’m working on a hosted tier for people who want tunneling without managing their own VPS — if that interests you, join the waitlist.
The current focus is nailing the developer experience: one‑command install, first tunnel live in under a minute, and docs that answer questions before you have to ask them.
If you’re tired of ngrok’s limits, frp’s config files, or depending on someone else’s infrastructure for access to your own services — give Proxly a try and let me know what breaks.
GitHub: