<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
        <title>Gustavo — tavin.dev</title>
        <link>https://blog.tavin.dev</link>
        <description>Deep technical articles on DDD, CQRS, hexagonal architecture, and TypeScript backend patterns.</description>
        <lastBuildDate>Thu, 15 Oct 2026 14:49:28 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>2026 Gustavo</copyright>
        <item>
            <title><![CDATA[tavin.cloud: A PaaS for the Agent Era]]></title>
            <link>https://blog.tavin.dev/paas-for-the-agent-era</link>
            <guid>https://blog.tavin.dev/paas-for-the-agent-era</guid>
            <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Every PaaS was designed for humans clicking dashboards. tavin.cloud is built on the opposite bet — the first-class deployer is an LLM, the API and MCP server are the same surface, and the launch target is São Paulo bare metal.]]></description>
        </item>
        <item>
            <title><![CDATA[HornetMQ: A BullMQ-Compatible Job Queue for Rust]]></title>
            <link>https://blog.tavin.dev/hornetmq</link>
            <guid>https://blog.tavin.dev/hornetmq</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How I built a Redis-backed job queue in Rust that speaks BullMQ's wire protocol, and how AI brought it back from a two-year hiatus.]]></description>
        </item>
        <item>
            <title><![CDATA[When AI Agents Meet Real Engineering]]></title>
            <link>https://blog.tavin.dev/ai-agents-meet-real-engineering</link>
            <guid>https://blog.tavin.dev/ai-agents-meet-real-engineering</guid>
            <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AI coding agents aren't exposing model limits — they're exposing architecture debt. Why good boundaries matter more than better prompts.]]></description>
        </item>
        <item>
            <title><![CDATA[CQRS Beyond the Basics: When Queries Should Skip Your Domain Model]]></title>
            <link>https://blog.tavin.dev/cqrs-beyond-basics</link>
            <guid>https://blog.tavin.dev/cqrs-beyond-basics</guid>
            <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Command handlers orchestrate domain logic through ports. Query handlers bypass it entirely. The asymmetry is intentional — here's why and how.]]></description>
        </item>
        <item>
            <title><![CDATA[Hexagonal Architecture in NestJS: Ports, Adapters, and the Testing Payoff]]></title>
            <link>https://blog.tavin.dev/hexagonal-nestjs</link>
            <guid>https://blog.tavin.dev/hexagonal-nestjs</guid>
            <pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to structure a NestJS module as a bounded context with ports, adapters, and the concrete testing advantages this unlocks.]]></description>
        </item>
        <item>
            <title><![CDATA[Two Ways to Model Aggregates in TypeScript]]></title>
            <link>https://blog.tavin.dev/aggregate-modeling</link>
            <guid>https://blog.tavin.dev/aggregate-modeling</guid>
            <pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Mutable state machines vs immutable copy-on-write — two real patterns for DDD aggregates in TypeScript, their trade-offs, and when to use each.]]></description>
        </item>
    </channel>
</rss>