<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ramya Lakhani — Blog</title>
    <link>https://ramyalakhani.in/blog/</link>
    <description>Notes from production by Ramya Lakhani.</description>
    <language>en</language>
    <item>
      <title>Migrating 11 OpenAI call sites without touching 11 callers</title>
      <link>https://ramyalakhani.in/blog/migrating-to-openai-responses-api/</link>
      <guid>https://ramyalakhani.in/blog/migrating-to-openai-responses-api/</guid>
      <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
      <description>How a single adapter layer moved a 20,000-line chat controller to the Responses API while keeping rollback a one-line change.</description>
    </item>
    <item>
      <title>Webhooks fire twice. Your invoices shouldn't.</title>
      <link>https://ramyalakhani.in/blog/idempotent-payments/</link>
      <guid>https://ramyalakhani.in/blog/idempotent-payments/</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
      <description>Notes on payment idempotency and invoice integrity from building a multi-tenant commerce platform.</description>
    </item>
    <item>
      <title>2,000 pages “Discovered — currently not indexed”: not a technical bug</title>
      <link>https://ramyalakhani.in/blog/discovered-not-indexed/</link>
      <guid>https://ramyalakhani.in/blog/discovered-not-indexed/</guid>
      <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
      <description>Diagnosing a programmatic-SEO indexation problem as crawl budget and authority, and the recovery plan that followed.</description>
    </item>
  </channel>
</rss>