<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>~$ klumbsyd/tech</title><link>https://tech.klumbsyd.com/</link><description>Recent content on ~$ klumbsyd/tech</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Thu, 16 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tech.klumbsyd.com/index.xml" rel="self" type="application/rss+xml"/><item><title>NFO files: why your Plex metadata is wrong</title><link>https://tech.klumbsyd.com/posts/nfo-files-plex-metadata/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://tech.klumbsyd.com/posts/nfo-files-plex-metadata/</guid><description>&lt;p&gt;If you&amp;rsquo;ve ever had Plex match a show to the wrong series &amp;ndash; or worse, merge two different shows into one entry &amp;ndash; you know the frustration. The fix is a small XML file called &lt;code&gt;tvshow.nfo&lt;/code&gt; that tells Plex exactly which TVDB ID to use.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;Plex&amp;rsquo;s automatic matching is pretty good, but it falls apart with shows that share names, reboots, or regional variants. Dragon Ball GT matched to the wrong TVDB ID. Animaniacs (2020) merged with the original. Hunter x Hunter showed both versions as one entry.&lt;/p&gt;</description></item><item><title>isolating docker containers behind wireguard with a kill switch</title><link>https://tech.klumbsyd.com/posts/wireguard-docker-kill-switch/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://tech.klumbsyd.com/posts/wireguard-docker-kill-switch/</guid><description>&lt;p&gt;Some containers need VPN routing. Not all of them &amp;ndash; just the ones where the exit IP matters. The typical write-up tells you to run gluetun and attach containers to it. On UnRAID, you don&amp;rsquo;t need that. The WireGuard plugin handles it natively, and the kill switch is already wired in.&lt;/p&gt;
&lt;h2 id="the-unraid-way"&gt;The UnRAID way&lt;/h2&gt;
&lt;p&gt;UnRAID&amp;rsquo;s VPN Manager (Settings &amp;gt; VPN Manager) has a tunnel type called &amp;ldquo;VPN tunneled access for docker.&amp;rdquo; That&amp;rsquo;s the one. It creates a &lt;code&gt;wg0&lt;/code&gt; interface and sets up policy routing so that any container assigned to it routes all traffic through the tunnel &amp;ndash; and only through the tunnel.&lt;/p&gt;</description></item><item><title>Building a DoVi conversion pipeline on UnRAID</title><link>https://tech.klumbsyd.com/posts/dovi-pipeline/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://tech.klumbsyd.com/posts/dovi-pipeline/</guid><description>&lt;p&gt;If you run a Plex server with Dolby Vision content, you&amp;rsquo;ve probably hit the wall: your LG or Samsung TV app chokes on Profile 5 files. The screen goes black, audio keeps playing, and your family thinks you broke the TV again.&lt;/p&gt;
&lt;p&gt;The fix is converting Profile 5 to Profile 8 using &lt;code&gt;dovi_tool&lt;/code&gt;. It&amp;rsquo;s lossless &amp;ndash; you&amp;rsquo;re restructuring the DV metadata layer, not re-encoding video. The hard part is doing it automatically for every new file that arrives.&lt;/p&gt;</description></item><item><title>Running 40+ Docker containers on UnRAID without losing your mind</title><link>https://tech.klumbsyd.com/posts/unraid-docker-at-scale/</link><pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate><guid>https://tech.klumbsyd.com/posts/unraid-docker-at-scale/</guid><description>&lt;p&gt;At some point your UnRAID server stops being a NAS and starts being a small data center. I&amp;rsquo;m running 47 containers right now &amp;ndash; Plex, Sonarr, Radarr, Lidarr, qBittorrent, SABnzbd, Immich, Ollama, audiobookshelf, two game servers, and a long tail of smaller tools. Here&amp;rsquo;s how I keep it manageable.&lt;/p&gt;
&lt;h2 id="naming"&gt;Naming&lt;/h2&gt;
&lt;p&gt;When you have 47 containers, naming matters. I follow the upstream image name where possible: &lt;code&gt;binhex-plexpass&lt;/code&gt;, &lt;code&gt;binhex-sonarr&lt;/code&gt;, &lt;code&gt;binhex-radarr&lt;/code&gt;, &lt;code&gt;binhex-lidarr&lt;/code&gt;. It makes grepping logs and writing scripts that target groups of containers straightforward.&lt;/p&gt;</description></item><item><title>Cloudflare Tunnels: exposing services without port forwarding</title><link>https://tech.klumbsyd.com/posts/cloudflare-tunnel-setup/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://tech.klumbsyd.com/posts/cloudflare-tunnel-setup/</guid><description>&lt;p&gt;Opening ports on your home router is a non-starter if you care about security. Dynamic DNS is fragile. Cloudflare Tunnels solve both problems &amp;ndash; your server connects outbound to Cloudflare, and they handle routing, SSL, and DDoS protection.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;cloudflared&lt;/code&gt; daemon runs on your server and establishes an outbound connection to Cloudflare&amp;rsquo;s network. No inbound ports needed. Traffic flows:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Internet → Cloudflare → cloudflared tunnel → nginx → static files
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I run the tunnel as a Docker container (&lt;code&gt;figro/unraid-cloudflared-tunnel&lt;/code&gt;) on UnRAID. All public hostnames route through a single tunnel &amp;ndash; one container handles everything. The tunnel authenticates to Cloudflare via a token passed as an environment variable (&lt;code&gt;TUNNEL_TOKEN&lt;/code&gt;) in the container template. No config file needed, no local credentials on disk.&lt;/p&gt;</description></item><item><title>Discord webhooks for server alerts without Grafana</title><link>https://tech.klumbsyd.com/posts/discord-webhook-alerts/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://tech.klumbsyd.com/posts/discord-webhook-alerts/</guid><description>&lt;p&gt;Every homelab guide tells you to set up Grafana, Prometheus, and a dozen exporters just to know when something breaks. That&amp;rsquo;s overkill for a single server. Discord webhooks give you instant alerts with zero infrastructure overhead — no database, no dashboards, no containers to babysit.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how I wired them up on my UnRAID server for the DoVi conversion pipeline and beets review queue.&lt;/p&gt;
&lt;h2 id="store-the-webhook-url-in-etcenvironment"&gt;Store the webhook URL in /etc/environment&lt;/h2&gt;
&lt;p&gt;The first mistake people make is hardcoding the webhook URL in their scripts. If you ever commit that script or share it, the URL leaks and anyone can post to your Discord channel.&lt;/p&gt;</description></item><item><title>about</title><link>https://tech.klumbsyd.com/about/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://tech.klumbsyd.com/about/</guid><description>&lt;p&gt;I&amp;rsquo;m Dustin, also known as KlumbsyD on Twitch and social media.&lt;/p&gt;
&lt;p&gt;I run a homelab on an &lt;strong&gt;UnRAID server&lt;/strong&gt; with 128GB RAM that handles media automation, game servers, and too many Docker containers. This blog documents the things I build, break, and eventually fix.&lt;/p&gt;
&lt;h2 id="what-i-write-about"&gt;What I write about&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Self-hosting and homelab infrastructure&lt;/li&gt;
&lt;li&gt;Docker container orchestration on UnRAID&lt;/li&gt;
&lt;li&gt;Media automation with Plex, Sonarr, Radarr, and Lidarr&lt;/li&gt;
&lt;li&gt;Networking, security, and Cloudflare Tunnels&lt;/li&gt;
&lt;li&gt;The scripts and tools that hold everything together&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-stack"&gt;The stack&lt;/h2&gt;
&lt;p&gt;This blog is built with &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt;, served by nginx on my UnRAID server, and routed through a Cloudflare Tunnel. No CMS, no JavaScript frameworks, no build pipelines. Just Markdown files and a static site generator.&lt;/p&gt;</description></item></channel></rss>