<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ritesh KC blog</title>
    <link>https://riteshkc.com.np/blog</link>
    <description>Notes on building with AI, retrieval and production web apps.</description>
    <language>en</language>
    <item>
      <title>How to Get a Claude Pro Free Trial in October 2026</title>
      <link>https://riteshkc.com.np/blog/claude-pro-guest-pass</link>
      <guid>https://riteshkc.com.np/blog/claude-pro-guest-pass</guid>
      <description>Anthropic removed the public trial button, but you can still get 7 days of Claude Pro for free. Click here to use an active referral pass.</description>
      <pubDate>Fri, 04 Sep 2026 11:15:00 GMT</pubDate>
    </item>
    <item>
      <title>A status machine belongs in a table</title>
      <link>https://riteshkc.com.np/blog/a-status-machine-belongs-in-a-table</link>
      <guid>https://riteshkc.com.np/blog/a-status-machine-belongs-in-a-table</guid>
      <description>Nine statuses, two sets of allowed transitions, and two names for every state. Moving all of that into rows instead of an if chain got engineering out of the workflow business.</description>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Endpoints that refuse to be oracles</title>
      <link>https://riteshkc.com.np/blog/endpoints-that-refuse-to-be-oracles</link>
      <guid>https://riteshkc.com.np/blog/endpoints-that-refuse-to-be-oracles</guid>
      <description>A 404 on unsubscribe tells an attacker which tokens are real. A 409 on subscribe tells them who is on your list. Honest status codes leak, and the fix reads like a bug.</description>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Every reset link returned 400</title>
      <link>https://riteshkc.com.np/blog/every-reset-link-returned-400</link>
      <guid>https://riteshkc.com.np/blog/every-reset-link-returned-400</guid>
      <description>The reset endpoint was fine. The token was fine. The email was fine. The bug was one path in a captcha config, and the word doing the damage was &quot;includes&quot;.</description>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Ready to submit is not a boolean</title>
      <link>https://riteshkc.com.np/blog/ready-to-submit-is-not-a-boolean</link>
      <guid>https://riteshkc.com.np/blog/ready-to-submit-is-not-a-boolean</guid>
      <description>A submit gate that looked like one rule and needed three, plus an error message that names which of four things the student actually has to fix.</description>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Six socket events, and not one refetch</title>
      <link>https://riteshkc.com.np/blog/six-socket-events-and-not-one-refetch</link>
      <guid>https://riteshkc.com.np/blog/six-socket-events-and-not-one-refetch</guid>
      <description>Realtime usually arrives as a second copy of your state. Treating every socket event as a write into the query cache instead of a signal to refetch keeps it to one.</description>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A trust score you can rebuild from the log</title>
      <link>https://riteshkc.com.np/blog/a-score-you-can-rebuild-from-the-log</link>
      <guid>https://riteshkc.com.np/blog/a-score-you-can-rebuild-from-the-log</guid>
      <description>Ten lines that replay a moderation history into a score, and why clamping inside the fold instead of after it is the difference between working and quietly drifting.</description>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Cache invalidation when the cache is in another repo</title>
      <link>https://riteshkc.com.np/blog/cache-invalidation-in-another-repo</link>
      <guid>https://riteshkc.com.np/blog/cache-invalidation-in-another-repo</guid>
      <description>An admin edits a university and the public page keeps the old number for a day. The backend now calls the frontend, over tag names nothing checks.</description>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Overbooking is a database problem</title>
      <link>https://riteshkc.com.np/blog/overbooking-is-a-database-problem</link>
      <guid>https://riteshkc.com.np/blog/overbooking-is-a-database-problem</guid>
      <description>Counting rows before you insert one is not a capacity check. Here is how a unique index, a constraint violation, and a NULL ended up doing the work instead.</description>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Rate limiting a provider without a rate limiter</title>
      <link>https://riteshkc.com.np/blog/rate-limiting-by-queue-shape</link>
      <guid>https://riteshkc.com.np/blog/rate-limiting-by-queue-shape</guid>
      <description>SES caps sends per second. The fix was worker concurrency of one and a sleep, plus an honest note in the code about the case where it stops working.</description>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The fast moderation layer does less on purpose</title>
      <link>https://riteshkc.com.np/blog/the-fast-moderation-layer-does-less</link>
      <guid>https://riteshkc.com.np/blog/the-fast-moderation-layer-does-less</guid>
      <description>A synchronous gate on five routes that blocks almost nothing, and an async worker that decides everything else. Splitting them by latency was the wrong axis.</description>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>In RAG, recall is the number that matters</title>
      <link>https://riteshkc.com.np/blog/recall-beats-precision</link>
      <guid>https://riteshkc.com.np/blog/recall-beats-precision</guid>
      <description>Why the failure mode that sinks a retrieval system is the right document never showing up, and why that makes recall, not prompt tuning, the thing to optimize.</description>
      <pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>