<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel>
  <title>gdhami.net</title>
  <link>https://gdhami.net</link>
  <description>Khaled Gadhami — .NET, Angular, and the lessons that survived production.</description>
  <item>
    <title>GitGlass, a VS Code-style repo viewer in under 10 KB of vanilla JS</title>
    <link>https://gdhami.net/blog/gitglass-a-vs-code-style-repo-viewer-under-10-kb-of-vanilla-js.html</link>
    <guid>https://gdhami.net/blog/gitglass-a-vs-code-style-repo-viewer-under-10-kb-of-vanilla-js.html</guid>
    <pubDate>Sat, 22 Aug 2026 09:00:00 +0000</pubDate>
    <description>I wanted readers to browse a demo repo without leaving the article. Nothing embeddable was small enough, so I built one: tree, tabs, highlighting, themes, snippets and guided tours in under 10 KB of JS, with no dependencies and no backend.</description>
  </item>
  <item>
    <title>Your API ignores the user who gave up</title>
    <link>https://gdhami.net/blog/your-api-ignores-the-user-who-gave-up.html</link>
    <guid>https://gdhami.net/blog/your-api-ignores-the-user-who-gave-up.html</guid>
    <pubDate>Tue, 18 Aug 2026 09:00:00 +0000</pubDate>
    <description>ASP.NET Core can tell when a caller disconnects. Most handlers never ask. What CancellationToken actually does, where to pass it, and where to be careful.</description>
  </item>
  <item>
    <title>Kill the boolean soup</title>
    <link>https://gdhami.net/blog/kill-the-boolean-soup.html</link>
    <guid>https://gdhami.net/blog/kill-the-boolean-soup.html</guid>
    <pubDate>Tue, 11 Aug 2026 09:00:00 +0000</pubDate>
    <description>isLoading, error, data — three flags, eight combinations, half of them lies. Discriminated unions make the impossible states impossible, and the compiler enforces it.</description>
  </item>
  <item>
    <title>The cache stampede you haven&#x27;t met yet</title>
    <link>https://gdhami.net/blog/the-cache-stampede-you-have-not-met-yet.html</link>
    <guid>https://gdhami.net/blog/the-cache-stampede-you-have-not-met-yet.html</guid>
    <pubDate>Tue, 04 Aug 2026 09:00:00 +0000</pubDate>
    <description>GetOrCreateAsync on IMemoryCache lets every concurrent request run the factory on a cold key. HybridCache&#x27;s single-flight fixes the stampede you only meet under load.</description>
  </item>
  <item>
    <title>Integration tests that lie</title>
    <link>https://gdhami.net/blog/integration-tests-that-lie.html</link>
    <guid>https://gdhami.net/blog/integration-tests-that-lie.html</guid>
    <pubDate>Tue, 28 Jul 2026 09:00:00 +0000</pubDate>
    <description>A mocked repository test proves your mock works. Testcontainers runs the real SQL Server and RabbitMQ inside the test run, so green means what you think it means.</description>
  </item>
  <item>
    <title>Life without Zone.js</title>
    <link>https://gdhami.net/blog/life-without-zonejs.html</link>
    <guid>https://gdhami.net/blog/life-without-zonejs.html</guid>
    <pubDate>Tue, 21 Jul 2026 09:00:00 +0000</pubDate>
    <description>Going zoneless removes Angular&#x27;s magic change detection. What actually breaks, why it breaks, and the migration order that keeps the app working at every step.</description>
  </item>
</channel></rss>
