<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Artem Petrusenko</title>
    <description>The latest articles on Forem by Artem Petrusenko (@artem_petrusenko_1342b220).</description>
    <link>https://forem.com/artem_petrusenko_1342b220</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3812750%2F23dfa6e3-4dcd-4d4b-b168-9d7f3c48c90d.jpg</url>
      <title>Forem: Artem Petrusenko</title>
      <link>https://forem.com/artem_petrusenko_1342b220</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/artem_petrusenko_1342b220"/>
    <language>en</language>
    <item>
      <title>I Got Frustrated with ngrok and Built My Own Self-Hosted Tunneling Tool</title>
      <dc:creator>Artem Petrusenko</dc:creator>
      <pubDate>Sun, 08 Mar 2026 10:10:52 +0000</pubDate>
      <link>https://forem.com/artem_petrusenko_1342b220/i-got-frustrated-with-ngrok-and-built-my-own-self-hosted-tunneling-tool-54l2</link>
      <guid>https://forem.com/artem_petrusenko_1342b220/i-got-frustrated-with-ngrok-and-built-my-own-self-hosted-tunneling-tool-54l2</guid>
      <description>&lt;h1&gt;
  
  
  I Got Frustrated with ngrok and Built My Own Self-Hosted Tunneling Tool
&lt;/h1&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The free tier gives you 1GB 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.&lt;/p&gt;

&lt;p&gt;So I looked at alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Alternatives Weren't Great Either
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;frp&lt;/strong&gt; has over 100k 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;bore&lt;/strong&gt; and &lt;strong&gt;chisel&lt;/strong&gt; are clean and minimal, but they're basic — no custom domains, no multi-tunnel management, no dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pangolin&lt;/strong&gt; (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.&lt;/p&gt;

&lt;p&gt;What I wanted was simple: run one command, get a tunnel on my own domain, done.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I Built Proxly
&lt;/h2&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @a1tem/proxly
proxly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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 &lt;code&gt;yourname-myapp.yourdomain.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Need to manage projects later? The CLI keeps it simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proxly add      &lt;span class="c"&gt;# create a new project&lt;/span&gt;
proxly delete   &lt;span class="c"&gt;# remove one&lt;/span&gt;
proxly reset    &lt;span class="c"&gt;# start fresh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;proxly&lt;/code&gt; again and it auto-launches if you have one project, or gives you a picker if you have several.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: Keep It Stupid Simple
&lt;/h2&gt;

&lt;p&gt;The request flow is straightforward: Browser → Nginx (handles 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.&lt;/p&gt;

&lt;p&gt;You need three things on the server side: a VPS with a public IP, a domain with wildcard DNS pointed at it (so &lt;code&gt;*.yourdomain.com&lt;/code&gt; resolves to your VPS), and Node.js 18+. On your local machine, you just need Node.js and the Proxly CLI.&lt;/p&gt;

&lt;p&gt;Each tunnel maps a subdomain to a local port or target URL. Your config is personal and stays on your machine — set up once, and &lt;code&gt;proxly&lt;/code&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes It Different
&lt;/h2&gt;

&lt;p&gt;I'm not trying to build a platform. Proxly is a tunneling tool. Here's where it stands compared to the alternatives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs. ngrok:&lt;/strong&gt; Your domain, your infrastructure, no bandwidth caps, no session limits, no monthly fee. The tradeoff is you need a VPS (a $4/month Hetzner box works fine).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs. frp:&lt;/strong&gt; Same self-hosted approach, but Proxly aims for 60-second setup versus frp's multi-file TOML configuration. If frp's config has ever made you question your career choices, you'll appreciate the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs. Cloudflare Tunnel:&lt;/strong&gt; No vendor lock-in, no ToS restrictions on traffic types, no dependency on a third-party's uptime for access to your own services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs. Pangolin:&lt;/strong&gt; Proxly stays focused on developer DX — tunneling, done well. Pangolin is building toward enterprise infrastructure with VPN, identity management, and role-based access. Different tools for different users.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;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, &lt;a href="https://freewaitlists.com/w/cmmhkchc7004001pn2e1zzrc6" rel="noopener noreferrer"&gt;join the waitlist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Right now I'm focused on nailing the developer experience: the install should be one command, the first tunnel should be live in under a minute, and the docs should answer your question before you have to ask it.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/a1tem/proxly" rel="noopener noreferrer"&gt;https://github.com/a1tem/proxly&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'd love feedback — especially if the install isn't as smooth as I think it is. The fastest way to help is to try the 60-second setup on a fresh VPS and tell me where you got stuck.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devtools</category>
      <category>selfhosted</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
