MQTT Explained: Why AI Agents Need an Event Bus
October 24, 2026
Advanced C# tutorials, system design deep-dives, and real-world developer tools built in public.
Active development · Build in Public
An open-source .NET tool, built one episode at a time. It simulates fleets of MQTT clients, each with a Last Will, and measures what a broker does under churn: connect latency first, then how long it takes to tell everyone a client has died.
MQTT Explained: Why AI Agents Need an Event Bus
October 24, 2026
3 Lines and a Copy: Why Your Merger Ships Broken Orders
October 17, 2026
I Deleted My Custom Sharding Service and Used This Hidden Feature
October 11, 2026
Get new posts straight to your inbox via Substack.

NuGet Audit only checks packages when you restore. Use cve.now's free NuGet feed, its KEV and EPSS triage, and its MCP server to find new CVEs in .NET services you haven't rebuilt.
Read more
Run RabbitMQ locally with Aspire, inject its connection into a .NET 10 API, publish and consume a job, inspect the management UI, and understand what local orchestration does not guarantee.
Read more
How change data capture works in PostgreSQL: the WAL, logical decoding, replication slots and publications. Build a working CDC consumer in .NET with Npgsql and Aspire, and see when CDC beats the Outbox pattern.
Read more
Your solution is full of interfaces and you still can't swap anything. The Dependency Inversion Principle isn't about having abstractions — it's about who owns them. Ports, adapters, and the compile-time test that settles the argument in .NET.
Read more
How the Open/Closed Principle actually plays out when you own a NuGet package, why extension methods are .NET's cheapest OCP tool, and what C# 14 extension members in .NET 10 change for library authors.
Read more
Why architecture tests matter more now that agents write code: enforce Clean Architecture layers and module isolation with NetArchTest, xUnit and .NET 10, and turn the rule into a gate an agent must pass.
Read more
Build .NET integration tests that provision PostgreSQL with Testcontainers, configure WebApplicationFactory, apply EF Core migrations, and run unchanged on a workstation or GitHub Actions.
Read more
How the NATS message broker works in .NET: subjects and wildcard subscriptions, queue groups for load balancing, how NATS compares to RabbitMQ and Kafka, and validating every incoming message in one line with MessageValidation.NatsNet.
Read more
Native AOT can reduce startup time and memory usage for focused .NET services, but only when the application and its dependencies are compatible with ahead-of-time compilation.
Read more
Socket exhaustion and stale DNS are the two classic HttpClient bugs. Learn the right lifetime strategy — long-lived clients with PooledConnectionLifetime, or IHttpClientFactory — and how to combine both.
Read moreWritten by Romain Ottonelli Dabadie, .NET engineer. Messaging, distributed systems and the architecture decisions that still hold up two years later. More about me.