<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nicolás Biondi | Blog (en)</title>
    <link>https://nicolasbiondi.com/en/blog/</link>
    <description>Notes on AI agents, ecommerce and the infrastructure behind them. By Nicolás Biondi.</description>
    <language>en</language>
    <lastBuildDate>Sat, 03 Oct 2026 12:00:00 GMT</lastBuildDate>
    <atom:link href="https://nicolasbiondi.com/en/blog/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Boss and interns: How I split coding work across several AI models without the bill exploding</title>
      <link>https://nicolasbiondi.com/en/blog/kitchen-brigade-ai-agents/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/kitchen-brigade-ai-agents/</guid>
      <pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate>
      <description>28 billion tokens in six months, 94% of them read from cache. How I split the work between one expensive model and several cheap ones at LENZ.</description>
      <category>AI Agents</category>
      <category>delegation</category>
      <category>caching</category>
      <category>tokens</category>
      <category>workflow</category>
    </item>
    <item>
      <title>The wrong key: We matched each sale to its row in the sheet instead of the camera sold, so duplicates slipped through</title>
      <link>https://nicolasbiondi.com/en/blog/la-llave-equivocada/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/la-llave-equivocada/</guid>
      <pubDate>Thu, 03 Sep 2026 12:00:00 GMT</pubDate>
      <description>We matched sales by their row in the spreadsheet instead of the camera sold, so every re-pasted block came in as a new sale.</description>
      <category>Lessons</category>
      <category>data-quality</category>
      <category>deduplication</category>
      <category>reconciliation</category>
      <category>sqlite</category>
      <category>postmortem</category>
    </item>
    <item>
      <title>The test mode didn&#39;t test: We sent test mode on every order, but the invoicing API never checked: the account decides that</title>
      <link>https://nicolasbiondi.com/en/blog/el-ensayo-facturo/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/el-ensayo-facturo/</guid>
      <pubDate>Mon, 31 Aug 2026 12:00:00 GMT</pubDate>
      <description>We integrated our invoicing provider&#39;s API trusting the test mode on each order. The API ignored it: the account decides the environment, not the order.</description>
      <category>Lessons</category>
      <category>invoicing</category>
      <category>postmortem</category>
      <category>idempotency</category>
      <category>erp-integration</category>
    </item>
    <item>
      <title>Midnight doesn&#39;t count: Our counter allowed 96 posts in 24 rolling hours and X blocked the bot at post 64</title>
      <link>https://nicolasbiondi.com/en/blog/medianoche-no-cuenta/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/medianoche-no-cuenta/</guid>
      <pubDate>Thu, 13 Aug 2026 12:00:00 GMT</pubDate>
      <description>A bot sat blocked on X: we counted the limit by calendar day and X counts the last 24 rolling hours.</description>
      <category>Lessons</category>
      <category>postmortem</category>
      <category>rate-limits</category>
      <category>rolling-window</category>
      <category>bots</category>
      <category>geocoding</category>
    </item>
    <item>
      <title>The doorbell won&#39;t ding: We changed a key and the alerts chat went quiet without a single error. Now we count the alerts that arrive</title>
      <link>https://nicolasbiondi.com/en/blog/diez-dias-sin-timbre/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/diez-dias-sin-timbre/</guid>
      <pubDate>Sat, 08 Aug 2026 12:00:00 GMT</pubDate>
      <description>We changed a key and the alerts chat went quiet without an error. How to test a new key without posting anything and resend what was missed.</description>
      <category>Infrastructure</category>
      <category>postmortem</category>
      <category>tokens</category>
      <category>monitoring</category>
      <category>reconciliation</category>
    </item>
    <item>
      <title>Free with a meter: A cache spent 2,400 writes a day on a plan that allowed 1,000</title>
      <link>https://nicolasbiondi.com/en/blog/gratis-con-medidor/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/gratis-con-medidor/</guid>
      <pubDate>Thu, 06 Aug 2026 12:00:00 GMT</pubDate>
      <description>A cache wrote to KV on every visit: 2,400 writes a day against a quota of 1,000, and the daily meter we built so it wouldn&#39;t happen again.</description>
      <category>Tokens &amp; Costs</category>
      <category>cloudflare</category>
      <category>quotas</category>
      <category>caching</category>
      <category>metrics</category>
      <category>postmortem</category>
    </item>
    <item>
      <title>One sign per agent: Two agents shared one &#39;do not disturb&#39; and clashed; now each hangs its own sign, with an expiry</title>
      <link>https://nicolasbiondi.com/en/blog/un-cartel-por-agente/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/un-cartel-por-agente/</guid>
      <pubDate>Wed, 05 Aug 2026 12:00:00 GMT</pubDate>
      <description>Test notices announced repairs finished weeks earlier. Two agents shared one mute setting and clashed; now each holds a permit with an owner and expiry.</description>
      <category>AI Agents</category>
      <category>postmortem</category>
      <category>notifications</category>
      <category>concurrency</category>
      <category>workflow</category>
    </item>
    <item>
      <title>Nothing was broken: An agent touched four files in production over a fault that was in Shopify&#39;s index</title>
      <link>https://nicolasbiondi.com/en/blog/nada-estaba-roto/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/nada-estaba-roto/</guid>
      <pubDate>Mon, 03 Aug 2026 12:00:00 GMT</pubDate>
      <description>A valid search returned zero results. An agent changed four files in production and reverted them 18 minutes later: Shopify&#39;s index sorted itself out.</description>
      <category>AI Agents</category>
      <category>postmortem</category>
      <category>search</category>
      <category>data-quality</category>
      <category>metrics</category>
      <category>rollback</category>
    </item>
    <item>
      <title>The API played dumb: Three fields were missing and the API still said &#39;all good&#39;: it filled them in with whatever came to mind</title>
      <link>https://nicolasbiondi.com/en/blog/la-api-rellenaba-los-vacios/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/la-api-rellenaba-los-vacios/</guid>
      <pubDate>Sat, 25 Jul 2026 12:00:00 GMT</pubDate>
      <description>I sent an order missing three fields and the vendor always said it was fine: it filled them in on its own. The official example gave it away.</description>
      <category>Ecommerce</category>
      <category>api-contract</category>
      <category>data-quality</category>
      <category>postmortem</category>
      <category>validation</category>
    </item>
    <item>
      <title>Every click crashed it: We moved a 130 MB file to a real database, and each click dropped from 5 seconds to 0.6 ms</title>
      <link>https://nicolasbiondi.com/en/blog/cada-clic-tumbaba-todo/</link>
      <guid isPermaLink="true">https://nicolasbiondi.com/en/blog/cada-clic-tumbaba-todo/</guid>
      <pubDate>Mon, 25 May 2026 12:00:00 GMT</pubDate>
      <description>An internal board kept tens of thousands of notices in a 130 MB file. We moved it to a real database, and each status change now takes 0.6 ms.</description>
      <category>Infrastructure</category>
      <category>sqlite</category>
      <category>json</category>
      <category>performance</category>
      <category>postmortem</category>
    </item>
  </channel>
</rss>
