<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[AI Engineering Report]]></title><description><![CDATA[Practical news, tool deep dives, and how-tos for software engineers building with AI.]]></description><link>https://www.aiengineering.report</link><image><url>https://substackcdn.com/image/fetch/$s_!3S-C!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b99cbff-dbb8-4b0a-ad42-7bb6e81806a5_1024x1024.png</url><title>AI Engineering Report</title><link>https://www.aiengineering.report</link></image><generator>Substack</generator><lastBuildDate>Sat, 09 May 2026 03:07:51 GMT</lastBuildDate><atom:link href="https://www.aiengineering.report/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Bill Prin]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[aiengineeringreport@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[aiengineeringreport@substack.com]]></itunes:email><itunes:name><![CDATA[Bill Prin]]></itunes:name></itunes:owner><itunes:author><![CDATA[Bill Prin]]></itunes:author><googleplay:owner><![CDATA[aiengineeringreport@substack.com]]></googleplay:owner><googleplay:email><![CDATA[aiengineeringreport@substack.com]]></googleplay:email><googleplay:author><![CDATA[Bill Prin]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Beautiful Landing Pages with Nano Banana Pro ]]></title><description><![CDATA[Language models like Gemini and image models like Nano Banana Pro have both gotten much better at UI/UX design, but to unlock their full potential, you need to combine the two model types.]]></description><link>https://www.aiengineering.report/p/beautiful-landing-pages-with-nano</link><guid isPermaLink="false">https://www.aiengineering.report/p/beautiful-landing-pages-with-nano</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Thu, 18 Dec 2025 18:35:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2db1aa99-e5be-4c9e-8016-2b655fbe3659_1216x864.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1Ddv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Ddv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1Ddv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1Ddv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1Ddv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Ddv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg" width="1200" height="896" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:896,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:684310,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1Ddv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1Ddv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1Ddv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1Ddv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F048bc7d0-07c3-4462-8b9f-af0c4e17b167_1200x896.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Coding agents like Claude Opus 4.5 and Gemini Pro 3 can now generate decent-looking and functional UIs, but the designs they produce are often bland and uninspiring, and often resort to the same overdone patterns like purple gradients. This can be improved with smart prompting strategies, but there&#8217;s still a creative limit.</p><p>If you stick purely with coding agents for UI design, you are missing out on the massive improvements you can get by <strong>combining language models with image models</strong> <strong>to get the best of both worlds. </strong>This is 10x more true than ever since Google released Nano Banana Pro, and <em>incredible</em> image model.</p><p>Here&#8217;s a comparison of two landing pages for an AI coding course, the first generated by Gemini Pro and the second by Nano Banana Pro.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sVt7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sVt7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 424w, https://substackcdn.com/image/fetch/$s_!sVt7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 848w, https://substackcdn.com/image/fetch/$s_!sVt7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 1272w, https://substackcdn.com/image/fetch/$s_!sVt7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sVt7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png" width="1456" height="1859" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1859,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2849177,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sVt7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 424w, https://substackcdn.com/image/fetch/$s_!sVt7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 848w, https://substackcdn.com/image/fetch/$s_!sVt7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 1272w, https://substackcdn.com/image/fetch/$s_!sVt7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e73d303-0df9-424d-aba6-4032a3c920ca_4536x5792.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The page generated by Nano Banana is much more creative and visually appealing. Additionally, it&#8217;s faster to iterate because you can generate images faster than a coding agent can code a new page. Here&#8217;s another landing page for the same concept we quickly generated:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Mzv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Mzv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 424w, https://substackcdn.com/image/fetch/$s_!5Mzv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 848w, https://substackcdn.com/image/fetch/$s_!5Mzv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 1272w, https://substackcdn.com/image/fetch/$s_!5Mzv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Mzv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png" width="1456" height="605" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31509be8-63ea-4179-be33-2030552cea77_1958x814.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:605,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2270648,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5Mzv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 424w, https://substackcdn.com/image/fetch/$s_!5Mzv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 848w, https://substackcdn.com/image/fetch/$s_!5Mzv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 1272w, https://substackcdn.com/image/fetch/$s_!5Mzv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31509be8-63ea-4179-be33-2030552cea77_1958x814.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Nano Banana Pro is particularly exciting because it&#8217;s <em>much</em> better than previous image models at UI design, which often struggled to render text or comply with the prompt on small details.</p><p>Let&#8217;s talk about a <strong>workflow to combine language and image models for landing page design</strong>. </p><h3>Anthropic&#8217;s Frontend Design Skill</h3><p>Before we dive into the Gemini + Nano Banana workflow, it&#8217;s worth reviewing Anthropic&#8217;s &#8220;frontend design&#8221; Claude Skill, which is <a href="https://github.com/anthropics/claude-code/blob/main/plugins/frontend-design/skills/frontend-design/SKILL.md">open-source on GitHub</a>, and can be installed as a plugin with the following commands:</p><blockquote><p>/plugin marketplace add anthropic/claude-code</p><p>/plugin install frontend-design@claude-code-plugins</p></blockquote><p>This skill was created precisely to solve the "purple gradient AI UI slop&#8221; , and it does a decent job at pushing the agent to do something a bit more unique and creative.</p><p>What I find especially fascinating is that the skill doesn&#8217;t provide <em>that much </em>specific guidance but instead provides a framework for the model to apply &#8220;design thinking&#8221; and to commit to a creative aesthetic.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P5Xb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P5Xb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 424w, https://substackcdn.com/image/fetch/$s_!P5Xb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 848w, https://substackcdn.com/image/fetch/$s_!P5Xb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 1272w, https://substackcdn.com/image/fetch/$s_!P5Xb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P5Xb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png" width="1456" height="606" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/790752c8-8e31-4524-871b-be441119d02d_2380x990.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:606,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:311092,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P5Xb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 424w, https://substackcdn.com/image/fetch/$s_!P5Xb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 848w, https://substackcdn.com/image/fetch/$s_!P5Xb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 1272w, https://substackcdn.com/image/fetch/$s_!P5Xb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F790752c8-8e31-4524-871b-be441119d02d_2380x990.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you&#8217;re doing UI coding in Claude Code, I&#8217;d consider installing this plugin and skill mandatory. But while it significantly improves the UIs that Claude generates, the creative output is still significantly short of what Nano Banana can create.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Building an AI Design Workflow</h3><p>The important takeaway here from Anthropic&#8217;s frontend skill is something most devs who have done a lot of AI coding already know - <em>LLMs are much better at complex tasks if they first build a plan for that task</em>, <em>then execute that plan</em>. </p><p><strong>Design is no different</strong>. So our workflow will be something like:</p><ol><li><p>Use the &#8220;design thinking&#8221; prompts to build a <em>plan</em> for the landing page we want to make. Besides applying design thinking principles, this is also where we ask it to decide on a hierarchy, typography, color scheme, and general creative aesthetic. Optionally, include reference images for aesthetic inspiration.</p></li><li><p>Ask the language model to generate ASCII mocks so we can quickly iterate on specific copy and features of the landing page we want.</p></li><li><p>Now provide this design plan to the image model , Nano Banana Pro. This is an important step, as image generators will create much more visually interesting designs than a coding agent, which tend to avoid anything visually complex.</p></li><li><p>Once we have an image we like, we often want to extract smaller assets out of the full design. We can ask the image model to remove various components until we&#8217;ve isolated the assets we need.</p></li><li><p>Finally, we provide a coding agent with our reference image and isolated assets and have it code up the final page </p></li></ol><p>This approach lets us iterate on the design more efficiently, as having a coding agent code up a landing page is the slowest way to try a new design. With this system, we first iterate on the components on the landing page with fast text discussion and ASCII mocks. Then, we iterate on the visual design with the image generator, which is still much faster than coding up a full page. Finally, once we&#8217;re happy with the look and feel of our page, we have the coding agent actually build it.</p><h3>1. Planning the Design with the Language Model (Gemini, Claude, or ChatGPT)</h3><p>For iterating with Gemini and Nano Banana, I mostly stuck with <a href="https://aistudio.google.com/">Google AI Studio </a>where it&#8217;s easy to switch back and forth between the two. </p><p>Here is the <em>system prompt</em> I used for Gemini Pro 3 to plan the model (<a href="https://gist.github.com/waprin/fc007ddfb4dc2ca8fc9e81e98ffff1f4">link</a>). Similar to the Anthropic frontend plugin, it encourages design thinking and creating something unique.</p><p>Then, I prompted Gemini 3 Pro to give me a <em>plan</em> for a landing page. Here&#8217;s my second user prompt. (<a href="https://gist.github.com/waprin/c2e3ea56e35d9997ce174d61679d6c8b">link</a>) </p><p>I also provided additional <em>reference</em> images, which are optional but could help. This is an opportunity to find various visual inspiration online on sites like Dribbble, Mobbin, or Reeoo. You can also use any stock photography site or inspiration site like Pinterest if you just want to provide an aesthetic inspiration. And if you can also provide a reference image of an existing version of the page if you want to stick to that structure.</p><p>But what&#8217;s important is that we explicitly ask for a landing page plan with this part of the prompt:</p><blockquote><p>Plan the design, specifically regarding: Ratio of the section Layout, spacing, and white space Texture and backgrounds Animations Be extremely creative</p></blockquote><p>This lets the language model use its knowledge of design, layout, and hierarchy to create a <em>structure</em> for our landing page:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0GBN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0GBN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 424w, https://substackcdn.com/image/fetch/$s_!0GBN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 848w, https://substackcdn.com/image/fetch/$s_!0GBN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 1272w, https://substackcdn.com/image/fetch/$s_!0GBN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0GBN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png" width="1456" height="1219" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1219,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:411236,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0GBN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 424w, https://substackcdn.com/image/fetch/$s_!0GBN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 848w, https://substackcdn.com/image/fetch/$s_!0GBN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 1272w, https://substackcdn.com/image/fetch/$s_!0GBN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fe88dd7-1e11-4539-9a40-cc1b9c7ad291_1600x1340.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>2. Iterate on the basic landing page structure in ASCII</h3><p>As mentioned, we can start to discuss the basic look and feel of the landing page structure with ASCII mocks. This is going to be the fastest way to iterate on the basic structure. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ygjk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ygjk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 424w, https://substackcdn.com/image/fetch/$s_!ygjk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 848w, https://substackcdn.com/image/fetch/$s_!ygjk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 1272w, https://substackcdn.com/image/fetch/$s_!ygjk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ygjk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png" width="1456" height="823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:823,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122724,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ygjk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 424w, https://substackcdn.com/image/fetch/$s_!ygjk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 848w, https://substackcdn.com/image/fetch/$s_!ygjk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 1272w, https://substackcdn.com/image/fetch/$s_!ygjk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8dc11f7a-7c84-4fb5-b444-4168a4df4c91_1578x892.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>3. Switch to an image model like Nano Banana and use your design plan as the input</h2><p>Now that we have a plan and landing page mocks we&#8217;re happy with, we can switch our model from Gemini to Nano Banana Pro and provide this instruction:</p><blockquote><p>help me design a UI mock for the hero section, output image</p></blockquote><p>From there, we can iterate on a design that looks good:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Flsj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Flsj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 424w, https://substackcdn.com/image/fetch/$s_!Flsj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 848w, https://substackcdn.com/image/fetch/$s_!Flsj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 1272w, https://substackcdn.com/image/fetch/$s_!Flsj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Flsj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png" width="1456" height="1072" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/541460c8-183b-4185-b431-70535b735af5_1608x1184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1072,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1107187,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Flsj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 424w, https://substackcdn.com/image/fetch/$s_!Flsj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 848w, https://substackcdn.com/image/fetch/$s_!Flsj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 1272w, https://substackcdn.com/image/fetch/$s_!Flsj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F541460c8-183b-4185-b431-70535b735af5_1608x1184.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>4. Extract Visual Assets The Coding Agent Will Need</h2><p>As you can see in the example above, Nano Banana can generate great-looking visual assets that a coding agent would never make, but it generates a single image. For our coding agent to build this page, it might need specific assets. </p><p>Fortunately, we can talk to Nano Banana and ask it to remove various pieces until we have just the individual assets that we can use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6U8-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6U8-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 424w, https://substackcdn.com/image/fetch/$s_!6U8-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 848w, https://substackcdn.com/image/fetch/$s_!6U8-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!6U8-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6U8-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png" width="1456" height="1076" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1076,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1031298,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/181917599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6U8-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 424w, https://substackcdn.com/image/fetch/$s_!6U8-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 848w, https://substackcdn.com/image/fetch/$s_!6U8-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 1272w, https://substackcdn.com/image/fetch/$s_!6U8-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28730bbe-8675-453f-9c6e-e74d602212bf_1596x1180.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Another optional way to spice up this step is to use image-to-video models like Google Veo to generate short video animations that could make your landing page really pop. </p><h2>5. Have the coding agent code it up!</h2><p>Now we have a landing page design plan and design system generated in step 1, we have a final reference image that we&#8217;re happy with in step 3, and we have individual creative assets the coding agent can use generated in step 4. </p><p><em>Now</em>, we can go back to Claude Code, Cursor, or our favorite coding agent or IDE and implement the landing page. The coding agent will have a clear plan and a clear visual reference. Just as importantly, <em>you</em> have a clear plan and a clear visual reference to make sure the page looks the way you wanted it to. </p><p>An interesting area to explore here is using the Playwright MCP to try to get your agent to build the app until the screenshots of the app match the reference screenshots.</p><h3>Wrapping It Up</h3><p>I copied most of this workflow from &#8216;AI Jason&#8217;s YouTube video &#8220;<a href="https://www.youtube.com/watch?v=RYnxU_MTVvU&amp;t=265s">Nano Banana + Gemini 3 = S-Tier UI Designer&#8221;</a> video. My mind was blown watching his video and trying it out on various projects of mine to great success, so I felt compelled to share.</p><p>I&#8217;m a typical programmer who has <em>lots</em> of fun ideas, but like many programmers, I&#8217;ve struggled with the visual aesthetic aspect of app design. And anyone who&#8217;s published any sort of software online knows that your apps looking good often matters <em>a lot</em>.</p><p>What I love about this workflow is that it leverages <em>both</em> language models and image models to get the best of both worlds. With the language model, you get a cohesive <em>plan</em> and <em>design system</em> that you can re-use throughout your project. With the image model, you get the maximum amount of visual creativity. Then finally, you head back to your coding agent to get it built for real.</p><p>Building professional-looking software is more accessible than ever, but there&#8217;s still plenty of challenges in optimizing design workflows like these. I&#8217;m hoping to dive deeper on this topic, especially around building more complex UIs, and streamlining the process, and experimenting with tools like Playwright MCP to match the agent&#8217;s work to the reference image.</p><p>I hope this topic fascinates you as much as it does me. Happy holidays and I look forward to sharing more AI coding experiments in 2026!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/p/beautiful-landing-pages-with-nano/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.aiengineering.report/p/beautiful-landing-pages-with-nano/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Was MCP a mistake? The internet weighs in ]]></title><description><![CDATA[Anthropic released a new blog post about fixing MCP's problems with code execution, but many internet commentators argued it only highlights that MCP is fundamentally flawed and unnecessary.]]></description><link>https://www.aiengineering.report/p/was-mcp-a-mistake-the-internet-weighs</link><guid isPermaLink="false">https://www.aiengineering.report/p/was-mcp-a-mistake-the-internet-weighs</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Wed, 19 Nov 2025 19:06:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vsno!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vsno!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vsno!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!vsno!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!vsno!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!vsno!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vsno!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28672,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/179377831?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vsno!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!vsno!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!vsno!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!vsno!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab75a6b5-482d-4cbd-85be-c75d825ef885_1456x1048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>MCP is pissing a lot of people off, which may seem surprising for a software protocol. Earlier this month, Anthropic published <a href="https://www.anthropic.com/engineering/code-execution-with-mcp">a blog post on how to make MCP 98.7% more token efficient with code execution</a>. You&#8217;d think this would be a <em>good</em> thing, but for large parts of the community, they don&#8217;t see &#8220;MCP with code execution&#8221; as an improvement of MCP as much as proof that MCP <em>never should have existed at all</em>. And honestly? They&#8217;re making some pretty strong points.</p><p>First, let&#8217;s cover the problems Anthropic is highlighting in their blog post. </p><h1>Two Problems with MCP that Anthropic Highlights</h1><p>The first problem is that <strong>MCP tools eat up a </strong><em><strong>lot </strong></em><strong>of context,</strong> which both limits how much additional context you can fit into your window for actually <em>doing</em> things, but also raises your LLM usage and cost. As I <a href="https://twitter.com/@bill_prin">tweeted earlier</a>, using just <em>two</em> MCP tools, I already eat up 20% of my context window, before I&#8217;ve even done anything! </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JwYT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JwYT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 424w, https://substackcdn.com/image/fetch/$s_!JwYT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 848w, https://substackcdn.com/image/fetch/$s_!JwYT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 1272w, https://substackcdn.com/image/fetch/$s_!JwYT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JwYT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png" width="611" height="321" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:321,&quot;width&quot;:611,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73513,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/179377831?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JwYT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 424w, https://substackcdn.com/image/fetch/$s_!JwYT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 848w, https://substackcdn.com/image/fetch/$s_!JwYT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 1272w, https://substackcdn.com/image/fetch/$s_!JwYT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d2b3c4e-54c1-4f7c-9cf1-545a67ea2dd3_611x321.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The second problem Anthropic highlights is that <strong>MCP tools are not composable</strong>. Anthropic gives the example of pulling a transcript from Google Drive and uploading that transcript to Salesforce. The problem is that in a real coding environment, you could store that long transcript in a variable, but since MCP has no concept of variables, the entire transcript is passed between the two different tools as text. If the transcript is long, this could eat up a <em>ton</em> of tokens.</p><h1>Anthropic&#8217;s Solution - And Why The Community Is Skeptical </h1><p>Anthropic&#8217;s proposed solution is to make MCP more code-oriented. To solve the <em>first</em> problem that MCP tools take up too much context, the proposed idea is for MCP tools to expose a much smaller surface area meant only to discover options, and have the MCP client query that to determine what&#8217;s available as necessary. </p><p>To solve the second problem of composability, the proposed solution is to have MCP clients use the discovered MCP surface areas and write code to interact with it. In our example above including Google Drive and Salesforce, you can imagine the MCP client writing a short script with a <em>variable</em> to capture the transcript, and now the context has a short variable name instead of a long transcript.</p><p>If you don&#8217;t think too hard about it, this all sounds appealing. MCP has problems, Anthropic has proposed ways to improve MCP to fix those problems. But there&#8217;s a bigger picture issue - if LLMs can write code, why do we need MCP at all? </p><p><a href="https://x.com/stevekrouse/status/1986922520298287496">Steve Krouse took to Twitter</a> to make the following points:</p><blockquote><p>LLMs were bad at writing JSON<br>So OpenAI asked us to write good JSON schemas &amp; OpenAPI specs<br>But LLMs sucked at tool calling, so it didn&#8217;t matter. OpenAPI specs were too long, so everyone wrote custom subsets<br>Then LLMs got good at tool calling (yay!) but everyone had to integrate differently with every LLM<br>Then MCP comes along and promises a write-once-integrate everywhere story. <br>&#8230;.<br>Now this next part sounds like a joke, but it&#8217;s not. They generate a TypeScript SDK based on the MCP server, and then ask the LLM to write code using that SDK<br><br>Are you kidding me? After all this, we want the LLM to use the SAME EXACT INTERFACE that human programmers use?</p></blockquote><p>Let me paraphrase Steve&#8217;s point here: a big reason that MCP came to being in the first place was because LLMs were not very reliable at writing code to an API spec. Now they <em>are</em> more reliable at writing code to an API spec, so much that Anthropic is suggesting that MCP should generate a spec and MCP clients should write code to it. <em>But that raises the question - why not just use the original API specs that humans are using, such as those generated by tools like OpenAPI?</em> </p><p>In other words: we started with OpenAPI specs, abandoned them for MCP because LLMs couldn&#8217;t handle them, and now that LLMs can handle specs again, we&#8217;re... generating specs from MCP. We&#8217;ve gone full circle.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h1>Theo (t3.gg) Piles on the Hatred</h1><div id="youtube2-1piFEKA9XL0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1piFEKA9XL0&quot;,&quot;startTime&quot;:&quot;316s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/1piFEKA9XL0?start=316s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Theo Browne, one of the biggest and most influential YouTubers in the developer space with over 480k subscribers, jumped into the criticism with his own video<a href="https://www.youtube.com/watch?v=1piFEKA9XL0&amp;t=316s"> Anthropic admits that MCP sucks</a> that has over 100k views. This video contained a hilarious amount of anger towards a software protocol, including the following quotes:</p><blockquote><p>&#8220;How the fuck can you pretend that MCP is the right standard when doing a shitty code gen solution instead saves you 99% of the wasted bullshit? That is so funny to me. The creators of MCP are sitting here and telling us that writing shit TypeScript code is 99% more effective than using their spec as they wrote it. This is so amusing to me.&#8221;</p></blockquote><p>and</p><blockquote><p>This is what happens when we let these LLM people make the things that we have to use as devs. Devs should be defining what devs use. And if you don&#8217;t let them do that, then you&#8217;ll end up realizing they were right all along.</p></blockquote><h2>Are Skills Just MCP But Better?</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IWKh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IWKh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 424w, https://substackcdn.com/image/fetch/$s_!IWKh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 848w, https://substackcdn.com/image/fetch/$s_!IWKh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 1272w, https://substackcdn.com/image/fetch/$s_!IWKh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IWKh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png" width="597" height="445" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:445,&quot;width&quot;:597,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:125307,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/179377831?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IWKh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 424w, https://substackcdn.com/image/fetch/$s_!IWKh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 848w, https://substackcdn.com/image/fetch/$s_!IWKh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 1272w, https://substackcdn.com/image/fetch/$s_!IWKh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcf99bec3-17e6-4a4d-a83f-01fed2f90353_597x445.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>I wanted to make this post somewhat two-sided on this debate, but honestly, I found the anti-MCP points much more compelling. Still, MCP solves more than one problem. The first is how the LLM uses a third-party tool, which we&#8217;ve already seen argued, does not require MCP. The second is how MCP <em>discovers</em> what tools is even possible for it to call. We might not want to clutter up our context window with <em>every</em> possible GitHub API call we could make, but we <em>do</em> want a way for the LLM to reliably know how to use the GitHub API properly when we need it, ideally with some examples.</p><p>Coincidentally, shortly before Anthropic wrote their own blog post addressing MCP&#8217;s problems, Mario Zechner wrote his own MCP-alternative solution in a blog post titled <a href="https://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/?t=0">What if you don&#8217;t need MCP at all? </a>. He was even prescient enough to highlight the <em>exact </em>same problems that Anthropic did, two days before their own post!</p><blockquote><p>Unfortunately, many of the most popular MCP servers are inefficient for a specific task. They need to cover all bases, which means they provide large numbers of tools with lengthy descriptions, consuming significant context.</p><p>&#8230;</p><p>MCP servers also aren&#8217;t composable. Results returned by an MCP server have to go through the agent&#8217;s context to be persisted to disk or combined with other results.</p></blockquote><p>Mario&#8217;s alternative approach to tool calling is to create a README that references certain scripts (the tools he needs to use), as well as examples on how to use them. He specifically picks the &#8220;MCP enabling the agent to see the browser window during web dev&#8221; as an example, since it feels like it should be one of the more complex use-cases of MCP, but he easily replaces it with a few scripts.</p><p>Of course, if we&#8217;re replacing MCP with &#8220;small markdown files that explain how to do a task&#8221;, that sounds an awful lot like the recently announced Claude Skills. And Mario specifically calls out that Claude Skills are aligned with his approach, although he still prefers doing it his way for even greater control.</p><p>But it certainly feels like Claude Skills could fix many of MCP&#8217;s problems without the additional complexity that Anthropic is proposing in their post. Skills achieve the same progressive disclosure Anthropic describes, but without needing MCP as the underlying protocol. To circle back to my Firebase and GitHub MCP examples, the idea is that I could replace their MCPs with markdown files that explain how to correctly call their APIs or use their CLIs, and then I only need a single sentence to load those markdown files when using Firebase or GitHub. This means far fewer tokens <em>and </em>far less complexity. </p><h2>Do We Need A Standard At All?</h2><p>The only argument I truly see left for MCP is that if there&#8217;s many different AI agents, and many different external tools that AI agents will need to work with, it feels like there <em>must</em> be some reason we need to standardize that communication. But, protocols were created to help machines that understood neither English nor unstructured data by creating a highly structured machine format for them to parse. AI agents are excellent at understanding both English and unstructured data, raising the question of whether protocols even make sense in this new world. </p><p>Even if we imagine a world where Claude has a marketplace for third-party tools, if LLMs can now reliably call API specs, then MCP feels like it&#8217;s unnecessarily re-inventing OpenAPI&#8217;s wheel. </p><p>Ironically, Claude Skills seems like the more &#8220;AI-native&#8221; approach to LLMs using third party skills, but Skills is <em>not</em> an open standard. However, the underlying concept of a sentence that &#8220;points&#8221; to a larger set of prompts  seems simple enough that it&#8217;s likely we see broader adoption of the concept if not Claude&#8217;s exact version. If anything, Mario&#8217;s blog post above indicates that people were hand-rolling their own version of Skills even before Anthropic formalized the concept. </p><p>But let&#8217;s finally note Anthropic created Claude and Claude Code, so they have some pretty smart and talented people. When they&#8217;ve invested massive amounts of time and resources into formalizing a standard like MCP, it&#8217;s possible they have insight and foresight that the broader developer community lacks. If not, MCP risks going down as a major blunder in a company that until now has seemed to be untouchable. </p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/p/was-mcp-a-mistake-the-internet-weighs/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.aiengineering.report/p/was-mcp-a-mistake-the-internet-weighs/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Claude Code Custom Commands: 3 Practical Examples + When to (Not) Use Them]]></title><description><![CDATA[Understanding when to make Claude Code Custom Slash Commands, how to find useful ones online, and when to skip using this feature]]></description><link>https://www.aiengineering.report/p/claude-code-custom-commands-3-practical</link><guid isPermaLink="false">https://www.aiengineering.report/p/claude-code-custom-commands-3-practical</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Thu, 06 Nov 2025 19:00:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/450dae1c-004a-43f2-904c-ae2fa4f1f694_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-8Md1geX2wOs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;8Md1geX2wOs&quot;,&quot;startTime&quot;:&quot;9s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/8Md1geX2wOs?start=9s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Like any great developer tool, Claude Code is highly customizable, most notably through <a href="https://code.claude.com/docs/en/slash-commands#custom-slash-commands">custom slash commands</a> and <a href="https://code.claude.com/docs/en/output-styles">custom output styles</a>. But it might not be obvious when you should reach for these customization features.</p><p>This post will focus on custom slash commands by walking through three practical examples, sharing resources for finding more examples, and some guidelines on when to create custom commands and when not to use them.</p><h3>What Is A Custom Command</h3><p>Claude Code has many builtin slash commands such as /clear to empty the conversation, /context to view the context usage, /init to set up a CLAUDE.md, and /agents for managing subagents. Custom commands let us add our own special commands that similarly accomplish a common task with one quick word.</p><p>Custom commands live in either your home directory (~/.claude) and apply to all your sessions, or they can live in the ~/.claude directory in your project, thus enabling you to add the commands to a Git repo so they&#8217;re available to any other devs working on the project.</p><p>Custom commands are a bit like Bash scripts, but written in English instead of Bash. They can take arguments which can be accessed via the $ARGUMENTS flag or individually with $1, $2, $3, similar to Bash.</p><p>The most important insight is that custom slash commands are just prompts you save somewhere. This also creates a simple guideline:</p><ul><li><p><strong>Use a custom slash command for a long prompt that you frequently use</strong></p></li></ul><p>If we don&#8217;t frequently use a prompt, there&#8217;s not much value in saving it. If it&#8217;s something we do rarely, all the custom slash command does is obscure what the prompt is and make it harder to tweak it.</p><p>The reason we probably shouldn&#8217;t bother with custom commands for short prompts is we can simply type them in again. For example, if our prompt was very short like &#8220;do a git commit&#8221; or &#8220;review uncommitted changes&#8221;, then we could simply type those phrases. </p><p>However, both code commits and code reviews are examples of good places to build a custom slash command since those short phrases rarely capture the entirety of what you need in your development workflows, as we&#8217;ll explore next.</p><h2>Example 1: Sanity Check On Git Commits </h2><p>Paul Graham, founder of YCombinator, <a href="https://paulgraham.com/hp.html">once wrote</a>:</p><blockquote><p>I was taught in college that one ought to figure out a program completely on paper before even going near a computer. I found that I did not program this way&#8230; I tended to just spew out code that was hopelessly broken, and gradually beat it into shape.</p></blockquote><p>Like Paul, I often find myself writing code with a lot of exploratory work, commented out code, and TODO markers. However, I generally don&#8217;t want to check that code in.</p><p>Even more risky, sometimes when developing my apps I enable test flags or rig mock data so that I can test certain user flows. But it would be a critical mistake to commit that test code into production.</p><p>Historically, these problems were solved with tools like linters triggered by Git commit hooks and code review. Linters can only catch a small subset of issues, and code reviewers tend to find it annoying when they have to repeatedly view &#8220;sloppy&#8221; commits by the code author , which is perhaps not even available if you&#8217;re a solo dev.  Plus, code review takes up valuable human time. LLMs to the rescue.</p><p>We can build a Claude Code /commit command that will first check for any TODOs, commented out code, test flags enabled, or anything that simply <em>looks </em>like it&#8217;s a temporary test change and commit <em>only</em> if those things don&#8217;t exist in the changeset.</p><p>I created the file <code>~/.claude/commands/commit.md</code> and entered the following text:</p><blockquote><p>Review all local modifications relative to HEAD, including both staged and unstaged changes.</p><p>Before committing, check for any of the following patterns:</p><p>TODO, FIXME, HACK, or similar developer notes.</p><p>Commented-out blocks of code.</p><p>Debugging or test flags left enabled (e.g., DEBUG = true, test_mode = 1, or console.log/print calls used for debugging).</p><p>Clearly temporary or experimental code (e.g., &#8220;temp&#8221;, &#8220;try&#8221;, &#8220;placeholder&#8221;, &#8220;test data&#8221;).</p><p>Hardcoded, rigged, or mocked logic used for testing &#8212; like forcing outcomes, overriding randomness, mocking API responses, or using fixed test data.</p><p>If any of these are found:</p><p>Abort the commit.</p><p>Output a clear, structured summary describing what was found and where, with short cleanup suggestions.</p><p>If none are found:</p><p>Stage all changes (git add -A).</p><p>Perform the commit using the following message: &#8220; $ARGUMENTS &#8220; , or if the previous arguments between the quotes are empty, read through the changes being committed and write an appropriate commit message that reflects the changes being made.</p><p>Output a short confirmation message indicating success (e.g., &#8220;&#9989; Commit completed &#8212; working tree clean.&#8221;).</p></blockquote><p>As you can see, I use the $ARGUMENTS flag so that I can assign a commit message when using the command like <code>/commit update the landing page</code>,<code> </code>but I can also just type /commit and have Claude write a commit message for me based on the changes - pretty cool!</p><p>This custom command solves a huge pain point for me on solo projects as I always felt that double checking I didn&#8217;t accidentally commit some temporary testing code was a timesink. Claude is far smarter than a traditional linter and can understand changes that would otherwise never be flagged, as you can see by it being suspicious of this &#8220;hardcoded logic&#8221;, as seen in the following screenshot of my app development:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xna0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xna0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 424w, https://substackcdn.com/image/fetch/$s_!Xna0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 848w, https://substackcdn.com/image/fetch/$s_!Xna0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 1272w, https://substackcdn.com/image/fetch/$s_!Xna0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xna0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png" width="1207" height="281" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:281,&quot;width&quot;:1207,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94337,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/178199146?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xna0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 424w, https://substackcdn.com/image/fetch/$s_!Xna0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 848w, https://substackcdn.com/image/fetch/$s_!Xna0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 1272w, https://substackcdn.com/image/fetch/$s_!Xna0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F423fb0c5-6686-40a3-8298-a6117e823ca3_1207x281.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Besides sanity checking for TODOs or commented out code, there&#8217;s many other things you might want to review before you commit. For example, some people feel strongly that a commit should only do <em>one</em> thing, so that&#8217;s another condition you could add to the custom prompt. </p><p>Custom prompts are <em>custom</em>, so while you <em>could</em> use other people&#8217;s prompts verbatim, it&#8217;s worth considering massaging them to your specific workflows. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>Example 2: Catchup Context After Context Clear </h2><p>This next command is one that I&#8217;m borrowing from the blog post <a href="https://blog.sshh.io/p/how-i-use-every-claude-code-feature">How I use Every Claude Code Feature</a> by Shrivu Shankar which did extremely well on Hacker News (500+ upvotes).</p><p>Shrivu recommends having a /catchup custom command that reads in all the uncommited changes into your context. The idea is that you can call /clear as the context window gets full, then reload the necessary work-in-progress into your new conversation. It might look something like this:</p><blockquote><p>&#8220;read all uncommitted git changes into this conversation&#8220;</p></blockquote><p>Honestly, I&#8217;m on the fence about whether this is a great example of a custom Claude Code command because it falls a bit short of the &#8220;long&#8221; prompt qualifier I mentioned above. It&#8217;s not difficult to simply type . On the other hand, one word is shorter than eight if you&#8217;re doing it frequently. </p><p>I included this example for a few reasons anyway: first, I wanted to link to Shrivu&#8217;s excellent post; second, it&#8217;s an interesting example of managing the mechanics of Claude Code itself; and thirdly, it ties into very nicely into my third example.</p><h2>Example 3: Catchup Context With Github Issues via MCP </h2><p>I expect that for many people, the most useful custom commands will interact with MCP tools. Why? Because if a task exists that a general Claude Code user needs to do frequently, it&#8217;ll probably just get added to Claude Code builtin commands. Adding external tools is one of the ways Claude Code gets unique to you - thus needing customization - and external tools often require various forms of finagling that saved prompts can capture. </p><p>One of the most obviously useful MCP is the <a href="https://github.com/github/github-mcp-server">Github MCP</a>. While you can already talk to Claude directly on Github as I wrote about in<a href="https://www.aiengineering.report/p/combining-claude-code-with-github"> Scaling Claude Code with Github Actions</a>, there&#8217;s still plenty of times you will want to be developing locally in Claude Code and want to access something on Github. Setting this up is fairly quick, you can create a GitHub personal access token and add the MCP to Claude Code as <a href="https://github.com/github/github-mcp-server/blob/main/docs/installation-guides/install-claude.md">documented here</a>. </p><p>Let&#8217;s tie this Github MCP concept with Example 2 of catching up on context after a /clear command. In example 2, we only added the <em>code</em> context. But often times, we don&#8217;t just want to know what the current code changes are, but <em>why </em>we&#8217;re making those changes, and those changes often exist in an issue tracker like Github Issues.</p><p>So now we can extend our /catchup command with something like this:</p><blockquote><p>Find issue $ARGUMENTS on repo &lt;your repo&gt; and load its contents into the context here</p></blockquote><p>Assuming you&#8217;ve installed the Github MCP, now you can pull all the information about the Github Issue into your conversation along with the code change after you run the /catchup command, resetting all necessary context after you cleared it. We could also consider pulling in information from relevant Pull Requests. </p><h2>Where To Find More Examples </h2><p>If you want to find more examples, you can check out the <a href="https://github.com/hesreallyhim/awesome-claude-code">awesome-claude-code</a> repo which has multiple examples of custom commands people have contributed. There&#8217;s a website directory at <a href="https://claudecodecommands.directory/">https://claudecodecommands.directory/</a> with more resources. </p><p>Browsing through there, we can look at several more templates of what people are using Custom Commands for:</p><ul><li><p>Managing Git commits as demonstrated in Example 1</p></li><li><p>Context management tools as demonstrated in Example 2 and Example 3</p></li><li><p>Create documentation for new changes being added</p></li><li><p>Create a changelog.md or release notes based on recent commits or PRs</p></li><li><p>Managing releases </p></li><li><p>Creating formal product planning docs based on input docs </p></li></ul><p>However, I would recommend avoiding using anyone else&#8217;s custom commands and instead use them for inspiration. After all, these are <em>custom commands </em>- it makes most sense to tailor them to your specific workflows. It&#8217;s also worth considering that if you add too many custom commands, you&#8217;re adding a level of indirection that might confuse new developers on a project if they have to learn dozens of project-specific command meanings. </p><p>Custom commands work best when they encode your specific workflows, and capture some sort of prompt you frequently find yourself reaching for but find tedious to repeatedly re-enter. </p><p>Thanks for reading and as always reply to this email or leave a comment on Substack. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/p/claude-code-custom-commands-3-practical/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.aiengineering.report/p/claude-code-custom-commands-3-practical/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Claude Code vs Codex: I Built A Sentiment Dashboard From 500+ Reddit Comments]]></title><description><![CDATA[I scraped hundreds of Reddit comments that compare Claude Code and Codex, and used Claude Haiku to build a sentiment analysis dashboard. The dashboard and my interpretations are shared here.]]></description><link>https://www.aiengineering.report/p/claude-code-vs-codex-sentiment-analysis-reddit</link><guid isPermaLink="false">https://www.aiengineering.report/p/claude-code-vs-codex-sentiment-analysis-reddit</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Thu, 16 Oct 2025 16:39:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/641d82d0-d138-450f-9368-98a9880b529a_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-0RSMIdoXRsw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;0RSMIdoXRsw&quot;,&quot;startTime&quot;:&quot;3s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/0RSMIdoXRsw?start=3s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Most benchmarks tell us how AI coding models perform in carefully constructed scenarios. But they don&#8217;t tell us what developers actually think when they use these tools every day. That gap is why I built a Reddit sentiment analysis dashboard to see how real engineers compare <strong>Claude Code vs Codex</strong> in the wild. You can find the dashboard at </p><p><a href="https://claude-vs-codex-dashboard.vercel.app/">https://claude-vs-codex-dashboard.vercel.app/</a></p><p>and the source code at: <a href="https://github.com/waprin/claude-vs-codex-dashboard">https://github.com/waprin/claude-vs-codex-dashboard</a></p><p>There are some options to view sentiment weighted or unweighted by upvotes, and compare on specific categories like speed, problem solving, and workflows. </p><p>In this newsletter edition, I&#8217;ll discuss:</p><ul><li><p>What trends the sentiment analysis dashboard uncovers on Claude Code vs Codex discussions on Reddit</p></li><li><p>The methodology I used to build the dashboard and plans for future improvements</p></li></ul><p>While notable AI benchmarks like <a href="https://www.swebench.com/">SWEbench</a>, <a href="https://prarena.ai/">PR Arena</a>, <a href="https://www.tbench.ai/">TerminalBench</a>, and <a href="https://lmarena.ai/">LMArena</a> help us navigate the landscape of the quality of AI models, <strong>I don&#8217;t think </strong><em><strong>any</strong></em><strong> benchmark can truly capture how most software engineers are using agentic coding models day-to-day</strong>. We don&#8217;t typically &#8220;set-it-and-forget&#8221; the agent on a constructed task but rather there&#8217;s an interactive back-and-forth conversational session. Furthermore, engineers in the wild are facing a far greater diversity of tasks than any given benchmark could hope to capture.</p><p>For those reasons, I believe a survey of the &#8220;wisdom of the crowd&#8221; <em>is</em> valuable to gain a broader understanding of which agentic coding models are performing better. To do so, I scraped a wide variety of comments on Reddit from AI-coding focused subreddits such as <strong>/r/ChatGPTCoding,</strong> /<strong>r/ClaudeCode</strong>, and <strong>/r/Codex</strong>. I then used the Claude Haiku model to classify whether the comment directly compared Claude Code and Codex, and classified the sentiment accordingly.</p><p>(note: this analysis was done <em>before </em>the new Haiku model that <a href="https://www.anthropic.com/news/claude-haiku-4-5">Anthropic announced yesterday</a>) </p><p>Since this post is fairly long, I&#8217;ll summarize here:</p><ul><li><p><strong>Overall, Codex has much more positive sentiment than Claude Code in comments that compare the two directly</strong></p></li><li><p><strong>However, Claude Code has much more discussion overall, at about 4x the volume of Codex, raising the question of whether its popularity leads to its detractors</strong></p></li><li><p><strong>On specific topics like performance, model quality, and problem-solving, Codex leads in all categories except two - speed and workflows. Claude Code is considered faster to respond and has a better terminal UX and ecosystem of tools</strong>. <strong>Codex frequently gets complimented for outperforming Claude Code on more challenging problems. </strong></p></li></ul><p>Claude Code performing better on speed but Codex on problem-solving also aligns with some tweets I&#8217;ve seen in the wild.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GTG2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GTG2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 424w, https://substackcdn.com/image/fetch/$s_!GTG2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 848w, https://substackcdn.com/image/fetch/$s_!GTG2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 1272w, https://substackcdn.com/image/fetch/$s_!GTG2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GTG2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png" width="614" height="359" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:359,&quot;width&quot;:614,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58135,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/176279172?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GTG2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 424w, https://substackcdn.com/image/fetch/$s_!GTG2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 848w, https://substackcdn.com/image/fetch/$s_!GTG2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 1272w, https://substackcdn.com/image/fetch/$s_!GTG2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35e8afd5-f35c-456e-9674-6a24d664e768_614x359.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Let&#8217;s dive into some specific takeaways, and then I&#8217;ll circle back to my notes on the methodology.</p><h1>Codex Wins the Sentiment War By A Large Margin</h1><p>The first takeaway is that Codex is compared more positively against Claude Code by a fairly large margin:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RYLh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RYLh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 424w, https://substackcdn.com/image/fetch/$s_!RYLh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 848w, https://substackcdn.com/image/fetch/$s_!RYLh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 1272w, https://substackcdn.com/image/fetch/$s_!RYLh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RYLh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png" width="1456" height="299" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:299,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111873,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/176279172?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RYLh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 424w, https://substackcdn.com/image/fetch/$s_!RYLh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 848w, https://substackcdn.com/image/fetch/$s_!RYLh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 1272w, https://substackcdn.com/image/fetch/$s_!RYLh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52edd2ff-3e33-4255-aa47-c7e7707de440_2578x530.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>As you can see, <strong>65.3% of Reddit comments comparing Claude Code vs Codex prefer Codex.</strong></p><p>The above metric only tallies raw <em>number</em> of comments. If we weight those comments by upvotes, so a comment with 10 upvotes counts ten times as much as a comment with 1 upvote, the sentiment difference is even more stark. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hJcw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hJcw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 424w, https://substackcdn.com/image/fetch/$s_!hJcw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 848w, https://substackcdn.com/image/fetch/$s_!hJcw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 1272w, https://substackcdn.com/image/fetch/$s_!hJcw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hJcw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png" width="1456" height="295" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:295,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159163,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/176279172?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hJcw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 424w, https://substackcdn.com/image/fetch/$s_!hJcw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 848w, https://substackcdn.com/image/fetch/$s_!hJcw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 1272w, https://substackcdn.com/image/fetch/$s_!hJcw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f227fb9-8f39-478e-b5cf-877e051ac86d_2668x540.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>We can see that <strong>79.9% of Reddit upvotes prefer Codex to Claude Code</strong>. </p><p>The dashboard also lets you see all the Reddit comments at the bottom, sorted by upvotes and optionally filtered by themes such as speed or price, if you want to see the original comments.</p><h3>But People Are Talking About Claude Code Much More&#8230;.And Reddit Is A Negative Place<br></h3><p>While Codex has far more positive sentiment than Claude Code, it&#8217;s worth noting that people are simply <em>talking </em>about Claude Code <em>significantly</em> more than Codex. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P15c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P15c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 424w, https://substackcdn.com/image/fetch/$s_!P15c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 848w, https://substackcdn.com/image/fetch/$s_!P15c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 1272w, https://substackcdn.com/image/fetch/$s_!P15c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P15c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png" width="1456" height="319" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:319,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133447,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/176279172?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P15c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 424w, https://substackcdn.com/image/fetch/$s_!P15c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 848w, https://substackcdn.com/image/fetch/$s_!P15c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 1272w, https://substackcdn.com/image/fetch/$s_!P15c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4a13ff4-290e-464f-b584-b5d9a69dbffc_2548x558.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>As you can see, &#8220;Codex&gt;CC&#8221; has 98 comments vs. 18 comments that have &#8220;CC&gt;Codex&#8221;. But if we look at comments that don&#8217;t directly compare the tools, <em>both </em>Claude Code and Codex have more negative comments than positive comments. People tend to complain more than praise on the internet. But of the 500 comments, Claude Code had 40 comments and Codex only had 10. This means people are talking about Claude Code <em>about four times as much</em> as they&#8217;re talking about Codex.</p><p>You can also see the volume of Claude Code discussion evidenced by the subreddits themselves, with /r/ClaudeCode having 4.2k weekly contributions and /r/codex having 1.2k weekly contributions.</p><p>This raises the question of how much negativity towards Claude Code is because the most popular tool tends to get the most criticism. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>GLM As A New Dark Horse</h3><p>I was surprised to see extensive discussion comparing Claude Code and Codex to another competitor I never even heard of, GLM, a Chinese agentic coding agent. In fact, one of the top threads in /r/ClaudeCode recently is: <strong><a href="https://www.reddit.com/r/ClaudeCode/comments/1nzet39/comment/ni1k50k/">Why I Finally Quit Claude (and Claude Code) for GLM</a>, </strong>with the top comment reading:</p><blockquote><p>GLM surprised me when I tried it recently. It&#8217;s not as good (yet) in terms of agentic capabilities compared to Codex or Claude, but it&#8217;s good enough it produces quality results for pennies on the dollar in terms of cost. Easily the best value LLM around right now.</p></blockquote><h3>Top Comment in Favor of Claude Code</h3><p></p><blockquote><p>i&#8216;ve been testing sonnet 4.5, gpt5-codex and glm 4.6 plans over the past few days with a nextjs project.<br>i think sonnet 4.5 is easily the best of the bunch. glm 4.6 is the worst, it needs a really good plan by a sota model or well broken down tasks, otherwise it codes itself in a corner.<br>gpt5 codex is great, sometimes best but i hit the limits much quicker than sonnet 4.5, even after the anthropic rate limit changes a few days ago. that&#8217;s on the 20$ plan. i also like claude code much more and the surrounding ecosystem of tools.</p><p>&#8212; User serialoverflow (<a href="https://www.reddit.com/r/ChatGPTCoding/comments/1nxthkn/comment/nhpqc9f/">source</a>)</p></blockquote><h3>Top Comment in Favor Of Codex</h3><p></p><blockquote><p>Former Claude Code user for a few months on Max 20x, fairly heavy user too. Loved it at the time, but feels like at least during part of last month the quality of the model responses degraded. I found myself having to regularly steer Claude into not making changes I didn&#8217;t actually agree on (yes I use the plan mode, it&#8217;s highly valuable). Claude also often told me that code was production ready when it wasn&#8217;t, it either failed to compile or had some kind of flaw that needed addressing.</p><p>The biggest challenge I&#8217;ve given it so far was to refactor a long overdue and messy .cs file that contained about 3k LOC. I&#8217;ve tried this with various other AI LLMs, including Claude Code (which couldn&#8217;t read the entire file as it was over 25k tokens), but they just ultimately make bugs and mess things up when trying to do so. I didn&#8217;t think GPT-5 would be any different, but my god, it surprised me again. I planned with it, did it in small bits and pieces at a time, and a day or so later I&#8217;m now down to around 1k LOC for that file. It seems to be working fine too.</p><p>&#8212; User Hauven (<a href="https://www.reddit.com/r/ChatGPTCoding/comments/1n8c82u/comment/nce1em4/">source</a>)</p></blockquote><p></p><h3>Claude Beats Codex On Two Categories - Speed and Workflows. Codex won the rest.</h3><p>The dashboard allows you to filter by specific <em>topics</em>, and Codex leads Claude Code on 8 of 10 categories. However, Claude Code leads on two - speed and workflows. This aligns with much of the discussion I&#8217;ve seen online, where people generally think Codex is a stronger model but notice that Claude Code just returns a response <em>faster</em> and that the terminal UX and tool ecosystem is stronger. </p><p>Codex won the rest of the categories: <em>pricing, performance, reliability, usage limits, code generation, problem solving, and code quality.</em></p><h3>Notes On Methodology - Data Collection Via Scraping Reddit</h3><p>To decide which Reddit comments to even scrape, I first used Google Search with the query `site:reddit.com &#8220;claude code&#8221; codex`. The vast majority of the results were from Claude-related subreddits - namely /r/ClaudeCode , /r/ClaudeAI, and /r/Anthropic. The only other subreddit with a large number of results is /r/ChatGPTCoding, which despite its name, is geared towards any sort of AI-coding discussion and is not ChatGPT specific. </p><p>Some other subreddits such as /r/Cursor, /r/OpenAI, /r/LLMDevs, /r/vibecoding, /r/AI_Agents, etc had a small number of results but were not significant.</p><p>Given that the Google Search API is severely limited in the number of results you can return, and the Bing API is being deprecated, the simplest way to scrape these comments is to use the Reddit API. </p><p>I focused on /r/ClaudeCode, /r/ChatGPTCoding, and /r/Codex. However, while I have some /r/Codex comments, none of them made it into this first analysis pass. I decided not to include /r/ClaudeAI despite a significant amount of discussion there because the dataset was already heavily biased towards Claude-centric discussions. </p><h3>Notes On Methodology - Sentiment Analysis Time And Cost With Claude Haiku </h3><p>I decided to use Claude Haiku to analyze the sentiment on each comment. I <em>did </em>make sure that each comment had its entire parent chain within its context when doing the sentiment analysis. This is important context if a comment says something like &#8220;I agree&#8221;.</p><p>I was curious if I should save time and cost by batching comments, but Claude itself recommended against this approach and suggested it could too easily distort results. There are actually <em>two</em> ways to consider batching here. We could batch by asking it to rate multiple comments at a time, which I decided against and there&#8217;s the B<a href="https://docs.claude.com/en/docs/build-with-claude/batch-processing">atch processing Anthropic API</a>, which I didn&#8217;t get around to using yet but might add in the future to save time. </p><p>I did use Haiku since it&#8217;s one of the cheaper models. Overall, the cost was not an issue, but the time took surprisingly long. For some data points:</p><p><em>50 comments took 3 minutes, 28k input tokens, 10k output tokens, and $0.08 to analyze.</em></p><p><em>500 comments took 26.7 minutes, 273k input tokens, and $0.77 to analyze</em></p><p>As you can see, even fairly big batches cost under $1 to analyze, but waiting 25 minutes for the results was slightly annoying. </p><p>Haiku may have been slighty overkill, as Gemini Flash may have been cheaper, but Haiku was cheap enough as-is. </p><h3>Takeaways And Conclusions</h3><p>Again, check out the link to the dashboard at the top of the post or the GitHub repo if you&#8217;re curious to dig in yourself.</p><p>On a personal note, I&#8217;ve played with Codex but have been finding myself using Claude Code more because <em>speed</em> makes programming more fun for me, and having fun means I stick to the work longer. But I am exploring how to upskill my agentic coding with background agents and spec-driven development, and it&#8217;s very clear that the broader community sentiment suggests Codex is a stronger tool here than Claude Code.</p><p>Let me know if you&#8217;re interested in this topic by replying to this email or leaving a comment on Substack. I plan to add more comments to the analysis, and I&#8217;m also interested in comparing the sentiment analysis result of Haiku vs stronger models like GPT-5 or Sonnet and see if any differences emerge. Thanks for reading!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/p/claude-code-vs-codex-sentiment-analysis-reddit/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.aiengineering.report/p/claude-code-vs-codex-sentiment-analysis-reddit/comments"><span>Leave a comment</span></a></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[OpenAI Dev Day: Sora 2 Stole the Show]]></title><description><![CDATA[Sora 2 is now available via API, why OpenAI gives direct competitors the mic on Main Stage, and how I feel they stack up against Anthropic after DevDay 2025]]></description><link>https://www.aiengineering.report/p/sora-2-stole-the-show-at-openai-devday</link><guid isPermaLink="false">https://www.aiengineering.report/p/sora-2-stole-the-show-at-openai-devday</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Tue, 07 Oct 2025 19:16:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FMlo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FMlo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FMlo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 424w, https://substackcdn.com/image/fetch/$s_!FMlo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 848w, https://substackcdn.com/image/fetch/$s_!FMlo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 1272w, https://substackcdn.com/image/fetch/$s_!FMlo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FMlo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png" width="1000" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50284,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/175555409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FMlo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 424w, https://substackcdn.com/image/fetch/$s_!FMlo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 848w, https://substackcdn.com/image/fetch/$s_!FMlo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 1272w, https://substackcdn.com/image/fetch/$s_!FMlo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b110d44-b55d-4bc4-828b-47d3fb574fa2_1000x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Yesterday, I had the opportunity to attend OpenAI Dev Day in San Francisco. Since this is such a big event, almost everyone writing about AI covered it, so I don&#8217;t want to re-hash the big announcements too much, but instead offer my personal impressions.</p><p>Let&#8217;s quickly recap the <em>biggest</em> announcements that I&#8217;ll discuss in this newsletter:</p><ol><li><p><strong>Sora 2 gets an API,</strong> meaning you can now build apps around generative video for surprisingly affordable pricing</p></li><li><p><strong><a href="https://openai.com/index/introducing-apps-in-chatgpt/">OpenAI launched the Apps SDK</a></strong><a href="https://openai.com/index/introducing-apps-in-chatgpt/">,</a> meaning you&#8217;ll be able to use MCP to build apps that are accessible directly within ChatGPT, hinting at a new &#8216;App Store&#8217; moment</p></li><li><p><strong><a href="https://openai.com/index/introducing-agentkit/">OpenAI launched AgentKit</a></strong>, a toolkit for building complex agent orchestrations, with a special focus on a visual drag-and-drop UI agent builder and an SDK for adding ChatGPT-like experiences in your app</p></li></ol><p>Unrelated to DevDay, there&#8217;s also a big promo deal being offered for 40M free tokens for the #1 agent on TerminalBench at the end!</p><h3>Takeaway #1: Sora 2 Stole The Show</h3><p>While I was looking forward to primarily <em>developer</em> talks, it was a <em>creatives</em> talk that blew my mind the most - <em>Sora, ImageGen, and Codex: The Next Wave of Creative Production.</em> They showed off a new &#8220;Storyboarding&#8221; tool that lets you organize consistent characters, settings, and related prompts, in a way designed to tell consistent stories with consistent characters.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!suIt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!suIt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 424w, https://substackcdn.com/image/fetch/$s_!suIt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 848w, https://substackcdn.com/image/fetch/$s_!suIt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 1272w, https://substackcdn.com/image/fetch/$s_!suIt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!suIt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png" width="1456" height="785" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:785,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1620291,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/175555409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!suIt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 424w, https://substackcdn.com/image/fetch/$s_!suIt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 848w, https://substackcdn.com/image/fetch/$s_!suIt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 1272w, https://substackcdn.com/image/fetch/$s_!suIt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13401366-cf1e-4256-ab13-d6d8528f7bc7_1461x788.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>As someone who&#8217;s attended many of <a href="https://machinecinema.ai/">Machine Cinema&#8217;s</a> &#8220;GenJam&#8221; meetups, where we do things like make music videos with AI, AI-generated videos badly struggled with lack of consistency. Even if individual clips looked great, the inconsistency between the clips is what made the longer videos easily identifiable as &#8220;AI slop&#8221;. This storyboard tool looks to solve that problem.</p><p>I loved that they linked traditional human creativity to AI-related creativity by having a human draw a real novel character on an iPad, then loading that character into the tool and generating a Pixar-style short animated film with that character as the lead.</p><p>But there was great Sora 2 news for developers after all, as they also announced pricing for the Sora 2 API, at $0.10 per second of video for the regular model, $0.30 for the pro model, and $0.50 for the larger resolution.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XyIb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XyIb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 424w, https://substackcdn.com/image/fetch/$s_!XyIb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 848w, https://substackcdn.com/image/fetch/$s_!XyIb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 1272w, https://substackcdn.com/image/fetch/$s_!XyIb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XyIb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png" width="1074" height="417" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:417,&quot;width&quot;:1074,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:43119,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/175555409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XyIb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 424w, https://substackcdn.com/image/fetch/$s_!XyIb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 848w, https://substackcdn.com/image/fetch/$s_!XyIb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 1272w, https://substackcdn.com/image/fetch/$s_!XyIb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa021d7d2-9400-4e94-b240-0b1dbcf396c8_1074x417.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While not exactly cheap in the general sense, this is fairly cheap by AI video generation standards, which is significantly more expensive than text or code generation.</p><p>One use case they showed off was a toy company using Sora to make proof of concepts for new toy and game designs. While interesting, given these models are expensive, I think the use cases we&#8217;ll see emerge the most will relate to advertisement, as video advertisements are both hard to make and one of the most monetizable use cases of AI video generation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Takeaway #2: OpenAI Competes Against Yet Simultaneously Promotes Their Startup Ecosystem</h3><p>One of the biggest announcements was <a href="https://platform.openai.com/docs/guides/agents/agent-builder">Agent Builder</a>, a visual toolkit for building agents. At first, I thought this was strictly a no-code tool, but an OpenAI employee I spoke with later told me that it&#8217;s actually just a visualization of an underlying SDK and you can still mix and match coding with the drag &amp; drop UI.</p><p>Many noted this might put huge competitive pressure on startups in the visual agent space, notably <a href="https://github.com/n8n-io/n8n">n8n</a>, Zapier, and YC-Backed <a href="https://www.gumloop.com/">Gumloop</a>. Any startup in the AI space <em>has</em> to consider that if their market is even remotely big, they will be competing directly with the AI behemoths they are building on top of. It&#8217;s honestly unclear to me whether startups can differentiate in the space, or if &#8220;nobody got fired for buying from OpenAI&#8221; will demolish them.</p><p>But the silver lining for those startups is that OpenAI does not seem interested in sucking the air out of the room for competing startups, in fact, very much the opposite. OpenAI gave speaking slots to <em>many</em> direct competitors to Codex, including a highlighted main stage talk given to Cursor, and a lightning round talk given to Warp. It was somewhat fascinating to me that Sam Altman would make Codex moving from Research Preview to GA a central aspect of his keynote address, and then let a direct competitor on stage immediately after.</p><p>To me, the takeaway is that OpenAI just wants to grow the overall AI ecosystem, and they&#8217;re more than happy to compete with startups and let the best products win. It was inevitable that they would want to build their own coding agents, but it&#8217;s also wise that they&#8217;re willing to force their internal teams to compete against external ones and let the best agent win.</p><p>It seems Sam Altman is avoiding many pitfalls that Microsoft ran into in the past trying to build a walled garden on Windows, and there was even a callback to the heyday of Microsoft when they played a remixed version of the classic Steve Ballmer&#8217;s &#8220;<a href="https://www.youtube.com/watch?v=Vhh_GeBPOhs">Developers, Developers, Developers</a>&#8221; meme , replaced with Sam Altman, and generated by Sora 2, on the main stage.</p><h3>Takeaway #3: OpenAI Feels A Step Behind Anthropic on AI Coding But A Leap Ahead of Anthropic on Everything Else AI</h3><p>Despite Codex moving to GA being a big announcement, everything about coding agents felt underwhelming. They demonstrated several use cases of MCP, that felt like something that might impress me 6 months ago, but in the AI coding world, that might as well be a decade ago. Nowadays, using MCP to connect to an external device is a big &#8216;meh&#8217;, and lest we forget, it&#8217;s OpenAI adopting a standard that Anthropic created.</p><p>Moreover, while both Twitter and Reddit seem genuinely divided on whether Codex or Claude Code is better, I&#8217;m personally still a bigger fan of Claude Code, particularly since Sonnet 4.5 came out. I wrote <a href="https://www.aiengineering.report/p/claude-code-20-great-model-but-flawed">about this in the last edition of the newsletter</a>, and it&#8217;s almost entirely because it&#8217;s <em>faster</em> , which makes it more fun for me. Nobody disputes that Sonnet is faster - even the OpenAI employees I spoke with. The only argument is whether Codex is better on larger, more complex tasks, but personally, I&#8217;d usually rather &#8216;pair&#8217; on larger tasks interactively than let the agent do the entire thing myself.</p><p>But meanwhile, OpenAI feels significantly ahead of Anthropic on everything <em>except</em> coding. The biggest announcement here was <strong>AppKit</strong>, which lets people build apps within ChatGPT - although whether this will be realistic to monetize is still up in the air, it will certainly be an exciting moment for the AI consumer market.</p><p>Their <strong>AgentKit</strong> is clearly meant to move into the market of the &#8216;semi-technical&#8217; agent builders, expanding OpenAI&#8217;s ambitions beyond pure devs.</p><p>And of course, Sora 2 is both one of the hottest consumer apps on the planet <em>and</em> a leading option for the creative industry to adopt AI into their workflows.</p><p>Given the conference was titled <em>Developer Day</em>, I thought it&#8217;d be more focused on coding. But of course, if you&#8217;re a developer, we don&#8217;t just want to code faster but also build awesome stuff for end-users, and almost all of these announcements enable that.</p><ul><li><p>AppKit might trigger a new &#8220;App Store&#8221; gold rush (I&#8217;m very skeptical it will be easy to monetize, but it&#8217;s possible and great to be early)</p></li><li><p>AgentKit might bridge the gap between technical and non-technical teams for building advanced agent use cases</p></li><li><p>Sora 2 will open up a whole new class of application categories enabled by AI video</p></li></ul><h3>ICYMI: Free Tokens for #1 Agent On Terminal Bench</h3><p>Something unrelated to DevDay, but worth noting, in case you like free stuff - Factory <a href="https://x.com/francesca_lab/status/1973478664148074786">shared a tweet</a> offering 40M free tokens to use their agent Droid with Sonnet 4.5. Factory&#8217;s Droid agent is actually the <a href="https://www.tbench.ai/leaderboard">#1 ranked agent</a> according to TerminalBench, so this is a lot of free value if you want to compare their product to Claude Code or Codex.</p><p>Thanks for reading <em>AI Engineering Report.</em> Reply to this email or leave a comment on Substack with any thoughts.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/p/sora-2-stole-the-show-at-openai-devday/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.aiengineering.report/p/sora-2-stole-the-show-at-openai-devday/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Claude Code 2.0 Is Promising But Flawed]]></title><description><![CDATA[Sonnet 4.5 arrives to great acclaim, but the new features like checkpoint rewinds and usage monitoring seem half-baked compared to third-party alternatives. Also, my dog does a kickflip with Sora 2.]]></description><link>https://www.aiengineering.report/p/claude-code-20-great-model-but-flawed</link><guid isPermaLink="false">https://www.aiengineering.report/p/claude-code-20-great-model-but-flawed</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Wed, 01 Oct 2025 22:22:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!i09Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i09Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i09Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 424w, https://substackcdn.com/image/fetch/$s_!i09Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 848w, https://substackcdn.com/image/fetch/$s_!i09Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 1272w, https://substackcdn.com/image/fetch/$s_!i09Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i09Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png" width="1000" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109753,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/175061110?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i09Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 424w, https://substackcdn.com/image/fetch/$s_!i09Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 848w, https://substackcdn.com/image/fetch/$s_!i09Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 1272w, https://substackcdn.com/image/fetch/$s_!i09Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d4507f0-5833-4f8e-a867-adeb47d82f5b_1000x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Two weeks ago, Anthropic looked like it was stumbling. <a href="https://www.aiengineering.report/p/devs-cancel-claude-code-en-masse">Developers were bailing on Claude Code</a>, OpenAI <a href="https://www.aiengineering.report/p/devs-cancel-claude-code-en-masse">had just shipped GPT-5 Codex</a>, and Sonnet itself was rumored to be degrading. But in the roller-coaster world of AI coding agents, scripts flip fast and Anthropic is once again flexing on the competition with the release of <a href="https://www.anthropic.com/news/claude-sonnet-4-5">Claude Sonnet</a> 4.5, beating Codex in head-to-head tests and winning over both veteran engineers and hype bros across the internet. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QSIn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QSIn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 424w, https://substackcdn.com/image/fetch/$s_!QSIn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 848w, https://substackcdn.com/image/fetch/$s_!QSIn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 1272w, https://substackcdn.com/image/fetch/$s_!QSIn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QSIn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png" width="606" height="165" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:165,&quot;width&quot;:606,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35224,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/175061110?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QSIn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 424w, https://substackcdn.com/image/fetch/$s_!QSIn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 848w, https://substackcdn.com/image/fetch/$s_!QSIn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 1272w, https://substackcdn.com/image/fetch/$s_!QSIn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a192ff8-e788-49d0-ad6c-6c3125257301_606x165.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>But while the underlying model feels stronger than ever, Anthropic&#8217;s simultaneous release of Claude Code v2 is more mixed. While it&#8217;s great to see progress on critical quality of life features like checkpoints and usage monitoring, both of these new features seem half-baked, especially next to third party options like Git and Claude Monitor.</p><p>In this edition of <em>AI Engineering Report</em>, I will cover:</p><ul><li><p>Online sentiment towards Sonnet including one YouTuber&#8217;s fascinating breakdown <strong>comparing Sonnet 4.5 directly to GPT-5-Codex</strong> on a web dev task.</p></li><li><p>Why I&#8217;m disappointed with the new <strong>/rewind feature</strong> in Claude Code v2</p></li><li><p>Why I&#8217;m disappointed with the new <strong>/usage feature</strong> in Claude Code v2</p></li><li><p>Using <strong>OpenAI&#8217;s new Sora 2</strong> app to pretend my dog can do a kickflip</p></li></ul><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;33cfaf02-dcf2-4717-92f4-ebfa4e8d8278&quot;,&quot;duration&quot;:null}"></div><h3>Claude 2.0.0 Release - What&#8216;s New</h3><p>If you&#8217;re curious about exactly what Claude Code v2 contains, you can find it on their <a href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md">CHANGELOG.md</a> on their GitHub repo. Claude Code is <em>not</em> open source, but their GitHub repo is used for Issue Tracking, Changelogs, and some small examples. Here&#8217;s the v2 release notes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e_91!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e_91!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 424w, https://substackcdn.com/image/fetch/$s_!e_91!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 848w, https://substackcdn.com/image/fetch/$s_!e_91!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 1272w, https://substackcdn.com/image/fetch/$s_!e_91!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e_91!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png" width="1219" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1219,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94579,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/175061110?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!e_91!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 424w, https://substackcdn.com/image/fetch/$s_!e_91!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 848w, https://substackcdn.com/image/fetch/$s_!e_91!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 1272w, https://substackcdn.com/image/fetch/$s_!e_91!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29efb5d7-76bf-4473-a8db-6af1a975cf40_1219x578.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There&#8217;s a few neat things in here, including <strong>tab-to-think,</strong> which is a way to force the model to think harder. Sonnet is now outperforming Opus on most tasks - raising the question of whether there&#8217;s even a point to Opus - but like GPT-5 it can either respond quickly or think harder for a better thought-out response. The straightforward way to get it to think harder is to simply <em>use the words &#8216;think harder&#8217; or &#8216;ultrathink&#8217; in your prompt</em>, but as an alternative you can now press tab to turn on a mode that will always do it.</p><p>Ctrl-R to search history is a nice quality of life feature mirroring bash terminals, although honestly, I rarely find myself wanting to do this. </p><p>The two features that stood out to me are <strong>/rewind</strong> and <strong>/usage ,</strong> both of which I found disappointing, which I&#8217;ll get into.</p><p>But first, let&#8217;s talk about the Sonnet 4.5 hype.</p><h3>Sonnet Puts Codex Back In Its Place</h3><p>Despite weeks of speculation that Sonnet was deteriorating as a model, the new release of Sonnet 4.5 completely upended the sentiment. Simon Willison, one of the <a href="https://refactoringenglish.com/tools/hn-popularity/?utm_source=chatgpt.com">top 5 bloggers ever</a> on Hacker News, wrote:</p><blockquote><p>My initial impressions were that it felt like a better model for code than GPT-5-Codex, which has been my preferred coding model since <a href="https://simonwillison.net/2025/Sep/23/gpt-5-codex/">it launched a few weeks ago</a>.</p></blockquote><p>Simon wasn&#8217;t alone. YouTuber Cole Medlin has 167k subscribers, and in his video titled <a href="https://www.youtube.com/watch?v=P-0fm8ljl0I&amp;t=38s">Claude Sonnet 4.5 - The New Coding King? (Sonnet 4.5 vs. GPT 5 Codex)</a>, he set out to compare Claude 4.5 directly to Codex on a web dev task he orchestrated. The task was to add a Stripe integration to an existing web app.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kYYy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kYYy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 424w, https://substackcdn.com/image/fetch/$s_!kYYy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 848w, https://substackcdn.com/image/fetch/$s_!kYYy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 1272w, https://substackcdn.com/image/fetch/$s_!kYYy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kYYy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png" width="880" height="89" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fea277fb-58e7-46de-8520-6943eacfd91d_880x89.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:89,&quot;width&quot;:880,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28282,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/175061110?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kYYy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 424w, https://substackcdn.com/image/fetch/$s_!kYYy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 848w, https://substackcdn.com/image/fetch/$s_!kYYy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 1272w, https://substackcdn.com/image/fetch/$s_!kYYy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffea277fb-58e7-46de-8520-6943eacfd91d_880x89.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>On Sonnet 4.5, he had the following to say:</p><blockquote><p>There we go , Claude Code with Sonnet 4.5 has finished the implementation and did it in 15 minutes, the entire Stripe integration, it&#8217;s very impressive. I actually did this exact same build with Opus 4.1 in the past and it took 35 minutes to build the whole thing, so more than 2.5 faster with 4.5&#8230;.it made a couple mistakes, so it wasn&#8217;t quite a one-shot but it was pretty close.</p></blockquote><p>Meanwhile, he ran the same test with GPT-5-Codex</p><blockquote><p>It took 1 hour and 20 minutes in total while Sonnet 4.5 took 15 minutes, so the speed...was pretty disappointing. It seemed to do a lot of weird things like after editing a file, it would re-read the files and see what changes it made.</p></blockquote><p>While he had minor issues with both implementations, he found Claude Code&#8217;s to be slightly closer to his desired output. </p><p><strong>Overall, Cole put Claude Code ahead of Codex on both speed and quality.</strong></p><p>As an aside, I found Cole&#8217;s benchmarking strategy using a Claude Code <a href="https://docs.claude.com/en/docs/claude-code/slash-commands">custom command</a> (<em>/execute-prp</em>) that took a product requirements doc to be a really cool way of benchmarking these two agents.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Claude Code /rewind Command: Useful But Inferior To Git</h3><p><a href="https://www.anthropic.com/news/enabling-claude-code-to-work-more-autonomously">On the Claude 2 announcement post</a>, Anthropic describes the /rewind command in the following way:</p><blockquote><p>Complex development often involves exploration and iteration. Our new checkpoint system automatically saves your code state before each change, and you can instantly rewind to previous versions by tapping Esc twice or using the /rewind command. Checkpoints let you pursue more ambitious and wide-scale tasks knowing you can always return to a prior code state.</p><p>When you rewind to a checkpoint, you can choose to restore the code, the conversation, or both to the prior state. Checkpoints apply to Claude&#8217;s edits and not user edits or bash commands, and we recommend using them in combination with version control.</p></blockquote><p>I tested this command out by doing some work, then typing `/rewind`. </p><p>Upon typing the command, you get a list of all your previous messages, which are checkpointed. You can return to those checkpoints, and either <em>revert code,</em> <em>revert the conversation</em>, <em>or both - </em>undoing all code and/or conversation changes since the checkpoint.</p><p>If it does what it advertises it does, why am I disappointed? <strong>Because Git is still way better at solving the stated problem.</strong> Anthropic advertises checkpoints as a way to manage exploration and iteration of long-running tasks, but the checkpoint feature is far too rudimental to accomplish this.</p><p>When you revert the code, <em>it destroys all the code changes made</em>. Even though that&#8217;s what you asked for, destroying written code might still surprise you in a way you didn&#8217;t expect. With Git, you could just commit all the changes you want to destroy to a branch, then move off the branch. That way, the code is gone, but in an emergency where you deleted something that you actually needed , it&#8217;s still right there in a branch.</p><p>And if you need Git for <em>anything,</em> why not just use it for everything? In particular, I find that <a href="https://desktop.github.com/download/">GitHub Desktop</a> is an intuitive and visual tool for managing Git branches on your local machine, and lightyears ahead of this new checkpoint feature of Claude. </p><p>In fact, a Reddit user even <a href="https://www.reddit.com/r/ClaudeAI/comments/1ls64yu/i_built_a_hook_that_gives_claude_code_automatic/">built a tool that auto-commits after every Claude edit</a>, essentially giving you checkpoints, but powered by Git&#8217;s full ecosystem that&#8217;s evolved over two decades of production use.</p><p>To me, there&#8217;s one great use case of the /rewind command, which is to clean up the conversation to avoid context rot. You manage the code in Git but you can not manage the conversation in Git. Still, I&#8217;m increasingly suspecting it&#8217;s better to make more frequent check-ins into files like CLAUDE.md / AGENTS.md as a way of organizing work, and starting clean fresh sessions based on those markdown notes, than it is to try to repair a session that went off the rail.</p><p>Overall, it&#8217;s nice to see the Claude Code team make some progress towards managing complex work all within one session and one tool, but it&#8217;s simply not there yet.</p><h3>Claude Code /usage Command: Objectively Worse Than Claude-Monitor</h3><p>Last week, I wrote a post highlighting that Claude Code saves all your session&#8217;s token usage, and cost, in a local &#8216;~/.claude/projects&#8217; JSONL file and <a href="https://www.aiengineering.report/p/the-hidden-costs-of-claude-code-token">simply doesn&#8217;t show it to you</a>. Despite being easily accessible on your local box, you need a third party tool called <a href="https://github.com/Maciek-roboblog/Claude-Code-Usage-Monitor">Claude Monitor</a> to view it. So when I saw that Claude Code v2 released a new <strong>/usage</strong> command, I assumed they incorporated the essentials of claude-monitor into Claude Code.</p><p>To my surprise, the /usage<code> command</code> is even more crippled than /rewind. It <em>only</em> shows you the percent of usage left in the current session and week. </p><ul><li><p>It doesn&#8217;t show the amount of tokens you used - only the percentage</p></li><li><p> It doesn&#8217;t show what the cost would be if you were using the API instead of a monthly plan. </p></li><li><p>It doesn&#8217;t differentiate between token usage and message usage, even though the quotas limit both</p></li><li><p>It  doesn&#8217;t let you switch between a session view, daily view, and monthly view. </p></li></ul><p><strong>Meanwhile, claude-monitor does all of these things.</strong></p><p>Furthermore, if you <em>are</em> on a monthly plan, the /cost command <em>still</em> simply tells you that there&#8217;s &#8220;no need to monitor cost&#8221;, hiding the information that you <em>might</em> save money paying for usage-based pricing via API instead of a monthly plan. And once again, I have to speculate that Anthropic doesn&#8217;t want you to know that you could save money, and are banking on people preferring the predictability of fixed-pricing over taking the time to realize they&#8217;re overpaying.</p><p>In short, claude-monitor is still a <em>mandatory</em> tool if you care about optimizing cost and token usage <em>at all.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Using Sora 2 To Watch My Dog Do A Kickflip</h3><p>This newsletter is primarily targeted towards engineers and will primarily cover engineering content, but I&#8217;m also closely following the AI media and arts trends, including being a participant in the excellent <a href="https://text.machinecinema.ai/">Machine Cinema</a> AI art meetup group. Through their WhatsApp group, I was able to get an invite into the just-announced Sora 2 by OpenAI, and I have to say, it&#8217;s a <em>lot</em> of fun. The UI is clearly heavily inspired by TikTok, except instead of posting and editing videos with a traditional editor, you only prompt videos and edit them with followup prompts. </p><p>For now, I&#8217;ve mostly focused on pretending my dog Lucky could skateboard.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;5ce4ec38-c4f1-4072-b094-450c0c62143c&quot;,&quot;duration&quot;:null}"></div><p></p><p>That one actually looked somewhat believable as he does not succeed at the kickflip and some dogs can actually skateboard a little bit. But I did push my luck and have him get some hang-time off of the half-pipe:</p><p></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;8b41aa4b-dc61-4ffb-9d59-7d552c206b0d&quot;,&quot;duration&quot;:null}"></div><p>Thanks for reading <em>AI Engineering Report</em>! As always, please leave a comment on Substack or reply to this email with any thoughts.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/p/claude-code-20-great-model-but-flawed/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.aiengineering.report/p/claude-code-20-great-model-but-flawed/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Hidden Costs of Claude Code: Cost Optimization and Token Usage Monitoring]]></title><description><![CDATA[Anthropic hides your cost data, but here&#8217;s how to track tokens, compare subscription vs API, and avoid wasting money.]]></description><link>https://www.aiengineering.report/p/the-hidden-costs-of-claude-code-token</link><guid isPermaLink="false">https://www.aiengineering.report/p/the-hidden-costs-of-claude-code-token</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Wed, 24 Sep 2025 15:52:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/75d4eb7a-c378-45a4-b0ab-103aba3be4db_1000x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-HCko-NxCD_8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;HCko-NxCD_8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/HCko-NxCD_8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>In the last edition of this newsletter, I discussed how many developers were switching from Claude Code to Codex, in part because of tighter usage limits on Claude Plans. Even before the new weekly caps, the 5-hour usage limits are a common point of frustration, since you can hit a quota in the middle of your working session.</p><p><strong>But like many others, I had no idea that Anthropic hides the token and cost information you need to optimize your way around these problems</strong></p><p>Once you find this critical info, you can develop strategies for avoiding hitting your quota in your 5-hour window. You can also more accurately determine <strong>whether a monthly subscription is more cost-effective than using the API-key</strong> directly, in which case you pay by usage, as well as evaluate how many tokens using various MCP tools will burn. But first, you must find this info.</p><p>In this edition of <em>AI Engineering Report,</em> I dig into topics around understanding token usage and cost optimization on Claude Code, covering:</p><ul><li><p><strong>An invaluable OSS tool for measuring token usage in Claude Code</strong>, and pro tips on how to get the most value from it</p></li><li><p>The critical cost and token usage information that <strong>Anthropic hides in plain sight </strong>which I learned by reverse engineering how the OSS tool reverse engineers Claude Code</p></li><li><p>How to <strong>compare costs of Claude Pro and Max plans vs API key usage</strong></p></li><li><p>Thoughts on <strong>why Anthropic makes understanding cost intentionally difficult</strong></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>To work around the 5-hour reset limit, some developers on Reddit are even reporting <a href="https://www.reddit.com/r/ClaudeCode/comments/1nl8prc/hit_my_5hour_claude_code_limit/">waking up early</a> to send Claude a quick message so that they get a fresh quota reset fairly early in their workday, meaning Anthropic has solved one of the hardest problems in software engineering - getting programmers out of bed before 8AM.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Qtz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Qtz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 424w, https://substackcdn.com/image/fetch/$s_!0Qtz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 848w, https://substackcdn.com/image/fetch/$s_!0Qtz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 1272w, https://substackcdn.com/image/fetch/$s_!0Qtz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Qtz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png" width="624" height="124" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:124,&quot;width&quot;:624,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18856,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/174449388?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0Qtz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 424w, https://substackcdn.com/image/fetch/$s_!0Qtz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 848w, https://substackcdn.com/image/fetch/$s_!0Qtz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 1272w, https://substackcdn.com/image/fetch/$s_!0Qtz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F181441cc-28c5-42ea-b027-a861ee2bc7b8_624x124.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Jokes aside, I&#8217;d remind those developers that Claude Code has a non-interactive <code>-p</code> flag, meaning they could set up a crontab job to run a &#8220;hi Claude&#8221; early in the morning and enjoy a few extra hours of sleep.</p><h1>Claude Code Usage Monitor - A Mandatory OSS Tool</h1><p>It&#8217;s very interesting that Anthropic effectively hides your cost usage. If you&#8217;re on a subscription plan, the <code>/cost</code> command in Claude Code gives you a message like this:</p><pre><code><code>&gt; /cost 
  &#9151;  With your Claude Max subscription, no need to monitor cost &#8212; your subscription includes Claude Code usage
</code></code></pre><p>Given the limited quotas, Anthropic is wrong - you <em>do</em> need to monitor costs. Fortunately, a third party developer gave us an excellent way to do so.</p><p>Almost all of the research I did for this article comes from discovering the <a href="https://github.com/Maciek-roboblog">Claude Code Usage Monitor</a>, developed by <code>Maciek-roboblog</code> on GitHub, downloading it, then having Claude Code answer my questions about how it works. This tool is <em>amazingly useful</em>, and I&#8217;d consider it mandatory for any Claude Code users.</p><p>After you install it, you can run <code>claude-monitor</code> in a terminal window and it will show you the cost, token usage, and message limit of your current session, and the percentage you&#8217;ve moved toward your maximum quota. Keep in mind, Claude has quota on both token usage <em>and</em> the number of messages you send to Claude, so you should keep an eye on both. The cost is only your true cost if you&#8217;re using an API key. If you&#8217;re on a monthly subscription plan, then the cost is just what it <em>would</em> cost if you used the API key - which is quite helpful if you&#8217;re evaluating whether a monthly plan is cheaper than using the API key.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BZh1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BZh1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 424w, https://substackcdn.com/image/fetch/$s_!BZh1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 848w, https://substackcdn.com/image/fetch/$s_!BZh1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 1272w, https://substackcdn.com/image/fetch/$s_!BZh1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BZh1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png" width="1155" height="637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e708e489-c180-4b84-a371-79fdf8f11543_1155x637.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:637,&quot;width&quot;:1155,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:156949,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/174449388?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BZh1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 424w, https://substackcdn.com/image/fetch/$s_!BZh1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 848w, https://substackcdn.com/image/fetch/$s_!BZh1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 1272w, https://substackcdn.com/image/fetch/$s_!BZh1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe708e489-c180-4b84-a371-79fdf8f11543_1155x637.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Just as interesting as what information this tool tells you is <em>how</em> it gets this information. But first, I want to provide a few more tips on using it.</p><p></p><h1>Claude Code Usage Monitor - Two Pro Tips</h1><p>The Claude Code Usage Monitor tool has a README that clearly explains how the product works, but it&#8217;s exhaustive enough it&#8217;s easy to miss some critical options to get the most value out of it.</p><p>My first piece of advice is that if you&#8217;re on a monthly plan, you need to tell it what your plan is with the <code>--plan</code> flag, like this: <code>claude-usage --plan max20</code> (or pro, max5). This is important because the usage tool tells you the percentage of quota you&#8217;ve used up, but it has no way of knowing what your quota actually is without you telling it.</p><p>If you don&#8217;t provide the plan, the tool estimates your plan by looking at all your recent sessions, assuming your largest session was one that ran into a quota, and making that your max usage. This is a heuristic that might often be right, but is easily wrong if you have yet to hit your current quota. It&#8217;s best to just explicitly tell the tool with the <code>--plan</code> flag.</p><p>The next pro tip for this tool is that it has several different views configured with the <code>--view</code> flag. The default is <code>session</code>, but you can also look at <code>daily</code> and <code>monthly</code>. The two important ones are <code>session</code> and <code>monthly</code> .</p><p><code>session</code> is important because, behind the scenes, it calculates where you&#8217;re at in your current 5-hour quota window. If you want to avoid getting stuck without Claude Code for several hours, understanding where you&#8217;re at within the current window is critical. <code>session</code> is the default view if you don&#8217;t provide the <code>--view</code> flag. (<em>N.B.</em> technically the default appears to be <code>realtime</code> which I believe is simply an alias of <code>session</code>).</p><p>The <code>--view monthly</code> flag is not the default, so unless you look for it, you might not find it. As the name suggests, it shows the token usage, message usage, and API cost (or what it would be) of the current month.</p><p><strong>The monthly view is critical if you&#8217;re evaluating between the API usage-based pricing and monthly subscription, as it&#8217;s the best way to see what your API usage-based pricing </strong><em><strong>would</strong></em><strong> be even if you&#8217;re on a monthly plan.</strong></p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O2Ad!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O2Ad!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 424w, https://substackcdn.com/image/fetch/$s_!O2Ad!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 848w, https://substackcdn.com/image/fetch/$s_!O2Ad!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 1272w, https://substackcdn.com/image/fetch/$s_!O2Ad!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O2Ad!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png" width="1310" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:452,&quot;width&quot;:1310,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:142467,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/174449388?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O2Ad!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 424w, https://substackcdn.com/image/fetch/$s_!O2Ad!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 848w, https://substackcdn.com/image/fetch/$s_!O2Ad!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 1272w, https://substackcdn.com/image/fetch/$s_!O2Ad!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa40f266-6a03-4cd6-8d53-547759ef5471_1310x452.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see from the above screenshot, when I ran the <code>--view monthly</code>, I saw that I would have only spent $70.46 if I used an API key, when I&#8217;m actually paying $100/mo for Claude Max. Granted, the month is not over so I still may end up hypothetically saving money with the subscription, but the point remains that this view is the <em>only</em> reliable way to even make this comparison.</p><p>Unfortunately there&#8217;s no way to switch between views once you start the program, so you have to open up several instances of it or kill and restart it to switch between realtime, daily, and monthly views.</p><p>The final reason I consider this Claude Code Usage Monitor so important is that since Anthropic hides your usage statistics if you&#8217;re on the monthly plan, it&#8217;s the best way to understand token usage of various things you might do on Claude Code. For example, I&#8217;ve frequently seen people warn about tools like <strong>Playwright MCP</strong> burning many tokens, but there&#8217;s no good way of measuring how many tokens it burns without a tool like this.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Claude Code Usage Monitor - How It Works</h1><p>When I first saw this usage monitor tool, I immediately wondered how it worked. Given that Anthropic doesn&#8217;t provide this info, I assumed the tool must do advanced reverse engineering of something complex like network packet captures. Out of curiosity, I downloaded the project and asked Claude Code to answer questions about it.</p><p>To my astonishment, the tool is surfacing information that Anthropic is saving locally to JSON files, and simply not revealing!</p><p>Every time you start a new Claude Code session, a JSONL file is created in <code>~/.claude/projects</code> . While the <code>~/.claude/settings</code> file is officially documented, this projects file remains undocumented. However, if you dig in, you&#8217;ll see that every time you create a Claude Code session, a new file is created in the projects directory.</p><p>In that file, every message that Claude Code sends to the backend API has a field showing the <code>input_tokens</code> and <code>output_tokens</code> used, which can be trivially multiplied by the current model pricing to calculate cost. <strong>This means the exact cost of each Claude Code message is sitting right on your computer in JSON format.</strong></p><p>So all Claude Code Usage Monitor has to do is read those files to get your token usage, and multiply by $/token to get the cost. For example, to get the monthly costs, it simply reads all the JSON messages you sent this month and sums their cost. It still has a bit of nuance, for example, for the realtime view it has to determine where your 5-hour window reset occurs, but overall, the i<strong>nformation is more hidden in plain sight than reverse engineered in a complex way</strong>.</p><h1>Why Is Anthropic Hiding This Information?</h1><p>It&#8217;s fascinating to me that Anthropic is putting this cost information neatly formatted on your local machine in JSONL files, then simply <em>not</em> showing it to you. If you are deciding between using the API key and picking a monthly plan, then how much you&#8217;d be spending with the API key is critical information. You might - like me - find that you&#8217;re paying $100/mo for a monthly plan but spending less than $100/mo on tokens, and therefore would save money with the API key.</p><p>The uncharitable interpretation would be that <strong>Anthropic doesn&#8217;t want you to save money.</strong> By telling monthly plan users, &#8220;don&#8217;t worry about usage, it&#8217;s included!&#8221;, they let a subset of users overpay for their subscription and perhaps subsidize power users. Even if you started with an API key and saw how much your usage was, you&#8217;d still need to know how many tokens you used to evaluate whether you&#8217;d be under the quota set by the monthly plans, which, like the cost, <strong>is sitting on a JSONL file on your computer but simply not surfaced to you by Claude Code.</strong></p><p>The most charitable interpretation I could give Anthropic is that they want users to simply focus on getting value out of Claude Code and not stress over saving $20/mo by min-maxing their usage. But given how expensive AI coding can be, it&#8217;s simply inevitable that most users will care about cost optimization, and it&#8217;s hard not to suspect that Anthropic was discouraging that so that lower-usage customers could subsidize power users.</p><p>Fortunately, Claude Code Usage Monitor is here to the rescue, and if you&#8217;re a Claude Code user, it&#8217;s simply a mandatory tool. I hope this article helped you understand why it&#8217;s important and how to get the most value out of it.</p><p>Thanks for reading <em>AI Engineering Report</em>. Let me know your thoughts by replying to this email or leaving a comment on Substack.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/p/the-hidden-costs-of-claude-code-token/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.aiengineering.report/p/the-hidden-costs-of-claude-code-token/comments"><span>Leave a comment</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Devs Cancel Claude Code En Masse - But Why?]]></title><description><![CDATA[Redditors have started a mass cancellation campaign of Anthropic's Claude Code over pricing and quality issues.]]></description><link>https://www.aiengineering.report/p/devs-cancel-claude-code-en-masse</link><guid isPermaLink="false">https://www.aiengineering.report/p/devs-cancel-claude-code-en-masse</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Tue, 09 Sep 2025 18:26:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/yhjieRhsVHc" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-yhjieRhsVHc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;yhjieRhsVHc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/yhjieRhsVHc?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong>Claude Code</strong> has gone from developer darling to facing a mass cancellation campaign in the blink of an eye. The top post on Anthropic&#8217;s subreddit last week was <a href="https://www.reddit.com/r/Anthropic/comments/1n5gzz2/claude_is_dead/">Claude Is Dead</a> with over 841 upvotes, over double the amount that <a href="https://www.reddit.com/r/Anthropic/comments/1nc4nf7/update_on_recent_performance_concerns/">Anthropic&#8217;s official response got.</a></p><p>Meanwhile, metrics from the <a href="https://www.vibekanban.com/">Vibe Kanban</a> - a tool which orchestrates AI agents - has shown Claude Code usage drop from  83% to 70%, with <strong>OpenAI&#8217;s Codex</strong> agent taking up slack (and taking most of <strong>Google&#8217;s Gemini</strong> agent&#8217;s usage along with it).</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;447fd177-7a9b-4f64-bffa-1a06c3f680c9&quot;,&quot;duration&quot;:null}"></div><p><a href="https://www.reddit.com/r/ClaudeCode/comments/1n7891r/actual_numbers_on_people_switching_to_codex/">(source</a>)</p><p>In this edition of <em>AI Engineering Report,</em> I&#8217;ll cover:</p><ul><li><p><strong>The reasons</strong> devs and Redditors have started a mass cancellation campaign for Claude Code</p></li><li><p>What <strong>AI agent benchmarks</strong> are saying about how AI coding agents compare</p></li><li><p>What this means for the <strong>AI coding agent landscape</strong></p><p></p></li></ul><h3>Why Devs Are Canceling Claude Code En Masse</h3><p>There are <strong>two reasons</strong> that this cancellation campaign started:</p><p>The first reason is <strong>usage limit changes.</strong> Anthropic announced that starting <strong>August 28, 2025</strong>, they added <strong>weekly usage limits</strong> across all Claude Pro and Max plans. These new limits now act alongside the existing <strong>5-hour reset window</strong>, introducing an additional layer of restrictions.</p><p><strong>Before (pre-Aug 28, 2025):</strong></p><ul><li><p>Only <strong>5-hour rolling reset windows</strong>.</p></li><li><p>Pro: ~45 msgs / 5h.</p></li><li><p>Max $100: ~225 msgs / 5h.</p></li><li><p>Max $200: ~900 msgs / 5h.</p></li><li><p><strong>No weekly caps.</strong></p></li></ul><p><strong>After (post-Aug 28, 2025):</strong></p><ul><li><p>Still <strong>5-hour reset windows</strong>, <em>plus</em> new <strong>weekly caps</strong>.</p></li><li><p>Pro: ~40&#8211;80 hrs Sonnet 4 / week (no Opus).</p></li><li><p>Max $100: ~140&#8211;280 hrs Sonnet 4 + ~15&#8211;35 hrs Opus / week.</p></li><li><p>Max $200: ~240&#8211;480 hrs Sonnet 4 + ~24&#8211;40 hrs Opus / week.</p></li></ul><p>As a result, many users have hit rate limits that have made it difficult to complete their tasks despite paying $200 a month.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Perceived Quality Issues and Benchmarks </h3><p>The <strong>second reason is perceived quality issues. </strong>Many Redditors have complained that they <em>feel</em> Claude Code is producing worse outputs. Some go on to theorize that Anthropic has <em>degraded the model </em>in an effort to reduce costs, such as by <em>quantizing</em> the model, or reducing the numerical precision which slightly degrades performance but massively saves on cost. </p><p>Many are switching to <strong>OpenAI Codex </strong>as their preferred alternatives. Here&#8217;s some top comments mentioned:</p><blockquote><p>Claude &#8594; better for rapid prototyping, creative fill-in, mimicking style.</p><p>Codex &#8594; better for structured, step-controlled builds.</p><p>I use both. BUT when considering to go to the Pro plan on Claude vs OpenAI, I went with OpenAI. I dont trust Claude not to just crash or further downgrade/limit access. (<a href="https://www.reddit.com/r/ClaudeCode/comments/1nb27dh/ive_been_asking_claude_code_and_codex_to_create/">source</a>)</p></blockquote><blockquote><p>I find codex is better with writing the minimum code required to get the job done (<a href="https://www.reddit.com/r/ClaudeCode/comments/1nan23i/i_have_used_cc_and_codex_for_24_hours_straight_on/">source</a>)</p></blockquote><p>Most damning of all is the deep analysis of YouTuber <em><a href="https://www.youtube.com/watch?v=bp5TNTl3bZM&amp;t=494s">GosuCoder</a> </em>who did a deep dive on AI agent performance using his custom benchmark suite you can learn more about at <a href="https://gosuevals.com/index.html">GosuEvals</a>. </p><p>In his video, he summarizes his benchmark system as follows:</p><ul><li><p>Instruction Following</p></li><li><p>Unit Tests</p></li><li><p>LLM as judge</p></li></ul><p>While GosuCoder clearly spends an incredible amount of time evaluating AI agents, it&#8217;s important to note that his eval framework is <strong>not open source</strong> so that it can&#8217;t be gamed by AI agent creators. While his motivation makes sense, it does make it harder to evaluate the quality of his benchmarks.</p><h3>Claude Code At The Bottom</h3><p>Regardless of the quality of GosuCoder&#8217;s benchmarking system, it was <strong>shocking to find Claude Code toward the bottom of the pack. </strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ndug!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ndug!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 424w, https://substackcdn.com/image/fetch/$s_!Ndug!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 848w, https://substackcdn.com/image/fetch/$s_!Ndug!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 1272w, https://substackcdn.com/image/fetch/$s_!Ndug!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ndug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png" width="1456" height="824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1432403,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/173203800?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ndug!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 424w, https://substackcdn.com/image/fetch/$s_!Ndug!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 848w, https://substackcdn.com/image/fetch/$s_!Ndug!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 1272w, https://substackcdn.com/image/fetch/$s_!Ndug!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F638ab6fa-89d6-4ea7-b8e9-47d9901ae297_3430x1940.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>GosuCoder added the following commentary:</p><blockquote><p>This is the thing that blows my mind&#8230;.claude code used to be one of the better ones, and it has actually come down to be 24,314 now, it&#8217;s behind Kiro and Windsurf and Crush, and part of me wonders if comes with the nature of them trying to preserve tokens&#8230;or if the other agents have just caught up. Regardless Claude Code is still incredibly good value, but it&#8217;s surprising to me how much it&#8217;s fallen.</p></blockquote><h3>Anthropic Responds</h3><p>Anthropic took to their own subreddit to make an <em><a href="https://www.reddit.com/r/Anthropic/comments/1nc4nf7/update_on_recent_performance_concerns/">official statement</a></em> on perceived quality degradation performance. They <strong>admitted known bugs had hurt performance for some users but denied intentionally degrading performance to handle cost.</strong></p><blockquote><p>We've received reports, including from this community, that Claude and Claude Code users have been experiencing inconsistent responses. We shared your feedback with our teams, and last week we opened investigations into a number of bugs causing degraded output quality on several of our models for some users. <a href="https://status.anthropic.com/incidents/72f99lh1cj2c">Two bugs have been resolved</a>, and we are continuing to monitor for any ongoing quality issues, including investigating reports of degradation for Claude Opus 4.1.</p></blockquote><p></p><h3>Implications and My Take</h3><p>Let&#8217;s state the obvious - Redditors like to overdramatize things and vocal minorities often seem bigger than they are, with some stating that Claude Code is still <a href="https://www.reddit.com/r/ClaudeCode/comments/1nac5lx/am_i_the_only_nonvibe_coder_who_still_thinks_cc/">easily the best</a>. Many commenters still preferred Claude Code to Codex, and even the ones who do prefer Codex described the CLI as poor and <a href="https://github.com/just-every/code">suggested a separate repo </a>to fix the UX issues. </p><p>Furthermore, GosuCoder&#8217;s benchmarks were shown as &#8220;proof&#8221; that quality degraded despite not being open to public scrutiny, still being subjective (as all benchmarks are), and perhaps most importantly, Claude Code was only 10% behind the leader in his scoring system. That type of difference could easily be changed by a tweak to the scoring system.</p><p>In my own experience, <strong>benchmarking AI agents is incredibly difficult</strong><em>. </em>Most of them are quite good at accomplishing well-defined tasks and struggle at novel tasks or tasks they lack good training examples on. This often makes them more similar than different. Furthermore, they are often more influenced by <strong>prompting strategies and context provided</strong> than by the difference in the agent quality themselves. Finally, <em>&#8220;</em><strong>good code&#8221; has always been somewhat subjective</strong><em>, </em>so evaluations of AI coding &#8220;quality&#8221; is likewise subjective.</p><p>Even by the &#8220;stats&#8221; proving the demise of Claude Code, we can see that it dropped from 83% to 70% on the Vibe Kanban tool (and it&#8217;s unclear how reflective that is of broader industry trends), which is still the market leader. Still, Anthropic <em>issuing an official response</em> does indicate they were at least somewhat concerned by the accusations and wanted to quell them, with many end-users appreciating Anthropic&#8217;s transparency on the issue.</p><p>Thanks for reading AI Engineering Report, please reply by email or leave a Substack comment if you have any opinions on this topic!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Scaling Claude Code with GitHub Actions and Pull Requests]]></title><description><![CDATA[My initial experiments with letting Claude add features to my app using GitHub Actions and GitHub Pull Requests]]></description><link>https://www.aiengineering.report/p/combining-claude-code-with-github</link><guid isPermaLink="false">https://www.aiengineering.report/p/combining-claude-code-with-github</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Wed, 20 Aug 2025 18:35:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ae996376-735a-4519-9e54-d2143f8f6f3b_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-PvqMVLbdO-s" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;PvqMVLbdO-s&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/PvqMVLbdO-s?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><a href="https://docs.anthropic.com/en/docs/claude-code/github-actions">The GitHub integration</a> stands out as one of Claude Code's most powerful features. There are many exciting aspects of it, but what I'm most excited about is the ability to have dozens of agents running in isolated environments and adding features to your codebase, all in the extremely well-documented and battle-tested toolset of GitHub Actions.</p><p><strong>GitHub Actions provide isolated container environments for each agent, which means Claude Code can work on multiple features simultaneously without agents stepping on each other.</strong> </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Code Review, Linting, and Testing</h3><p>Before diving into the scaling potential, there are some immediate wins from this integration. For example, very often when you make a new code change, it fails &#8220;linting&#8221; (static code analysis tool that catches bugs and style issues). Now, you can forget worrying about fixing those issues and just ask Claude to fix it for you after you&#8217;re done, eliminating the 10-15 minute cycle of fixing linting errors, running tests, and checking results. </p><p>Something I found even more frustrating during code review were minor style issues that modern linting tools weren&#8217;t quite sophisticated enough to catch, but that a code reviewer felt strongly about. In this case, you have to manually read the code review comments, fix the issues, and test everything again, which can be a huge time drain. Now Claude can handle all of that for you in the background so you can focus on more important work.</p><h3>Scaling Feature Development</h3><p>A former colleague has been chatting to me about the topic of scaling coding AI agents quite a bit using <a href="https://sketch.dev/">sketch.dev</a>. He has very positive things to say about it other than the high cost of running so many agents, but when I took a look at the product, I found the UI/UX a bit intimidating and ambiguous. </p><p>Meanwhile, GitHub Actions is extremely well-documented, battle tested, and well understood. It&#8217;s very likely that you <em>already</em> use GitHub Actions to run your testing and possibly your continuous deployments. </p><p>Now, by running a single command in Claude Code (/install-github-app) you can mention @Claude on your Github Issue and it will spin up a pull request in an isolated environment. This implies that if you have 20 Github Issues, you can mention @Claude on each of them and have 20 Claude agents get to work adding 20 features to your app, each in an isolated environment. <br></p><h3>My Experience Setting Up Claude Code and Github Actions on My Project and the Value of Vercel Preview Environments</h3><p>The top of this post will include a Youtube video where I walk through my experience setting up Claude Code on my Github repo, but ultimately it was just running /install-github-app and following a few OAuth steps. </p><p><strong>However, this experience revealed a key insight: AI coding agents make robust testing more critical, not less.</strong> While Claude codes incredibly fast, it still hallucinates and makes mistakes. It became crystal clear that having Claude code create PRs, while having now way to verify those PRs didn&#8217;t break anything, wasn&#8217;t actually useful. The more you can rely on automated testing to catch these issues, the faster you can move with confidence.</p><p>Of course, Claude Code was helpful in getting a Jest integration test suite setup very quickly. But its initial pass ended up writing a <em>lot</em> of tests that didn&#8217;t even catch bugs I introduced, so I had to coax Claude a bit more to accomplish what I actually cared about, which is a test suite that catches app breakages. In Claude&#8217;s defense, I&#8217;ve seen <em>plenty</em> of human engineering teams write huge amounts of useless tests. </p><p>Once I had those tests, and I setup the /install-github-app command, it truly was as simple as creating a GitHub Issue and mentioning @Claude, and it created the feature. This is demonstrated in the video.</p><p>Additionally, besides automated testing, since I deploy to Vercel they automatically create a preview deployment of the changes Claude made. This is useful to manually check everything looks good before merging the changes, and an easy path to set up end-to-end tests on a real environment. </p><h3>Conclusion, Cost / Pricing, and Looking Forward</h3><p>I'm curious about the cost and scalability of running many agents simultaneously, and will learn more as I continue to use this integration. But for now I wanted to share this initial setup experience</p><p><br>Thanks for reading! As always happy to read comments on Substack or by replying to this email. </p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How YC Startups Use AI: Agents, OCR, and Prompt Engineering with Mercoa (YC W23)]]></title><description><![CDATA[An interview with Sandeep Dinesh, Co&#8209;Founder and CTO of Mercoa (YC W23), on building AI agents, doing OCR with LLMs, and lessons learned from AI in the trenches]]></description><link>https://www.aiengineering.report/p/how-yc-startups-use-ai-agents-ocr</link><guid isPermaLink="false">https://www.aiengineering.report/p/how-yc-startups-use-ai-agents-ocr</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Wed, 06 Aug 2025 15:55:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oIib!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oIib!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oIib!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 424w, https://substackcdn.com/image/fetch/$s_!oIib!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 848w, https://substackcdn.com/image/fetch/$s_!oIib!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 1272w, https://substackcdn.com/image/fetch/$s_!oIib!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oIib!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png" width="1243" height="731" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:731,&quot;width&quot;:1243,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:271441,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/170279359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oIib!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 424w, https://substackcdn.com/image/fetch/$s_!oIib!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 848w, https://substackcdn.com/image/fetch/$s_!oIib!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 1272w, https://substackcdn.com/image/fetch/$s_!oIib!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a3f688c-c129-4fb7-a821-08d59689b815_1243x731.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Y Combinator is the highest-profile startup incubator and one of the loudest advocates of LLM adoption. They report that roughly a quarter of their portfolio lets <a href="https://leaddev.com/hiring/95-ai-written-code-unpacking-the-y-combinator-ceos-developer-jobs-bombshell">AI write 95 percent of its code</a>, and that <a href="https://www.ycombinator.com/blog/why-yc-went-to-dc/">nearly every new company touches AI in some way</a>.</p><p><a href="https://mercoa.ai/">Mercoa</a> fits that mold. The Winter 2023 batch company turns accounts-payable rails into an AI-powered bill-pay agent, and its CTO, <strong>Sandeep Dinesh</strong> (formerly my colleague at Google), has been shipping LLM features since the GPT-3.5 era.</p><p>In this interview we cover:</p><ul><li><p>The state-machine <strong>AI agent architecture</strong> behind Mercoa&#8217;s payment product</p></li><li><p><strong>Prompt-engineering tactics t</strong>heir team refined in production</p></li><li><p>How they pick models and tools (Gemini, GPT-4, BAML, Stagehand)</p></li><li><p><strong>Advice for founders and engineers </strong>who want to move faster with AI</p></li></ul><p><strong>Interviewer: Bill Prin, </strong><em><strong>AI Engineering Report</strong></em></p><h3><strong>Bill: Quick intro &#8211; what is Mercoa?</strong></h3><p><strong>Sandeep:</strong> Mercoa is an embedded accounts&#8209;payable and accounts&#8209;receivable platform. We sell to vertical SaaS, banks, and payment issuers such as Mercury or Brex. Their end customers are businesses that handle thousands of bills each month.</p><p>Recently we pivoted to an AI agent that pays invoices with virtual credit cards. The agent processes invoices, figures out whether the vendor will accept card, navigates the payment portal or checkout page, and executes the payment.</p><div><hr></div><h3><strong>What are some of the ways you&#8217;ve used AI and LLMs to build features that help customers or otherwise give your business an advantage?</strong></h3><p><strong>Sandeep:</strong> Back in the GPT&#8209;3.5 days we dumped invoice text into ChatGPT with a structured prompt. It outperformed specialized OCR APIs that cost ten cents per document and struggled with layout variation. It was a bit surprising that these much more general language-focused models would outperform specialized computer vision techniques, but ultimately their ability to handle the slight imperfections in the input is where they came out ahead. Today we run Gemini 2.5 Pro for vision OCR. No fine&#8209;tuning.</p><p>After one-shotting the invoice page through an LLM, we pipe the raw text into BAML so it can extract the fields it needs into clean JSON.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div><hr></div><h3><strong>What are some of your lessons learned about AI Engineering based on that experience?</strong></h3><p><strong>Sandeep:</strong> A key lesson around prompt engineering has been that less context reduces hallucination. So we split multi&#8209;page docs, process pages in parallel, then use business logic to reconcile totals. We one&#8209;shot with a tight system prompt and minimal examples.</p><h3><strong>Interesting, that sounds like a term I've recently seen called &#8216;context rot&#8217; that<a href="https://simonwillison.net/2025/Jun/18/context-rot/"> Simon Willison has written about</a> and I&#8217;ve seen some<a href="https://www.youtube.com/watch?v=TUjQuC4ugak&amp;t=13s"> YouTube videos</a> pop up around.</strong></h3><p><strong>Sandeep:</strong> Yeah exactly, with the early versions of LLMs, context windows were so small, GPT-3 had 2048 tokens, people were begging for bigger windows. So LLMs like Gemini come out today with <em>million</em>-token context windows, and at first it sounds great, until you realize that too much context can actually hurt your results. You want to figure out the smallest amount of information you can give the model to complete the task as that will usually have the best results.</p><h3><strong>What are some other applications you&#8217;ve built? Have you found the need to do any fine-tuning or RAG applications?</strong></h3><p><strong>Sandeep:</strong> We&#8217;ve completely ignored fine-tuning. There&#8217;s an emerging consensus that it&#8217;s too time-consuming and expensive to do relative to other approaches, especially with the foundational models themselves evolving so fast. You&#8217;d have to fine tune again for every model you want to try every time a new one releases. Meanwhile, providing better prompts and using better examples is typically cheaper and more effective.</p><p>For RAG, we have a use case where we predict metadata for invoices, and we&#8217;ve found that a &#8220;lazy RAG&#8221; approach has been most effective. In this case, we just do a database lookup for invoices that have some similarity based on the limited metadata we do have, and then we use those as examples so that the model can predict the rest of the metadata. For our use cases, we haven&#8217;t found the need for more complex embeddings or vector database approaches.</p><h3><strong>Let&#8217;s talk more about this AI agent you&#8217;ve been focusing on recently and have made your primary product offering. What does the agent architecture look like?</strong></h3><p><strong>Sandeep:</strong> Think of it as a state machine that only goes in one direction. State 1: We have an invoice PDF. State 2: Determine if the vendor supports card. State 3: Get to the card form. State 4: Fill details and submit. Transition logic is fuzzy, so we let the model decide how to move forward inside each state. The secret sauce is the chain of prompts and loops to get from one state to the next in a reliable way.</p><p>One very useful tip we learned is that LLMs have a tendency to hallucinate and confidently answer even if they don&#8217;t know if you ask them for an answer. But if you provide an &#8216;escape hatch&#8217; and explicitly tell them they can say they don&#8217;t know, they will use that escape hatch which will reduce bad answers. So typically we use BAML and have our model provide an answer of &#8216;yes&#8217;, &#8216;no&#8217;, or &#8216;unknown&#8217;. BAML lets the model write its chain-of-thought into reasoning while our code reads only acceptCard, which keeps the agent deterministic. The &#8216;unknown&#8217; answer is that escape hatch that prevents some hallucinations.</p><div><hr></div><h3><strong>There is an explosion of browser&#8209;automation libraries. What are you using?</strong></h3><p><strong>Sandeep:</strong> We shipped v1 on Stagehand because it worked fastest for us in TypeScript. We are evaluating Browserless, Browserflow, and Playwright&#8209;based agents. Vendor lock&#8209;in is a concern, so we prefer thin wrappers around browser primitives.</p><div><hr></div><h3><strong>How do you choose between GPT&#8209;4, Claude, Gemini, or open models?</strong></h3><p><strong>Sandeep:</strong> Criteria are quality first, then latency, then price. For heavy OCR we use Gemini 2.5 Pro &#8211; accuracy matters. For the agent&#8217;s incremental steps Gemini Flash is fastest and cheap.</p><h3><strong>How do you evaluate the quality of your LLM responses?</strong></h3><p><strong>Sandeep:</strong> We keep a unit&#8209;test style suite per task. New model comes out, swap it in BAML, run the suite. If it passes, we migrate.</p><div><hr></div><h3><strong>What prompt engineering tips have stuck with you over this time?</strong></h3><ul><li><p>Keep the context window as small as possible &#8211; chunk large docs and post&#8209;process.</p></li><li><p>Use enums instead of booleans (yes, no, unknown) to avoid bias.</p></li><li><p>Chain&#8209;of&#8209;thought is helpful but only include it if it actually helps.</p></li><li><p>Prompt engineering is probably the best way to get better performance. A good prompt can outperform a better model.</p></li></ul><div><hr></div><h3><strong>What&#8217;s your advice for people building startups, if you started over, what would you do differently?</strong></h3><p><strong>Sandeep:</strong> I would build agentic workflows sooner. If something today seems like it&#8217;s delivering some value, but the underlying tech feels not quite ready, well, the underlying tech is evolving so fast that it&#8217;s likely it <em>will</em> be ready soon and you&#8217;ll be the first one to capitalize on it because you have a head start.</p><p><strong>On hype and competition:</strong> Massive VC funding can look scary. It simply reflects a huge surface area of problems to solve. Focus on shipping something customers pay for.</p><h3><strong>What&#8217;s your advice for junior engineers looking for a job, or perhaps senior engineers looking to upskill on AI skills? Do you recommend any libraries or frameworks that seem hot like LangChain or LlamaIndex?</strong></h3><p>I&#8217;ve always been skeptical about learning frameworks or libraries because they&#8217;re popular or for their own sake. Instead, try to build something interesting, but also talk to a lot of people in the space, be active on AI social media, go to hackathons and meetups. When you do this, typically when you have conversations with people, the need for new tools will emerge more organically. You&#8217;ll say, &#8220;oh this problem is giving me a hard time&#8221; and someone will say, &#8220;oh this library can help&#8221;.</p><p>I was a bit late on the Cursor adoption, but I was on a call with a vendor when I saw them solve something very quickly with Cursor and that led me to try it. With this approach, any tool you adopt has some clear purpose and you understand why you&#8217;re using it, plus you have tangible output for all your work.</p><div><hr></div><h2><strong>Resources and links</strong></h2><ul><li><p>Mercoa &#8211; <a href="https://mercoa.ai">https://mercoa.ai</a></p></li><li><p>BAML &#8211; structured prompt and JSON extraction toolkit<a href="https://github.com/baml-hq/baml"> </a><a href="https://github.com/BoundaryML/baml">https://github.com/BoundaryML/baml</a></p></li><li><p>Stagehand &#8211; TypeScript browser automation,<a href="https://docs.stagehand.dev/get_started/quickstart"> https://docs.stagehand.dev/get_started/quickstart</a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Claude Code vs Cursor: First Look On A Real Dev Problem ]]></title><description><![CDATA[I gave Claude Code a specific task and compared how it did vs Cursor]]></description><link>https://www.aiengineering.report/p/claude-code-vs-cursor-my-first-impressions</link><guid isPermaLink="false">https://www.aiengineering.report/p/claude-code-vs-cursor-my-first-impressions</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Tue, 29 Jul 2025 21:36:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c09a892f-4493-4a21-bb15-03f615085278_2560x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-_JwiXRf7na0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_JwiXRf7na0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_JwiXRf7na0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>A few months ago during the <a href="https://www.aiengineering.report/p/making-a-video-game-with-ai-by-just">Vibe Coding Game Jam</a>, almost everyone I saw on Twitter discussing their work was using Cursor, one of the most popular AI-assisted IDEs. Claude Sonnet 4 had just been released, and Cursor had put their coding &#8220;Agent&#8221; feature front-and-center and moved its &#8220;Ask&#8221; feature to the side. The combination of the power of Sonnet with the tooling of Cursor made vibe coding more powerful and fun than ever.</p><p>More recently, I&#8217;ve seen countless people talk about embracing <strong>Claude Code -</strong> which Anthropic, the creator of Claude, released in &#8216;research preview earlier this year&#8217; - in favor of tools like <strong>Cursor, </strong>an AI-based IDE I&#8217;ve written about on my newsletter and Youtube a <a href="https://www.aiengineering.report/p/building-a-custom-mcp-server-to-query">few</a> <a href="https://www.youtube.com/watch?v=Pe8v0v_iYLo">times</a>. </p><p>Unlike Cursor, Claude Code is a primarily terminal-based tool, though there is some IDE support via plugins, including one for VSCode and Cursor itself. The terminal-based nature of Claude Code is a huge appeal to many engineers, some of whom prefer not to use IDEs, and others who want to use agentic based coding in contexts outside of the IDE such as terminal scripts and GitHub.</p><p>When Cursor hype was at its peak (<a href="https://techcrunch.com/2025/05/04/cursor-is-reportedly-raising-funds-at-9-billion-valuation-from-thrive-a16z-and-accel/">raising money at a $9B valuation</a>), many highlighted the irony that a &#8220;ChatGPT-wrapper&#8221; - a tool that just builds around foundational models- seemed to be a stronger business than the foundational models themselves. This inverted previous assumptions that &#8220;wrappers&#8221; were low effort with little to no competitive business moats.</p><p>Since the release of Claude Code in Research Preview, we&#8217;ve seen a foundational model company strike back. Claude Sonnet is usually cited as the current strongest coding model, and Anthropic - being the company that makes Claude - has at least some advantages in building the best coding tools on top of it.</p><p>Claude Code has emerged as one of the most popular tools for AI-assisted coding, and I&#8217;ve seen countless tweets and Reddit posts asserting that they&#8217;ve abandoned Cursor in favor of simply using Claude Code. <strong>So I&#8217;ve decided to give both a spin and come to some early opinions.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>The Task They Battled Over - Improving ESLint Config in a Large Turborepo Monorepo</h3><p>The main task I set out to accomplish is one that&#8217;s been giving me headaches for months. In Typescript, you can write <code>async</code> functions which are almost always intended to be called with <code>await</code> . Forgetting this has been a huge source of bugs in my codebase.</p><p>As an example of a bug, I mean to send a customer an email, but the server function finishes and terminates because I did not <code>await</code> for the email function. Because the server thread no longer exists, the async email function never around to being run, and a critical email is not sent.</p><p>This is not technically a violation of the Typescript compiler, and is instead something that should be checked by a linter like ESLint. In a small project, this is usually trivial to add.</p><p>The real challenge arose when I moved to a <a href="https://turborepo.com/">Turborepo</a> monorepo, which I mostly did so that my web version of my project (written in React) and the native iOS/Android versions (built with Expo / React Native) could share code. NodeJS dependency management is notoriously error-prone and fragile, and in the world of Expo and React Native, doubly so, and in a world of trying o combine Expo with NextJS, triply so.</p><p>A few months ago, I spent over 10 hours with both Claude and ChatGPT trying to get my linter working, and still failed. It sounds a bit ridiculous, but does speak to the complexity and fragility of the ecosystem.</p><h3>Claude Code One-Shots It</h3><p>I downloaded Claude Code, and ran just <code>claude</code> in my cli, being presented with a prompt, where I described my issue.</p><p>Before I did that, I ran the initialization to create a <code>Claude.MD</code>, and I was pleasantly surprised that it deduced that my project was really two separate but closely connected apps (web and native) sharing code, without any instruction from me explaining this.</p><p>I then asked it to fix the ESLint issues, including that I was looking for a sample file that could reproduce the bug and show &#8220;red squiggly lines&#8221; in my IDE, which would call visual attention to the bugs as I develop.</p><p>Claude Code had no problem navigating my codebase (including the two separate versions of the product) and setting up ESLint:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bmSK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bmSK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 424w, https://substackcdn.com/image/fetch/$s_!bmSK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 848w, https://substackcdn.com/image/fetch/$s_!bmSK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 1272w, https://substackcdn.com/image/fetch/$s_!bmSK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bmSK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png" width="1279" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d280480-7237-4011-b528-c1f9689cff22_1279x683.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1279,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:220812,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/169609580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bmSK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 424w, https://substackcdn.com/image/fetch/$s_!bmSK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 848w, https://substackcdn.com/image/fetch/$s_!bmSK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 1272w, https://substackcdn.com/image/fetch/$s_!bmSK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d280480-7237-4011-b528-c1f9689cff22_1279x683.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>It also created the test file like I asked and pointed it to me to verify I could see the red squiggly lines:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QvYG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QvYG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 424w, https://substackcdn.com/image/fetch/$s_!QvYG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 848w, https://substackcdn.com/image/fetch/$s_!QvYG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 1272w, https://substackcdn.com/image/fetch/$s_!QvYG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QvYG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png" width="1286" height="117" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:117,&quot;width&quot;:1286,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40964,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/169609580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QvYG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 424w, https://substackcdn.com/image/fetch/$s_!QvYG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 848w, https://substackcdn.com/image/fetch/$s_!QvYG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 1272w, https://substackcdn.com/image/fetch/$s_!QvYG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd3fe084-cb45-49d3-962e-1dd7400f0b60_1286x117.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><h3>But Cursor One Shots It Too</h3><p>I was blown away by Claude Code finally getting the configuration right and fixing this long standing issue, as I thought previous AI toolings had failed. However, I asked Cursor to accomplish the same thing, and it <em>also</em> one-shot it, fixing many quirky dependency issues:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2V4n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2V4n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 424w, https://substackcdn.com/image/fetch/$s_!2V4n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 848w, https://substackcdn.com/image/fetch/$s_!2V4n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 1272w, https://substackcdn.com/image/fetch/$s_!2V4n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2V4n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png" width="591" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:460,&quot;width&quot;:591,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77556,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/169609580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2V4n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 424w, https://substackcdn.com/image/fetch/$s_!2V4n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 848w, https://substackcdn.com/image/fetch/$s_!2V4n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 1272w, https://substackcdn.com/image/fetch/$s_!2V4n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1db72b9-eac8-4cc3-b337-c6ceec7e5a47_591x460.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>It&#8217;s All The Same Underlying Model - So Whats The Difference</h3><p>Its not surprising that both Claude Code and Cursor were able to fix the issue since <strong>they both use the same model, Claude Sonnet, behind the scenes.</strong></p><p>While there&#8217;s clearly some minor differences in how their agent operates, both Claude Code and Cursor have top-notch teams so any big difference in capabilities is likely to be ironed out over time.</p><p>So if both Claude Code and Cursor can accomplish this task - what <em>is</em> the difference between the two tools? I&#8217;ve come to the following (early) conclusions:</p><ol><li><p><strong>Cursor still offers better IDE usability.</strong> While I tried the Claude Code VSCode Plugin, it&#8217;s bare-bones in comparisons to Cursor, mostly just showing diffs to approve. Cursor, meanwhile, has tab to complete and multi-line edit, which are much more sophisticated ways for a human to use AI to code faster.</p></li><li><p><strong>Cursor is a faster workflow if you can use your codebase knowledge to hint the AI along its task.</strong> When I asked Claude Code to fix one of the linter errors, it took several Unix <code>search</code> and <code>grep</code> commands to even identify the area of the code I was talking about. Cursor, on the other hand, by default will add the file you&#8217;re looking at into the context, and specifically add context about where your cursor is highlighting code. This makes Cursor&#8217;s agent <em>slightly</em> faster when you are actively working in your codebase.</p></li><li><p><strong>Claude Code is scriptable .</strong> Claude Code has a <code>-p</code> flag that lets you give it a prompt as you call it, which means you can write a script that will trigger Claude Code to do its job. This has almost infinite use cases but to name one, you could imagine a simple script to pull a GitHub PR, and run <code>claude -p fix the linter errors</code> . This way, Claude Code can be dispatched to every use case outside of the IDE, while Cursor&#8217;s agent is trapped inside of it.</p></li><li><p><strong>Claude Code has tight GitHub integration</strong> - This ties into the above scriptabiilty topic, but it&#8217;s worth calling out that Anthropic has already added first-class support to GitHub for Claude Code. There&#8217;s tons of cool out-of-the-box features like being able to go to a GitHub issue, mention @claude, and have it create a new PR using a Github action in the background.</p></li><li><p><strong>Claude Code is slightly more price efficient -</strong> Both Claude Pro and Cursor Pro are $20/month, but Claude Pro resets its usage slightly more frequently. If you need to step up from there, Claude Code offers a halfway price point at $100/mo, while both offer $200/mo plans.</p></li></ol><h3>Why Not Both?</h3><p>It&#8217;s worth noting that Cursor, being a fork of VCCode, has a terminal window as one its panels. That means its <strong>trivial to run Claude Code inside of Cursor, and in fact Cursor is explicitly supported</strong>.</p><p>If you take this approach, you&#8217;ll still have to pick whether you want to use Cursor&#8217;s agent or Claude Code , with Cursor support, on any given task. The difference is subtle, but as noted above, if you reach for Claude Code within Cursor, you&#8217;ll get basic code diffs but won&#8217;t have access to Cursor Rules or Projects. In practice, I think if I&#8217;m within the IDE, but there may be specific workflows where Claude Code is better set up to accomplish a task.</p><h3>Conclusion</h3><p>Both Claude Code and Cursor are fast moving products (along with the rest of the ecosystem) so it&#8217;s tough to compare any of these tools as anything written can be changed within a few weeks.</p><p>But overall, the comparison between them becomes pretty clear. <strong>Cursor is an IDE-first tool with a focus on a great IDE experience and Claude is a terminal-first tool with a focus on flexibility and scriptability.</strong> Since they both use the same models under the hood, most of the difference in these two tools becomes centered around these focus points.</p><p><strong>Finally, you can run Claude Code in the terminal panel of Cursor and have access to the best of both worlds.</strong></p><p>There&#8217;s still <em>tons</em> of interesting features being released by both products such as Cursor background agents, Claude sub-agents, and Claude Github integration I hope to explore in future posts. <a href="https://kiro.dev/blog/introducing-kiro/">I&#8217;m also intrigued by Amazon&#8217;s new Cursor competitor - Kiro.</a> </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From Zero to Monetized iOS App in 10 hours with Bolt.new, Expo, and RevenueCat]]></title><description><![CDATA[More of my Bolt.new $1M Hackathon Experiences, this time focusing on using Expo to build native apps]]></description><link>https://www.aiengineering.report/p/from-zero-to-monetized-ios-app-in</link><guid isPermaLink="false">https://www.aiengineering.report/p/from-zero-to-monetized-ios-app-in</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Wed, 25 Jun 2025 21:07:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/21fe0e36-fd59-4af2-91e4-532f66604f4b_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-WyhwmgO40BQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;WyhwmgO40BQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/WyhwmgO40BQ?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>As part of the <a href="http://Bolt.new">Bolt.new</a> hackathon, I was able to go to from an idea to a monetized iOS app in about 11 hours of focused work. The app is called Systematic, and its a flashcard app to review key concepts on databases, networks, and API designs to prepare for tech system design interviews. <a href="https://apps.apple.com/ae/app/systematic-fyi/id6747363270?platform=ipad">You can find it on the App Store here</a>. Here&#8217;s a screenshot of it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nU-E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nU-E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!nU-E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!nU-E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!nU-E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nU-E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png" width="350" height="760.9452736318408" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2622,&quot;width&quot;:1206,&quot;resizeWidth&quot;:350,&quot;bytes&quot;:307867,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/166844893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nU-E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 424w, https://substackcdn.com/image/fetch/$s_!nU-E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 848w, https://substackcdn.com/image/fetch/$s_!nU-E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 1272w, https://substackcdn.com/image/fetch/$s_!nU-E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c45cce1-9361-4a27-a03c-7f2602202c70_1206x2622.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I measure my time spent on projects in my time-tracking app, <a href="https://www.interstitch.app/">Interstitch</a>, and it took me about 6 hours of focused work to go from &#8220;idea&#8221; to &#8220;in the App Store&#8221; and about another 6 hours of focused work to add the subscription monetization features with RevenueCat. Pretty good!</p><p>A couple weeks ago, I wrote about <a href="https://www.aiengineering.report/p/speedrunning-an-ai-art-app-with-boltnew">speedrunning an AI art app using Bolt.new, Supabase, and Replicate</a>. The goal there was to build an app with a last-minute deadline as a favor for the organizer of an AI Art Meetup, but I was also motivated to use <a href="http://bolt.new">Bolt.new</a> because of their hackathon with over a million in prizes.</p><p>Bolt.new <em>also</em> has several $25k prizes for apps that use Expo and RevenueCat to build monetized native iOS / Android apps. And as someone who <a href="https://apps.apple.com/ae/app/live-poker-theory-gto-preflop/id6504085713">already has an app using Expo and RevenueCat</a> in production, I was eager to try out Bolt.new&#8217;s integration so I can circle back to that app with new tools.</p><p>So, I set out to again try to ship and monetize an app as fast as I could.</p><p>This post walks through what it took to go from zero to shipped, what went well, and what still had rough edges.</p><h3>First Pass In Bolt.New</h3><p>I started with the following prompt:</p><blockquote><p>Build a mobile app that is a system design flashcard app. It should be minimal and offer a few quizzes on :<br>databases</p><ol><li><p>networking</p></li><li><p>api design</p></li></ol><p>All the flashcards can be statically stored for the first pass. No user login is needed. Keep it simple and minimal, but good looking, with maybe a few visual fx like confetti.</p></blockquote><p>I stressed to keep it minimal and simple since sometimes AI agents can get a bit too creative and start adding up lots of UI for features like user authentication that don&#8217;t exist and aren&#8217;t necessary for a v1.</p><p>The request for the confetti was to make sure there was some visual &#8220;juice&#8221;, though if I were to be more thorough here, I should have first brainstormed different &#8220;juice&#8221; ideas with the AI, then asked it to add that. But showering confetti on a right answer seemed like a good start, and the agent did an excellent job with the animation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>My Favorite Prompt Engineering Trick</h3><p>The first pass of the app looked great, but there was a <em>slight</em> problem. Whenever I answered a question, and clicked &#8220;got it right&#8221;, and expected to move to the next question, it would &#8220;flicker&#8221; the old question for about a second. It was minor, but very distracting and made the app look unprofessional.</p><p>I told the agent to fix the flicker several times, and it went into the frustrating loop that AI agents sometimes get into, where they repeatedly say:</p><ul><li><p>They understand the problem</p></li><li><p>They have a working fix</p></li><li><p>The fix is implemented</p></li><li><p>&#8230;.but then I check and the issue is still broken</p></li></ul><p>fortunately, I was able to re-use a trick that I mentioned in my post on the <a href="https://www.aiengineering.report/p/making-a-video-game-with-ai-by-just">Vibe Coding Game Jam.</a></p><p>I prompted the model in the following way:</p><blockquote><p>First, determine the logic for when the next question should be rendered and replace the current question<br><br>Next, determine the logic for the timing of when the &#8220;question answered&#8221; buttons are pressed</p><p>Verify those occur at the exact same time. If not, fix it.</p></blockquote><p></p><blockquote></blockquote><p>This prompting strategy fixes it. Giving the LLMs a way to make a multi-step plan is a well-known way to get agents to accomplish tasks, but helping the agent by providing your own plan can sometimes get it out of a rut.</p><h3>Minor Bumps On The Road</h3><p>After I had a pass of the app working in the <a href="http://Bolt.new">Bolt.new</a> preview, I synced it to a Github repo and finished most of the building and App Store publishing in my local repo using Cursor.</p><p>There were a few minor issues with building it for the App Store, which was fixed when I ran <code>npx expo doctor</code>, which is an Expo tool to make sure all dependencies are on the same page.</p><p>I was surprised to get errors related to permissions to use the iPhone Camera when I deployed to the App Store. Turns out, the Bolt agent added a bunch of dependencies to set up the Camera to my flashcard app, which makes no sense, and once again shows that the AI-generated code still benefits from human review.</p><h3>Publishing the App and Trying Out RevenueCat Paywall</h3><p>To create the iOS screenshots, I used <a href="https://app-mockup.com/">App Mockup</a>. I initially generated fancier ones but they got rejected during review. iOS review is notoriously inconsistent - they encourage straightforward screenshots, yet nearly every top app disregards that guidance. So in my experience you have to try a few times until you get a more permissive reviewer. For now, I used simpler screenshot annotations and will try a fancier one in a future update.</p><p>The hackathon requirement mentioned using RevenueCat&#8217;s Paywall system, which lets you design a paywall in a web design kit, that you can then experiment on without changing your code. Here&#8217;s what my Paywall design looked like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v3z7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v3z7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 424w, https://substackcdn.com/image/fetch/$s_!v3z7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 848w, https://substackcdn.com/image/fetch/$s_!v3z7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!v3z7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v3z7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png" width="508" height="449.14379622021363" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1076,&quot;width&quot;:1217,&quot;resizeWidth&quot;:508,&quot;bytes&quot;:262426,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/166844893?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!v3z7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 424w, https://substackcdn.com/image/fetch/$s_!v3z7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 848w, https://substackcdn.com/image/fetch/$s_!v3z7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!v3z7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3da1bd8-c409-4ebe-a8d5-3fe2586ad146_1217x1076.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, the design tool is similar to Figma.</p><p>I&#8217;m a little unclear what the value proposition of this tool is. I <em>think</em> the idea is that a developer can build an app, and then the marketer can just iterate on the paywall without a developer&#8217;s assistance, and without re-publishing the app. This makes some sense since the paywall will be one of the most important pieces of monetization, and a screen you&#8217;re going to iterate on more than average.</p><p>But this doesn&#8217;t seem to add much value to me, since using AI like <a href="http://bolt.new">Bolt.new</a> to build screens is faster than what I&#8217;ll slowly design myself, and you can already publish Expo apps OTA (over-the-air) without going through the full app publication lifecyle.</p><p>So I found their desire to highlight an &#8220;old-school no-code&#8221; feature as part of a &#8220;new-school AI no-code&#8221; hackathon a bit odd. However, I am curious to try this Paywall feature along with RevenuCat&#8217;s Experiment features. It&#8217;s possible that the Paywall still makes pricing A/B tests easier, so I&#8217;m open to exploring more there.</p><h3>Wrapping Up</h3><p>About 2 years ago, I wrote a post on my old blog about going from an app idea to a paid subscriber in <em>one month</em>. At the time, I thought that was a pretty ambitious schedule and I was happy to have succeeded. (<em>as an aside, that app and blog post have since been removed - long story).</em></p><p>Throughout my 13+ years at big Silicon Valley companies like Google and Pinterest, I mostly did backend work. When I set out to build my own apps, both as side projects while working and when focusing full time on indie apps, writing frontend code was a huge time sink. I know React and React Native fairly well, but doing good UX design in Figma, translating that to CSS, and just churning through the high volume of code required was a massive drag on my velocity.</p><p>AI frontend-generators like <a href="http://Bolt.new">Bolt.new</a> massively accelerate that velocity and unlock the ability to experiment with many more small apps to see what gets traction.</p><p>But, I will note that while Bolt was fantastic for creating UI screens, I found myself syncing to Github and working in Cursor for all further work, such as setting up RevenueCat. Both Bolt and Cursor are using similar models like Claude under the hood, so the difference really came down to the rest of the development environment. Cursor is still built for coders and makes working with the code easier, and even though I&#8217;m letting the AI do most of the coding, Cursor lets me &#8220;keep an eye&#8221; on things more as I fill in the rest of the backend.</p><p>One rough edge I hit was that Bolt&#8217;s one-project-per-repo structure doesn&#8217;t play well with my Turborepo setup, which I use to manage a growing portfolio of apps in one repo with standardized dependencies and tooling. I&#8217;m toying with the idea of building an AI agent to sync Bolt-generated screens into larger codebases.</p><h3>Signing Off</h3><p>Thanks for reading! Let me know if you checked out the app, have any questions about Bolt or Expo, or any other thoughts on AI no-code UI generators. Feel free to get in touch by replying to this email, leaving a comment on Substack, or emailing me using the email listed on my personal site.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Speedrunning an AI Art App With bolt.new, Supabase, and Replicate]]></title><description><![CDATA[When a friend asked if I could make an app for a Washington DC meetup in under 2 hours, it was perfect timing because bolt.new is running a $1 Million Hackathon.]]></description><link>https://www.aiengineering.report/p/speedrunning-an-ai-art-app-with-boltnew</link><guid isPermaLink="false">https://www.aiengineering.report/p/speedrunning-an-ai-art-app-with-boltnew</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Thu, 12 Jun 2025 16:40:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f15a2542-83fc-44f6-b94f-3ab9d9be8a1c_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-Ph0_fdWxWyg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Ph0_fdWxWyg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Ph0_fdWxWyg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>This week, an organizer of an AI art meetup I&#8217;ve attended messaged me on WhatsApp around 7pm: &#8220;Can you build an AI art app by tomorrow afternoon?&#8221;</p><p>A few years ago, I would&#8217;ve said that timeline was impossible. But with tools like Bolt.new, Supabase, and Replicate, I had a working version live the next day.</p><p>The goal was to build an &#8220;experience&#8221; app so that 300 people at a meetup in Washington DC could all share their fears and hopes about AI, have images generated, and then create a gallery where all those fears and hopes stood side-by-side.</p><p><strong><a href="http://bolt.new">bolt.new</a> enabled me to build this app in a few hours. </strong></p><p>bolt.new has been on my radar for a while, along with its competitors like v0 and lovable. This month, they are hosting a <strong><a href="https://hackathon.dev/">$1 million hackathon</a></strong>, which seemed like a good excuse to give it a try.</p><p>Overall, I&#8217;ve been very impressed by bolt, particularly for quickly shipping web apps. They now have first-class integration with Supabase, a popular open-source database, which enables not just data-persistence but server side API endpoints and file storage - both critical features for my AI art app.</p><p>In this post, I&#8217;ll cover why I&#8217;m interested in no-code AI platforms despite being a competent coder, why bolt.new was especially well-suited to this task, and other lessons and challenges.</p><p>(btw, you can check out the app <a href="https://timely-fairy-496c3a.netlify.app/">here</a>, but please don&#8217;t stress-test it too much as the event is Friday June 13)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!79io!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!79io!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 424w, https://substackcdn.com/image/fetch/$s_!79io!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 848w, https://substackcdn.com/image/fetch/$s_!79io!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!79io!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!79io!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png" width="1456" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2944748,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/165800570?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!79io!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 424w, https://substackcdn.com/image/fetch/$s_!79io!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 848w, https://substackcdn.com/image/fetch/$s_!79io!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!79io!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22b1a9e-3b31-4984-a1fa-846d39ec428a_2674x1428.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>The AI Art App We Set Out To Build using Replicate</h3><p>The AI art meetup is called <a href="https://machinecinema.ai/">Machine Cinema</a>, who&#8217;s mission is to bring AI + art into real life, with a community of people sharing the latest tips and techniques. The organizer - Minh Do - wanted to build a collaborative experience for meetup attendees.</p><p>The app asks the following four questions:</p><ol><li><p><em>What fear, tension, or challenge about AI or society keeps you up at night?</em></p></li><li><p><em>At some point, we stopped believing ________, and started imagining ________.</em></p></li><li><p><em>Imagine a breakthrough moment that shifted the story of AI for the better - what was it?</em></p></li><li><p><em>In one sentence: What headline would make you feel like we've truly made it?</em></p></li></ol><p>Each user should submit an answer to that question, and the answers will then be combined in a gallery so you can see each &#8220;act&#8221;: Act 1 where we review everyone&#8217;s fears, Act 2 where we review what we start imagining, Act 3 where we review everyone&#8217;s breakthrough moment, etc.</p><p>For image generation via an API, there are a few different options. Both OpenAI and Google&#8217;s Gemini have an API for generating images, however their flagship models are fairly slow and expensive.</p><p>We ended up going with <a href="https://replicate.com/">Replicate</a>, which is a company that runs open source image generation models for you, while handling various complexities like GPU provisioning. Our main motivation for using Replicate was the wide variety of models they offer so we can optimize the tradeoff between time, cost, and quality.</p><p>On Replicate, we started using their default suggested model, &#8220;flux-pro&#8221;. This model creates high quality images but like OpenAI and Gemini is fairly slow and expensive. Fortunately, it was easy to switch to &#8220;flux-schnell&#8221;, a much faster and cheaper image model. While the images weren&#8217;t as consistently relevant to the prompt, the tradeoff of the app being snappier to use and enabling us to afford it makes it a good choice.</p><h3>Why Bolt Was the Right Choice</h3><p>AI no-code platforms are being heavily marketed towards <em>non-engineers ,</em> with there sometimes being an implicit assumption that coders won&#8217;t use no-code. But just because you <em>can</em> code, doesn&#8217;t mean you should.</p><p>Even though I&#8217;ve extensively coded in React and React Native, I&#8217;m more than happy to let AI do the lion&#8217;s share of the work - especially since Bolt enables both Github sync and a project download, easily enabling you to take your code off the platform if you ever run into a limitation.</p><p>When I first got asked to do the project, Minh - the organizer of Machine Cinema was already working with a teammate using <a href="http://v0.dev">v0.dev</a> and Replit - other competitors in the space. I immediately suggested switching to bolt.new, and not only because of the hackathon, but because of critical features we ended up using.</p><p>Overall, Minh was happy with how quickly I turned around the app, and I was happy that I was able to do effectively the entire app in plain English, and most features in a single prompt.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Why Supabase Made It Work</h3><p><a href="http://Bolt.new">Bolt.new</a> has a built-in integration with Supabase, which adds an actual database to the project, a key and critical feature to make anything other than a transient demo. Without a database, whatever your app creates will disappear on the next page refresh.</p><p>There were a few other ways in which Supabase provided - <strong>edge functions and file storage.</strong></p><p>Supabase adds another key feature to Bolt - Edge Functions - server side API endpoints. This turns out to be a key feature for our use case, because to generate the AI image, we use the Replicate API. But given images can be expensive to generate, we don&#8217;t want to expose the API key in the client, and instead need to use a server side endpoint. This is exactly where Supabase edge functions worked great, since it gave us a server side endpoint immediately.</p><p>Another problem we ran into is that our links kept being broken. This was because I was using Replicate to generate URLs for our images, but Replicate is not meant to serve images in a production app. You&#8217;re supposed to download the image and store it somewhere yourself. We learned this the hard way as our image links kept getting broken.</p><p>Fortunately, this was again easily fixed. In Bolt.New, we simply asked the agent to download the images from Replicate, upload the files in Supabase Storage, and save the links to our Supabase database. It worked like a charm.</p><h3>Strengths and Weaknesses of Bolt.New</h3><p>While I&#8217;m excited about various AI coding products, I do try to remain realistic and grounded rather than buy into any hype.</p><p>Overall I found Bolt extremely functional, but there were some setbacks. By far, the biggest pain point came when trying to setup Replicate. It was not familiar with the API. While Replicate can work with just HTTP fetch, it&#8217;s recommended to instead use the Replicate NPM package, which the agent did not use until I suggested it install it.</p><p>By contrast, the Supabase integrations worked incredibly well. I asked it to add the database and it created a schema that worked on the first try. Later, when we needed the Supabase edge functions and file storage, it again worked on the first try in both cases.</p><p>It&#8217;s not surprising that the Supabase prompts worked well and the Replicate prompts didn&#8217;t, given that <a href="http://bolt.new">bolt.new</a> advertises Supabase as a first-class integration on the platform. Presumably, they have a variety of prompts already provided that guides it to using Supabase correctly, that were missing with Replicate.</p><p>Another major strength of <a href="http://bolt.new">bolt.new</a> is its ability to sync your code to Github or download the project altogether. Because I was having problems with Replicate, I did download the code and fix it locally in Cursor, where I have more typical IDE tooling that&#8217;s partially missing in the bolt cloud environment. To me, this is a critical feature of any platform since being able to &#8216;backdoor&#8217; into the code provides a workaround if the agent is ever simply unable to fix the problem.</p><h3>Is Bolt Ready for Primetime?</h3><p>One question I got asked on Twitter is whether bolt is ready for real, production, monetized apps. My answer to that is - it depends on what the app is. If it&#8217;s something simple, bolt can probably do it well. Of course, simple apps rarely have competitive advantages outright, although simple apps in a niche market with the right sales and marketing can still greatly succed. And now a no-coder could easily spin up a <a href="http://bolt.new">bolt.new</a> app, integrate Stripe, and be off to the races.</p><p>On the other hand, if you wanted to start installing custom system libraries, you might run into the platform limitations. Even in this case, I could imagine bolt.new being a useful platform to build a frontend on that uses a more productionized backend API for the heavy lifting.</p><h3>My Plans for Bolt Going Forward - Youtube and Expo Native iOS Apps</h3><p>While the app was built for Minh&#8217;s event, I handled the engineering side, and I&#8217;m sharing it here primarily to showcase the tech stack, so <a href="https://timely-fairy-496c3a.netlify.app/">here&#8217;s the link</a>. Keep in mind this is primarily for Minh&#8217;s event so don&#8217;t share it too widely.</p><p>I&#8217;m very eager to continue playing with Bolt. If AI agents can build frontends, or at least frontend MVPs, I&#8217;m not worried about &#8216;replaced&#8217;, I&#8217;m excited to work on more interesting problems than boilerplate frontend code. The fact that Bolt is offering a huge number of prizes is icing on the cake in case I win, though given there&#8217;s already 80,000 people competing for 10 prizes, it&#8217;s surely to be competitive and I&#8217;m not counting on anything.</p><p>The project I&#8217;m <em>most</em> excited to work on is tooling to improve at YouTube. In case you didn&#8217;t notice, most of these Substack posts have YouTube embeds at the top, as I view YouTube as a platform with massive reach and its algorithm one of the best ways to reach new people. At the same time, I&#8217;ve frequently struggled with the video production. I have a vision for an app that helps me create &#8220;b-roll&#8221;, or background images that match my written script, as a way to more quickly add engaging visuals to my YouTube scripts. Since that&#8217;s a fairly complex app, I plan to start with a simpler use case - generating YouTube thumbnails.</p><p>Bolt also has an integration with Expo, which is a framework that simplifies React Native development and is a tool I used for my monetized native app, <a href="https://apps.apple.com/us/app/live-poker-theory-gto-preflop/id6504085713">Live Poker Theory.</a> I&#8217;m curious to try out Bolt on a new Expo app to compare my experience doing it with and without a no-code platform.</p><p>Overall, I&#8217;m very excited about the potential to ship web and mobile MVPs <em>much</em> faster with AI, and it&#8217;s clear that AI tools specifically built to accomplish this are making fast gains, with incredible demos from bolt, v0 by Vercel, and Lovable. Bolt&#8217;s Supabase integration , for the moment, put its at the head of the pack for me, though I plan to keep an eye on all of them.</p><p>Thanks for reading, reply to this email, comment on Substack, or email me with any thoughts. I look forward to sharing more of my progress on my <a href="http://bolt.ne">bolt.ne</a>w apps.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Building a Custom MCP Server to Query Firebase from Cursor]]></title><description><![CDATA[My experience extending MCP for Firebase so I could ask product analytics questions in plain English and have the AI build the database queries for me]]></description><link>https://www.aiengineering.report/p/building-a-custom-mcp-server-to-query</link><guid isPermaLink="false">https://www.aiengineering.report/p/building-a-custom-mcp-server-to-query</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Wed, 28 May 2025 20:47:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0d7ebf13-5ff7-4215-b7e9-ba6a2ab35c45_1280x720.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-5ZBAS10aCgE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;5ZBAS10aCgE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/5ZBAS10aCgE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Lately, I've been obsessed with bridging the gap between <strong>AI agents and real-world data</strong>. For my poker training app, <a href="http://www.livepokertheory.com">Live Poker Theory</a>, I often just wanted to quickly answer product questions, like "Are users studying tournaments or cash games more?" (These are two different sets of flashcards that users might study).</p><p>Now, I could go the traditional route: invest hours in setting up a full analytics platform like Mixpanel or Posthog, defining custom events, and building dashboards. Those are incredible tools, but they take time to configure and learn to use, and for a quick, ad-hoc question, it feels like overkill. My data lived in Firebase, my AI agent in Cursor, and the constant friction was that there wasn't an easy, intelligent way for them to talk.</p><p>I've already shown how <a href="https://www.aiengineering.report/p/connecting-claude-to-notion-with">MCP can connect AI tools to Notion for project planning,</a> but if we can apply the same principle to the product's actual backend data? </p><p><strong>Managing a TODO list is cool, but what&#8217;s even cooler is the AI </strong><em><strong>doing</strong></em><strong> the TODO list.</strong> To do that, the AI needs access to the real data.</p><p>This post details exactly how I built a <strong>custom MCP server</strong> to enable Cursor and Claude Desktop to query my Firebase database directly. My goal was to put MCP to a tangible test, letting me analyze product usage with natural language, all within the comfort of my editor.</p><h2>The Setup</h2><p>Quick recap: MCP lets you expose tools that agents, like Claude or Cursor, can call to obtain external knowledge like the weather or your TODO list. </p><p>LLMs are trained once and remain static and unchanged, so any &#8220;new&#8221; knowledge they have <em>must</em> be provided by the user or a tool, and MCP provides a standard way to create these tools.</p><p>My goal was to use an MCP server so that a tool like Cursor can talk to Firebase, and specifically, Firestore, which is a document database that serves as a subset of the Firebase suite of products.</p><p>When I started this work, no official Firebase MCP server existed, but an <a href="https://github.com/gannonh/firebase-mcp">open source repo gave me a starting point.</a> The repo is written by Gannon Hall, and it&#8217;s an <em>excellent</em> small reference repo to look at if you&#8217;re building an MCP server for <em>any</em> database. Since then, Firebase has released <a href="https://firebase.google.com/docs/cli/mcp-server">their own official MCP server. </a></p><p><strong>But there was a big problem -</strong> <strong>Neither Firebase&#8217;s official server nor Gannon&#8217;s unofficial server supported the Firebase </strong><code>count</code><strong> method - the exact method I needed</strong>.</p><p>The existing MCP servers <em>do</em> support listing and retrieving documents, and in theory you could simply get all the documents and count them, but with tens of thousands of sessions in my database, this would be slow and expensive, since Firebase charges you based on the number of times you read a document. </p><p>Fortunately, the <em>firebase-admin</em> API supports a way to count all documents that match a query <em>without</em> retrieving them all, but that API call just wasn&#8217;t added to either of the Firebase MCP servers.</p><p><em>Of course, this problem was a great opportunity for me to <strong>explore extending an MCP server for a real use case</strong> and write about it in this newsletter!</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>To Vibe Code Or Not To Vibe Code ?</h2><p>To do this, I forked Gannon&#8217;s repo and made the changes. I&#8217;ll try to get these merged upstream, but in the meantime, you can check out my working fork with <code>firestore_count_documents</code> <a href="https://github.com/waprin/firebase-mcp">support on my Github</a>.</p><p>While adding the new tool, I did what most MCP tutorials suggest: I asked the AI (via Cursor) to write the code for me.</p><p>And to its credit,  it worked. The assistant quickly scaffolded a functioning <code>count_documents</code> tool using Firestore&#8217;s admin SDK.</p><p><strong>But this is also where &#8220;vibe coding&#8221; started to break down.</strong></p><p>I asked it to add a <code>filters</code> parameter to the count query. It did - but it also added <code>orderBy</code> and <code>pagination</code> fields. That makes no sense for a count - you&#8217;re getting a single number. When I pointed this out, the AI agreed and removed them. But it was only my own experience reviewing the code that caught the problem.</p><p>To get it working, I had to dig into how MCP servers handle tool registration and request handling under the hood. I also leaned heavily on the <strong>MCP Inspector</strong>, a debugging tool that helped me simulate tool calls and verify responses without needing to go through Claude or Cursor directly. If you're building your own MCP integration, especially with a backend like Firebase, this next section covers the key pieces you'll want to get right.</p><p>If you&#8217;re curious about just the <em>changes</em> I made to Gannon&#8217;s repo, I&#8217;ve uploaded the two steps (listing what the tool does, and actually doing it) <a href="https://gist.github.com/waprin/bc47b9f9e19adc424434032bc462ca91">in this Github Gist</a>.</p><h2>Challenges I Encountered and Lessons I Learned</h2><p>The process was <em>mostly</em> smooth, but I ran into a few challenges, and learned a few things:</p><ul><li><p><strong>Restart fatigue</strong>: I often forgot to restart Claude Desktop, reload MCP servers in Cursor, or rebuild the local server after making changes. Small things, but it frequently caused me to stumble when I thought my changes weren&#8217;t working when in fact they were not getting used </p></li><li><p><strong>Environment handling in MCP Inspector</strong>: It's a great tool, but make sure you learn about providing command line environment variables  with the `e` flag - otherwise it&#8217;s another thing thats easy to forget, and it&#8217;s tedious to copy and paste them in every time. In my case, I needed to add the credential to authenticate to Firebase as an environment variable</p></li><li><p><strong>Firebase data modeling trickiness</strong>: My sessions don&#8217;t explicitly say &#8220;tournament&#8221; or &#8220;cash.&#8221; Instead, I inferred it from the <code>chart</code> field. Firebase doesn&#8217;t support any sort of substring match as its filter. However, it <em>does</em> support string compare, and fortunately, all my tournament charts begin with <code>MTT</code>, so I used string comparison (<code>"MTT" &lt;= x &lt; "MTU"</code>) to filter them. </p></li><li><p><strong>Tool registration differences</strong>: Gannon&#8217;s implementation uses <code>server.setRequestHandler(ListToolsRequestSchema)</code> and <code>CallToolRequestSchema</code>. This  gives more control than the  <code>server.tool()</code> shortcut highlighted in the weather tutorial, the first  tutorial on the official MCP website . This is helpful if you want to customize routing or shape tools more directly.</p></li><li><p><strong>Smithery integration</strong>: The repo includes a <code>smithery.yaml</code> file for publishing to <a href="https://smithery.ai/">Smithery AI</a>, a community MCP registry. It also includes HTTP transport, which is forward-compatible even if you're using stdio today.</p></li><li><p><strong>Port check issue</strong>: The server refused to start if port 3000 was in use, even when running in stdio mode where that port is irrelevant. Not a dealbreaker, but it was confusing until I understood the cause.</p></li></ul><h2>Product Insights I Obtained</h2><p>About 17,000 sessions, or roughly 40 percent, were tournament-focused. That surprised me. I had assumed tournaments would dominate, especially since the demo flow starts in the tournament trainer and I didn&#8217;t exclude demo sessions from the count.</p><p>For those unfamiliar with poker strategy: tournaments tend to play short-stacked, which makes preflop decisions more structured and math-driven. Cash games, on the other hand, are often deep-stacked and reward postflop creativity. That usually makes preflop study less essential in cash compared to tournaments.</p><p>But the data is clear. If 60 percent of users are studying cash game spots, I&#8217;d be ignoring reality if I continued thinking of tournaments as the main use case.</p><h2>Takeaways</h2><ul><li><p>MCP + Cursor lets me query my real product data in my editor, by translating natural language questions into database queries.</p></li><li><p>You <em>can</em> vibe code most of this, but you should still review the logic closely, as even state-of-the-art models still code major mistakes</p></li><li><p>MCP tooling is still in the early stages, and while remote registries like Smithery AI exist and server authors are adding HTTP transports, for now, we mostly live in a local MCP server world. For that, <strong>MCP Inspector</strong> is a critical and useful tool.</p></li></ul><h3>Conclusion</h3><p>Thanks for reading. If you have any thoughts or opinions on Firebase + MCP, please get in touch by replying to this email, leaving a comment on Substack, or shooting me an email linked on my personal site.</p><p>For the next edition of AI Engineering Report, I&#8217;m getting equally excited by <a href="http://bolt.new">bolt.new</a> $1 Million (!) dollar June hackathon, AI Agent architectures, and OpenAI&#8217;s recently released image generation API. Thanks for reading and stay tuned!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[AI Engineer (AIE) vs. Machine Learning Engineer (MLE) : Why Hacker News Purists Are Wrong]]></title><description><![CDATA[What exactly does 'AI Engineering' mean and how is an AI Engineer different from a Machine Learning Engineer?]]></description><link>https://www.aiengineering.report/p/ai-engineer-aie-vs-machine-learning</link><guid isPermaLink="false">https://www.aiengineering.report/p/ai-engineer-aie-vs-machine-learning</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Thu, 15 May 2025 17:43:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/mUj96Jvfdqo" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-mUj96Jvfdqo" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;mUj96Jvfdqo&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/mUj96Jvfdqo?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><br>Everyone&#8217;s talking about AI, but not everyone agrees on what &#8220;AI Engineering&#8221; actually means, especially when compared to the more established role like Machine Learning Engineer. </p><p>Machine Learning Engineers are typically the ones that <em>build the AI, </em>and the job title is a standard one at leading tech companies like Meta, Uber, and Netflix. So at first, it might seem odd that &#8216;AI Engineering&#8217; largely refers to something else other than what those engineers building AI are doing. </p><p>In this article, I&#8217;ll explain how I think the terms are evolving, and why I believe &#8220;AI Engineering&#8221; is going to become the dominant label for a growing category of engineering work. In essence, AI Engineering is becoming a shorthand for<strong> </strong><em><strong>Applied AI Engineering</strong></em><strong>, </strong>building applications, systems, and tooling <em>on top of</em> pretrained large foundational models, especially <strong>LLMs</strong> and <strong>image generators</strong> like Stable Diffusion.</p><p>AI - or Artificial Intelligence - has been around since the 1950s so it might seem strange that AI Engineering is such a recent term. But it is, and I&#8217;ll explain why below. And like all new terminology, there&#8217;s no clear consensus on what exactly it means. </p><p>The definition I&#8217;ll use in this article reflects a growing industry trend - <strong>and one I believe is likely to become the standard</strong>, for reasons I&#8217;ll explore, even if it contradicts how some purists feel. There's also uncertainty around whether the formal job title &#8220;AI Engineer&#8221; will catch on, or whether it will morph into something like &#8220;Software Engineer - Applied AI&#8221;.</p><p>Since I&#8217;ve named this newsletter <em>AI Engineering Report</em>, it&#8217;s only fair that I explain what the term means to me. I&#8217;ll also compare how AI Engineering compares to Machine Learning Engineering work.</p><h2>AI Engineering vs. ML Engineering </h2><p>The definition of "AI Engineering" varies depending on who you ask.</p><p>Some purists argue that only those building the AI models deserve the &#8220;AI Engineer&#8221; label, and that those merely <em>using</em> the models are just software engineers applying machine learning.</p><p><strong>I think the purists are going to lose that fight.</strong></p><p>Yes, their argument makes sense in a historical context. But &#8220;AI&#8221; has become a tidal-wave buzzword, and in practice, it now mostly refers to using models like GPT, Claude, and Stable Diffusion, not building them from scratch. Far more people will work with these models than will train them.</p><p>And importantly, the people building the models already have accurate titles: <strong>AI Researcher</strong>, <strong>Research Engineer</strong>, <strong>ML Engineer</strong>. There's room for a new label for those who specialize in building software with these models at the core.</p><h2>A Brief History of AI Nomenclature</h2><p>AI has always had many flavors, from brute-force <strong>search</strong> (e.g. chess), to symbolic logic (rule-based systems), to today&#8217;s statistical and neural methods.</p><p>Ultimately, <strong>machine learning</strong>, especially statistical and neural approaches, became the dominant paradigm for real-world AI products.</p><p>From Google Search and Translate, to the Facebook feed, to Netflix recommendations and Google Photos,  machine learning powers nearly every major "AI product" of the last 15 years.</p><p>The people building those systems were called <strong>Machine Learning Engineers</strong>, because that&#8217;s what they were doing day-to-day: training models, optimizing pipelines, working closely with data and researchers.</p><p>Meanwhile, most academic researchers simply labeled their work <strong>AI research</strong>. Even if it included engineering, it wasn't usually framed that way.</p><p>Because the <em>industry</em> embraced "machine learning" as its operational term, and the academic community was smaller and less media-visible, the term <em>AI</em> remained loosely defined&#8230; until the rise of LLMs and generative models in the 2020s.</p><p>Today, AI in popular discourse largely refers to generative foundation models , especially LLMs. So it&#8217;s natural that <em>AI Engineering</em> now refers to engineering work focused on using those models.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>ML Engineer vs. AI Engineer: What They Work On</h2><p>Let&#8217;s be honest: job titles are messy, and responsibilities often overlap.</p><p>Roles like <strong>software engineer</strong>, <strong>data scientist</strong>, <strong>infra engineer</strong>, and <strong>ML engineer</strong> frequently blur. But we can still draw a rough outline of where things tend to cluster.</p><h4><strong>Machine Learning Engineers</strong>:</h4><p>These are the people who build foundational models and bring them to production scale. Some specialize in algorithm design and research; others focus on training pipelines, distributed compute, and massive-scale data engineering.</p><p>Common areas of work:</p><ul><li><p>Ranking systems (e.g. search engines, ad platforms)</p></li><li><p>Recommendation systems (e.g. Netflix, YouTube)</p></li><li><p>Classification (e.g. spam detection, fraud)</p></li><li><p>Forecasting and time series prediction</p></li><li><p>Computer vision and traditional NLP</p></li></ul><h4><strong>Applied AI Engineers (AI Engineers)</strong>:</h4><p>These are software engineers who build apps, tools, workflows, and systems <em>on top of</em> pretrained models, especially generative ones like GPT-4 or Stable Diffusion.</p><p>Common areas of work:</p><ul><li><p>Prompt engineering, prompt routing, and finetuning</p></li><li><p>Retrieval-augmented generation (RAG) and vector search</p></li><li><p>LLM pricing and latency optimization</p></li><li><p>Model benchmarking and evals</p></li><li><p>Agent architectures</p></li><li><p>AI-Assisted coding and AI-Driven coding (vibe coding)</p></li><li><p>Apps with LLM technology as a central feature</p></li></ul><div><hr></div><h3>No Neat Boxes</h3><p>In practice, there's no clean boundary between AI engineering and other disciplines.</p><p>A senior FAANG engineer recently told me: <em>&#8220;At our company, data scientists run prompt evals, and software engineers handle prompt routing optimization.&#8221;</em></p><p>This reflects the reality that AI Engineering often spans teams and disciplines. And while I can&#8217;t say with certainty where industry consensus will land, I&#8217;m absolutely confident that this type of work is exploding in complexity, scope, and importance.</p><p>That means we need better language and clearer mental models, and this newsletter exists to help shape that conversation.</p><h2>Further Reading and Notes</h2><p>This article was heavily inspired by Latent Space&#8217;s &#8220;The Rise of the AI Engineer&#8221; article:</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:131896365,&quot;url&quot;:&quot;https://www.latent.space/p/ai-engineer&quot;,&quot;publication_id&quot;:1084089,&quot;publication_name&quot;:&quot;Latent.Space&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73b0838a-bd14-46a1-801c-b6a2046e5c1e_1130x1130.png&quot;,&quot;title&quot;:&quot;The Rise of the AI Engineer&quot;,&quot;truncated_body_text&quot;:&quot;We are observing a once in a generation &#8220;shift right&#8221; of applied AI, fueled by the emergent capabilities and open source/API availability of Foundation Models.&quot;,&quot;date&quot;:&quot;2023-06-30T16:59:08.912Z&quot;,&quot;like_count&quot;:415,&quot;comment_count&quot;:18,&quot;bylines&quot;:[],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.latent.space/p/ai-engineer?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!DbYa!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73b0838a-bd14-46a1-801c-b6a2046e5c1e_1130x1130.png" loading="lazy"><span class="embedded-post-publication-name">Latent.Space</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">The Rise of the AI Engineer</div></div><div class="embedded-post-body">We are observing a once in a generation &#8220;shift right&#8221; of applied AI, fueled by the emergent capabilities and open source/API availability of Foundation Models&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">3 years ago &#183; 415 likes &#183; 18 comments</div></a></div><p>Their research on job postings was especially insightful, where they pointed out that AI engineering job postings are on pace to overtake ML Engineering job postings. </p><p>It was also inspired by Vercel&#8217;s post, <a href="https://vercel.com/blog/becoming-an-ai-engineering-company">Becoming an AI Engineering Company</a>.</p><p>I&#8217;m still deep playing with MCP, and plan to return to the topic next edition. In the meantime, check out the Substack &#8216;MCP in Context&#8217; if you want a newsletter even more focused on MCP. In a recent post, the author explained what entities will win and lose if MCP adoption continues to grow:</p><p></p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:163529924,&quot;url&quot;:&quot;https://www.mcpincontext.com/p/mcps-winners-and-losers&quot;,&quot;publication_id&quot;:4663458,&quot;publication_name&quot;:&quot;MCP In Context&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde40a7c8-16f4-4acf-bc5d-26fa6a82abd4_256x256.png&quot;,&quot;title&quot;:&quot;MCP's Winners &amp; Losers&quot;,&quot;truncated_body_text&quot;:null,&quot;date&quot;:&quot;2025-05-15T12:02:41.299Z&quot;,&quot;like_count&quot;:0,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:39026280,&quot;name&quot;:&quot;MB Crosier&quot;,&quot;handle&quot;:&quot;mbcrosier&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f02db19-59a2-4f4e-9e06-4c9a5637ab4b_4264x4264.jpeg&quot;,&quot;bio&quot;:&quot;Hi, I'm MB! I&#8217;m an MCP enthusiast, writing the newsletter \&quot;MCP in Context.\&quot; I'm also currently a graduate student in Harvard&#8217;s MS/MBA Engineering Sciences program. Previously, I was a growth marketer at Stytch, a developer tools startup.&quot;,&quot;profile_set_up_at&quot;:&quot;2023-05-10T00:33:30.143Z&quot;,&quot;reader_installed_at&quot;:&quot;2025-04-12T13:59:25.008Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:4757053,&quot;user_id&quot;:39026280,&quot;publication_id&quot;:4663458,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:4663458,&quot;name&quot;:&quot;MCP In Context&quot;,&quot;subdomain&quot;:&quot;mcpincontext&quot;,&quot;custom_domain&quot;:&quot;www.mcpincontext.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Everything you need to know about the Model Context Protocol.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de40a7c8-16f4-4acf-bc5d-26fa6a82abd4_256x256.png&quot;,&quot;author_id&quot;:39026280,&quot;primary_user_id&quot;:39026280,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2025-04-09T13:55:48.749Z&quot;,&quot;email_from_name&quot;:&quot;MCP In Context&quot;,&quot;copyright&quot;:&quot;MB Crosier&quot;,&quot;founding_plan_name&quot;:&quot;Founding Member&quot;,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.mcpincontext.com/p/mcps-winners-and-losers?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!3nAR!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde40a7c8-16f4-4acf-bc5d-26fa6a82abd4_256x256.png" loading="lazy"><span class="embedded-post-publication-name">MCP In Context</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">MCP's Winners &amp; Losers</div></div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">a year ago &#183; MB Crosier</div></a></div><p>I&#8217;d love to hear any thoughts on this topic - reply by email or comment directly on Substack. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Connecting Claude to Notion with MCP ]]></title><description><![CDATA[Claude Can Now Access My Notion Workspace]]></description><link>https://www.aiengineering.report/p/connecting-claude-to-notion-with</link><guid isPermaLink="false">https://www.aiengineering.report/p/connecting-claude-to-notion-with</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Fri, 09 May 2025 18:38:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tndE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tndE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tndE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 424w, https://substackcdn.com/image/fetch/$s_!tndE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 848w, https://substackcdn.com/image/fetch/$s_!tndE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 1272w, https://substackcdn.com/image/fetch/$s_!tndE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tndE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png" width="627" height="418" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b7c1102-223f-4ec0-b872-014b78063950_627x418.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:418,&quot;width&quot;:627,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46923,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/163225522?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c955e9f-4881-4ce0-8c72-9b717b72484f_700x500.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tndE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 424w, https://substackcdn.com/image/fetch/$s_!tndE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 848w, https://substackcdn.com/image/fetch/$s_!tndE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 1272w, https://substackcdn.com/image/fetch/$s_!tndE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b7c1102-223f-4ec0-b872-014b78063950_627x418.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Welcome to the <strong>second edition of the AI Engineering Report</strong>. This week, I&#8217;m exploring how I used Notion&#8217;s recently released official MCP server to connect my AI chatbot (Claude) to the documents, spreadsheets, and calendar I use to manage my life and projects. I&#8217;ll cover:</p><ul><li><p>What Notion is and how the new official MCP server works</p></li><li><p>Why this general idea of connecting AIs to real tools like Notion, Google Docs, JIRA, Confluence, or Linear is so powerful</p></li><li><p>How this changes what AI agents can actually <em>do</em></p></li></ul><h2>Notion MCP</h2><p>If you&#8217;re not familiar with Notion, think of it like Google Docs but with a better UI - you can store and manage a document like a resume, a spreadsheet, or a calendar of events. I use it to keep track of almost everything in my life.</p><p>That&#8217;s why I was so excited to try the <strong><a href="https://github.com/makenotion/notion-mcp-server">new official Notion MCP server.</a></strong></p><p>If you&#8217;re not using a coding IDE like Cursor or Windsurf, your best option for an MCP-enabled chatbot is <strong>Claude Desktop</strong>.<strong> </strong>(OpenAI has announced MCP support for ChatGPT, but it&#8217;s not released yet. Similar story with Claude Web).</p><p>Once the Notion MCP server is installed, Claude can do things like:</p><blockquote><p>&#8220;Look at my TODO list and pull up any tasks related to home improvement that are older than 6 months.&#8221;</p></blockquote><p>Under the hood, Claude:</p><ul><li><p>Locates the TODO document</p></li><li><p>Queries all items</p></li><li><p>Filters by date and natural language relevance (&#8220;home improvement&#8221;)</p></li><li><p>Uses the Notion API efficiently, but fills in the gaps where intelligence is needed</p></li></ul><p>This hybrid model API-level speed, AI-level reasoning&#8212;is the future of agentic workflows.</p><h2>Why This Pattern Matters for Engineers (and most other people too)</h2><p>I wrote about MCP in the first issue of this newsletter, and I&#8217;ll likely return to it again. It&#8217;s a simple concept, but it unlocks a huge surface area for useful AI applications.</p><p>LLMs are only as good as the information they have access to. They hallucinate. They make up details. And they often can&#8217;t tell when they&#8217;re doing it.</p><p>MCP changes that. It gives them structured, real-time access to the data you already use. Some early use cases that stand out:</p><ul><li><p>Letting an AI coding assistant reference live business requirements while writing code</p></li><li><p>Forecasting project timelines using real calendars and backlogs</p></li><li><p>Understanding team org charts and routing questions to the right person</p></li></ul><p>These use cases don&#8217;t require &#8220;superintelligence.&#8221; They just require <strong>access</strong>. MCP provides that access.</p><h2>Want to Try It?</h2><p>If you want to try the Notion MCP setup, I wrote a short tutorial here:</p><p><a href="http://How to Let Claude Access Your Notion data via MCP">How to Let Claude Access Your Notion data via MCP</a></p><p>I originally planned to cover building a <em>custom</em> MCP server (e.g., for a niche internal tool or a more streamlined Notion setup). But before doing that, it helps to see what&#8217;s possible with an official, full-featured one.</p><p>Thanks for reading. If this was useful, feel free to forward it or reply with thoughts!</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Making a Video Game with AI By Just Typing English (Vibe Coding Game Jam)]]></title><description><![CDATA[How I built a playable card game using nothing but AI prompts]]></description><link>https://www.aiengineering.report/p/making-a-video-game-with-ai-by-just</link><guid isPermaLink="false">https://www.aiengineering.report/p/making-a-video-game-with-ai-by-just</guid><dc:creator><![CDATA[Bill Prin]]></dc:creator><pubDate>Thu, 01 May 2025 18:56:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Pl8i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pl8i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pl8i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 424w, https://substackcdn.com/image/fetch/$s_!Pl8i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 848w, https://substackcdn.com/image/fetch/$s_!Pl8i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 1272w, https://substackcdn.com/image/fetch/$s_!Pl8i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pl8i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png" width="1456" height="1288" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1288,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4601093,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.aiengineering.report/i/162636700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pl8i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 424w, https://substackcdn.com/image/fetch/$s_!Pl8i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 848w, https://substackcdn.com/image/fetch/$s_!Pl8i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 1272w, https://substackcdn.com/image/fetch/$s_!Pl8i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1dcb782-4d34-4adc-9498-820f8409b85d_1890x1672.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Welcome to the <strong>first edition of the AI Engineering Report.</strong> </p><p>In this newsletter, I&#8217;ll cover my experience participating in the <strong>Vibe Coding Game Jam</strong>, where the challenge was to create a game from scratch using only English prompts - no coding allowed. I used AI tools to build a playable deckbuilder game from scratch, discovered the power of the new <strong>Model Context Protocol (MCP)</strong>, and came away with some new opinions on AI-assisted development.</p><h3>My AI-Generated Game </h3><p><strong><a href="https://en.wikipedia.org/wiki/Vibe_coding">Vibe coding</a> -  using AI to write 100% of your code -  is having a major moment.</strong></p><p>I recently made a video game from scratch by <em>just</em> typing English into a prompt window, as part of a game jam to celebrate &#8220;vibe coding&#8221;.</p><p>Here&#8217;s a quick video of my game in action:</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b69970ef-953f-437a-a1f8-c302a348d802&quot;,&quot;duration&quot;:null}"></div><p>And here is a link to <a href="https://vibeslay.vercel.app/">Play My Game - Vibeslayer</a>. The game should be playable on your browser on both web and mobile, but be warned: I only made the first level! </p><p>The game is in the <a href="https://en.wikipedia.org/wiki/Deck-building_game">deckbuilding genre</a>, which you read about on Wikipedia. Specifically, it&#8217;s very similar to Slay The Spire, which is a great game if you like mobile strategy games, and a terrible game if you have anything more important to do with your time.</p><p>There&#8217;s only 1 level in my game and it&#8217;s very thin. The game jam had over 1000 entries and I didn&#8217;t expect to get much attention. My main goal was to learn pure AI coding better.</p><p>While coding, the mechanics of grabbing the card and dragging the card was where the AI was a massive unlock because the CSS and physics to get a smooth card playing motion aren&#8217;t exactly <em>difficult</em>, but are extremely <em>tedious</em> <em>and</em> <em>complicated. </em><strong>I estimate it would have taken me at least a week to get the game feeling right, but it took the AI about 90 minutes</strong>. </p><p>I used Midjourney for the art, though this was before OpenAI released their new incredible new image gen. I also asked the AI agent for advice on getting the best Midjourney prompts, which is one of the best image-generation hacks (use the AI for advice on prompting the AI better)</p><h3>Vibe Code Jam and Why Vibe Coding Is Huge Right Now</h3><p>I made this game as part of the &#8220;vibe code jam&#8221;, organized by indie hacker legend Pieter Levels and he got over 1k entries. </p><p>Why has vibe coding exploded this year? It&#8217;s a confluence of a few factors:</p><ol><li><p><strong>Base models have gotten much better at coding</strong> - Every time OpenAI, Anthropic, and Google release new coding models, their ability improves. This year, Anthropic released Claude 3.7 and Google released Gemini 2.5 Pro - both leading models for AI coding </p></li><li><p><strong>IDE assistants like Cursor, Cline, and Windsurf have improved at using the base models</strong> - The base models give you a starting point, but there&#8217;s still a lot of logistics to effectively leverage them in your coding workflows. The first pass at AI coding assistants basically just replaced the workflow from &#8220;copy my code into ChatGPT, ask the question, copy the response&#8221;. The new generation of these tools create <em>agents</em> that can form complex plans such as searching for necessary files themselves to implement a new feature, and do fancy multi-line automatic edits as you write code based on continually scanning the context around your cursor.</p></li><li><p><strong>The tools are getting less siloed </strong>- This year, Anthropic released MCP, or Model Context Protocol, which is an open standard for AI agents to talk to each other. Now, AI agents can not just look at your code, but look at your browser to see any errors as they build your web app, or look at your database to understand the structure of the data you&#8217;re working with, or look at your company&#8217;s internal wiki for key documentation to understand requirements.</p></li></ol><p><strong>MCP was particularly relevant during my experience creating my game.</strong> Often, I&#8217;d ask the AI to implement a feature, and it would cause an error in the browser. But, the AI agent is unable to see the browser logs. With MCP, I was able to give the AI a way to check there are no errors and fix them if there are.</p><p>I wrote a tutorial on how to use MCP to debug browser errors on my website here:</p><p><a href="https://www.billprin.com/articles/mcp-cursor-browser-errors">How to Use MCP to Let Your AI IDE See and Fix Browser Console Errors</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p><h3>Vibe Coding Tips and Why I Believe Prompt Engineering Will Be Huge (But Called Something Else)</h3><p>The biggest lesson by far in the vibe coding jam was <strong>I&#8217;m fully convinced prompt engineering is a massive, important field. </strong></p><p>There were several points while making my game for the vibe coding contest that I <em>wanted</em> to just stop the AI from going in circles and to write some code myself to get it unstuck. I didn&#8217;t do that stay within the spirit of the competition and exercise.</p><p><em><strong>But what I learned is that I was able to get myself &#8220;unstuck&#8221; from situations where the LLM was going in loops by prompting it creatively.</strong></em></p><p>For example, here are some of the ways I got it unstuck:</p><ol><li><p><strong>Breaking it down into smaller steps</strong> - instead of &#8220;the user grabs the card and drags it up to play the card&#8221;, first just focus on making the card draggable and worrying about playing it later</p></li><li><p><strong>Break down its reasoning with it </strong> - At one point , &#8220;attack cards&#8221; were playable, but &#8220;defend cards&#8221; weren&#8217;t. Telling the agent &#8220;attack cards work, just copy that&#8221; wasn&#8217;t working. But what <em>did </em>work was telling it &#8220;first, describe the  exact logic by which an attack card will be played.  next, describe the exact logic by which a defend card will be played. next, verify if those will always be exactly the same, if not, fix it&#8221;. That worked!</p></li><li><p><strong>Changing models and just rewording commands</strong> - The equivalent of &#8220;smack your hand against the television until it works&#8221;, this strategy is more viable than ever in an era of non-deterministic machines. The two leading models are Gemini-2.5 and Claude 3.7 , so I usually switched between those, but others are worth trying.</p></li></ol><p>Ironically, as I&#8217;m writing this post I&#8217;m seeing an <strong>email alert on LinkedIn that &#8220;prompt engineering'&#8220; is a dead job titl</strong>e. And I think the reason is that prompt engineering is <em>still engineering, </em>and thus<strong>, I expect most people who are doing prompt engineering work will instead use the title </strong><em><strong>AI Engineer.</strong></em></p><h3>Conclusion</h3><p>Building my game with only AI was a surprisingly emotional experience. <br>In many ways, it felt like what I imagined programming would be as a kid: just telling a machine what you want it to do.</p><p>Today, "vibe coding" is often pitched as a way for non-technical people to build apps without engineers. I don't think we're quite there yet. AI still struggles with novel problems, and engineering involves much more than code: testing, deployment, monitoring all still require real judgment.</p><p>But it's close, and that's why vibe coding is so exciting for senior engineers.<br>The best results come when AI handles the busywork, and experienced engineers step in to fix architecture and unblock edge cases.</p><p>History shows a familiar pattern:</p><ul><li><p>COBOL promised English-like programming to replace engineers.</p></li><li><p>Java promised programming without worrying about system details like memory management to replace engineers.</p></li><li><p>Each time, we didn&#8217;t eliminate engineers, we shifted the line between "technical" and "non-technical."</p></li></ul><p>I believe AI will do the same. Most people still won't build full software products.<br>But a new wave of "almost-technical" builders will, and senior engineers who master these AI tools will move even faster.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.aiengineering.report/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading AI Engineering Report! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>