<?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>DEV Community: Nick - Ngoc Loc Coc</title>
    <description>The latest articles on DEV Community by Nick - Ngoc Loc Coc (@tuanngocptn).</description>
    <link>https://dev.to/tuanngocptn</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%2F1182229%2F4e7d08c1-ab58-4011-ae92-ede51ec3ccef.jpeg</url>
      <title>DEV Community: Nick - Ngoc Loc Coc</title>
      <link>https://dev.to/tuanngocptn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tuanngocptn"/>
    <language>en</language>
    <item>
      <title>Stop paying for ngrok! 🛑 Meet NPort: The Free Open Source Alternative</title>
      <dc:creator>Nick - Ngoc Loc Coc</dc:creator>
      <pubDate>Fri, 16 Jan 2026 06:31:00 +0000</pubDate>
      <link>https://dev.to/tuanngocptn/stop-paying-for-ngrok-meet-nport-the-free-open-source-alternative-2iok</link>
      <guid>https://dev.to/tuanngocptn/stop-paying-for-ngrok-meet-nport-the-free-open-source-alternative-2iok</guid>
      <description>&lt;h2&gt;
  
  
  The Problem 😫
&lt;/h2&gt;

&lt;p&gt;We've all been there. You are demoing a Next.js app to a client, or testing a Stripe webhook locally. You fire up &lt;code&gt;ngrok&lt;/code&gt;, send the link, and 2 hours later... &lt;strong&gt;the session expires&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Or worse, you restart your server, and the domain changes from &lt;code&gt;random-xyz.ngrok-free.app&lt;/code&gt; to &lt;code&gt;random-abc.ngrok-free.app&lt;/code&gt;. You have to go update your webhook settings again.&lt;/p&gt;

&lt;p&gt;To get a stable, custom subdomain, you usually have to pay.&lt;/p&gt;

&lt;p&gt;I got tired of this, so I decided to build my own solution using the massive edge network of &lt;strong&gt;Cloudflare&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;NPort&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F130pe4sc4jecr21mqiy8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F130pe4sc4jecr21mqiy8.webp" alt="Nport Home Page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is NPort? 🚀
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NPort&lt;/strong&gt; is a Node.js CLI tool that exposes your localhost to the internet.&lt;br&gt;
It is &lt;strong&gt;100% Free&lt;/strong&gt;, &lt;strong&gt;Open Source&lt;/strong&gt;, and designed to be a "set it and forget it" replacement for paid tunneling services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💸 &lt;strong&gt;100% Free:&lt;/strong&gt; No monthly fees.&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Free Custom Subdomains:&lt;/strong&gt; You can claim &lt;code&gt;my-project.nport.link&lt;/code&gt; for free. No more random strings.&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Fast:&lt;/strong&gt; Powered by Cloudflare Tunnel (Argo), so it uses their global edge network.&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Secure:&lt;/strong&gt; Automatic HTTPS.&lt;/li&gt;
&lt;li&gt;🛠 &lt;strong&gt;Self-Hostable:&lt;/strong&gt; Don't trust my server? Fork the repo and deploy the backend to your own Cloudflare Workers account (Free tier) in 5 minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🎥 See it in action
&lt;/h2&gt;

&lt;p&gt;I recorded a quick demo showing how fast it is to get a live HTTPS link:&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/pLIWgiKQPSU"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  How it compares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;NPort&lt;/th&gt;
&lt;th&gt;ngrok (Free Tier)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (Limited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Subdomain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✅ Included&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Paid feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unlimited&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Login Required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open Source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes (MIT)&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to use it 💻
&lt;/h2&gt;

&lt;p&gt;You need Node.js installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install via NPM
&lt;/h3&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; nport

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Start your local server
&lt;/h3&gt;

&lt;p&gt;Let's say your Next.js or Express app is running on port &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create a Tunnel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nport 3000 &lt;span class="nt"&gt;-s&lt;/span&gt; nickpham

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(The &lt;code&gt;-s&lt;/code&gt; flag stands for subdomain)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawm50rif8776ijbul3od.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawm50rif8776ijbul3od.webp" alt="Nport Terminal Startup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Done! 🎉
&lt;/h3&gt;

&lt;p&gt;You can now access your app at &lt;code&gt;https://nickpham.nport.link&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is what it looks like in the terminal:&lt;/p&gt;

&lt;p&gt;As you can see, the connection is established instantly, and you get a beautiful, clean summary of your session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood ⚙️
&lt;/h2&gt;

&lt;p&gt;For the curious technical folks, here is how NPort works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Client:&lt;/strong&gt; The CLI (Node.js) creates a secure tunnel connection using the Cloudflare Tunnel protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge:&lt;/strong&gt; The connection is routed through Cloudflare's nearest edge location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; I used &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; (serverless) to handle the routing and subdomain logic. This ensures high availability and low latency.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because it runs on Cloudflare Workers, the infrastructure cost is near zero, which is why I can offer this for free to the community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy &amp;amp; Self-Hosting 🛡️
&lt;/h2&gt;

&lt;p&gt;Privacy is important. While NPort uses end-to-end encryption via Cloudflare, I understand that for sensitive projects, you might want full control.&lt;/p&gt;

&lt;p&gt;NPort is &lt;strong&gt;fully open-source&lt;/strong&gt;. You can fork the repository and deploy your own "Backend" on your own Cloudflare account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You get your own private tunnel server.&lt;/li&gt;
&lt;li&gt;You can use your own domain name (e.g., &lt;code&gt;tunnel.your-company.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Check the &lt;code&gt;server/README.md&lt;/code&gt; in the repo for instructions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Give it a try!
&lt;/h2&gt;

&lt;p&gt;I built this tool to help my own team, and I hope it helps you too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Github Repo:&lt;/strong&gt; &lt;a href="https://github.com/tuanngocptn/nport" rel="noopener noreferrer"&gt;github.com/tuanngocptn/nport&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://nport.link/" rel="noopener noreferrer"&gt;nport.link&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find it useful, please consider giving it a &lt;strong&gt;Star ⭐ on GitHub&lt;/strong&gt;. It helps more developers find the tool!&lt;/p&gt;

&lt;p&gt;Happy Coding! 👩‍💻👨‍💻&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
