<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Joel Hanson</title>
    <link>https://joelhanson.com/</link>
    <description>Recent content on Joel Hanson</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>joelhanson025@gmail.com (Joel Hanson)</managingEditor>
    <webMaster>joelhanson025@gmail.com (Joel Hanson)</webMaster>
    <copyright>&amp;copy; Joel Hanson</copyright>
    <lastBuildDate>Mon, 17 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://joelhanson.com/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Apicurio Registry</title>
      <link>https://joelhanson.com/projects/apicurio-registry/</link>
      <pubDate>Sat, 04 Jul 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/apicurio-registry/</guid>
      <description>Schema registry migration and upstream MCP work for IBM Event Streams.</description>
      
    </item>
    
    <item>
      <title>Configuring Kafka Connector with Docker: A Step-by-Step Guide</title>
      <link>https://joelhanson.com/posts/09-kafka-connector-docker-setup/</link>
      <pubDate>Sat, 12 Oct 2024 12:17:49 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/09-kafka-connector-docker-setup/</guid>
      <description>&lt;p&gt;In this tutorial, we&amp;rsquo;ll walk through the process of setting up a Kafka connector using Docker and docker-compose.yml. We&amp;rsquo;ll focus on configuring a file connector, which is useful for reading data from files and writing data to files using Kafka.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>ContextLayer</title>
      <link>https://joelhanson.com/projects/contextlayer/</link>
      <pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/contextlayer/</guid>
      <description>Transform any REST API into an MCP server — connectors that make existing APIs usable by LLM tools.</description>
      
    </item>
    
    <item>
      <title>Supercharging Your AI: Setting Up RAG with PostgreSQL and pgvector</title>
      <link>https://joelhanson.com/posts/06-setting-up-rag-with-postgre-sql-and-pgvector/</link>
      <pubDate>Mon, 30 Sep 2024 21:28:28 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/06-setting-up-rag-with-postgre-sql-and-pgvector/</guid>
      <description>Learn how to implement a powerful Retrieval-Augmented Generation (RAG) system using PostgreSQL and pgvector. This comprehensive guide covers everything from setting up a custom PostgreSQL Docker image to creating a fully functional RAG query system with vector embeddings and language model inference.</description>
      
    </item>
    
    <item>
      <title>Convert Your Django DRF Project to MCP in 5 Minutes</title>
      <link>https://joelhanson.com/posts/20-convert-your-django-drf-project-to-mcp-in-5-minutes/</link>
      <pubDate>Sun, 03 Aug 2025 15:20:06 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/20-convert-your-django-drf-project-to-mcp-in-5-minutes/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;The Problem: When APIs Meet AI Assistants&#xA;    &lt;div id=&#34;the-problem-when-apis-meet-ai-assistants&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-problem-when-apis-meet-ai-assistants&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;A few weeks ago, I was experimenting with &lt;a href=&#34;https://modelcontextprotocol.io/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Model Context Protocol (MCP)&lt;/a&gt; for a &lt;a href=&#34;https://joelhanson.com/posts/16-breaking-kafka-walls-building-an-mcp-server-for-your-kafka-cluster/&#34; &gt;Kafka integration project&lt;/a&gt;. The experience was eye-opening - being able to interact with complex systems through natural language felt like a glimpse into the future of development workflows.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Kafka MCP Server</title>
      <link>https://joelhanson.com/projects/kafka-mcp-server/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/kafka-mcp-server/</guid>
      <description>Expose Kafka cluster operations as LLM-accessible tools via the Model Context Protocol.</description>
      
    </item>
    
    <item>
      <title>Kafka Common Problems</title>
      <link>https://joelhanson.com/projects/kafka-common-problems/</link>
      <pubDate>Sun, 02 Aug 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/kafka-common-problems/</guid>
      <description>Operational playbooks for common Kafka production issues — symptoms, diagnosis steps, and fixes you can walk with a customer.</description>
      
    </item>
    
    <item>
      <title>Setting Up a Kafka Cluster Without Zookeeper Using Docker</title>
      <link>https://joelhanson.com/posts/08-setting-up-a-kafka-cluster-without-zookeeper-using-docker/</link>
      <pubDate>Sat, 05 Oct 2024 23:14:04 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/08-setting-up-a-kafka-cluster-without-zookeeper-using-docker/</guid>
      <description>&lt;h3 class=&#34;relative group&#34;&gt;Introduction&#xA;    &lt;div id=&#34;introduction&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#introduction&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;In this post, we will walk through the process of setting up an Apache Kafka cluster &lt;strong&gt;without using Zookeeper&lt;/strong&gt;, leveraging Kafka&amp;rsquo;s &lt;strong&gt;KRaft mode&lt;/strong&gt; for metadata management. Kafka no longer requires a Zookeeper instance, simplifying the cluster setup. We will use &lt;strong&gt;Docker&lt;/strong&gt; to deploy this Kafka cluster with the latest version of Kafka.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>bijou64</title>
      <link>https://joelhanson.com/projects/bijou64/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/bijou64/</guid>
      <description>Shrink Kafka integer payloads with a compact encoding library for Java/Kafka apps.</description>
      
    </item>
    
    <item>
      <title>Building an MCP Server for Your Kafka Cluster</title>
      <link>https://joelhanson.com/posts/16-breaking-kafka-walls-building-an-mcp-server-for-your-kafka-cluster/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/16-breaking-kafka-walls-building-an-mcp-server-for-your-kafka-cluster/</guid>
      <description>A step‑by‑step guide to using FastMCP and the MCP protocol to expose Kafka operations (topic management, produce/consume, troubleshooting) as LLM‑accessible tools.</description>
      
    </item>
    
    <item>
      <title>Markdown2Medium</title>
      <link>https://joelhanson.com/projects/markdown2medium/</link>
      <pubDate>Sat, 26 Apr 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/markdown2medium/</guid>
      <description>Convert Hugo-friendly Markdown into Medium-ready posts with a live preview and one-click copy.</description>
      
    </item>
    
    <item>
      <title>Kafka Connector Template</title>
      <link>https://joelhanson.com/projects/kafka-connector-template/</link>
      <pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/kafka-connector-template/</guid>
      <description>Production-ready Kafka Connect template with Testcontainers integration tests.</description>
      
    </item>
    
    <item>
      <title>Wayfare</title>
      <link>https://joelhanson.com/projects/wayfare/</link>
      <pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/wayfare/</guid>
      <description>Travel bucket list and savings tracker with MCP. Same trip context in ChatGPT, Claude, and Cursor.</description>
      
    </item>
    
    <item>
      <title>Antarctic Iceberg Tracker</title>
      <link>https://joelhanson.com/projects/iceberg-locations/</link>
      <pubDate>Thu, 01 May 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/iceberg-locations/</guid>
      <description>Real-time iceberg monitoring with NASA data, automated pipelines, and GitHub as a data platform.</description>
      
    </item>
    
    <item>
      <title>leetok</title>
      <link>https://joelhanson.com/projects/leetok/</link>
      <pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/leetok/</guid>
      <description>Mobile-first swipe feed for interview problems and free learning resources.</description>
      
    </item>
    
    <item>
      <title>Stream Wars</title>
      <link>https://joelhanson.com/projects/stream-wars/</link>
      <pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/stream-wars/</guid>
      <description>A real-time multiplayer tap battle that turns every click into a Kafka event you can inspect.</description>
      
    </item>
    
    <item>
      <title>Habit Tracker</title>
      <link>https://joelhanson.com/projects/habit-tracker/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/habit-tracker/</guid>
      <description>Aesthetic challenge-grid habit tracker hosted on GitHub Pages.</description>
      
    </item>
    
    <item>
      <title>Nursing Tracker</title>
      <link>https://joelhanson.com/projects/booby-tracker/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/booby-tracker/</guid>
      <description>Home-screen PWA for nursing/feeding logs, built and shipped on GitHub Pages.</description>
      
    </item>
    
    <item>
      <title>SSE Kafka Connector</title>
      <link>https://joelhanson.com/projects/sse-kafka-connector/</link>
      <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/sse-kafka-connector/</guid>
      <description>Kafka Connect source that turns Server-Sent Events streams into Kafka topics — used in Event Streams demos.</description>
      
    </item>
    
    <item>
      <title>Django DRF → MCP</title>
      <link>https://joelhanson.com/projects/django-drf-mcp/</link>
      <pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/django-drf-mcp/</guid>
      <description>Turn an existing Django REST Framework project into MCP tools for AI assistants in minutes.</description>
      
    </item>
    
    <item>
      <title>GitHub Data Platform</title>
      <link>https://joelhanson.com/projects/github-data-platform/</link>
      <pubDate>Thu, 01 May 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/github-data-platform/</guid>
      <description>Turn GitHub Actions + Pages into a free scrape-and-serve data API — template and weather example.</description>
      
    </item>
    
    <item>
      <title>SSE Stream Monitor</title>
      <link>https://joelhanson.com/projects/sse-stream/</link>
      <pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/sse-stream/</guid>
      <description>Minimal Server-Sent Events demo — a live CPU/RAM dashboard with almost no client code.</description>
      
    </item>
    
    <item>
      <title>Flask &#43; Restate</title>
      <link>https://joelhanson.com/projects/flask-restate/</link>
      <pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/flask-restate/</guid>
      <description>Side-by-side Flask apps showing durable execution with Restate versus plain request handlers.</description>
      
    </item>
    
    <item>
      <title>Django Celery → Restate</title>
      <link>https://joelhanson.com/projects/django-celery-restate/</link>
      <pubDate>Mon, 15 Sep 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/projects/django-celery-restate/</guid>
      <description>Compare Celery-style async tasks in Django with Restate durable execution on the same workload.</description>
      
    </item>
    
    <item>
      <title>When One Kafka Partition Takes All the Heat</title>
      <link>https://joelhanson.com/posts/31-when-one-kafka-partition-takes-all-the-heat/</link>
      <pubDate>Sun, 02 Aug 2026 12:00:00 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/31-when-one-kafka-partition-takes-all-the-heat/</guid>
      <description>Hot partitions show up as lag on one partition, a stressed broker, and consumers that do nothing when you scale out. Confirm the skew, fix the key, and recreate it locally with a Docker Compose demo.</description>
      
    </item>
    
    <item>
      <title>Wayfare: I Plan Trips More Than I Take Them</title>
      <link>https://joelhanson.com/posts/30-wayfare-mcp-first-travel-context-layer/</link>
      <pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/30-wayfare-mcp-first-travel-context-layer/</guid>
      <description>I keep losing trip research across ChatGPT, Claude, and Cursor. So I built Wayfare: a travel bucket list with savings tracking, plus MCP so connected chatbots can use the same trip context.</description>
      
    </item>
    
    <item>
      <title>Wayfare: trip context over MCP and OAuth</title>
      <link>https://joelhanson.com/discoveries/wayfare-mcp-travel-context/</link>
      <pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/discoveries/wayfare-mcp-travel-context/</guid>
      <description>Travel bucket list and savings tracker. Same trip data in Claude, Cursor, and ChatGPT, per user via OAuth.</description>
      
    </item>
    
    <item>
      <title>The Connector That Kept Retrying and Never Said So</title>
      <link>https://joelhanson.com/posts/29-the-connector-that-kept-retrying-and-never-said-so/</link>
      <pubDate>Thu, 30 Jul 2026 10:00:00 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/29-the-connector-that-kept-retrying-and-never-said-so/</guid>
      <description>A Kafka Connect MQ Sink looked healthy while messages never reached MQ — RetriableException loops in put() sit outside errors.retry.timeout. How we added mq.retry.timeout.ms so silent retries become visible failures.</description>
      
    </item>
    
    <item>
      <title>About</title>
      <link>https://joelhanson.com/about/</link>
      <pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/about/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Open to global and remote roles.&lt;/strong&gt;&lt;br&gt;&#xA;hello [at] joelhanson.com · &lt;a href=&#34;https://joelhanson.com/files/Resume%20-%20Joel%20Hanson.pdf&#34; &gt;Resume (PDF)&lt;/a&gt; · &lt;a href=&#34;https://linkedin.com/in/joel-hanson/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;LinkedIn&lt;/a&gt; · &lt;a href=&#34;https://github.com/Joel-hanson&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;GitHub&lt;/a&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;About me&#xA;    &lt;div id=&#34;about-me&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#about-me&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Hey, I am Joel.&lt;br&gt;&#xA;distributed systems, event streaming, and production backends. usually shipping something.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Aesthetic Habit Tracker: A Challenge Grid That Lives in Your Browser</title>
      <link>https://joelhanson.com/posts/28-aesthetic-habit-tracker-challenge-grid-on-github-pages/</link>
      <pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/28-aesthetic-habit-tracker-challenge-grid-on-github-pages/</guid>
      <description>Most habit apps want an account, a subscription, and a notification every hour. I built a minimalist challenge tracker that stores everything locally, exports to PDF, and ships free on GitHub Pages.</description>
      
    </item>
    
    <item>
      <title>Challenge-grid habit tracker, no account</title>
      <link>https://joelhanson.com/discoveries/habit-tracker-challenge-grid/</link>
      <pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/discoveries/habit-tracker-challenge-grid/</guid>
      <description>A local-only challenge grid — tap a day, export PDF, ship on GitHub Pages.</description>
      
    </item>
    
    <item>
      <title>From Prompt to Home Screen: Shipping Nursing Tracker with GitHub Pages</title>
      <link>https://joelhanson.com/posts/27-from-prompt-to-home-screen-booby-tracker-on-github-pages/</link>
      <pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/27-from-prompt-to-home-screen-booby-tracker-on-github-pages/</guid>
      <description>My wife was losing track of feeds, so I built a one-tap nursing timer that grew into a pumping log, and shipped it for free on GitHub Pages with no database and no app store.</description>
      
    </item>
    
    <item>
      <title>Send Half the Bytes Over the Network: Cut Kafka Integer Payloads with Bijou64</title>
      <link>https://joelhanson.com/posts/26-shrink-kafka-integer-payloads-with-bijou64/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/26-shrink-kafka-integer-payloads-with-bijou64/</guid>
      <description>Every Kafka record with a Long value you produce sends 8 bytes over the wire, even when the value is 42. Bijou64 encodes integers in 1–3 bytes with drop-in serializers, cutting network transfer and replication traffic on integer-heavy topics by up to 50% or more.</description>
      
    </item>
    
    <item>
      <title>Shrink Kafka int payloads with bijou64</title>
      <link>https://joelhanson.com/discoveries/bijou64-compact-ints/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/discoveries/bijou64-compact-ints/</guid>
      <description>Variable-length unsigned 64-bit ints — small numbers stay small on the wire.</description>
      
    </item>
    
    <item>
      <title>Stream Wars: A Simple Game to Explain Kafka</title>
      <link>https://joelhanson.com/posts/25-building-stream-wars-a-real-time-multiplayer-tap-battle-game-with-kafka-and-websockets/</link>
      <pubDate>Fri, 19 Dec 2025 12:00:00 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/25-building-stream-wars-a-real-time-multiplayer-tap-battle-game-with-kafka-and-websockets/</guid>
      <description>I built Stream Wars as a tiny tap game to demo how Kafka works, by turning every tap in the browser into a real Kafka event you can inspect.</description>
      
    </item>
    
    <item>
      <title>From Celery to Restate: Rethinking Async Tasks in Django</title>
      <link>https://joelhanson.com/posts/24-from-celery-to-restate-rethinking-async-tasks-in-django/</link>
      <pubDate>Sun, 16 Nov 2025 17:00:00 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/24-from-celery-to-restate-rethinking-async-tasks-in-django/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;The Celery Question&#xA;    &lt;div id=&#34;the-celery-question&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-celery-question&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;For years, when someone asked &amp;ldquo;How do I handle background tasks in Django?&amp;rdquo;, the answer was almost always &amp;ldquo;Use Celery&amp;rdquo;. And for good reason. Celery is mature, battle-tested, and has solved async task processing for countless Django applications. It has extensive documentation, a large ecosystem of plugins, and most Django developers have at least some experience with it.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Adding Durable Execution to Flask Applications with Restate</title>
      <link>https://joelhanson.com/posts/23-adding-durable-execution-to-flask-with-restate/</link>
      <pubDate>Sun, 16 Nov 2025 16:00:00 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/23-adding-durable-execution-to-flask-with-restate/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;The Challenge of Reliable Background Operations&#xA;    &lt;div id=&#34;the-challenge-of-reliable-background-operations&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-challenge-of-reliable-background-operations&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Building web applications with Flask is straightforward until you need to handle operations that can fail. Database operations timeout, external APIs become unavailable, and network connections drop. These failures are inevitable in production systems, yet handling them gracefully often requires significant engineering effort.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Introducing ContextLayer: Transform Any REST API into an MCP Server in Minutes</title>
      <link>https://joelhanson.com/posts/22-introducing-contextlayer-transform-any-rest-api-into-an-mcp-server/</link>
      <pubDate>Sun, 16 Nov 2025 10:00:00 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/22-introducing-contextlayer-transform-any-rest-api-into-an-mcp-server/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;The Problem: Connecting AI Assistants to Your APIs&#xA;    &lt;div id=&#34;the-problem-connecting-ai-assistants-to-your-apis&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-problem-connecting-ai-assistants-to-your-apis&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;As AI assistants like &lt;a href=&#34;https://claude.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Claude&lt;/a&gt; and &lt;a href=&#34;https://github.com/features/copilot&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;VS Code Copilot&lt;/a&gt; become more powerful, developers are discovering a critical bottleneck: &lt;strong&gt;these AI tools can&amp;rsquo;t directly interact with our existing REST APIs&lt;/strong&gt;.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>SSE Kafka Connector: Stream Real-time Events into Kafka</title>
      <link>https://joelhanson.com/posts/21-sse-kafka-connector/</link>
      <pubDate>Wed, 27 Aug 2025 21:15:47 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/21-sse-kafka-connector/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;The Problem: Getting Real-time Data into Kafka&#xA;    &lt;div id=&#34;the-problem-getting-real-time-data-into-kafka&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-problem-getting-real-time-data-into-kafka&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Have you ever tried to stream Wikipedia changes or other real-time Server-Sent Events (SSE) updates into Kafka? If you have, you probably wrote custom Kafka producer and consumer code to handle these events, managed reconnections, and built your own error handling.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Turn GitHub into Your Free Data Platform: Building APIs with GitHub Actions</title>
      <link>https://joelhanson.com/posts/19-turn-git-hub-into-your-free-data-platform-building-ap-is-with-git-hub-actions/</link>
      <pubDate>Sat, 26 Jul 2025 14:47:05 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/19-turn-git-hub-into-your-free-data-platform-building-ap-is-with-git-hub-actions/</guid>
      <description>&lt;p&gt;&lt;em&gt;What if I told you that you could build, host, and maintain data APIs completely free using just GitHub? Here&amp;rsquo;s how I built a production-ready data platform without spending a penny on hosting.&lt;/em&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Tracking Antarctic Giants: Building a Real-Time Iceberg Monitor with NASA Data</title>
      <link>https://joelhanson.com/posts/18-tracking-antarctic-giants-building-a-real-time-iceberg-monitor-with-nasa-data/</link>
      <pubDate>Sat, 26 Jul 2025 12:14:10 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/18-tracking-antarctic-giants-building-a-real-time-iceberg-monitor-with-nasa-data/</guid>
      <description>&lt;p&gt;&lt;em&gt;Ever wondered where those massive icebergs the size of cities are drifting? I built a system to track them in real-time using NASA satellite data.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The Problem: Lost Giants in the Southern Ocean&#xA;    &lt;div id=&#34;the-problem-lost-giants-in-the-southern-ocean&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-problem-lost-giants-in-the-southern-ocean&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Antarctic icebergs are some of the most fascinating phenomena on Earth. These floating ice mountains—some larger than entire countries—break off from ice shelves and drift across the Southern Ocean for years. But tracking their movements has always been challenging.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Mastering Integration Testing for Kafka Connectors: A Complete Guide</title>
      <link>https://joelhanson.com/posts/mastering-integration-testing-for-kafka-connectors-a-complete-guide/</link>
      <pubDate>Sun, 13 Jul 2025 21:40:00 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/mastering-integration-testing-for-kafka-connectors-a-complete-guide/</guid>
      <description>Integration testing is crucial for Kafka Connectors to ensure they work correctly with external systems. This guide provides a comprehensive approach to setting up and executing integration tests for Kafka Connectors, covering everything from environment setup to best practices for testing source and sink connectors.</description>
      
    </item>
    
    <item>
      <title>How I Automated My Markdown Publishing on Medium (No More Manual Work!)</title>
      <link>https://joelhanson.com/posts/15-how-i-automated-my-markdown-publishing-on-medium-no-more-manual-work/</link>
      <pubDate>Sat, 26 Apr 2025 18:30:13 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/15-how-i-automated-my-markdown-publishing-on-medium-no-more-manual-work/</guid>
      <description>Tired of manually reformatting Markdown for Medium? Discover my open-source tool that converts Hugo-friendly Markdown into perfectly formatted Medium posts instantly.</description>
      
    </item>
    
    <item>
      <title>Creating Tombstone Records Using kafka-console-producer.sh: A Quick Guide</title>
      <link>https://joelhanson.com/posts/14-creating-tombstone-records-using-kafka-console-producer-sh-a-quick-guide/</link>
      <pubDate>Tue, 22 Apr 2025 16:03:27 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/14-creating-tombstone-records-using-kafka-console-producer-sh-a-quick-guide/</guid>
      <description>A practical guide to creating tombstone records for Kafka compacted topics using the kafka-console-producer.sh command-line tool with the null marker feature</description>
      
    </item>
    
    <item>
      <title>Kafka tombstones via console producer</title>
      <link>https://joelhanson.com/discoveries/kafka-tombstone-null-marker/</link>
      <pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/discoveries/kafka-tombstone-null-marker/</guid>
      <description>Key + null value = tombstone. Use null.marker so the CLI can send it.</description>
      
    </item>
    
    <item>
      <title>Build Custom Kafka Connectors Fast with This Open-Source Template</title>
      <link>https://joelhanson.com/posts/13-build-custom-kafka-connectors-fast-with-this-open-source-template/</link>
      <pubDate>Mon, 14 Apr 2025 16:19:42 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/13-build-custom-kafka-connectors-fast-with-this-open-source-template/</guid>
      <description>Apache Kafka is a powerful distributed event streaming platform, and &lt;strong&gt;Kafka Connect&lt;/strong&gt; makes it easy to integrate Kafka with external systems. While many pre-built connectors exist, real-world applications often need &lt;strong&gt;custom connectors&lt;/strong&gt; tailored for proprietary systems, custom logic, or advanced error handling.&#xA;That’s where this &lt;strong&gt;production-ready template&lt;/strong&gt; comes in—it removes the boilerplate and gives you everything you need to build, test, and deploy connectors with ease.</description>
      
    </item>
    
    <item>
      <title>Filtering Tombstone Records in Kafka Connect</title>
      <link>https://joelhanson.com/posts/12-filtering-tombstone-records-in-kafka-connect/</link>
      <pubDate>Tue, 11 Mar 2025 12:19:08 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/12-filtering-tombstone-records-in-kafka-connect/</guid>
      <description>&lt;p&gt;Kafka Connect provides a flexible way to process streaming data using Single Message Transforms (SMTs). If you need to filter out tombstone records (records with &lt;code&gt;null&lt;/code&gt; values), you should use the generic &lt;strong&gt;Filter&lt;/strong&gt; transformation along with the &lt;strong&gt;RecordIsTombstone&lt;/strong&gt; predicate.&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Server-Sent Events: Build Real-Time Web Apps with Minimal Code</title>
      <link>https://joelhanson.com/posts/11-build-real-time-web-apps-with-minimal-code/</link>
      <pubDate>Sat, 07 Dec 2024 21:19:08 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/11-build-real-time-web-apps-with-minimal-code/</guid>
      <description>In this technical deep-dive, we unravel the power of Server-Sent Events (SSE), a game-changing web technology that simplifies real-time communication. Developers often struggle with complex, resource-intensive methods for creating live updates, but SSE offers an elegant solution that&amp;rsquo;s both lightweight and powerful.</description>
      
    </item>
    
    <item>
      <title>Online Machine Learning: Real-time Image Classification with CIFAR10 Dataset and Kafka</title>
      <link>https://joelhanson.com/posts/07-online-machine-learning-real-time-image-classification-with-cifar10-dataset-and-kafka/</link>
      <pubDate>Wed, 02 Oct 2024 18:12:07 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/07-online-machine-learning-real-time-image-classification-with-cifar10-dataset-and-kafka/</guid>
      <description>This blog post explores online machine learning through a practical example using the CIFAR10 dataset and Apache Kafka.</description>
      
    </item>
    
    <item>
      <title>Git Aliases to Supercharge Your Workflow</title>
      <link>https://joelhanson.com/posts/05-useful-git-aliases-for-a-productive-workflow/</link>
      <pubDate>Thu, 21 Mar 2024 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/05-useful-git-aliases-for-a-productive-workflow/</guid>
      <description>Git aliases are a powerful workflow tool that create shortcuts to frequently used Git commands.</description>
      
    </item>
    
    <item>
      <title>Mastering the Find Command: Unleashing Unix File Management Power</title>
      <link>https://joelhanson.com/posts/04-mastering-the-find-command-unleashing-unix-file-management-power/</link>
      <pubDate>Wed, 28 Feb 2024 08:03:02 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/04-mastering-the-find-command-unleashing-unix-file-management-power/</guid>
      <description>Discover the unparalleled capabilities of the &amp;lsquo;find&amp;rsquo; command in Unix systems. From basic file searches to advanced manipulations, mastering &amp;lsquo;find&amp;rsquo; empowers users to efficiently navigate, search, and manage files. With practical examples and powerful techniques, this blog unveils the full potential of &amp;lsquo;find&amp;rsquo;, transforming your Unix experience into one of seamless productivity and control. Unlock the power of Unix file management with the mastery of the &amp;lsquo;find&amp;rsquo; command.</description>
      
    </item>
    
    <item>
      <title>Delete logs older than 7 days with find</title>
      <link>https://joelhanson.com/discoveries/find-delete-old-logs/</link>
      <pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/discoveries/find-delete-old-logs/</guid>
      <description>find + -mtime + -delete is safer than a recursive rm when you scope the path.</description>
      
    </item>
    
    <item>
      <title>Mastering the Egg Drop: A Math Heist Unveiled</title>
      <link>https://joelhanson.com/posts/03-solve-egg-drop-with-2-eggs-and-n-floors/</link>
      <pubDate>Fri, 29 Dec 2023 11:20:41 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/03-solve-egg-drop-with-2-eggs-and-n-floors/</guid>
      <description>Mastering the egg drop involves a careful blend of strategy, mathematics, and optimization. From crafting a plan with two replicas to understanding the arithmetic behind the sum formula, the jewel thief&amp;rsquo;s mission highlights the fascinating intersection of math and real-world problem-solving. As we unravel the complexities, we find that breaking a few eggs may require a dash of strategic brilliance and a pinch of mathematical finesse.</description>
      
    </item>
    
    <item>
      <title>Crafting Command-Line Magic with Ease</title>
      <link>https://joelhanson.com/posts/02-bash-cmd-line-argument/</link>
      <pubDate>Sun, 24 Dec 2023 11:23:15 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/02-bash-cmd-line-argument/</guid>
      <description>Different ways to accept arguments in a Bash script</description>
      
    </item>
    
    <item>
      <title>Building a CSV Reader in C with Python Integration</title>
      <link>https://joelhanson.com/posts/01-how-to-load-csv-using-cpython/</link>
      <pubDate>Tue, 19 Dec 2023 20:08:08 +0530</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/01-how-to-load-csv-using-cpython/</guid>
      <description>CSV (Comma-Separated Values) files are a common format for storing tabular data. In this blog post, we&amp;rsquo;ll explore the process of creating a simple CSV reader in C using CPython standard library.</description>
      
    </item>
    
    <item>
      <title>My First Post</title>
      <link>https://joelhanson.com/posts/my-first-post/</link>
      <pubDate>Sat, 16 Dec 2023 14:09:49 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/posts/my-first-post/</guid>
      <description>This my first blog post on my personal website.</description>
      
    </item>
    
    <item>
      <title>Search</title>
      <link>https://joelhanson.com/search/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <author>joelhanson025@gmail.com (Joel Hanson)</author>
      <guid>https://joelhanson.com/search/</guid>
      <description>&lt;p&gt;Use the search button in the header (or press the search shortcut) to find posts and projects by title, tags, or content.&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
