<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Mustafa Zidan Abuelfadl</title><description>Notes on software engineering, distributed systems, and using AI to build real things.</description><link>https://zidan.me/</link><item><title>Idempotency in Practice, Part 3: Idempotent Consumers and Pipelines</title><link>https://zidan.me/blog/idempotency-series/part-3-idempotent-consumers-and-pipelines/</link><guid isPermaLink="true">https://zidan.me/blog/idempotency-series/part-3-idempotent-consumers-and-pipelines/</guid><description>The idempotent consumer pattern implemented (processed-message table in the same transaction), dedup identity for events, Kafka&apos;s exactly-once machinery taken apart honestly, offset-commit ordering, and the series-capstone retrofit checklist.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Idempotency in Practice, Part 2: Building the Key Store</title><link>https://zidan.me/blog/idempotency-series/part-2-building-the-key-store/</link><guid isPermaLink="true">https://zidan.me/blog/idempotency-series/part-2-building-the-key-store/</guid><description>Brandur Leach&apos;s Stripe-style Postgres key store walked end to end in Kotlin: the schema, atomic claim via ON CONFLICT, recovery points so a crashed request resumes instead of double-executing, the Redis variant compared honestly, and the window you can&apos;t close.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Idempotency in Practice, Part 1: The Exactly-Once Lie</title><link>https://zidan.me/blog/idempotency-series/part-1-the-exactly-once-lie/</link><guid isPermaLink="true">https://zidan.me/blog/idempotency-series/part-1-the-exactly-once-lie/</guid><description>Why exactly-once delivery is impossible, the at-most-once vs at-least-once dichotomy, idempotency keys (who mints them, where they live, when they expire), and a taxonomy of operations by natural idempotency.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Distributed Clocks and Ordering, Part 3: Hybrid Clocks in Production</title><link>https://zidan.me/blog/distributed-clocks-series/part-3-hybrid-clocks-in-production/</link><guid isPermaLink="true">https://zidan.me/blog/distributed-clocks-series/part-3-hybrid-clocks-in-production/</guid><description>Hybrid logical clocks walked by hand, CockroachDB&apos;s uncertainty intervals and read restarts, Spanner&apos;s TrueTime and commit-wait, Cassandra&apos;s last-write-wins as a cautionary tale, and a decision sketch for choosing a clock.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Distributed Clocks and Ordering, Part 2: Logical Clocks</title><link>https://zidan.me/blog/distributed-clocks-series/part-2-logical-clocks/</link><guid isPermaLink="true">https://zidan.me/blog/distributed-clocks-series/part-2-logical-clocks/</guid><description>Lamport clocks, vector clocks, the version-vector distinction almost every article gets wrong, the sibling-explosion failure that motivated dotted version vectors, and interval tree clocks for dynamic membership.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate></item><item><title>Distributed Clocks and Ordering, Part 1: Wall Clocks and Causality</title><link>https://zidan.me/blog/distributed-clocks-series/part-1-wall-clocks-and-causality/</link><guid isPermaLink="true">https://zidan.me/blog/distributed-clocks-series/part-1-wall-clocks-and-causality/</guid><description>Why physical timestamps can&apos;t order distributed events — NTP slewing and stepping, leap-second carnage, monotonic vs wall clocks, and Lamport&apos;s happened-before as the only order a distributed system can compute without coordination.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate></item><item><title>CRDTs from Scratch, Part 3: Use Cases, Libraries, and the Limits</title><link>https://zidan.me/blog/crdts-from-scratch/part-3-use-cases-and-libraries/</link><guid isPermaLink="true">https://zidan.me/blog/crdts-from-scratch/part-3-use-cases-and-libraries/</guid><description>Where CRDTs ship today (Yjs, Automerge, Loro, Riak, Redis), the metadata and invariant costs, and when not to reach for one.</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate></item><item><title>CRDTs from Scratch, Part 2: The Zoo, Implemented in Go</title><link>https://zidan.me/blog/crdts-from-scratch/part-2-the-crdt-zoo/</link><guid isPermaLink="true">https://zidan.me/blog/crdts-from-scratch/part-2-the-crdt-zoo/</guid><description>Building the classic CRDTs in Go: G-Counter, PN-Counter, LWW- and MV-Registers, G-Set / 2P-Set / OR-Set, and an RGA sketch for collaborative sequences.</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate></item><item><title>CRDTs from Scratch, Part 1: The Foundations</title><link>https://zidan.me/blog/crdts-from-scratch/part-1-foundations/</link><guid isPermaLink="true">https://zidan.me/blog/crdts-from-scratch/part-1-foundations/</guid><description>The intuition and the math behind Conflict-free Replicated Data Types: Strong Eventual Consistency, join semilattices, and the difference between state-based and operation-based replication.</description><pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Event Sourcing from the Ground Up, Part 4: Production Realities</title><link>https://zidan.me/blog/event-sourcing-from-the-ground-up/part-4-production-realities/</link><guid isPermaLink="true">https://zidan.me/blog/event-sourcing-from-the-ground-up/part-4-production-realities/</guid><description>Schema evolution and upcasting, the right to be forgotten, why Kafka isn&apos;t an event store, dynamic consistency boundaries, and the 2026 JVM library landscape.</description><pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Event Sourcing from the Ground Up, Part 3: CQRS and Projections</title><link>https://zidan.me/blog/event-sourcing-from-the-ground-up/part-3-cqrs-and-projections/</link><guid isPermaLink="true">https://zidan.me/blog/event-sourcing-from-the-ground-up/part-3-cqrs-and-projections/</guid><description>Splitting reads from writes: projections as folds over the log, checkpoints and rebuilds, living with eventual consistency, and integration events.</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Event Sourcing from the Ground Up, Part 2: Building It in Kotlin</title><link>https://zidan.me/blog/event-sourcing-from-the-ground-up/part-2-building-it-in-kotlin/</link><guid isPermaLink="true">https://zidan.me/blog/event-sourcing-from-the-ground-up/part-2-building-it-in-kotlin/</guid><description>A from-scratch Kotlin event store with optimistic concurrency, a bank-account decider, replay, and snapshots — about 150 lines, no framework.</description><pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Event Sourcing from the Ground Up, Part 1: The Log Is the Truth</title><link>https://zidan.me/blog/event-sourcing-from-the-ground-up/part-1-foundations/</link><guid isPermaLink="true">https://zidan.me/blog/event-sourcing-from-the-ground-up/part-1-foundations/</guid><description>The intuition behind event sourcing: events vs commands vs state, the event store contract, the benefits and the costs that compound, and a precise comparison with CRDTs.</description><pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate></item><item><title>Turn Your Coding Agent into a Grounded Coding Assistant</title><link>https://zidan.me/blog/turn-your-coding-agent-into-a-grounded-coding-assistant/</link><guid isPermaLink="true">https://zidan.me/blog/turn-your-coding-agent-into-a-grounded-coding-assistant/</guid><description>Using Docs-MCP-Server to ground a coding agent in real, up-to-date library docs so it stops hallucinating APIs that don&apos;t exist.</description><pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate></item><item><title>A Self-Hosted “Read ↔ Listen ↔ Ask” Reader: My Journey &amp; How to Use It</title><link>https://zidan.me/blog/a-self-hosted-read-listen-ask-reader-my-journey-how-to-use-it/</link><guid isPermaLink="true">https://zidan.me/blog/a-self-hosted-read-listen-ask-reader-my-journey-how-to-use-it/</guid><description>Stitching together a local EPUB reader, Orpheus TTS, and an LLM into a self-hosted reading workflow that fits how I actually read.</description><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate></item><item><title>Software Engineering in the Time of AI</title><link>https://zidan.me/blog/software-engineering-in-the-time-of-ai/</link><guid isPermaLink="true">https://zidan.me/blog/software-engineering-in-the-time-of-ai/</guid><description>AI is already part of the developer’s toolkit, but it’s not the revolution many are claiming. Its value lies in automation, not intelligence.</description><pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate></item><item><title>Airflow on Kubernetes, Part 4: XCom on Object Storage, Secrets, and Slack Alerts</title><link>https://zidan.me/blog/airflow-on-kubernetes-series/part-4-xcom-secrets-slack/</link><guid isPermaLink="true">https://zidan.me/blog/airflow-on-kubernetes-series/part-4-xcom-secrets-slack/</guid><description>Moving XCom payloads to object storage instead of bloating the metadata DB, managing secrets and connections the isolated-worker way, and wiring up Slack notifications for failing DAGs.</description><pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Airflow on Kubernetes, Part 3: Executors and the Execution Lifecycle</title><link>https://zidan.me/blog/airflow-on-kubernetes-series/part-3-executors-and-lifecycle/</link><guid isPermaLink="true">https://zidan.me/blog/airflow-on-kubernetes-series/part-3-executors-and-lifecycle/</guid><description>When to use Local vs Celery vs Kubernetes (and multi-executor), the full task lifecycle, how a worker actually gets its task, and what happens when code changes mid-run.</description><pubDate>Fri, 25 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Airflow on Kubernetes, Part 2: The Metadata Database and PgBouncer</title><link>https://zidan.me/blog/airflow-on-kubernetes-series/part-2-database-pgbouncer/</link><guid isPermaLink="true">https://zidan.me/blog/airflow-on-kubernetes-series/part-2-database-pgbouncer/</guid><description>Why Airflow opens so many connections, how to size the SQLAlchemy pool, and why PgBouncer in transaction mode is non-negotiable for Postgres.</description><pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Airflow on Kubernetes, Part 1: Setup, Architecture, and the git-sync Sidecar</title><link>https://zidan.me/blog/airflow-on-kubernetes-series/part-1-setup-helm-gitsync/</link><guid isPermaLink="true">https://zidan.me/blog/airflow-on-kubernetes-series/part-1-setup-helm-gitsync/</guid><description>The moving pieces of Airflow 3, the git-sync sidecar pattern for DAG delivery, and the image-rebuild-on-dependency-change workflow with Helmsman.</description><pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Building a Vision-Language API to Convert PDFs into Markdown with SmolDocling</title><link>https://zidan.me/blog/building-a-vision-language-api-to-convert-pdfs-into-markdown-with-smoldocling/</link><guid isPermaLink="true">https://zidan.me/blog/building-a-vision-language-api-to-convert-pdfs-into-markdown-with-smoldocling/</guid><description>Building a blazing-simple API on top of SmolDocling, an ultra-compact vision-language model that turns messy PDFs into clean, structured Markdown: tables, equations, code blocks, and all.</description><pubDate>Sat, 08 Mar 2025 00:00:00 GMT</pubDate></item><item><title>Monitoring Next.js with Prometheus in Kubernetes</title><link>https://zidan.me/blog/monitoring-next-js-with-prometheus-in-kubernetes/</link><guid isPermaLink="true">https://zidan.me/blog/monitoring-next-js-with-prometheus-in-kubernetes/</guid><description>Wiring Prometheus into a Next.js app via Server Actions and deploying the whole thing inside a Kind cluster.</description><pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate></item></channel></rss>