<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Projects - Category - Tonderai Khatai</title><link>https://tldkhatai.com/categories/projects/</link><description>Projects - Category - Tonderai Khatai</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 17 Jun 2026 00:00:00 +0100</lastBuildDate><atom:link href="https://tldkhatai.com/categories/projects/" rel="self" type="application/rss+xml"/><item><title>One Droplet, One YAML File, Two Production Apps</title><link>https://tldkhatai.com/posts/digitalocean-infra-setup/</link><pubDate>Wed, 17 Jun 2026 00:00:00 +0100</pubDate><author>Tonderai Khatai</author><guid>https://tldkhatai.com/posts/digitalocean-infra-setup/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/posts/digitalocean-infra-setup.png" referrerpolicy="no-referrer">
            </div><p>Two production Node apps — <a href="https://handovha.com">Handovha</a> and Mail Koenig — run on one <a href="https://www.digitalocean.com">DigitalOcean</a> droplet at the smallest tier DigitalOcean sells. No <a href="https://kubernetes.io">Kubernetes</a>, no <a href="https://www.terraform.io">Terraform</a>, no PaaS.</p>]]></description></item><item><title>Mail Koenig: A Send Queue Made Entirely of Postgres</title><link>https://tldkhatai.com/posts/mail-koenig-architecture/</link><pubDate>Thu, 14 May 2026 00:00:00 +0100</pubDate><author>Tonderai Khatai</author><guid>https://tldkhatai.com/posts/mail-koenig-architecture/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/posts/mail-koenig-architecture.png" referrerpolicy="no-referrer">
            </div><p>Sending an email campaign to a few thousand people looks simple until the third recipient&rsquo;s inbox provider rate-limits you mid-send, the fourth bounces permanently, and the process doing the sending gets killed by a deploy halfway through.</p>]]></description></item><item><title>Functional Core, Imperative Shell Makes Sense for Micro Apps</title><link>https://tldkhatai.com/posts/functional-core-imperative-shell-micro-apps/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0100</pubDate><author>Tonderai Khatai</author><guid>https://tldkhatai.com/posts/functional-core-imperative-shell-micro-apps/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/posts/functional-core-imperative-shell-micro-apps.png" referrerpolicy="no-referrer">
            </div><p>Functional core, imperative shell usually gets pitched as a full architecture: pure domain functions in one layer, all I/O pushed to the edges, everything wired together through explicit ports.</p>]]></description></item><item><title>Handovha: A Verifiable Handover, Without Accounts</title><link>https://tldkhatai.com/posts/handovha-architecture/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0100</pubDate><author>Tonderai Khatai</author><guid>https://tldkhatai.com/posts/handovha-architecture/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/posts/handovha-architecture.png" referrerpolicy="no-referrer">
            </div><p>Memory is not a receipt. A landlord and a tenant agree a flat is fine at handover; six months later they remember it differently. A fleet manager hands over a van with a full tank and no dents; a week later, someone disputes which of those was true.</p>]]></description></item><item><title>Building a Zero-Code Photography Portfolio</title><link>https://tldkhatai.com/posts/eyes-of-wadzi-architecture/</link><pubDate>Mon, 16 Feb 2026 00:00:00 +0100</pubDate><author>Tonderai Khatai</author><guid>https://tldkhatai.com/posts/eyes-of-wadzi-architecture/</guid><description><![CDATA[<div class="featured-image">
                <img src="/images/posts/eyes-of-wadzi-architecture.png" referrerpolicy="no-referrer">
            </div><p>Someone close to me is a photographer who needed a portfolio site but doesn&rsquo;t want to touch a terminal, a code editor, or a &ldquo;deploy&rdquo; button.</p>]]></description></item></channel></rss>