<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Homelab From Scratch on khuo.ng</title>
    <link>https://hi.khuo.ng/series/homelab-from-scratch/</link>
    <description>Recent content in Homelab From Scratch on khuo.ng</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 11 Jun 2026 09:00:00 -0500</lastBuildDate>
    <atom:link href="https://hi.khuo.ng/series/homelab-from-scratch/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Self-hosted mail: Stalwart behind a smarthost chain</title>
      <link>https://hi.khuo.ng/posts/2026-06-11-self-hosted-mail/</link>
      <pubDate>Thu, 11 Jun 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-06-11-self-hosted-mail/</guid>
      <description>The boss fight, documented: inbound through the VPS, a mailstore the internet can&amp;rsquo;t reach, and outbound through a retry-ladder of relay providers, DMARC-aligned on the root domain no matter which rung delivers.</description>
    </item>
    <item>
      <title>Split-horizon DNS: same names, shorter path</title>
      <link>https://hi.khuo.ng/posts/2026-06-07-split-horizon-dns/</link>
      <pubDate>Sun, 07 Jun 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-06-07-split-horizon-dns/</guid>
      <description>Public hostnames that resolve to the local proxy when you&amp;rsquo;re at site A: same URLs everywhere, no hairpin through the VPS for local traffic, and the OAuth quirk the shortcut drags into the light.</description>
    </item>
    <item>
      <title>Backups: restic to local &#43; B2, restore-tested</title>
      <link>https://hi.khuo.ng/posts/2026-05-30-backups-restic/</link>
      <pubDate>Sat, 30 May 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-05-30-backups-restic/</guid>
      <description>Nightly restic snapshots of appdata to a local disk AND cloud object storage, databases dumped properly, keys that live on paper, and the quarterly restore drill that finds what the green checkmarks hide.</description>
    </item>
    <item>
      <title>Observability without the Prometheus tax</title>
      <link>https://hi.khuo.ng/posts/2026-05-23-observability/</link>
      <pubDate>Sat, 23 May 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-05-23-observability/</guid>
      <description>Four small tools instead of a monitoring distro: live metrics, every host&amp;rsquo;s logs in one tab, uptime checks that page the phone, and a dashboard tying it together. What you give up, and why it doesn&amp;rsquo;t hurt at this scale.</description>
    </item>
    <item>
      <title>The *arrs, properly: naming templates, quality profiles, and recyclarr</title>
      <link>https://hi.khuo.ng/posts/2026-05-16-arr-naming-quality/</link>
      <pubDate>Sat, 16 May 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-05-16-arr-naming-quality/</guid>
      <description>The deep dive on library automation: exact naming templates that feed Plex cleanly, quality profiles that stop the upgrade churn, custom formats without the madness, and recyclarr so none of it lives only in a web UI.</description>
    </item>
    <item>
      <title>Plex, properly: a full setup, and why not Jellyfin (yet)</title>
      <link>https://hi.khuo.ng/posts/2026-05-13-plex/</link>
      <pubDate>Wed, 13 May 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-05-13-plex/</guid>
      <description>The whole Plex page: the honest Plex-vs-Jellyfin call, hardware transcoding that actually engages, the /data mount convention that makes hardlinks work, naming the scanner loves, and wiring the *arrs in cleanly.</description>
    </item>
    <item>
      <title>The download pipeline: gluetun and the VPN-namespace trick</title>
      <link>https://hi.khuo.ng/posts/2026-05-09-media-stack/</link>
      <pubDate>Sat, 09 May 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-05-09-media-stack/</guid>
      <description>The plumbing half of bender&amp;rsquo;s media stack: download clients that live inside a VPN network namespace, the label trick namespace-sharing requires, and the restart gotcha that otherwise pages you at 3 a.m.</description>
    </item>
    <item>
      <title>Komodo: git push to deploy</title>
      <link>https://hi.khuo.ng/posts/2026-04-25-komodo-deploys/</link>
      <pubDate>Sat, 25 Apr 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-04-25-komodo-deploys/</guid>
      <description>Komodo Core watches the repo and redeploys app stacks on push. Secrets decrypt in a pre-deploy hook, the agent runs as systemd on purpose, and the webhook gets treated like the weather: usually fine, never trusted.</description>
    </item>
    <item>
      <title>Authentik: one login for everything</title>
      <link>https://hi.khuo.ng/posts/2026-04-11-authentik-sso/</link>
      <pubDate>Sat, 11 Apr 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-04-11-authentik-sso/</guid>
      <description>A single Authentik core with a lightweight outpost on every host: forward-auth for apps that can&amp;rsquo;t do auth, OIDC for apps that can, config as code where the product allows, and four pitfalls ranked by how down production went.</description>
    </item>
    <item>
      <title>Traefik part 2: the public edge</title>
      <link>https://hi.khuo.ng/posts/2026-03-28-traefik-edge/</link>
      <pubDate>Sat, 28 Mar 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-03-28-traefik-edge/</guid>
      <description>A cheap VPS fronts everything: TLS, auth at the door, Crowdsec bouncing the scanners, then proxying over the overlay to services whose disks it can&amp;rsquo;t even see. Plus the TLS error whose message will not help you.</description>
    </item>
    <item>
      <title>Traefik part 1: proxies inside the walls</title>
      <link>https://hi.khuo.ng/posts/2026-03-14-traefik-internal/</link>
      <pubDate>Sat, 14 Mar 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-03-14-traefik-internal/</guid>
      <description>One Traefik per host, wildcard certs via DNS-01 with zero open ports, and routing declared as labels on the containers themselves. Plus three footguns, ranked by how many hours each took from me.</description>
    </item>
    <item>
      <title>ZeroTier: a private /24 across three sites</title>
      <link>https://hi.khuo.ng/posts/2026-02-28-zerotier-overlay/</link>
      <pubDate>Sat, 28 Feb 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-02-28-zerotier-overlay/</guid>
      <description>One flat 10.99.0.0/24 spanning site A, site B, and the VPS. No port forwards, no router surgery, and the two-nodes-one-NAT collision that silently makes everything slow.</description>
    </item>
    <item>
      <title>Secrets in git: SOPS &#43; age</title>
      <link>https://hi.khuo.ng/posts/2026-02-14-secrets-in-git/</link>
      <pubDate>Sat, 14 Feb 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-02-14-secrets-in-git/</guid>
      <description>Encrypted .env files committed beside the compose files that use them: per-machine keys, per-file recipient rules, the one backup that cannot live inside the lab, and the git-diff habit that catches every near-miss.</description>
    </item>
    <item>
      <title>The GitOps repo: compose, one file per service</title>
      <link>https://hi.khuo.ng/posts/2026-02-01-the-gitops-repo/</link>
      <pubDate>Sun, 01 Feb 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-02-01-the-gitops-repo/</guid>
      <description>A repo layout that scales past 60 services without becoming a junk drawer: the infra/app split, four reusable service-file patterns, and naming conventions that do the remembering for you.</description>
    </item>
    <item>
      <title>Domains &amp; DNS: one canonical domain, many purposes</title>
      <link>https://hi.khuo.ng/posts/2026-01-18-domains-and-dns/</link>
      <pubDate>Sun, 18 Jan 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-01-18-domains-and-dns/</guid>
      <description>Domain-per-purpose, two wildcard records that mean you never touch DNS again, and scoped API tokens so no leaked credential can take the whole thing down.</description>
    </item>
    <item>
      <title>A homelab from scratch: what we&#39;re building and why</title>
      <link>https://hi.khuo.ng/posts/2026-01-06-homelab-from-scratch/</link>
      <pubDate>Tue, 06 Jan 2026 09:00:00 -0500</pubDate>
      <guid>https://hi.khuo.ng/posts/2026-01-06-homelab-from-scratch/</guid>
      <description>Years of accumulated server cruft, three boxes that each grew their own personality, and the decision to tear it down and rebuild as one git repo. The architecture, the rules, and why.</description>
    </item>
  </channel>
</rss>
