<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Daily concepts — Hamza Kareem</title>
    <link>https://articles.hamzawi.dev/</link>
    <atom:link href="https://articles.hamzawi.dev/feed.xml" rel="self" type="application/rss+xml" />
    <description>One engineering concept a day.</description>
    <language>en</language>
    <item>
      <title>Last-Write-Wins &amp; Clock Skew</title>
      <link>https://articles.hamzawi.dev/lww-clock-skew</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/lww-clock-skew</guid>
      <pubDate>Sat, 17 Oct 2026 00:00:00 GMT</pubDate>
      <category>system design</category>
      <description>Your &quot;Latest&quot; Timestamp Is Lying. updated_at doesn&#39;t measure when something happened. It measures what some machine&#39;s clock said when the code ran. Those are different numbers, and on a fleet of nodes they…</description>
    </item>
    <item>
      <title>Semantic Caching for LLM Apps</title>
      <link>https://articles.hamzawi.dev/semantic-caching-llm</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/semantic-caching-llm</guid>
      <pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate>
      <category>ai engineering</category>
      <description>Build It In 12 Lines, Then See Where It Bites. Your support bot answers &quot;how do I reset my password?&quot; 400 times a day. Each one is a fresh generation: ~1.4s, ~$0.004. An exact-match cache catches almost none of them,…</description>
    </item>
    <item>
      <title>Idle Timeout Mismatch (LB Keep-Alive vs Backend)</title>
      <link>https://articles.hamzawi.dev/idle-timeout-mismatch</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/idle-timeout-mismatch</guid>
      <pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate>
      <category>cloud infrastructure</category>
      <description>The Silent Hang-Up. Keep-alive is a phone line left open between calls. Your load balancer keeps a pool of open lines to each backend so it doesn&#39;t pay a TCP+TLS handshake per request.</description>
    </item>
    <item>
      <title>Property-Based Testing (Shrinking &amp; Oracles)</title>
      <link>https://articles.hamzawi.dev/property-based-testing</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/property-based-testing</guid>
      <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
      <category>developer tooling</category>
      <description>97% Coverage, One Missing Example. A booking service merges a user&#39;s busy intervals (minutes since midnight) before computing free slots:</description>
    </item>
    <item>
      <title>srcset vs picture (Responsive Images)</title>
      <link>https://articles.hamzawi.dev/srcset-vs-picture</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/srcset-vs-picture</guid>
      <pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate>
      <category>web development</category>
      <description>Who Actually Picks The Image. img + srcset/sizes = you let the BROWSER choose.</description>
    </item>
    <item>
      <title>UUID v4 vs v7 Primary Keys</title>
      <link>https://articles.hamzawi.dev/uuid-v4-vs-v7-primary-keys</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/uuid-v4-vs-v7-primary-keys</guid>
      <pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate>
      <category>databases</category>
      <description>The Cost Isn&#39;t The 16 Bytes. The width is a rounding error. What hurts is insert order. Random keys fight the B-tree&#39;s love of locality.</description>
    </item>
    <item>
      <title>LoRA (Low-Rank Adaptation)</title>
      <link>https://articles.hamzawi.dev/lora-low-rank-adaptation</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/lora-low-rank-adaptation</guid>
      <pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate>
      <category>ai engineering</category>
      <description>Fine-Tuning a Model in 6 Lines. class LoRALinear(nn.Module):</description>
    </item>
    <item>
      <title>Event Time vs Processing Time (Watermarks &amp; Late Data)</title>
      <link>https://articles.hamzawi.dev/event-time-vs-processing-time-watermarks</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/event-time-vs-processing-time-watermarks</guid>
      <pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate>
      <category>system design</category>
      <description>The Bug That Only Shows Up On The Hour. A streaming job counts checkout events into hourly buckets.</description>
    </item>
    <item>
      <title>PodDisruptionBudgets — Voluntary vs Involuntary Disruption</title>
      <link>https://articles.hamzawi.dev/k8s-pod-disruption-budgets</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/k8s-pod-disruption-budgets</guid>
      <pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate>
      <category>cloud infrastructure</category>
      <description>The Permission Slip Nobody Has To Ask For. A PDB is a permission desk standing between your pods and anything that wants to politely remove one.</description>
    </item>
    <item>
      <title>Shallow Clone vs Partial Clone</title>
      <link>https://articles.hamzawi.dev/shallow-vs-partial-clone</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/shallow-vs-partial-clone</guid>
      <pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
      <category>developer tooling</category>
      <description>Two Ways to Not Download Your Repo. Monorepo: 2.1 GB, 180k commits. CI spends 95s cloning before a single test runs. You reach for --depth=1, your &quot;git diff against main&quot; breaks, you set fetch-depth: 0, and…</description>
    </item>
    <item>
      <title>INP &amp; Long Tasks — Yielding to the Main Thread</title>
      <link>https://articles.hamzawi.dev/inp-long-tasks-yielding</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/inp-long-tasks-yielding</guid>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <category>web development</category>
      <description>Your Handler Was Fast, the Main Thread Wasn&#39;t. Your search box filters a 5,000-row table. You profile the keypress handler: 0.9ms. Lighthouse gives you 98. You ship.</description>
    </item>
    <item>
      <title>The Lock Queue (ALTER TABLE &amp; Lock Waits)</title>
      <link>https://articles.hamzawi.dev/lock-queue-alter-table</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/lock-queue-alter-table</guid>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <category>databases</category>
      <description>Why a &quot;Safe&quot; Migration Froze Your Whole Table. The rewrite was never the only risk. The real one is the lock queue.</description>
    </item>
    <item>
      <title>Prompt Caching — The Prefix Match You Keep Breaking</title>
      <link>https://articles.hamzawi.dev/prompt-caching-prefix-match</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/prompt-caching-prefix-match</guid>
      <pubDate>Sun, 04 Oct 2026 00:00:00 GMT</pubDate>
      <category>ai engineering</category>
      <description>The Prefix Match You Keep Breaking. You cached your 20K-token system prompt. The bill didn&#39;t move. Your logs:</description>
    </item>
    <item>
      <title>Shuffle Sharding — Blast-Radius Math</title>
      <link>https://articles.hamzawi.dev/shuffle-sharding</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/shuffle-sharding</guid>
      <pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate>
      <category>system design</category>
      <description>Blast-Radius Math. Pairs out of 8: C(8,2) = 28.</description>
    </item>
    <item>
      <title>SNAT Port Exhaustion (NAT Gateway Outbound Limits)</title>
      <link>https://articles.hamzawi.dev/snat-port-exhaustion</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/snat-port-exhaustion</guid>
      <pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate>
      <category>cloud infrastructure</category>
      <description>Why Outbound Calls Die At Scale. 3am page. Your payment service — 40 pods, private subnet, one NAT gateway — starts throwing:</description>
    </item>
    <item>
      <title>Build Cache Invalidation — Timestamps vs Content Hashes</title>
      <link>https://articles.hamzawi.dev/build-cache-timestamps-vs-hashes</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/build-cache-timestamps-vs-hashes</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
      <category>developer tooling</category>
      <description>Timestamps vs Content Hashes. &quot;My build is incremental, so it only rebuilds what actually changed.&quot;</description>
    </item>
    <item>
      <title>Font Loading Strategy (font-display &amp; Metric Overrides)</title>
      <link>https://articles.hamzawi.dev/font-loading-display-metric-overrides</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/font-loading-display-metric-overrides</guid>
      <pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate>
      <category>web development</category>
      <description>font-display &amp; Metric Overrides. A web font is not a stylesheet. It&#39;s a late-arriving image that your text is shaped by. Until it lands the browser must choose: show nothing, or show something wrong. That…</description>
    </item>
    <item>
      <title>Index-Only Scans &amp; the Visibility Map</title>
      <link>https://articles.hamzawi.dev/index-only-scans-visibility-map</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/index-only-scans-visibility-map</guid>
      <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
      <category>databases</category>
      <description>Debug-Along. Dashboard query, 400ms p95. There IS an index. EXPLAIN says it&#39;s used. Nobody can see the problem.</description>
    </item>
    <item>
      <title>Hybrid Search &amp; Reciprocal Rank Fusion (RRF)</title>
      <link>https://articles.hamzawi.dev/hybrid-search-rrf</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/hybrid-search-rrf</guid>
      <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
      <category>ai engineering</category>
      <description>Build It in 5 Lines. Your vector search is good at &quot;how do I cancel my plan&quot; → finds the doc titled &quot;Ending a subscription&quot;. Semantics work.</description>
    </item>
    <item>
      <title>Wire Compatibility &amp; Schema Evolution (Protobuf field numbers)</title>
      <link>https://articles.hamzawi.dev/wire-compatibility-schema-evolution</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/wire-compatibility-schema-evolution</guid>
      <pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate>
      <category>system design</category>
      <description>A Schema Change Is a Rollout, Not an Edit. Take a proto — or a plain JSON API — you own. Add a field, then answer honestly: if an OLD consumer receives this message today, what exactly does it do? Then prove it: encode…</description>
    </item>
    <item>
      <title>Spot Instances — Interruptions Are About Capacity, Not Price</title>
      <link>https://articles.hamzawi.dev/spot-instances-capacity-interruptions</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/spot-instances-capacity-interruptions</guid>
      <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
      <category>cloud infrastructure</category>
      <description>Interruptions Are About Capacity, Not Price. Since 2017 AWS spot prices are smoothed — they drift slowly with long-term supply and demand, and everyone in a pool pays the same current price. Bidding high buys you almost…</description>
    </item>
    <item>
      <title>Stdio Buffering — Line vs Block (Pipes Change Your Program)</title>
      <link>https://articles.hamzawi.dev/stdio-buffering-line-vs-block</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/stdio-buffering-line-vs-block</guid>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <category>developer tooling</category>
      <description>Why Your Logs Disappear The Moment You Pipe Them. Your worker prints progress every second. Run it in the terminal: perfect, one line per second.</description>
    </item>
    <item>
      <title>The Back/Forward Cache (bfcache)</title>
      <link>https://articles.hamzawi.dev/bfcache-back-forward-cache</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/bfcache-back-forward-cache</guid>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <category>web development</category>
      <description>Your Page Isn&#39;t Reloading, It&#39;s Waking Up. When a user hits Back, the browser doesn&#39;t have to re-run your page. Modern browsers snapshot the whole thing — DOM, JS heap, scroll position, closures, your Redux store — and…</description>
    </item>
    <item>
      <title>Prepared Statements — Custom Plan vs Generic Plan</title>
      <link>https://articles.hamzawi.dev/prepared-statements-generic-plan</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/prepared-statements-generic-plan</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category>databases</category>
      <description>Custom Plan vs Generic Plan. Your query ran in 3ms. Same query, same params, 10 minutes later: 400ms. Nothing deployed. No data grew. Welcome to the 6th execution.</description>
    </item>
    <item>
      <title>The Agent Loop — Tool Use Is a Contract, Not a Function Call</title>
      <link>https://articles.hamzawi.dev/agent-loop-tool-use-contract</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/agent-loop-tool-use-contract</guid>
      <pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
      <category>ai engineering</category>
      <description>Tool Use Is a Contract, Not a Function Call. msgs = [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Why is checkout 500ing?&quot;}]</description>
    </item>
    <item>
      <title>Cross-AZ Traffic — The Bill Line Nobody Can Explain</title>
      <link>https://articles.hamzawi.dev/cross-az-traffic-zone-aware-routing</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/cross-az-traffic-zone-aware-routing</guid>
      <pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate>
      <category>cloud infrastructure</category>
      <description>The Bill Line Nobody Can Explain. Your cluster is healthy. p99 is fine. Then finance forwards the invoice:</description>
    </item>
    <item>
      <title>Leases &amp; Fencing Tokens — Why Your Distributed Lock Isn&#39;t Safe</title>
      <link>https://articles.hamzawi.dev/leases-fencing-tokens</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/leases-fencing-tokens</guid>
      <pubDate>Sun, 20 Sep 2026 00:00:00 GMT</pubDate>
      <category>system design</category>
      <description>Why Your Distributed Lock Isn&#39;t Safe. A distributed lock does NOT guarantee mutual exclusion over the resource. It only guarantees that two workers don&#39;t both hold the lock. Those are different things, and the gap…</description>
    </item>
    <item>
      <title>Merge Queues &amp; Semantic Conflicts</title>
      <link>https://articles.hamzawi.dev/merge-queues-semantic-conflicts</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/merge-queues-semantic-conflicts</guid>
      <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
      <category>developer tooling</category>
      <description>PR #412 renames a helper: getUser(id) → fetchUser(id). CI green ✅</description>
    </item>
    <item>
      <title>Service Workers — Caching &amp; the Update Lifecycle</title>
      <link>https://articles.hamzawi.dev/service-worker-update-lifecycle</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/service-worker-update-lifecycle</guid>
      <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
      <category>web development</category>
      <description>Build One in 14 Lines, Then Meet the Trap. Fast, offline-capable — and it will serve a broken &#39;/&#39; forever if you ship a bug, because a cached HTML hit never consults the network.</description>
    </item>
    <item>
      <title>Reading EXPLAIN ANALYZE — Estimated vs Actual Rows</title>
      <link>https://articles.hamzawi.dev/explain-analyze-estimated-vs-actual-rows</link>
      <guid isPermaLink="true">https://articles.hamzawi.dev/explain-analyze-estimated-vs-actual-rows</guid>
      <pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate>
      <category>databases</category>
      <description>Estimated vs Actual Rows. Postgres does not know your data. Before running a query it places a BET: &quot;this WHERE clause will match about 50 rows.&quot; From that guess it picks the strategy — index scan or…</description>
    </item>
  </channel>
</rss>
