<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" 
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Andre S. Kristensen Blog</title>
    <link>https://andreskristensen.blog</link>
    <description>Technical blog about web development, Sanity CMS, Next.js, and modern web technologies</description>
    <language>en-US</language>
    <lastBuildDate>Sat, 11 Apr 2026 10:03:49 GMT</lastBuildDate>
    <pubDate>Mon, 06 Apr 2026 21:08:57 GMT</pubDate>
    <ttl>60</ttl>
    <atom:link href="https://andreskristensen.blog/feed.xml" rel="self" type="application/rss+xml" />
    <managingEditor>(Andre S. Kristensen)</managingEditor>
    <webMaster>(Andre S. Kristensen)</webMaster>
    <generator>Next.js</generator>
    <docs>https://www.rssboard.org/rss-specification</docs>
    <copyright>Copyright 2026 Andre S. Kristensen</copyright>
    <image>
      <url>https://andreskristensen.blog/opengraph-image.alt</url>
      <title>Andre S. Kristensen Blog</title>
      <link>https://andreskristensen.blog</link>
    </image>

    <item>
      <title>I Fed Brewfather&apos;s API to Claude and Built My Own MCP Server</title>
      <link>https://andreskristensen.blog/posts/i-fed-brewfathers-api-to-claude-and-built-my-own-mcp-server</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/i-fed-brewfathers-api-to-claude-and-built-my-own-mcp-server</guid>
      <pubDate>Mon, 06 Apr 2026 21:08:57 GMT</pubDate>
      <description>Brewfather is a comprehensive app for homebrewers that manages recipe design, batch tracking, fermentation logs, water chemistry, and ingredient inventory, making it a central hub...</description>
      <content:encoded>
        <![CDATA[
          <p>Brewfather is a comprehensive app for homebrewers that manages recipe design, batch tracking, fermentation logs, water chemistry, and ingredient inventory, making it a central hub...</p>
          <p><a href="https://andreskristensen.blog/posts/i-fed-brewfathers-api-to-claude-and-built-my-own-mcp-server">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>Home Brewing</category>
      <category>AI</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/ed9d7904662d1ab2fd36cbedfb60e238665a0062-1024x1024.png" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/968b7def417f8fd0b1a22bc1c15f9124e629e72e.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Using the WAT Framework: Writing Sanity MCP Workflows That Make Claude Consistent and Reliable</title>
      <link>https://andreskristensen.blog/posts/using-the-wat-framework-sanity-mcp-workflows</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/using-the-wat-framework-sanity-mcp-workflows</guid>
      <pubDate>Sun, 15 Mar 2026 21:52:40 GMT</pubDate>
      <description>The text explains why open-ended AI instructions like “write a blog post about TypeScript” lead to inconsistent results. Because models are probabilistic, they vary structure,...</description>
      <content:encoded>
        <![CDATA[
          <p>The text explains why open-ended AI instructions like “write a blog post about TypeScript” lead to inconsistent results. Because models are probabilistic, they vary structure,...</p>
          <p><a href="https://andreskristensen.blog/posts/using-the-wat-framework-sanity-mcp-workflows">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>Sanity</category>
      <category>AI</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/633ac137887bb755c1dd9c145299efb90383e71a-1024x1024.png" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/16b42d08204b8710ec92903279dd2e66de815475.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Serving Your Blog as Markdown So AI Agents Can Actually Read It</title>
      <link>https://andreskristensen.blog/posts/serving-your-blog-as-markdown-for-ai-agents</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/serving-your-blog-as-markdown-for-ai-agents</guid>
      <pubDate>Sun, 15 Mar 2026 21:32:20 GMT</pubDate>
      <description>The article explains how to serve clean Markdown versions of blog posts so AI agents can consume content without HTML noise like navigation, scripts, and...</description>
      <content:encoded>
        <![CDATA[
          <p>The article explains how to serve clean Markdown versions of blog posts so AI agents can consume content without HTML noise like navigation, scripts, and...</p>
          <p><a href="https://andreskristensen.blog/posts/serving-your-blog-as-markdown-for-ai-agents">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>AI</category>
      <category>NextJS</category>
      <category>Sanity</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/eba4ec42b75b86af98229009026182a5a8144430-4896x3264.jpg" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/ac02e10d62bcb755e01ead5b01e8bf93af48254e.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Finished TypeScript Pro Essentials course — quick notes</title>
      <link>https://andreskristensen.blog/posts/finished-typescript-pro-essentials-course-quick-notes</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/finished-typescript-pro-essentials-course-quick-notes</guid>
      <pubDate>Tue, 03 Feb 2026 21:29:49 GMT</pubDate>
      <description>I recently completed the TypeScript Pro Essentials course by Matt Pocock, which turned out to be a solid, comprehensive deep dive into practical TypeScript. The...</description>
      <content:encoded>
        <![CDATA[
          <p>I recently completed the TypeScript Pro Essentials course by Matt Pocock, which turned out to be a solid, comprehensive deep dive into practical TypeScript. The...</p>
          <p><a href="https://andreskristensen.blog/posts/finished-typescript-pro-essentials-course-quick-notes">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>TypeScript</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/457b346d3527287b9a6a9b7a9eb3d16d13d62ca5-1684x1190.png" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/a970b0dde80f4f5a2f0879f51be27d5ad1c1a54a.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Content Agent: AI That Runs Content Operations at Scale</title>
      <link>https://andreskristensen.blog/posts/content-agent-ai-that-runs-content-operations-at-scale</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/content-agent-ai-that-runs-content-operations-at-scale</guid>
      <pubDate>Sat, 17 Jan 2026 19:44:16 GMT</pubDate>
      <description>Content Agent is an AI built specifically for large-scale content operations, going far beyond traditional AI writing assistants that only handle one document at a...</description>
      <content:encoded>
        <![CDATA[
          <p>Content Agent is an AI built specifically for large-scale content operations, going far beyond traditional AI writing assistants that only handle one document at a...</p>
          <p><a href="https://andreskristensen.blog/posts/content-agent-ai-that-runs-content-operations-at-scale">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>Sanity</category>
      <category>AI</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/ccc9c8564eab22d044a7447b56e47ae4aaf7ab1d-6016x4000.jpg" type="image/jpeg" />
      
    </item>

    <item>
      <title>Building a Pixel Art Converter: From DOOM to Modern Portraits</title>
      <link>https://andreskristensen.blog/posts/pixel-art-converter-doom-to-portraits</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/pixel-art-converter-doom-to-portraits</guid>
      <pubDate>Fri, 02 Jan 2026 21:59:17 GMT</pubDate>
      <description>The project began as a simple DOOM-inspired image converter, evolving into a comprehensive pixel art transformation tool. Initially inspired by DOOM&apos;s iconic color palette, the...</description>
      <content:encoded>
        <![CDATA[
          <p>The project began as a simple DOOM-inspired image converter, evolving into a comprehensive pixel art transformation tool. Initially inspired by DOOM&apos;s iconic color palette, the...</p>
          <p><a href="https://andreskristensen.blog/posts/pixel-art-converter-doom-to-portraits">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>AI</category>
      <category>NextJS</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/e5b99d7a8cadb6f7e4a539594d216ec1cf09fe66-300x300.png" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/69c28e6f0ff8717c705ff5d0f3f65dca5d100e15.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Building a GDPR-Compliant Cookie Consent System with Sanity CMS</title>
      <link>https://andreskristensen.blog/posts/gdpr-compliant-cookie-consent-sanity-cms</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/gdpr-compliant-cookie-consent-sanity-cms</guid>
      <pubDate>Tue, 30 Dec 2025 08:15:33 GMT</pubDate>
      <description>The author decided to build a custom cookie consent solution for their blog to avoid the complexities and privacy issues of third-party libraries. Their solution...</description>
      <content:encoded>
        <![CDATA[
          <p>The author decided to build a custom cookie consent solution for their blog to avoid the complexities and privacy issues of third-party libraries. Their solution...</p>
          <p><a href="https://andreskristensen.blog/posts/gdpr-compliant-cookie-consent-sanity-cms">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>Sanity</category>
      <category>NextJS</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/f06033669fd7f73988af6eb3675f1d7bfc9d9ea4-6000x3376.jpg" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/e8be1ef5ca0bc43b4bb8dd40dc124fe12bbeca8b.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Adding an RSS Feed to My Next.js Blog</title>
      <link>https://andreskristensen.blog/posts/implementing-rss-feed-nextjs-blog</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/implementing-rss-feed-nextjs-blog</guid>
      <pubDate>Thu, 25 Dec 2025 22:39:11 GMT</pubDate>
      <description>The blog now offers a fully-featured RSS 2.0 feed, built with the Next.js App Router and Sanity’s content API, so readers can easily subscribe and...</description>
      <content:encoded>
        <![CDATA[
          <p>The blog now offers a fully-featured RSS 2.0 feed, built with the Next.js App Router and Sanity’s content API, so readers can easily subscribe and...</p>
          <p><a href="https://andreskristensen.blog/posts/implementing-rss-feed-nextjs-blog">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>NextJS</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/a28893ecb42bc81ae5320726da44920764da9a77-800x533.jpg" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/bf269e5ad63ecba506ae0a2b41f0ee5d0b08c8f3.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Automating Audio Narration with Sanity Blueprints and Google Text-to-Speech</title>
      <link>https://andreskristensen.blog/posts/automating-audio-narration-sanity-blueprints-google-tts</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/automating-audio-narration-sanity-blueprints-google-tts</guid>
      <pubDate>Mon, 22 Dec 2025 22:36:36 GMT</pubDate>
      <description>I recently developed an automated audio narration pipeline for my blog using Sanity, Next.js, and Google Cloud Text-to-Speech. The system regenerates a high-quality MP3 narration...</description>
      <content:encoded>
        <![CDATA[
          <p>I recently developed an automated audio narration pipeline for my blog using Sanity, Next.js, and Google Cloud Text-to-Speech. The system regenerates a high-quality MP3 narration...</p>
          <p><a href="https://andreskristensen.blog/posts/automating-audio-narration-sanity-blueprints-google-tts">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>AI</category>
      <category>Sanity</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/af91d784bd19e648e83b38378dd8aea1f4e2d791-6000x4000.jpg" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/31d92429ae2bb43dbea4f1d5c9da9fc1c0b28a41.mp3" type="audio/mpeg" length="0" />
    </item>

    <item>
      <title>Building Event-Driven Content Automation: Auto-Summaries with Sanity Agent</title>
      <link>https://andreskristensen.blog/posts/event-driven-content-automation-sanity-agent</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/event-driven-content-automation-sanity-agent</guid>
      <pubDate>Sat, 20 Dec 2025 21:15:59 GMT</pubDate>
      <description>This post discusses the implementation of an automatic summary generation system using Sanity&apos;s event-driven architecture. The system leverages Sanity Agent, Sanity Functions, and Blueprints to...</description>
      <content:encoded>
        <![CDATA[
          <p>This post discusses the implementation of an automatic summary generation system using Sanity&apos;s event-driven architecture. The system leverages Sanity Agent, Sanity Functions, and Blueprints to...</p>
          <p><a href="https://andreskristensen.blog/posts/event-driven-content-automation-sanity-agent">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>AI</category>
      <category>Sanity</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/82824c4c1414de071b93436d25e9db379608b8d8-3840x2160.jpg" type="image/jpeg" />
      
    </item>

    <item>
      <title>Mastering Social Media Previews with the SEO Preview Tool</title>
      <link>https://andreskristensen.blog/posts/mastering-social-media-previews-seo-preview-tool</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/mastering-social-media-previews-seo-preview-tool</guid>
      <pubDate>Sat, 15 Nov 2025 21:40:43 GMT</pubDate>
      <description>Social media is crucial for content distribution in 2025, and the SEO Preview tool is designed to optimize social media posts for maximum engagement. It...</description>
      <content:encoded>
        <![CDATA[
          <p>Social media is crucial for content distribution in 2025, and the SEO Preview tool is designed to optimize social media posts for maximum engagement. It...</p>
          <p><a href="https://andreskristensen.blog/posts/mastering-social-media-previews-seo-preview-tool">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>SEO</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/1db295233ffadbae110529ba7bfc813e6d1787d8-3840x2160.jpg" type="image/jpeg" />
      
    </item>

    <item>
      <title>The AI-Driven Journey: Crafting Content with Sanity MCP</title>
      <link>https://andreskristensen.blog/posts/ai-driven-journey-crafting-content-with-sanity-mcp</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/ai-driven-journey-crafting-content-with-sanity-mcp</guid>
      <pubDate>Wed, 12 Nov 2025 21:31:35 GMT</pubDate>
      <description>Sanity MCP is a Model Context Protocol server that connects AI assistants directly to the Sanity CMS, enabling schema-aware content creation, editing, and querying through...</description>
      <content:encoded>
        <![CDATA[
          <p>Sanity MCP is a Model Context Protocol server that connects AI assistants directly to the Sanity CMS, enabling schema-aware content creation, editing, and querying through...</p>
          <p><a href="https://andreskristensen.blog/posts/ai-driven-journey-crafting-content-with-sanity-mcp">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>Sanity</category>
      <category>AI</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/a9d33e3a74f0197980580596d6231a8924f6ac13-2765x3456.jpg" type="image/jpeg" />
      
    </item>

    <item>
      <title>Reading time sanity blog</title>
      <link>https://andreskristensen.blog/posts/reading-time-sanity-blog</link>
      <guid isPermaLink="true">https://andreskristensen.blog/posts/reading-time-sanity-blog</guid>
      <pubDate>Tue, 11 Nov 2025 14:02:08 GMT</pubDate>
      <description>Reading time estimates are useful for readers to gauge their engagement time with content. For Sanity-powered blogs, calculating reading time is challenging due to Sanity&apos;s...</description>
      <content:encoded>
        <![CDATA[
          <p>Reading time estimates are useful for readers to gauge their engagement time with content. For Sanity-powered blogs, calculating reading time is challenging due to Sanity&apos;s...</p>
          <p><a href="https://andreskristensen.blog/posts/reading-time-sanity-blog">Read full article</a></p>
        ]]>
      </content:encoded>
      <dc:creator>André Kristensen</dc:creator>
      <category>Sanity</category>
      <enclosure url="https://cdn.sanity.io/images/i6gaeymf/production/acab83427a8facf93b98d5a4cb0c168a44df3bee-7008x4672.jpg" type="image/jpeg" />
      <enclosure url="https://cdn.sanity.io/files/i6gaeymf/production/b9f58ca44a096aa1186bc144a0cb1ca99add180e.mp3" type="audio/mpeg" length="0" />
    </item>
  </channel>
</rss>