<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Abdel Ahzab — Writing</title>
    <link>https://www.codefolio.dev/writing</link>
    <atom:link href="https://www.codefolio.dev/rss.xml" rel="self" type="application/rss+xml"/>
    <description>Notes on shipping SaaS solo: applied AI, Next.js, security, and building in public.</description>
    <language>en</language>
    <item>
      <title>I gave my AI a workflow instead of a chat window</title>
      <link>https://www.codefolio.dev/writing/ai-daily-loop</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/ai-daily-loop</guid>
      <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
      <category>Applied AI</category>
      <description>An AI in a chat window is a brilliant contractor with amnesia. I stopped being its memory and moved it into my repo, where state lives in files and it runs one phase of my day at a time.</description>
    </item>
    <item>
      <title>How to handle a production incident without making it worse</title>
      <link>https://www.codefolio.dev/writing/incident-response</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/incident-response</guid>
      <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
      <category>Incidents</category>
      <description>When something breaks in production the instinct is to dive into the code. The right first moves are calmer than that. Stabilize, communicate, then find the cause.</description>
    </item>
    <item>
      <title>Stop parsing LLM text. Use tool calls.</title>
      <link>https://www.codefolio.dev/writing/structured-outputs</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/structured-outputs</guid>
      <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
      <category>Applied AI</category>
      <description>Asking a model for JSON and parsing the text breaks in production. Define a typed tool, force the model to call it, and get validated structured data back.</description>
    </item>
    <item>
      <title>Cut your LLM bill with prompt caching</title>
      <link>https://www.codefolio.dev/writing/prompt-caching</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/prompt-caching</guid>
      <pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate>
      <category>Applied AI</category>
      <description>Most AI features resend the same large prompt every call and pay full price for it. Cache the stable prefix and pay a fraction on every reuse.</description>
    </item>
    <item>
      <title>The Supabase mistake that exposes your data</title>
      <link>https://www.codefolio.dev/writing/supabase-rls</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/supabase-rls</guid>
      <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
      <category>Stack</category>
      <description>Filtering data in your queries and hiding it in the UI feels secure. Without Row Level Security, anyone with your public anon key can read the whole table.</description>
    </item>
    <item>
      <title>I almost listed a product I never built</title>
      <link>https://www.codefolio.dev/writing/fake-door-honesty</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/fake-door-honesty</guid>
      <pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate>
      <category>Building</category>
      <description>A fake-door landing page is a great way to test demand. It is not a product. Calling it one costs the trust that building in public runs on.</description>
    </item>
    <item>
      <title>I audited my own online presence. It was a mess.</title>
      <link>https://www.codefolio.dev/writing/profile-audit</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/profile-audit</guid>
      <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
      <category>Building</category>
      <description>Three profiles, three different people, none of them the one actually building. Your profiles are your storefront, and mine contradicted each other.</description>
    </item>
    <item>
      <title>Your Next.js Server Action is a public endpoint</title>
      <link>https://www.codefolio.dev/writing/nextjs-server-actions</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/nextjs-server-actions</guid>
      <pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <description>A server action looks like a function call, but it compiles to a public POST endpoint anyone can hit with any arguments. Authenticate and validate inside it.</description>
    </item>
    <item>
      <title>What actually ends up in your Next.js client bundle</title>
      <link>https://www.codefolio.dev/writing/nextjs-client-bundle</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/nextjs-client-bundle</guid>
      <pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate>
      <category>Next.js</category>
      <description>NEXT_PUBLIC env vars and anything a client component imports ship to the browser. One import line can leak a secret. The server-only package makes it impossible.</description>
    </item>
    <item>
      <title>Verify your Stripe webhooks, or anyone can grant themselves Pro</title>
      <link>https://www.codefolio.dev/writing/stripe-webhook-verification</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/stripe-webhook-verification</guid>
      <pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate>
      <category>Security</category>
      <description>An unverified webhook endpoint is a public URL that upgrades accounts. Without signature verification, anyone can POST a fake checkout.session.completed and unlock your paid plan.</description>
    </item>
    <item>
      <title>Cut the feature list before you build it</title>
      <link>https://www.codefolio.dev/writing/cut-the-feature-list</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/cut-the-feature-list</guid>
      <pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate>
      <category>Building</category>
      <description>Shipping solo means the bottleneck is always you. The way to ship is not to work faster, it is to build less. Cut to the one thing that tests the bet.</description>
    </item>
    <item>
      <title>What a high-traffic checkout taught me about reliability</title>
      <link>https://www.codefolio.dev/writing/checkout-reliability</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/checkout-reliability</guid>
      <pubDate>Tue, 27 May 2025 00:00:00 GMT</pubDate>
      <category>Scale</category>
      <description>Years on a production e-commerce checkout came down to a few hard rules. Make every operation idempotent, never trust the network, and degrade instead of failing.</description>
    </item>
    <item>
      <title>Redux that survives a complex checkout</title>
      <link>https://www.codefolio.dev/writing/redux-at-scale</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/redux-at-scale</guid>
      <pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate>
      <category>Frontend</category>
      <description>A real checkout has more state than a tutorial admits. A few rules keep a large Redux store maintainable. Normalize it, read through selectors, and keep side effects out of components.</description>
    </item>
    <item>
      <title>Why I reach for Vert.x on high-throughput services</title>
      <link>https://www.codefolio.dev/writing/vertx-event-loop</link>
      <guid isPermaLink="true">https://www.codefolio.dev/writing/vertx-event-loop</guid>
      <pubDate>Tue, 18 Mar 2025 00:00:00 GMT</pubDate>
      <category>Backend</category>
      <description>A thread per request does not scale to thousands of concurrent connections. An event loop does. Vert.x on the JVM with Kotlin makes non-blocking services that stay fast under load.</description>
    </item>
  </channel>
</rss>
