<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Joel Codja</title>
    <link>https://joelcodja.com/blog/</link>
    <description>Notes from building things.</description>
    <language>en</language>
    <item>
      <title>The best transactional email services in 2026</title>
      <link>https://joelcodja.com/blog/the-best-transactional-email-services-in-2026/</link>
      <guid>https://joelcodja.com/blog/the-best-transactional-email-services-in-2026/</guid>
      <description>Password resets, receipts and sign-in codes have to arrive. Here are seven ways to send them from your app, starting with the one that keeps your data and your provider in your hands.</description>
      <pubDate>Fri, 23 Oct 2026 00:00:00 GMT</pubDate>
      <category>Tools</category>
    </item>
    <item>
      <title>Validating API input with Zod in TypeScript</title>
      <link>https://joelcodja.com/blog/validating-api-input-with-zod-in-typescript/</link>
      <guid>https://joelcodja.com/blog/validating-api-input-with-zod-in-typescript/</guid>
      <description>TypeScript checks nothing once your app is running. Here is how to validate request bodies, environment variables and API responses with one Zod schema that also gives you the type.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>Backend</category>
    </item>
    <item>
      <title>Why I use Drizzle for every TypeScript backend</title>
      <link>https://joelcodja.com/blog/why-i-use-drizzle-for-every-typescript-backend/</link>
      <guid>https://joelcodja.com/blog/why-i-use-drizzle-for-every-typescript-backend/</guid>
      <description>Raw SQL has no types, and heavy ORMs hide the SQL. Drizzle sits in between: you write TypeScript that reads like SQL, and every query is typed from your schema.</description>
      <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>Tools</category>
    </item>
    <item>
      <title>Implementing AES-256-GCM encryption at rest in Node.js</title>
      <link>https://joelcodja.com/blog/aes-256-gcm-encryption-at-rest-in-nodejs/</link>
      <guid>https://joelcodja.com/blog/aes-256-gcm-encryption-at-rest-in-nodejs/</guid>
      <description>TLS stops protecting your data once it reaches the database. Here is how to encrypt sensitive fields yourself, with Node's native crypto module.</description>
      <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
      <category>Security</category>
    </item>
  </channel>
</rss>
