<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Karanveer Singh Shaktawat — Blog</title>
    <description>Technical articles on full stack development, infrastructure, Rust, and developer tooling.</description>
    <link>https://yourportfolio.example/blog</link>
    <atom:link href="https://yourportfolio.example/feed.xml" rel="self" type="application/rss+xml"/>
    <language>en-us</language>
    <lastBuildDate>Tue, 12 May 2026 18:06:28 GMT</lastBuildDate>
    <image>
      <url>https://yourportfolio.example/api/og</url>
      <title>Karanveer Singh Shaktawat — Blog</title>
      <link>https://yourportfolio.example/blog</link>
    </image>
    <item>
      <title><![CDATA[I Built a Five-Layer AI Assistant Into My Portfolio Site. Here's Every Layer.]]></title>
      <description><![CDATA[Tool calls, visitor memory, real-time analytics, an LLM eval harness, and full-duplex voice — wired into a Next.js portfolio over six sessions. The decisions, the wrong turns, and the bugs that took longer to find than to fix.]]></description>
      <link>https://yourportfolio.example/blog/portfolio-ai-assistant-five-layers</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/portfolio-ai-assistant-five-layers</guid>
      <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      
      <category>ai</category>
      <category>nextjs</category>
      <category>vercel-ai-sdk</category>
      <category>google-cloud</category>
      <category>voice</category>
      <category>engineering</category>
      <media:content url="https://yourportfolio.example/api/og?title=I+Built+a+Five-Layer+AI+Assistant+Into+My+Portfolio+Site.+Here%27s+Every+Layer.&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=12&amp;date=2026-04-27" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=I+Built+a+Five-Layer+AI+Assistant+Into+My+Portfolio+Site.+Here%27s+Every+Layer.&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=12&amp;date=2026-04-27" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Running 116 Containers on My Laptop: Building a Personal Cloud from Scratch]]></title>
      <description><![CDATA[How I turned a single MacBook into a private cloud — AI inference, media server, dev services, wildcard HTTPS — all managed as code across 19 Docker Compose profiles.]]></description>
      <link>https://yourportfolio.example/blog/116-containers-personal-cloud</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/116-containers-personal-cloud</guid>
      <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      
      <category>infrastructure</category>
      <category>self-hosting</category>
      <category>docker</category>
      <category>homelab</category>
      <category>tailscale</category>
      <media:content url="https://yourportfolio.example/api/og?title=Running+116+Containers+on+My+Laptop%3A+Building+a+Personal+Cloud+from+Scratch&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-17" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Running+116+Containers+on+My+Laptop%3A+Building+a+Personal+Cloud+from+Scratch&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-17" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[20 Million Emails, One Priority Queue: Fixing a Race Condition in Production Mailcow]]></title>
      <description><![CDATA[How a bulk marketing campaign starved transactional email at Prachyam Studios — and how I fixed it by understanding Postfix queue internals and building a priority queue on top of Mailcow.]]></description>
      <link>https://yourportfolio.example/blog/mailcow-race-condition-priority-queue</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/mailcow-race-condition-priority-queue</guid>
      <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      <category domain="series">mailcow-deep-dive</category>
      
      <category>infrastructure</category>
      <category>email</category>
      <category>self-hosting</category>
      <category>mailcow</category>
      <category>postfix</category>
      <media:content url="https://yourportfolio.example/api/og?title=20+Million+Emails%2C+One+Priority+Queue%3A+Fixing+a+Race+Condition+in+Production+Mailcow&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-17" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=20+Million+Emails%2C+One+Priority+Queue%3A+Fixing+a+Race+Condition+in+Production+Mailcow&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-17" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[9 Platforms, 1 Monorepo: Building an OTT Platform Solo in 5 Months]]></title>
      <description><![CDATA[How I architected a full-stack OTT streaming platform for web, mobile, four TV OSes, and a desktop admin panel — solo, in one Nx TypeScript monorepo — and what I'd do differently.]]></description>
      <link>https://yourportfolio.example/blog/prachyam-sangam-9-platforms</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/prachyam-sangam-9-platforms</guid>
      <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      <category domain="series">monorepo-chronicles</category>
      
      <category>architecture</category>
      <category>monorepo</category>
      <category>typescript</category>
      <category>nx</category>
      <category>streaming</category>
      <category>react-native</category>
      <media:content url="https://yourportfolio.example/api/og?title=9+Platforms%2C+1+Monorepo%3A+Building+an+OTT+Platform+Solo+in+5+Months&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-17" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=9+Platforms%2C+1+Monorepo%3A+Building+an+OTT+Platform+Solo+in+5+Months&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-17" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Why I Designed a Keyboard Layout at 15 (and Still Use It at 213 WPM)]]></title>
      <description><![CDATA[In 2015, at 15, I designed my own keyboard layout because QWERTY felt structurally wrong. Eleven years later I'm at 213 WPM and still use it every day. Here's the story and what it taught me about design.]]></description>
      <link>https://yourportfolio.example/blog/x-type-keyboard-layout</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/x-type-keyboard-layout</guid>
      <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">society</category>
      
      
      <category>keyboard</category>
      <category>design</category>
      <category>productivity</category>
      <category>personal</category>
      <media:content url="https://yourportfolio.example/api/og?title=Why+I+Designed+a+Keyboard+Layout+at+15+%28and+Still+Use+It+at+213+WPM%29&amp;subtitle=Blog&amp;genre=society&amp;readingTime=8&amp;date=2026-04-17" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Why+I+Designed+a+Keyboard+Layout+at+15+%28and+Still+Use+It+at+213+WPM%29&amp;subtitle=Blog&amp;genre=society&amp;readingTime=8&amp;date=2026-04-17" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: impl Trait vs dyn Trait in Rust]]></title>
      <description><![CDATA[The difference between static dispatch (impl Trait) and dynamic dispatch (dyn Trait) — not just syntax, but a real tradeoff.]]></description>
      <link>https://yourportfolio.example/blog/til-rust-impl-vs-dyn-trait</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-rust-impl-vs-dyn-trait</guid>
      <pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>rust</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+impl+Trait+vs+dyn+Trait+in+Rust&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-04-10" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+impl+Trait+vs+dyn+Trait+in+Rust&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-04-10" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Postfix Queue Management Under Load]]></title>
      <description><![CDATA[How Postfix queues work, why they pile up, and the exact commands to drain, inspect, and recover them when things go sideways.]]></description>
      <link>https://yourportfolio.example/blog/til-postfix-queue-management</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-postfix-queue-management</guid>
      <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      <category domain="series">mailcow-deep-dive</category>
      <category domain="postType">til</category>
      <category>infrastructure</category>
      <category>email</category>
      <category>linux</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Postfix+Queue+Management+Under+Load&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-04-08" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Postfix+Queue+Management+Under+Load&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-04-08" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Running a Complete Local AI Stack on M1 Max: What Actually Works]]></title>
      <description><![CDATA[Llama 70B, Flux image generation, Kokoro TTS, Whisper STT — all running locally on an M1 Max with 64GB unified memory. The practical setup, benchmarks, and honest assessment of what's ready and what isn't.]]></description>
      <link>https://yourportfolio.example/blog/local-ai-stack-m1-max</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/local-ai-stack-m1-max</guid>
      <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      
      <category>ai</category>
      <category>local-ai</category>
      <category>self-hosting</category>
      <category>macos</category>
      <media:content url="https://yourportfolio.example/api/og?title=Running+a+Complete+Local+AI+Stack+on+M1+Max%3A+What+Actually+Works&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-05" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Running+a+Complete+Local+AI+Stack+on+M1+Max%3A+What+Actually+Works&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-04-05" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Rust Lifetime Elision Rules]]></title>
      <description><![CDATA[The three rules Rust uses to infer lifetimes automatically, so you understand when you need to annotate and when the compiler handles it for you.]]></description>
      <link>https://yourportfolio.example/blog/til-rust-lifetime-elision</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-rust-lifetime-elision</guid>
      <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>rust</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Rust+Lifetime+Elision+Rules&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-04-02" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Rust+Lifetime+Elision+Rules&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-04-02" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: inotify on Linux vs FSEvents on macOS]]></title>
      <description><![CDATA[How file system event APIs differ between Linux and macOS, and why it matters for cross-platform tooling.]]></description>
      <link>https://yourportfolio.example/blog/til-linux-inotify-fsevent</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-linux-inotify-fsevent</guid>
      <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>linux</category>
      <category>macos</category>
      <category>infrastructure</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+inotify+on+Linux+vs+FSEvents+on+macOS&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-28" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+inotify+on+Linux+vs+FSEvents+on+macOS&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-28" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Building Mail Infrastructure for 20 Million Emails: What Nobody Tells You]]></title>
      <description><![CDATA[The full story of building a self-hosted email stack across 12 domains and 6 servers at Prachyam Studios — the architecture, the hard lessons, and why I'd do it again.]]></description>
      <link>https://yourportfolio.example/blog/prachyam-mail-infra-deep-dive</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/prachyam-mail-infra-deep-dive</guid>
      <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      <category domain="series">mailcow-deep-dive</category>
      
      <category>infrastructure</category>
      <category>self-hosting</category>
      <category>email</category>
      <category>postfix</category>
      <media:content url="https://yourportfolio.example/api/og?title=Building+Mail+Infrastructure+for+20+Million+Emails%3A+What+Nobody+Tells+You&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=8&amp;date=2026-03-25" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Building+Mail+Infrastructure+for+20+Million+Emails%3A+What+Nobody+Tells+You&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=8&amp;date=2026-03-25" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Tauri IPC — invoke() vs Commands vs Events]]></title>
      <description><![CDATA[The three ways the frontend talks to the Rust backend in Tauri, when to use each, and the one gotcha that wasted an afternoon.]]></description>
      <link>https://yourportfolio.example/blog/til-tauri-ipc-invoke</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-tauri-ipc-invoke</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>rust</category>
      <category>tauri</category>
      <category>desktop</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Tauri+IPC+%E2%80%94+invoke%28%29+vs+Commands+vs+Events&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-22" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Tauri+IPC+%E2%80%94+invoke%28%29+vs+Commands+vs+Events&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-22" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Nextcloud Chunked Upload via WebDAV]]></title>
      <description><![CDATA[How Nextcloud handles large file uploads under the hood, and how to implement chunked uploads manually when the desktop client isn't an option.]]></description>
      <link>https://yourportfolio.example/blog/til-nextcloud-chunked-upload</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-nextcloud-chunked-upload</guid>
      <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>self-hosting</category>
      <category>nextcloud</category>
      <category>infrastructure</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Nextcloud+Chunked+Upload+via+WebDAV&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-18" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Nextcloud+Chunked+Upload+via+WebDAV&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-18" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: The RSC Client Boundary Is Not a File Boundary]]></title>
      <description><![CDATA[A common Next.js App Router misconception: 'use client' doesn't make a file client-only — it marks the boundary where the client tree starts.]]></description>
      <link>https://yourportfolio.example/blog/til-nextjs-rsc-client-boundary</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-nextjs-rsc-client-boundary</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>nextjs</category>
      <category>react</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+The+RSC+Client+Boundary+Is+Not+a+File+Boundary&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-15" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+The+RSC+Client+Boundary+Is+Not+a+File+Boundary&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-15" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: XState Final States and Done Events]]></title>
      <description><![CDATA[How XState's final states work, what done() events are, and the pattern for composing machines that signal completion to a parent.]]></description>
      <link>https://yourportfolio.example/blog/til-xstate-final-states</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-xstate-final-states</guid>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>xstate</category>
      <category>typescript</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+XState+Final+States+and+Done+Events&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-10" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+XState+Final+States+and+Done+Events&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-10" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Architecting an OTT Platform for 8 Platforms in a Single Monorepo]]></title>
      <description><![CDATA[How I designed the code structure for a streaming platform targeting Next.js web, React Native iOS/Android, tvOS, Android TV, and Tauri desktop — shared business logic, platform-specific UI, one repo.]]></description>
      <link>https://yourportfolio.example/blog/ott-monorepo-8-platforms</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/ott-monorepo-8-platforms</guid>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      <category domain="series">monorepo-chronicles</category>
      
      <category>architecture</category>
      <category>react-native</category>
      <category>nextjs</category>
      <category>monorepo</category>
      <media:content url="https://yourportfolio.example/api/og?title=Architecting+an+OTT+Platform+for+8+Platforms+in+a+Single+Monorepo&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-03-10" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Architecting+an+OTT+Platform+for+8+Platforms+in+a+Single+Monorepo&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=7&amp;date=2026-03-10" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: git rerere — Reuse Recorded Resolution]]></title>
      <description><![CDATA[git rerere remembers how you resolved a merge conflict and automatically applies the same resolution next time. Useful for long-lived feature branches.]]></description>
      <link>https://yourportfolio.example/blog/til-git-rerere</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-git-rerere</guid>
      <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>git</category>
      <category>tools</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+git+rerere+%E2%80%94+Reuse+Recorded+Resolution&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-05" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+git+rerere+%E2%80%94+Reuse+Recorded+Resolution&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-05" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Drizzle Migrations Are Just SQL Files]]></title>
      <description><![CDATA[What Drizzle's migration system actually generates, why that's better than magic ORM migrations, and how to handle the edge cases.]]></description>
      <link>https://yourportfolio.example/blog/til-drizzle-migrations-sql</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-drizzle-migrations-sql</guid>
      <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>drizzle</category>
      <category>postgres</category>
      <category>typescript</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Drizzle+Migrations+Are+Just+SQL+Files&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-02" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Drizzle+Migrations+Are+Just+SQL+Files&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-03-02" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Git Worktrees Let You Check Out Multiple Branches Simultaneously]]></title>
      <description><![CDATA[git worktree lets you have multiple working trees from one repo — no stashing, no switching, no friction.]]></description>
      <link>https://yourportfolio.example/blog/til-git-worktrees</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-git-worktrees</guid>
      <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>git</category>
      <category>tools</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Git+Worktrees+Let+You+Check+Out+Multiple+Branches+Simultaneously&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-25" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Git+Worktrees+Let+You+Check+Out+Multiple+Branches+Simultaneously&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-25" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Docker Layer Cache Invalidation Is Sequential]]></title>
      <description><![CDATA[One changed line in a Dockerfile invalidates every layer after it. Ordering your Dockerfile with this in mind cuts rebuild times dramatically.]]></description>
      <link>https://yourportfolio.example/blog/til-docker-layer-cache</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-docker-layer-cache</guid>
      <pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>docker</category>
      <category>infrastructure</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Docker+Layer+Cache+Invalidation+Is+Sequential&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-20" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Docker+Layer+Cache+Invalidation+Is+Sequential&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-20" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: DKIM, SPF, and DMARC Alignment Are Not the Same Thing]]></title>
      <description><![CDATA[Passing SPF and DKIM doesn't mean DMARC passes. Alignment is a separate check — and missing it is why your authenticated emails still land in spam.]]></description>
      <link>https://yourportfolio.example/blog/til-dkim-spf-alignment</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-dkim-spf-alignment</guid>
      <pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>email</category>
      <category>infrastructure</category>
      <category>self-hosting</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+DKIM%2C+SPF%2C+and+DMARC+Alignment+Are+Not+the+Same+Thing&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-15" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+DKIM%2C+SPF%2C+and+DMARC+Alignment+Are+Not+the+Same+Thing&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-15" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Why I Self-Host Everything (And What It's Actually Cost Me)]]></title>
      <description><![CDATA[Self-hosting is not about being cheap or contrarian. It's about understanding your stack, owning your data, and building a certain kind of engineering judgment that you can't get any other way.]]></description>
      <link>https://yourportfolio.example/blog/self-hosting-philosophy</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/self-hosting-philosophy</guid>
      <pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate>
      <category domain="genre">philosophy</category>
      
      
      <category>self-hosting</category>
      <category>infrastructure</category>
      <category>opinion</category>
      <media:content url="https://yourportfolio.example/api/og?title=Why+I+Self-Host+Everything+%28And+What+It%27s+Actually+Cost+Me%29&amp;subtitle=Blog&amp;genre=philosophy&amp;readingTime=7&amp;date=2026-02-10" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Why+I+Self-Host+Everything+%28And+What+It%27s+Actually+Cost+Me%29&amp;subtitle=Blog&amp;genre=philosophy&amp;readingTime=7&amp;date=2026-02-10" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Multi-Stage Docker Builds for Rust Cut Image Size by 20x]]></title>
      <description><![CDATA[How to use Docker multi-stage builds to go from a 2GB Rust build image to a 12MB production image.]]></description>
      <link>https://yourportfolio.example/blog/til-docker-multistage-rust</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-docker-multistage-rust</guid>
      <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>rust</category>
      <category>docker</category>
      <category>infrastructure</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Multi-Stage+Docker+Builds+for+Rust+Cut+Image+Size+by+20x&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-08" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Multi-Stage+Docker+Builds+for+Rust+Cut+Image+Size+by+20x&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-02-08" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: PgBouncer Transaction Mode vs Session Mode]]></title>
      <description><![CDATA[The difference between PgBouncer's pooling modes, why transaction mode breaks prepared statements, and which to use for Next.js apps.]]></description>
      <link>https://yourportfolio.example/blog/til-pgbouncer-connection-pooling</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-pgbouncer-connection-pooling</guid>
      <pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>postgres</category>
      <category>infrastructure</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+PgBouncer+Transaction+Mode+vs+Session+Mode&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-01-28" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+PgBouncer+Transaction+Mode+vs+Session+Mode&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-01-28" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[TIL: Nginx upstream keepalive Cuts Latency on Internal Services]]></title>
      <description><![CDATA[Without keepalive on Nginx upstream blocks, every proxied request opens a new TCP connection to your backend. One directive fixes this.]]></description>
      <link>https://yourportfolio.example/blog/til-nginx-upstream-keepalive</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/til-nginx-upstream-keepalive</guid>
      <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      <category domain="postType">til</category>
      <category>nginx</category>
      <category>infrastructure</category>
      <category>performance</category>
      <category>til</category>
      <media:content url="https://yourportfolio.example/api/og?title=TIL%3A+Nginx+upstream+keepalive+Cuts+Latency+on+Internal+Services&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-01-20" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=TIL%3A+Nginx+upstream+keepalive+Cuts+Latency+on+Internal+Services&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=1&amp;date=2026-01-20" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[How I Vibe Code: Building Software with AI as a Co-Pilot]]></title>
      <description><![CDATA[What 'vibe coding' actually means in practice — my AI toolkit, when it helps, when it hurts, and the meta angle of building this portfolio with Claude.]]></description>
      <link>https://yourportfolio.example/blog/vibe-coding</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/vibe-coding</guid>
      <pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      
      <category>ai</category>
      <category>developer-tools</category>
      <category>workflow</category>
      <category>opinion</category>
      <media:content url="https://yourportfolio.example/api/og?title=How+I+Vibe+Code%3A+Building+Software+with+AI+as+a+Co-Pilot&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=5&amp;date=2025-09-01" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=How+I+Vibe+Code%3A+Building+Software+with+AI+as+a+Co-Pilot&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=5&amp;date=2025-09-01" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[How I Beat Procrastination (And How It Almost Beat Me)]]></title>
      <description><![CDATA[Not productivity hacks — the real psychological battle of shipping code when your brain would rather do anything else.]]></description>
      <link>https://yourportfolio.example/blog/beating-procrastination</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/beating-procrastination</guid>
      <pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate>
      <category domain="genre">philosophy</category>
      
      
      <category>productivity</category>
      <category>personal</category>
      <category>mental-health</category>
      <media:content url="https://yourportfolio.example/api/og?title=How+I+Beat+Procrastination+%28And+How+It+Almost+Beat+Me%29&amp;subtitle=Blog&amp;genre=philosophy&amp;readingTime=4&amp;date=2025-08-15" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=How+I+Beat+Procrastination+%28And+How+It+Almost+Beat+Me%29&amp;subtitle=Blog&amp;genre=philosophy&amp;readingTime=4&amp;date=2025-08-15" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Why I Wrote a Docker Tool in Rust]]></title>
      <description><![CDATA[Building Docsee — a cross-platform Docker management tool with a Tauri GUI and terminal TUI, and why Rust was the right choice.]]></description>
      <link>https://yourportfolio.example/blog/why-i-wrote-docsee-in-rust</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/why-i-wrote-docsee-in-rust</guid>
      <pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      
      <category>rust</category>
      <category>docker</category>
      <category>tauri</category>
      <category>open-source</category>
      <media:content url="https://yourportfolio.example/api/og?title=Why+I+Wrote+a+Docker+Tool+in+Rust&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=2&amp;date=2025-07-01" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Why+I+Wrote+a+Docker+Tool+in+Rust&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=2&amp;date=2025-07-01" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[How I Managed 18 Million Emails with Self-Hosted Mailcow]]></title>
      <description><![CDATA[Running a self-hosted email server across 12 domains for a media company — the architecture, challenges, and why I'd do it again.]]></description>
      <link>https://yourportfolio.example/blog/self-hosted-mailcow-18m-emails</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/self-hosted-mailcow-18m-emails</guid>
      <pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      <category domain="series">mailcow-deep-dive</category>
      
      <category>infrastructure</category>
      <category>self-hosting</category>
      <category>docker</category>
      <category>email</category>
      <media:content url="https://yourportfolio.example/api/og?title=How+I+Managed+18+Million+Emails+with+Self-Hosted+Mailcow&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=2&amp;date=2025-06-01" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=How+I+Managed+18+Million+Emails+with+Self-Hosted+Mailcow&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=2&amp;date=2025-06-01" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[Building for 12+ Platforms from a Single Codebase with Nx]]></title>
      <description><![CDATA[How I architected an OTT streaming platform that ships to web, mobile, TV, and desktop from one Nx monorepo.]]></description>
      <link>https://yourportfolio.example/blog/nx-monorepo-12-platforms</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/nx-monorepo-12-platforms</guid>
      <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      <category domain="series">monorepo-chronicles</category>
      
      <category>react-native</category>
      <category>nx</category>
      <category>architecture</category>
      <category>typescript</category>
      <media:content url="https://yourportfolio.example/api/og?title=Building+for+12%2B+Platforms+from+a+Single+Codebase+with+Nx&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=2&amp;date=2025-05-15" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=Building+for+12%2B+Platforms+from+a+Single+Codebase+with+Nx&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=2&amp;date=2025-05-15" width="1200" height="630"/>
    </item>
    <item>
      <title><![CDATA[23 MCP Servers: How I Built AI-Powered Developer Tooling]]></title>
      <description><![CDATA[Building custom Model Context Protocol servers for semantic code search, automated workflows, and integrating AI into daily development.]]></description>
      <link>https://yourportfolio.example/blog/23-mcp-servers-ai-tooling</link>
      <guid isPermaLink="true">https://yourportfolio.example/blog/23-mcp-servers-ai-tooling</guid>
      <pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate>
      <category domain="genre">tech</category>
      
      
      <category>ai</category>
      <category>mcp</category>
      <category>typescript</category>
      <category>developer-tools</category>
      <media:content url="https://yourportfolio.example/api/og?title=23+MCP+Servers%3A+How+I+Built+AI-Powered+Developer+Tooling&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=3&amp;date=2025-04-20" medium="image" width="1200" height="630"/>
      <media:thumbnail url="https://yourportfolio.example/api/og?title=23+MCP+Servers%3A+How+I+Built+AI-Powered+Developer+Tooling&amp;subtitle=Blog&amp;genre=tech&amp;readingTime=3&amp;date=2025-04-20" width="1200" height="630"/>
    </item>
  </channel>
</rss>