<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[UUMIT]]></title><description><![CDATA[UUMIT]]></description><link>https://uumithashnodedev.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6adc6846e981d0df3a443b56/17eca3fc-c1f3-4a77-a032-a692f91ffd89.png</url><title>UUMIT</title><link>https://uumithashnodedev.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 11:05:11 GMT</lastBuildDate><atom:link href="https://uumithashnodedev.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Making a survival game: Why difficulty tuning is so tricky]]></title><description><![CDATA[A 3D survival game built in a weekend. I kept dying at the 2-minute mark, so I retuned the difficulty curve. Here is what actually changed]]></description><link>https://uumithashnodedev.hashnode.dev/making-a-survival-game-why-difficulty-tuning-is-so-tricky</link><guid isPermaLink="true">https://uumithashnodedev.hashnode.dev/making-a-survival-game-why-difficulty-tuning-is-so-tricky</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[GameDev]]></category><category><![CDATA[webdev]]></category><category><![CDATA[showdev]]></category><dc:creator><![CDATA[Rory]]></dc:creator><pubDate>Thu, 05 Nov 2026 12:16:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6adc6846e981d0df3a443b56/6e6e2000-576f-4984-a956-b5b870b7d7f6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I wanted to see how far a weekend build could go, so I made a 3D survival game — dodge incoming fire, and don’t get sandwiched by enemies.</p>
<p>The whole thing runs on a bare Node HTTP server on my local machine and is exposed via a tunnel. No frameworks, no build steps, just plain ES modules.</p>
<p>The most fun part was balancing the difficulty. I set a fixed enemy spawn curve at first, but kept dying right around the 2-minute mark. That threshold is when ranged enemies start spawning and damage scaling begins compounding. Once I pushed back when shooters unlock, the curve felt fair instead of cheap.</p>
<p>My personal best is 4:39. A solid run should last roughly 10–14 minutes. How long can you survive?</p>
<p>Play it here: <a href="https://parcel-rush-courier-diaries--rory-desktop-u3f1mn6.uua2a.ai/">https://parcel-rush-courier-diaries--rory-desktop-u3f1mn6.uua2a.ai/</a></p>
<p>Feel free to ask me anything about the difficulty tuning or this local hosting + tunnel setup.</p>
]]></content:encoded></item><item><title><![CDATA[The tunnel takes 30 seconds. The permissions take a weekend.]]></title><description><![CDATA[Compare 5 methods to expose local MCP servers: ngrok, Cloudflare Tunnel, port forwarding, VPS and UUMit outbound relay. Learn the differences on…]]></description><link>https://uumithashnodedev.hashnode.dev/the-tunnel-takes-30-seconds-the-permissions-take-a-weekend</link><guid isPermaLink="true">https://uumithashnodedev.hashnode.dev/the-tunnel-takes-30-seconds-the-permissions-take-a-weekend</guid><category><![CDATA[mcp]]></category><category><![CDATA[AI]]></category><category><![CDATA[Security]]></category><category><![CDATA[#selfhosted]]></category><dc:creator><![CDATA[Rory]]></dc:creator><pubDate>Fri, 30 Oct 2026 11:02:27 GMT</pubDate><content:encoded><![CDATA[<p>Most write-ups about exposing an MCP server stop at the step where you get a public URL. That's the easy half.</p>
<p>The half that actually costs you time is deciding who's allowed to call it — and being able to cut them off without a redeploy.</p>
<p>If you run an MCP server on your laptop, you've probably noticed it works in Claude Desktop and nowhere else.<code>stdio</code> transport means the client spawns the process locally. That's fine for one person on one machine, and it stops working the moment a teammate's Agent needs to call your tool, or your phone needs to reach something running on your desk.</p>
<p>This post walks through five options, what each one actually costs you, and when to pick something else instead. There isn't a single right answer, and the last section covers the cases where none of this applies.</p>
<h2><strong>What "reachable" actually requires</strong></h2>
<p>Before comparing tools, it's worth naming the four things you need:</p>
<ol>
<li>A stable address — something that doesn't change every time you reconnect</li>
<li>Transport —<code>stdio</code> won't work across machines, so you need HTTP or SSE</li>
<li>Authentication — whoever connects needs to prove they're allowed</li>
<li>Revocation — the ability to cut someone off without restarting anything Most tools solve 1 and 2 and leave you to hand-roll 3 and 4. That's where the real work is.</li>
</ol>
<h2><strong>Option 1: ngrok (and similar tunnels)</strong></h2>
<p>The default answer. One command and you have a public HTTPS URL.</p>
<p>ngrok http 3000</p>
<p>What you get: transport and a stable dev domain, in about three seconds.</p>
<p>What you don't get:</p>
<ul>
<li>One address for everything. Free gives you a single auto-assigned dev domain, and it's the same domain for every service you expose. If you want a separate hostname per service, that's a paid tier.</li>
<li>Auth is per-endpoint, not per-caller. OAuth and traffic policy work on free (up to 5 MAUs), but the identity is a human account. Two Agents behind the same login look identical, and there's no per-call usage attached to either.</li>
<li>Revocation is all-or-nothing. You can kill the tunnel, which cuts everyone off at once. You also need ngrok installed on every machine running a server, and its config is a separate thing to maintain.</li>
</ul>
<p>For a quick demo this is unbeatable. For anything with more than one caller, it gets thin fast.</p>
<h2><strong>Option 2: Cloudflare Tunnel</strong></h2>
<p>Better on the address problem — you get a stable hostname on a domain you control.</p>
<p>cloudflared tunnel create my-mcp<br />cloudflared tunnel route dns my-mcp <a href="http://mcp.example.com">mcp.example.com</a></p>
<p>What you get: stable address, transport, and Cloudflare's auth layer if you wire up Access.</p>
<p>What it costs: a domain, DNS management, and a Cloudflare account. Cloudflare Access can give you per-user auth, but you're now configuring policies in a dashboard that's designed for corporate SSO, not for "let this one Agent call this one tool."</p>
<p>It's a solid choice if you already run Cloudflare. If you don't, you're adopting a whole platform to solve one problem.</p>
<h2><strong>Option 3: Just open a port</strong></h2>
<p>Don't. Even with a firewall rule scoped to an IP, you've now got a long-lived inbound listener on a machine that also holds your source code, your SSH keys, and probably an unpatched dependency or two.</p>
<p>This is the option people fall back to when the others feel heavy, and it's the one that shows up in incident reports.</p>
<h2><strong>Option 4: Deploy it to a VPS</strong></h2>
<p>Move the server off your laptop entirely. Now it's always on, has a real IP, and you can put nginx in front of it.</p>
<p>The catch is that half the reason the server was local is that it talks to local things — a Postgres instance, files on disk, a GPU you paid for. Moving it to a VPS means moving or tunneling those too, and now you're paying monthly for a machine that idles 90% of the time.</p>
<h2><strong>Option 5: Outbound-only connection with a stable subdomain</strong></h2>
<p>This is the model I ended up using, via a service called UUMit. I'll describe the mechanism rather than the product, because the mechanism is the interesting part.</p>
<p>The server on your machine opens an outbound connection to a relay. Nothing listens on your machine. Your address is assigned at signup —<a href="http://yourname.uumit.ai"><code>yourname.uumit.ai</code></a> — and stays attached to you even if you move to a different computer.</p>
<p>Inbound requests arrive through the relay and are pushed down the existing outbound connection. From your firewall's perspective, this is indistinguishable from a browser tab talking to a web server.</p>
<p>The parts that matter beyond transport:</p>
<p>Identity is signed. Each machine gets a keypair, and the public card is signed by the platform. A caller can verify that the address they're hitting actually belongs to you, rather than to someone who squatted the subdomain.</p>
<p>Permissions are per-caller, not per-network. Four levels — off, only me, invite only, everyone — set per exposed service. Opening one thing doesn't open the others.</p>
<p>Revocation is a state change, not a restart. You flip it, the next request is rejected. No tunnel to kill, no process to bounce.</p>
<p>Calls can be metered. If you want to charge per call, there's a counter and a settlement path instead of you building a billing table.</p>
<p>Setting it up is one prompt into your Agent, or one command:</p>
<p>Install UUMit and claim the address xiaolong</p>
<p>Then you point it at the services already running locally. The desktop client supports macOS, Windows 10/11, Linux, and Docker.</p>
<h2><strong>When none of this applies</strong></h2>
<p>Three cases where I'd tell you not to bother:</p>
<p>Your machine isn't always on. A relay can't reach a laptop that's asleep. If your server needs to be up 24/7, put it somewhere that is.</p>
<p>You need sub-100ms latency. Every hop through a relay adds some. For Agent tool calls this has never mattered to me, but for a real-time game backend it would.</p>
<p>You're serving thousands of callers. At that point you want a proper load balancer and a real ops setup, not a personal address.</p>
<p>There's also the honest limitation that this is a young product. If you need an SLA and a support contract, use Cloudflare.</p>
<h2><strong>What I'd actually recommend</strong></h2>
<p>Your situation Use Demo, one-off, nobody else needs it ngrok Already on Cloudflare, want per-user SSO Cloudflare Tunnel Server is stateful and tied to local resources Outbound relay with a stable address Needs 24/7 uptime and an SLA Deploy to a VPS</p>
<p>The thing I'd push back on is treating "reachable" as the whole problem. Transport is the easy half. Deciding who's allowed in, and being able to take it back without a redeploy, is the half that costs you a weekend if you build it yourself.</p>
]]></content:encoded></item></channel></rss>