<?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[Tech For Product]]></title><description><![CDATA[Build confidence without getting lost in technical jargon ]]></description><link>https://blog.techforproduct.com</link><image><url>https://substackcdn.com/image/fetch/$s_!95Df!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa27a7791-9903-4764-84c3-722130b23165_960x960.png</url><title>Tech For Product</title><link>https://blog.techforproduct.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 02:07:16 GMT</lastBuildDate><atom:link href="https://blog.techforproduct.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Colin Matthews]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[colinmatthews@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[colinmatthews@substack.com]]></itunes:email><itunes:name><![CDATA[Colin Matthews]]></itunes:name></itunes:owner><itunes:author><![CDATA[Colin Matthews]]></itunes:author><googleplay:owner><![CDATA[colinmatthews@substack.com]]></googleplay:owner><googleplay:email><![CDATA[colinmatthews@substack.com]]></googleplay:email><googleplay:author><![CDATA[Colin Matthews]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How to Turn Figma Designs into Working Prototypes with Claude Code]]></title><description><![CDATA[5 minutes to an engineering-ready prototype]]></description><link>https://blog.techforproduct.com/p/how-to-turn-figma-designs-into-working</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-to-turn-figma-designs-into-working</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Mon, 13 Apr 2026 14:02:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b548ac03-bf9b-4462-b0a5-167d3dda44e6_600x600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Figma-to-code conversion is one of the core workflows I cover in my AI Prototyping course. If you want the full system for building prototypes that look and feel like your real product, the next cohort kicks off on April 20th. Use <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers?promoCode=EMAIL15">this link </a>for 15% off!</em></p><div><hr></div><p>In this post, I&#8217;ll cover how to leverage Claude Code to convert from Figma to code. Specifically, I&#8217;ll cover:</p><ul><li><p>What MCP is and how the Figma MCP server connects to Claude Code</p></li><li><p>How to convert a Figma design into a working prototype with one prompt</p></li><li><p>Why that basic approach produces code your engineers can&#8217;t use</p></li><li><p>An advanced approach that produces code engineers can use</p></li></ul><p>Let&#8217;s jump in!</p><h2>What is MCP?</h2><p>MCP (Model Context Protocol) is a translation layer that lets AI agents talk to other products. Claude Code, Cursor, ChatGPT, Codex, they can all use MCP to reach out to external tools and pull in information or take actions.</p><p>The Figma MCP server lets Claude Code read your designs directly from Figma. It pulls in screenshots, design context, exported assets, component information, all of the things Claude needs to understand what your design looks like and how it&#8217;s structured.</p><p>To get started, you need two things connected:</p><p><strong>1) Figma:</strong> You need a full Figma seat with dev mode. In your design file, you&#8217;ll see an MCP option in the right panel when you enter dev mode. This tells Figma to make the design data available. </p><p>We&#8217;ll be using this dashboard design as our demo.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oYBp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oYBp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png 424w, https://substackcdn.com/image/fetch/$s_!oYBp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png 848w, https://substackcdn.com/image/fetch/$s_!oYBp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png 1272w, https://substackcdn.com/image/fetch/$s_!oYBp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oYBp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png" width="1456" height="1001" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1001,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:326300,&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://blog.techforproduct.com/i/193982609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.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_!oYBp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png 424w, https://substackcdn.com/image/fetch/$s_!oYBp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png 848w, https://substackcdn.com/image/fetch/$s_!oYBp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.png 1272w, https://substackcdn.com/image/fetch/$s_!oYBp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc7f62f0a-e0e9-4593-8df7-87610af137eb_1990x1368.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><strong>2) Claude Code:</strong> You need to add the Figma MCP server to Claude Code. You can follow the instructions <a href="https://help.figma.com/hc/en-us/articles/35281350665623-Figma-MCP-collection-How-to-set-up-the-Figma-remote-MCP-server-preferred#h_01K6BEK6CY5DWD1EQ7VS5DJT4S">here</a> to set this up.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sQEW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sQEW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png 424w, https://substackcdn.com/image/fetch/$s_!sQEW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png 848w, https://substackcdn.com/image/fetch/$s_!sQEW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png 1272w, https://substackcdn.com/image/fetch/$s_!sQEW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sQEW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:419231,&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://blog.techforproduct.com/i/193982609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.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_!sQEW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png 424w, https://substackcdn.com/image/fetch/$s_!sQEW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png 848w, https://substackcdn.com/image/fetch/$s_!sQEW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.png 1272w, https://substackcdn.com/image/fetch/$s_!sQEW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2493e09e-680c-41b8-ae3b-8e9f927b776f_2654x1476.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>The Figma plugin for Claude Code also comes with built-in skills. A skill is a pre-written collection of prompts that tells Claude how to use the Figma data effectively. When you ask Claude to implement a Figma design, it automatically uses a skill called &#8220;Figma Implement Design&#8221; that Figma themselves wrote.</p><h2>The Basic Workflow</h2><p>Let&#8217;s walk through the simplest version of this.</p><p>I start with an empty folder in Claude Code. I then go to Figma, select the frame I want to implement (in this case, a dashboard design), and copy the example prompt that appears in the MCP panel. It looks something like: &#8220;Implement this design from Figma.&#8221;</p><p>I paste that into Claude Code and hit enter.</p><p>What happens next is a series of tool calls. Claude Code reaches out to Figma through the MCP, grabs the design context, downloads a screenshot, exports assets like images and icons, and reads through the component structure. It&#8217;s pulling in everything it can to understand the design</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6S5Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6S5Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png 424w, https://substackcdn.com/image/fetch/$s_!6S5Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png 848w, https://substackcdn.com/image/fetch/$s_!6S5Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png 1272w, https://substackcdn.com/image/fetch/$s_!6S5Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6S5Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png" width="1456" height="1145" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1145,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:503587,&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://blog.techforproduct.com/i/193982609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.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_!6S5Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png 424w, https://substackcdn.com/image/fetch/$s_!6S5Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png 848w, https://substackcdn.com/image/fetch/$s_!6S5Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.png 1272w, https://substackcdn.com/image/fetch/$s_!6S5Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F487d5496-1475-47f3-a17c-74cf2c8b24ca_2286x1798.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>After a minute or so, the prototype is done. Comparing the original Figma mock to the implemented code, it&#8217;s 90 percent the same. The layout matches, the components look right, the data is in the right places. You&#8217;ll likely notice some differences, such as responsive layout gaps in the table or small changes in the components themselves.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AqoC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AqoC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png 424w, https://substackcdn.com/image/fetch/$s_!AqoC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png 848w, https://substackcdn.com/image/fetch/$s_!AqoC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png 1272w, https://substackcdn.com/image/fetch/$s_!AqoC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AqoC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png" width="1456" height="1383" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1383,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:383611,&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://blog.techforproduct.com/i/193982609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.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_!AqoC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png 424w, https://substackcdn.com/image/fetch/$s_!AqoC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png 848w, https://substackcdn.com/image/fetch/$s_!AqoC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.png 1272w, https://substackcdn.com/image/fetch/$s_!AqoC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba5f0a11-c9b9-4c34-9a6b-54ba84bbdf0c_1638x1556.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>From here, you can keep prompting to prototype any new experience you have in mind. Claude Code is not opinionated about your framework, so you can do this with React, Vue, Angular, or any other framework.</p><p>Although this is a quick way to generate a prototype, the quality of the code itself is not great. Claude Code had to reinvent every component used (buttons, badges, cards, etc), rather than reusing the components already in your code base. The basic prototype is still useful for showing your team how an interaction should feel, or for validating a concept with stakeholders, but the code doesn&#8217;t save your engineers any time.</p><h2>Getting Better Results</h2><p>To get a prototype that&#8217;s actually useful to your engineers, you need your design system. Set up a second project that contains your real code components (buttons, card, badges, etc). I&#8217;m using IBM&#8217;s Carbon design system, but at your company it would be whatever your team has built. The components are sitting in the folder, not being used yet, just available.</p><p>Now go back to Figma, copy the exact same prompt, paste it into Claude Code. I&#8217;d recommend adding &#8216;build with my existing components&#8217; to ensure Claude Code doesn&#8217;t try to invent new components to 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_!HIvo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HIvo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png 424w, https://substackcdn.com/image/fetch/$s_!HIvo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png 848w, https://substackcdn.com/image/fetch/$s_!HIvo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png 1272w, https://substackcdn.com/image/fetch/$s_!HIvo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HIvo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png" width="1456" height="1375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1375,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:367356,&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://blog.techforproduct.com/i/193982609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.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_!HIvo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png 424w, https://substackcdn.com/image/fetch/$s_!HIvo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png 848w, https://substackcdn.com/image/fetch/$s_!HIvo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.png 1272w, https://substackcdn.com/image/fetch/$s_!HIvo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ac811cf-d1e8-4d9f-801b-d31330384211_1644x1552.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>Visually, the output looks almost identical, but the code is now using our real components. You&#8217;ll noticed the difference in the table formatting, the tabs, and the cards.</p><p>Here&#8217;s a small snippet from the beginning of the code that shows these imports:</p><pre><code><code>import {
  Theme,
  Tabs,
  TabList,
  Tab,
  TabPanels,
  TabPanel,
  Tag,
  Table,
  TableHead,
  TableRow,
  TableHeader,
  TableBody,
  TableCell,
} from '@carbon/react';
</code></code></pre><p>In the past, most teams would get 80% of the design complete and accept it as good enough. Now, when we hand off to engineering, they get a prototype that they can easily pick up and implement. This allows PMs and designers to speed up implementation and no longer requires engineering to get small details about the design right.  </p><p>This is the kind of workflow we go deep on in the AI Prototyping course: how to set up your component library, how to handle design systems that aren&#8217;t perfectly documented, and how to iterate until the prototype is production-ready. Over 1000 PMs from companies like Meta, Google, Microsoft, and OpenAI have already enrolled.</p><p>Check out the full syllabus <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers?promoCode=EMAIL15">here</a>!</p><p></p>]]></content:encoded></item><item><title><![CDATA[What is Programmatic Tool Calling and how does it work?]]></title><description><![CDATA[How to reduce token usage and improve agent performance]]></description><link>https://blog.techforproduct.com/p/what-is-programmatic-tool-calling</link><guid isPermaLink="false">https://blog.techforproduct.com/p/what-is-programmatic-tool-calling</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Mon, 06 Apr 2026 17:59:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xyl9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>I just launched AI Agent System Design for Product Managers, a half-day workshop focused on building a strong understanding of foundational agent topics. Our first session is on May 8th - learn more <a href="https://maven.com/tech-for-product/ai-agent-system-design-for-product-managers">here</a>!</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><p></p><div><hr></div><p>Tool calling is an essential step in building AI agents. It allows the LLM to request information or take an action completely autonomously. There&#8217;s only one downside - every time you use a tool, the results load into the context window, taking up space and degrading the quality of future tool use.</p><p>This post will walk you through <strong>programmatic tool calling</strong>, a technique where a model writes code that orchestrates tool calls rather than the calls itself. You&#8217;ll understand why it can outperform standard tool calling by up to 20%, how both Anthropic and Cloudflare have shipped production implementations, and when it&#8217;s worth the added complexity.</p><p>Let&#8217;s dive in!</p><h2>The Problem With Standard Tool Calling</h2><p>Ai agents all work the same way: the model requests a tool call, your server executes it, the result enters the context window (the model&#8217;s working memory for the current task). The model then reasons about what to do next, and the cycle repeats for each  step. For any complex task, this often means 50+ tool calls per user request.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ceSL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ceSL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png 424w, https://substackcdn.com/image/fetch/$s_!ceSL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png 848w, https://substackcdn.com/image/fetch/$s_!ceSL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png 1272w, https://substackcdn.com/image/fetch/$s_!ceSL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ceSL!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png" width="1200" height="597.3837209302326" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:685,&quot;width&quot;:1376,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:255075,&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://blog.techforproduct.com/i/193372788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ceSL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png 424w, https://substackcdn.com/image/fetch/$s_!ceSL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png 848w, https://substackcdn.com/image/fetch/$s_!ceSL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.png 1272w, https://substackcdn.com/image/fetch/$s_!ceSL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e4d185-9ed7-4a27-b29b-b2cbba3793d7_1376x685.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>For example, let&#8217;s say we had an agent for managing our team&#8217;s expenses. The goal of the agent is to report back who has exceeded their budget for the month.</p><p>The model would start by calling <code>get_team_members()</code>, then calls <code>get_expenses()</code> for each person. It would then calculate each person&#8217;s budget one at a time, and finally return the list of people who exceeded the budget. All of this information has to sit in the context window, likely overwhelming the available memory and causing the agent to fail.</p><p>All the intermediate data (the list of members and their expenses) the agent stored in its context window was only useful for calculating the end result. This is where programmatic tool calling can help.</p><h2>Why Code Beats Tool Calls</h2><p>LLMs are much better at writing code than any other capability, including tool calling. A team at University of Illinois Urbana-Champaign first noticed this in 2024 with their paper CodeAct. Instead of having an agent call tools normally, they gave the agent a Python environment where it could write code. This code would call the tools instead, which means only the final result would enter the context window.</p><p>Results across 17 models on standard benchmarks showed up to 20% higher success rates compared to JSON and text-based tool calling, with fewer turns required to complete equivalent tasks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z_gN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z_gN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!Z_gN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!Z_gN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Z_gN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z_gN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:859022,&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://blog.techforproduct.com/i/193372788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.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_!Z_gN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!Z_gN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!Z_gN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Z_gN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e205ddf-d1a0-4cee-af68-b94667293727_1376x768.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>There are three main reasons why code outperforms regular tool calls:</p><ul><li><p>Models have deep familiarity with coding from pre-training</p></li><li><p>Code has built-in control flow: loops, conditionals, and composition of multiple operations in a single action</p></li><li><p>Code can call existing libraries rather than being limited to pre-defined tool schemas</p></li></ul><p>Also, when the generated code fails, the model can read the structured error output from the interpreter and revise the script.</p><p>Let&#8217;s take another look at our expenses agent using programmatic tool calling. Instead of calling each tool on each employee, our agent would write a script that executes this for us. Remember that the agent is writing the code to use tools, the code runs, and the agent sees the result.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!89Uc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!89Uc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png 424w, https://substackcdn.com/image/fetch/$s_!89Uc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png 848w, https://substackcdn.com/image/fetch/$s_!89Uc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png 1272w, https://substackcdn.com/image/fetch/$s_!89Uc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!89Uc!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png" width="1200" height="845.4545454545455" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:1023,&quot;width&quot;:1452,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:1268010,&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://blog.techforproduct.com/i/193372788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!89Uc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png 424w, https://substackcdn.com/image/fetch/$s_!89Uc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png 848w, https://substackcdn.com/image/fetch/$s_!89Uc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.png 1272w, https://substackcdn.com/image/fetch/$s_!89Uc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe1f46ba-455d-417f-9f26-f92c001c3e78_1452x1023.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>And finally, here&#8217;s what our context windows would look like between standard and programmatic tool calling:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xyl9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xyl9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!xyl9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!xyl9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!xyl9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xyl9!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png" width="1200" height="670.054945054945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff32e53a-e890-4a54-9895-64abba770783_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:1554076,&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://blog.techforproduct.com/i/193372788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xyl9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!xyl9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!xyl9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!xyl9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff32e53a-e890-4a54-9895-64abba770783_2752x1536.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>The Two Major Implementations</h2><p>Both Anthropic and Cloudflare shipped production implementations in 2025 and early 2026. They reach the same outcome through different architectural choices.</p><h3>Anthropic: Programmatic Tool Calling</h3><p>Anthropic released Programmatic Tool Calling in November 2025. The model writes Python that runs in a managed container. Your tools opt in by specifying <code>allowed_callers: ["code_execution_20250825"]</code> in their definition. The code runs inside the container, calls your tools as needed, and only the script&#8217;s output enters Claude&#8217;s context when it finishes.</p><p>Measured results on complex research tasks:</p><ul><li><p>37% average token reduction (43,588 to 27,297 tokens)</p></li><li><p>Up to 98% reduction for workflows with large intermediate data (150K tokens to 2K)</p></li><li><p>Accuracy improvements on internal knowledge retrieval benchmarks (25.6% to 28.5%)</p></li></ul><p>Anthropic released Programmatic Tool Calling alongside two related features worth knowing. <strong>Tool Search</strong> lets agents discover tool definitions on demand instead of loading all of them into context upfront (85% token reduction on MCP evaluations). <strong>Tool Use Examples</strong> lets you attach concrete usage demonstrations to each tool definition, improving accuracy from 72% to 90% on complex parameter handling. These three features together are Anthropic&#8217;s approach to scaling tool use without linearly scaling context costs.</p><p>One practical note: Anthropic recommends assigning each tool to either direct calling or programmatic calling, not both. The model performs better with unambiguous guidance about how each tool should be called.</p><h3>Cloudflare: Code Mode</h3><p>Cloudflare built the same pattern independently, calling it <strong>Code Mode</strong>. The model writes TypeScript instead of Python, and the code runs in lightweight sandboxed JavaScript environments rather than containers.</p><p>When the model decides to act, it writes a function like <code>sendEmail:</code></p><pre><code><code>async () =&gt; {
  const weather = await codemode.getWeather({ location: "London" });
  if (weather.includes("sunny")) {
    await codemode.sendEmail({ to: "team@example.com", subject: "Nice day!" });
  }
};
</code></code></pre><h2>When to Use It</h2><p>Programmatic tool calling can make your agent workflow more complex. Because the agent doesn&#8217;t see context in between steps, it won&#8217;t have any knowledge of what happened during that time. With any highly interactive and contextual use cases, this can make the agent feel slow and forgetful.</p><p>Use cases that work better are those that require reading in a lot of information to reach some final conclusion, and do not require the ability to chat with each individual data element. Other good use cases include handling a large number of tools, or restricting what data the model can see.</p><p>Let&#8217;s try two common agents: a coding agent and a data analysis agent.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MtoP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MtoP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!MtoP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!MtoP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!MtoP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MtoP!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png" width="1200" height="670.054945054945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:1514966,&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://blog.techforproduct.com/i/193372788?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MtoP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!MtoP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!MtoP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!MtoP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e244425-1e4f-41dd-bb0a-212f6e244ff3_2752x1536.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>With a coding agent, typical tools would include <code>edit_file, read_file</code>, and <code>search</code>. If we use programmatic tool calling, the coding agent would write a python script that would attempt to batch these reading and updating together. This could save on context window usage, but the agent would be required to reread files after every edit, as it would&#8217;t see the edit tool call results.</p><p>With a data analysis agent, we might have tools like <code>run_query</code> and <code>create_chart. </code>Based on the user&#8217;s question, the agent would run one or more queries and produce a visualization. Here programmatic tool calling would save a lot of time and tokens, as the intermediate query results themselves may not be important.</p><p>If most results in your workflow are just inputs to the next step and don&#8217;t need the model to reason about them directly, you have a strong case for programmatic tool calling.</p><p>Programmatic tool calling is not an often discussed topic, so I hope this helps you understand what it is, how it works, and when you should use it!</p><p></p>]]></content:encoded></item><item><title><![CDATA[AI Prototyping with your real components]]></title><description><![CDATA[How to make your engineering team 100% happier with your prototypes]]></description><link>https://blog.techforproduct.com/p/ai-prototyping-with-your-real-components</link><guid isPermaLink="false">https://blog.techforproduct.com/p/ai-prototyping-with-your-real-components</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Thu, 02 Apr 2026 19:15:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b8dccb02-1fe5-4b43-9fc1-ce5c0d5d387e_642x362.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. Subscribe to paid to get access to the AI Product Circle community on Slack, my full Tech Foundations for PMs course (84 lessons), a prompt library for common PM tasks, and discounts for live cohort-based courses.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Last year, I shared a lot of guidance on using component libraries with AI prototyping tools to improve the quality and consistency of your prototypes.</p><p>Today, teams are beginning to move towards using their real code in prototypes instead of AI generated code. What does this mean?</p><p>Instead of asking the AI to create a button or chart for you, you import your existing code components to your prototyping tool. This gives you two critical benefits:</p><ol><li><p>You know that the prototype will look exactly like your product</p></li><li><p>The code has actual value to the engineering team</p></li></ol><p>The main problem with AI prototyping is that it&#8217;s fast to spin up a new idea, but the artifact itself has no real value. The code generated doesn&#8217;t use your real colors, components, or systems. So if you give it to an engineer, they basically have to start from scratch.</p><p>This new wave of prototyping uses real components so that hand of to engineering has actual value. They can use the prototype as an accurate reference for implementation and even point their coding agent (aka Claude Code) at it to implement directly.</p><p>This isn&#8217;t theoretical. Based on a small subset of data from a popular AI prototyping tool, only 41% of teams selected Figma as their import source when adding a design system. A combined 36% were code (Github + Storybook), and another 16% were MCP.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f5Aq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f5Aq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!f5Aq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!f5Aq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!f5Aq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f5Aq!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg" width="1200" height="669.7674418604652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:349347,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f5Aq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!f5Aq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!f5Aq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!f5Aq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39d7622b-c217-41dc-9373-5df53fdded4e_1376x768.jpeg 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>In this post, I want to break down nine ways you can use a design system with AI prototyping tools, including MCP, skills, and more. </p><p>Let&#8217;s dive in.</p><h2>1. Screenshots</h2><p>Taking a screenshot of your existing UI and pasting it into an AI tool is the lowest-friction starting point. You screenshot your dashboard, paste it in, and ask your AI to recreate the layout. AI returns a visual approximation typically built with shadcn/ui.</p><p>The AI has no knowledge of your actual components, tokens, or design system. The output will use whatever default stack the tool prefers (almost always shadcn/ui plus Tailwind) and you&#8217;ll spend more time retrofitting the result to your design system than you saved.</p><p>This can be useful if you want to a scrappy idea quickly, not when you need design system accuracy.</p><p><strong>Best for:</strong> Early exploration when you don&#8217;t care about design system fidelity. Communicating a rough layout idea you plan to refine with a real method later.</p><h2>2. Prompt-only / paste code into chat</h2><p>You copy-paste your component source code directly into the chat prompt and instruct the AI to use those components. Paste your <code>&lt;Button&gt;</code>, <code>&lt;Card&gt;</code>, and <code>&lt;Input&gt;</code> into AI with: &#8220;Here are my components. Build a settings page using only these.&#8221;</p><p>With this approach, the AI tool needs to read all your components on each prompt, and it likely won&#8217;t be able to reconstruct them accurately unless you&#8217;re using the exact same tech stack. Even after you provide components, you need to re-prompt explicitly with each specific component, naming what to use and when.</p><p>Token limits also cap how many components you can paste. Bolt&#8217;s free tier burns through 300K tokens quickly. v0 is &#8220;tightly coupled to ShadCN and not flexible in this regard&#8221;.</p><p><strong>Best for:</strong> Nothing really, there are better approaches.</p><h2>3. npm package + explicit prompting</h2><p>This was the initial attempt at solving design systems and multiple products shipped support for NPM packages (Figma Make, Bolt, Lovable, etc).</p><p>You publish your code to npm, a package registry that allows you to easily install it in other environments. Then you jump into your favorite prototyping tool and tell AI tools to install and use it.</p><p>The problem is that all AI prototyping tools have strong defaults and just don&#8217;t know how to use your components. In my experience, this led to more errors and headaches than using a screenshot.</p><p>Some of this pain can be alleviated with good instructions, but it almost always still falls short.</p><p><strong>Best for:</strong> Teams with an already-published library who want a low-effort foundation. Pairs best with context files that document component usage patterns.</p><h2>4. Bolt Design System Agents / Magic Patterns design systems</h2><p>These are platform-native features that ingest your component library and constrain code generation to your design system. <a href="http://bolt.new">Bolt&#8217;s</a> Design System Agents (launched March 26, 2026) let you upload component source files, a Storybook URL, or brand guidelines. The agent &#8220;learns&#8221; your system and uses your components in subsequent builds.</p><p>I gave this a try and the results were not great. Here&#8217;s a quick side by side of the Figma mock I had (using a design system) and the Bolt design using a matching Storybook.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pe_E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pe_E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 424w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 848w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1272w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pe_E!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png" width="1200" height="652.7472527472528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:792,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:406151,&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://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pe_E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 424w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 848w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1272w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.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><figcaption class="image-caption">Figma design</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6edo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6edo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png 424w, https://substackcdn.com/image/fetch/$s_!6edo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png 848w, https://substackcdn.com/image/fetch/$s_!6edo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png 1272w, https://substackcdn.com/image/fetch/$s_!6edo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6edo!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png" width="1200" height="591.2917271407838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:679,&quot;width&quot;:1378,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:155251,&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://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6edo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png 424w, https://substackcdn.com/image/fetch/$s_!6edo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png 848w, https://substackcdn.com/image/fetch/$s_!6edo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.png 1272w, https://substackcdn.com/image/fetch/$s_!6edo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F542643c7-5b3e-49a0-933e-e06e731c3c0a_1378x679.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><figcaption class="image-caption">Bolt Design Systems</figcaption></figure></div><p></p><p><a href="http://magicpatterns.com">Magic Patterns</a> is another tool focused on design systems. You can import a structured set of rules, typography, colors, and reusable components that apply automatically to every generated prototype. Teams create components by importing from Figma or with screenshots, reference them by name in prompts (<code>@LibraryName/Button</code>), and publish versioned updates that can be bulk-applied across all designs using them.</p><p>This approach works well, but can be tedious to import and doesn&#8217;t match your existing code. The team has a private beta for importing code components that appears to solve this by allowing bulk imports via Figma and MCP.</p><p>Both platforms are React-only, limiting your options if you&#8217;re on a different stack.</p><p><strong>Best for:</strong> Design-focused teams who primarily prototype in one browser tool and need the lowest technical barrier.</p><h2>5. Storybook MCP</h2><p>The official <code>@storybook/addon-mcp</code> exposes your Storybook component metadata (names, props, descriptions, stories, screenshots) to any MCP-capable AI tool. You install the addon and add the MCP endpoint to your Claude Code. Claude Code then has tools like <code>list_components</code>, <code>get_component_props</code>, and <code>get_component_source</code>.</p><p>This is explicitly marked &#8220;highly experimental&#8221; by the Storybook team. I haven&#8217;t done a ton of testing with this, so I won&#8217;t share an opinion for now. From what I&#8217;ve seen, it&#8217;s mostly useful if you want to automatically create new Stories in Storybook, not for prototyping outside of the tool. Feel free to share if you&#8217;ve given this a try!</p><p><strong>Best for:</strong> Teams already invested in Storybook who want cross-tool component awareness. Treat this as an additive layer on top of context files, not a standalone solution.</p><h2>6. shadcn-compatible registry</h2><p>You restructure your components into shadcn&#8217;s <code>registry.json</code> format so they install via <code>npx shadcn add @namespace/component</code>. This lets you easily import individual components as needed for prototyping.</p><p>The fundamental constraint is again tailwind and react. If you&#8217;re already using a compatible stack, this option can be a good place to start, but many teams are not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C3Hc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C3Hc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C3Hc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C3Hc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C3Hc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C3Hc!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg" width="1200" height="669.7674418604652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:382075,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!C3Hc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C3Hc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C3Hc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C3Hc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64ecffe2-a519-421b-8e10-c629b434e13a_1376x768.jpeg 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><strong>Best for:</strong> Teams building on or willing to align with Tailwind/shadcn. </p><h2>7. Custom MCP server</h2><p>This is a newer pattern and takes a moment to understand.</p><p>You build a custom MCP server that exposes your component library&#8217;s metadata as structured tools. Tools like <code>list_components, get_component_props, get_component_source</code> give Claude Code or Cursor on-demand access to your components, usage examples, and anti-patterns.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ukac!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ukac!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ukac!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ukac!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ukac!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ukac!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg" width="1200" height="669.7674418604652" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:418337,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ukac!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ukac!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ukac!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ukac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d7a3dba-ed98-4682-b711-a55035b2dc5c_1376x768.jpeg 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>For large component libraries (100+), you should implement pagination or search, as dumping all components at once can exceed the context window on most AI models.</p><p>The main downside of MCPs for design systems is the number of queries and tokens your agent will do. You&#8217;ll find that Claude Code constantly is reading documentation before doing any prototyping work, slowing down the speed of iteration. </p><p>The results are often quite good - here&#8217;s another look at the dashboard from earlier:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pe_E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pe_E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 424w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 848w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1272w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pe_E!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png" width="1200" height="652.7472527472528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:792,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:406151,&quot;alt&quot;:&quot;&quot;,&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://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!pe_E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 424w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 848w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1272w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.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><figcaption class="image-caption">Figma Design</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yLZi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yLZi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png 424w, https://substackcdn.com/image/fetch/$s_!yLZi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png 848w, https://substackcdn.com/image/fetch/$s_!yLZi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png 1272w, https://substackcdn.com/image/fetch/$s_!yLZi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yLZi!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png" width="1200" height="500.27472527472526" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:607,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:121406,&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://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yLZi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png 424w, https://substackcdn.com/image/fetch/$s_!yLZi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png 848w, https://substackcdn.com/image/fetch/$s_!yLZi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.png 1272w, https://substackcdn.com/image/fetch/$s_!yLZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3af06047-b0ca-4395-9857-bf412575c1bd_1817x757.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><figcaption class="image-caption">MCP Design System + Screenshot</figcaption></figure></div><p></p><p>This also requires some technical skill as MCPs are best used by desktop coding agents like Claude Code or Codex.</p><p><strong>Best for:</strong> Teams comfortable with a little technical complexity and engineering bandwidth to support internal servers</p><h2>8. Figma MCP + Code Connect + Claude Code</h2><p>I don&#8217;t have access to Code Connect, so I can&#8217;t speak much to this workflow. I&#8217;ve seen good results, but I know it also take a lot of time and effort to set up.</p><p>Code Connect works by creating a <code>.figma.tsx</code> file per component that maps the Figma component to a React import and includes a usage example. After running <code>npx figma connect publish</code>, the AI receives actual import statements and component mappings.</p><p>Without Code Connect configured, you can accomplish something similar by writing a skill in Claude Code that maps your Figma components to code. It won&#8217;t be as accurate, but its a good place to start.</p><p><strong>Best for:</strong> Teams with a well-maintained Figma design system and Code Connect already configured (or willingness to set it up).</p><h2>9. Components + custom skill + Claude Code</h2><p>This is my recommended approach if you&#8217;re technical enough and focused on engineering handoff.</p><p>Your component library lives in the repo directly. You create a <code>SKILL.md</code> that documents what components you have and usage rules. Claude Code reads both the skill and the actual source files, which gives the AI a full understanding of how to use the components.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NDG5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NDG5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NDG5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NDG5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NDG5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NDG5!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg" width="1200" height="538.3831026948288" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:616,&quot;width&quot;:1373,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:136966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1044f41d-5774-4720-af3f-72d641bda52b_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NDG5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NDG5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NDG5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NDG5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2d55423-81bb-41a2-b271-242355594d3b_1373x616.jpeg 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 an example, here&#8217;s the same dashboard comparison with Figma first and Claude Code + components + Figma MCP second:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pe_E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pe_E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 424w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 848w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1272w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pe_E!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png" width="1200" height="652.7472527472528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:792,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:406151,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!pe_E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 424w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 848w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.png 1272w, https://substackcdn.com/image/fetch/$s_!pe_E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6189241-8677-47ae-9afa-4b40462f5eb9_2880x1566.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><figcaption class="image-caption">Figma Design</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FcQA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FcQA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png 424w, https://substackcdn.com/image/fetch/$s_!FcQA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png 848w, https://substackcdn.com/image/fetch/$s_!FcQA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png 1272w, https://substackcdn.com/image/fetch/$s_!FcQA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FcQA!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png" width="1200" height="497.8021978021978" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:604,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:178428,&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://blog.techforproduct.com/i/192989708?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FcQA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png 424w, https://substackcdn.com/image/fetch/$s_!FcQA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png 848w, https://substackcdn.com/image/fetch/$s_!FcQA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.png 1272w, https://substackcdn.com/image/fetch/$s_!FcQA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86ecf45-54dd-4e39-8147-ee3875e0c018_1848x767.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><figcaption class="image-caption">Components + Skill + Figma MCP</figcaption></figure></div><p></p><p>If you don&#8217;t want to working in the main repo, you can export just your components to a dedicated repo for prototyping. You can also pair this with screenshots or imports via Figma MCP to easily spin up interfaces for your ideas.</p><p><strong>Best for:</strong> Teams that want maximum code &amp; design fidelity between their design system and AI-generated prototypes.</p><h2>Quick comparison</h2><p>To wrap up, here&#8217;s a quick comparison chart of all the import methods covered in the post:</p><h2>Where to start</h2><p>If I had to recommend one thing to start with, it would be getting comfortable with Skills and MCP. Being able to move information between systems with MCP is a critical workflow, and learning how build Skills to document the exact instructions an AI should follow provides a lot of leverage.</p><p>Ultimately, the right approach depends on how technical your team is. Use web based tools like Bolt or Magic Patterns if you want a low barrier to entry. Use Claude Code + MCP + Skills for the best possible results.</p><p>I hope this breakdown was helpful in seeing all the ways teams are approaching this problem!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/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">Tech For Product is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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 to Build an AI Agent From Scratch]]></title><description><![CDATA[Learn to build agents without frameworks]]></description><link>https://blog.techforproduct.com/p/how-to-build-an-ai-agent-from-scratch</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-to-build-an-ai-agent-from-scratch</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Mon, 30 Mar 2026 15:07:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/de1faa22-f85c-49a1-bc13-10b63b4c6084_1456x1048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. Subscribe to paid to get access to the AI Product Circle community on Slack, my full Tech Foundations for PMs course (84 lessons), a prompt library for common PM tasks, and discounts for live cohort-based courses.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Platforms like N8N, Zapier, and frameworks like LangChain have made it easy to build AI agents without necessarily knowing what&#8217;s happening underneath. That works, right up until your agent does something unexpected and you have no idea why.</p><p>In this post I will show you exactly how agents work by walking through how to build one step-by-step. We&#8217;ll use a customer support agent as the example throughout.</p><p>You&#8217;ll learn what a tool is, how the LLM and your server pass information back and forth, how the agent decides when it&#8217;s done, and how to assemble all of it into a working loop.</p><h2>Step 1: Get an LLM that supports tool calling</h2><p>The first thing you need is a <strong>large language model</strong> (LLM) that supports <strong>tool calling</strong>. Tool calling is a feature that lets the model request that your server run a specific function, rather than just generating text.</p><p>A tool is a function you define and describe to the LLM before the conversation begins. You tell the model: these are the actions available to you. The model then decides, based on the conversation, whether to call one and which one to 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_!OFUY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OFUY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!OFUY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!OFUY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!OFUY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OFUY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:270462,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.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_!OFUY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!OFUY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!OFUY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!OFUY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02982e0c-3d8d-4f74-9dc8-8af651e25be6_1376x768.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>For example, you could build a tool called &#8216;search_web&#8217; that looks up information online, rather than depending on the LLMs existing knowledge. To use the &#8216;search_web&#8217; tool, you would:</p><ol><li><p>Create an tool handler on your server that can search the web when the &#8216;search_web&#8217; tool is called</p></li><li><p>Send a request to the LLM with the &#8216;search_tool&#8217; included in the list of available tools</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TBD5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TBD5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!TBD5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!TBD5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!TBD5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TBD5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:326236,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.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_!TBD5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!TBD5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!TBD5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!TBD5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a51e232-c6dd-426b-b6b7-fd6e2212c94b_1376x768.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>Tool calling has only become reliably good recently. Models from Anthropic, OpenAI, and Google have improved dramatically over the past two years. That improvement is what made agents practical outside of research settings.</p><h2>Step 2: Decide when the agent should stop</h2><p>An agent running in a loop needs an exit condition. Two approaches work well together:</p><p><strong>A &#8220;done&#8221; tool.</strong> You define a tool called something like <code>complete_task</code> or <code>end_conversation</code>. When the model calls it, your loop exits cleanly. The agent finishes when it decides it has finished.</p><p><strong>A maximum iteration limit.</strong> You set a cap on the number of loops. Max iterations are useful as a safety net, but hitting the limit means the agent ran out of turns before it could complete its work. You&#8217;ll want to handle that case explicitly so the user knows what happened.</p><p>Most production agents use both: the done tool as the primary exit, max iterations as the fallback.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!45QI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!45QI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!45QI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!45QI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!45QI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!45QI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:335321,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.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_!45QI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!45QI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!45QI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!45QI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70f72b22-d83d-49f9-b2dc-a72db5538de9_1376x768.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><h2>Step 3: Give the agent some tools</h2><p>The tools you provide define what the agent can actually do. For a customer support agent, three categories make sense:</p><p><strong>Information lookup:</strong> search the knowledge base, pull up a customer&#8217;s order, check account status</p><p><strong>Escalation:</strong> route the conversation to a live agent when the issue is outside what the LLM can resolve</p><p><strong>Actions:</strong> issue a refund, update a shipping address, cancel an order (start with read-only tools and expand from there)</p><p>Each tool is a function your server exposes. The LLM requests it by name with whatever arguments it needs. Your server runs the function and returns the result.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U2wP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U2wP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!U2wP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!U2wP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!U2wP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U2wP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:413796,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.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_!U2wP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!U2wP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!U2wP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!U2wP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd559b5e8-8c60-4bae-af07-39990ca45f47_1376x768.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>Each tool has a list of arguments or variables that can be passed in, like the order ID that needs to be refunded. Tools also have a description that helps the agent understand how to use them, and can return errors that tell the LLM what went wrong. These errors can allow the agent to self correct if they&#8217;re descriptive enough!</p><h2>Step 4: Write the system prompt</h2><p>Before the loop starts, you give the LLM a <strong>system prompt</strong>: a set of instructions that defines how it should behave. This is where you set the agent&#8217;s personality, scope, and guardrails.</p><p>For a customer support agent, your system prompt might include:</p><blockquote><p>&#8220;You are a support agent for Acme. Always look up the customer&#8217;s order before responding. If you cannot resolve the issue with the tools available, escalate to a human. Do not guess at policies you don&#8217;t know.&#8221;</p></blockquote><p>The system prompt is the single biggest lever you have over agent behavior. A well-written prompt prevents most of the edge cases you&#8217;d otherwise spend days debugging.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QtDk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QtDk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!QtDk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!QtDk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!QtDk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QtDk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:340810,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.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_!QtDk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!QtDk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!QtDk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!QtDk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669fe73e-6fca-493f-9f14-74f2493b60ad_1376x768.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&#8217;ll include full details on writing and improving system prompts in an upcoming post!</p><h2>Step 5: Put it all in a loop</h2><p>When a user sends a message, your server calls the LLM with the full conversation history. The model reads everything and decides what to do.</p><p>If it decides to use a tool, it responds with a structured message containing the tool name and arguments. Your server runs the tool, collects the result, then calls the LLM again, this time passing the full conversation including the tool request and the result.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UPnY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UPnY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!UPnY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!UPnY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!UPnY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UPnY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:333637,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.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_!UPnY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!UPnY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!UPnY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!UPnY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb280e6-a4f1-4758-b88b-cb841e863a26_1376x768.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>The LLM reads all of that context fresh and decides what to do next, usually calling another tool or generating a final response. This continues until the agent calls your done tool, you hit the max iteration limit, or you fill up the <strong>context window</strong>.</p><p>The context window is the maximum amount of text you can send to the LLM in a single call. A 250k token context window works out to roughly 1 million characters of text, which sounds like a lot, but each tool call adds to the history you carry forward on every subsequent call. A long agent session fills the context faster than you&#8217;d expect.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2V4S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2V4S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!2V4S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!2V4S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!2V4S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2V4S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:353928,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.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_!2V4S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!2V4S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!2V4S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!2V4S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bc94f2b-22de-4178-8b14-e5ab499ff3de_1376x768.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>There are strategies for managing and reducing the context window, including compaction and removing old tokens from tool calls and thinking &#8212; to be covered later!</p><h2>Putting It All Together</h2><p>To make this concrete, let&#8217;s trace a full example. A user says their order never arrived. The agent looks up the order, finds it&#8217;s lost in transit, issues a refund, and tells the user. That&#8217;s two tool calls and a final response, all handled without a human.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Eg1-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Eg1-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!Eg1-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!Eg1-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Eg1-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Eg1-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:412076,&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://blog.techforproduct.com/i/192619911?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.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_!Eg1-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!Eg1-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!Eg1-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Eg1-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F379838f0-1b29-4b7e-af9c-e9e5e30f4f80_1376x768.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>Remember, a basic agent has five components:</p><ol><li><p>An LLM with tool calling support</p></li><li><p>A <code>done</code> tool and a max iteration limit as exit conditions</p></li><li><p>Tools for the actions your agent needs to take</p></li><li><p>A system prompt that defines behavior and constraints</p></li><li><p>A loop: call the LLM, check for tool use, run the tool, call the LLM again</p></li></ol><p>Every agent framework you&#8217;ve seen, from LangChain to N8N to Zapier, is an abstraction on top of this loop. Knowing how the underlying loop works is what lets you understand why your agent is behaving the way it is, and fix it when it&#8217;s not.</p>]]></content:encoded></item><item><title><![CDATA[I Built a Coding Agent in 90 Days. Here’s How It Actually Works.]]></title><description><![CDATA[From a basic API wrapper to a production-ready agentic environment]]></description><link>https://blog.techforproduct.com/p/i-built-a-coding-agent-in-90-days</link><guid isPermaLink="false">https://blog.techforproduct.com/p/i-built-a-coding-agent-in-90-days</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Mon, 26 Jan 2026 14:35:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!IUCt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Almost all useful agents today are coding agents. Instead of interacting with an application through the UI, agents are now writing code to make slides, excel sheets, or browse the internet. In the past 90 days, I built my first coding agent from scratch (<a href="http://chippy.build">Chippy.build</a>, an ai prototyping tool for ChatGPT apps). </p><p>This post breaks down how it works, what makes coding agents different from other AI applications, and what I learned along the way. Let&#8217;s dive in!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/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"></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><div><hr></div><h2><strong>What Makes an Agent Different</strong></h2><p>The most common use case for AI applications today is generating text. Whether it&#8217;s finding a recipe or helping you write a paper, most people use tools like ChatGPT and Claude as text-based assistants. You send a message, you get a response, and that&#8217;s the end of the interaction.</p><p>An agent is different. An agent can use tools, maintain state across multiple turns, and work toward a goal that might take many steps to achieve. When you ask an agent to &#8220;help me book a vacation&#8221; it actually does it, searching flights, reserving hotels, and blocking your calendar. In this model, the valuable part is not the text response, but instead the work done between the user&#8217;s request and the agent&#8217;s response.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WhMv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WhMv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png 424w, https://substackcdn.com/image/fetch/$s_!WhMv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png 848w, https://substackcdn.com/image/fetch/$s_!WhMv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png 1272w, https://substackcdn.com/image/fetch/$s_!WhMv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WhMv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WhMv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png 424w, https://substackcdn.com/image/fetch/$s_!WhMv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png 848w, https://substackcdn.com/image/fetch/$s_!WhMv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.png 1272w, https://substackcdn.com/image/fetch/$s_!WhMv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd806ab56-39c1-47db-b976-2826ca2d1b7a_2048x1143.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>The distinction is important because it changes what you&#8217;re building. A chatbot needs good system prompts to present a coherent persona and may need access to external data sources like websites or files. An agent needs good system prompts <em>and</em> a runtime that can execute tools, manage state, handle errors, and verify results. The system prompts are maybe 30% of the work. The other 70% is the harness.</p><p>On top of this, coding agents are a degree more complex than regular agents. Where a regular agent may have one way to solve a problem, coding agents have near infinite. Here&#8217;s why:</p><ol><li><p>Code has to actually run. If you ask an agent to write an email, it can produce something plausible and you&#8217;ll judge whether it&#8217;s good. If you ask an agent to write code, there&#8217;s an objective test: does it execute without errors? This creates a tight feedback loop that other domains don&#8217;t have.</p></li><li><p>Code exists in files and files have relationships. Changing one file might break another. The agent needs to understand not just the code it&#8217;s writing but the context it&#8217;s writing into.</p></li><li><p>Users expect to see results immediately. When you change a UI component, you want to see the updated preview right away. This means the agent needs an execution environment and a real-time preview; you can&#8217;t just return text and call it done.</p></li><li><p>Evaluating the quality of coding agents is more challenging. Most coding problems can be correctly solved with many different approaches, so you can&#8217;t anticipate all possible correct answers to verify if the agent is behaving properly. Instead, you have to read traces to find common errors and build evaluation sets based solely on the final outcome of the agent.</p></li></ol><p>These constraints shape the overall design and architecture of a coding agent. We&#8217;ll take a look at how this works using Chippy as an example.</p><h2><strong>The Core Loop</strong></h2><p>Every coding agent follows the same basic pattern.</p><ol><li><p>The user sends a message describing what they want.</p></li><li><p>The agent plans the work by breaking it into steps.</p></li><li><p>The agent calls tools to read files, modify code, and interact with the environment.</p></li><li><p>It verifies that the changes work.</p></li><li><p>Then it responds and updates the preview.</p></li></ol><p>Oftentimes there are some visual updates as the agent is working, such as showing tools called or lines of code written. Good UX for demonstrating progress during these long running processes is critical.</p><p>Here&#8217;s how this was implemented inside of Chippy:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IUCt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IUCt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png 424w, https://substackcdn.com/image/fetch/$s_!IUCt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png 848w, https://substackcdn.com/image/fetch/$s_!IUCt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png 1272w, https://substackcdn.com/image/fetch/$s_!IUCt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IUCt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png" width="1456" height="803" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:803,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IUCt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png 424w, https://substackcdn.com/image/fetch/$s_!IUCt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png 848w, https://substackcdn.com/image/fetch/$s_!IUCt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.png 1272w, https://substackcdn.com/image/fetch/$s_!IUCt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffce33e89-d31a-4377-acf2-76d9175b1d85_2048x1130.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>That&#8217;s the loop: message, plan, tools, verify, respond. If you understand this pattern, you understand 80% of how coding agents work. It&#8217;s surprisingly easy to get a basic coding agent working, but a high quality agent is built in the details.</p><p>Chippy&#8217;s agent runs on the Anthropic API with a custom runtime. I didn&#8217;t use LangChain, the OpenAI Agent SDK, or Anthropic&#8217;s Claude Code SDK. I tried these frameworks but I found that they had some core assumptions about the environment they&#8217;d be running in that didn&#8217;t 100% align to my vision. Additionally, I found using these frameworks abstracted away the core agent loop and made it more difficult to learn how these systems really work.</p><p>Building a custom runtime sounds more intimidating than it is. Any LLM provider gives you everything you need: you send messages, the model returns tool calls, you execute them and send back results. The &#8220;runtime&#8221; is really just a loop. The complexity isn&#8217;t in the infrastructure - it&#8217;s in the tools themselves and in making the whole system reliable.</p><p>Chippy&#8217;s agent has about 20 tools. Here are the five that do most of the work:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dv18!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dv18!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png 424w, https://substackcdn.com/image/fetch/$s_!dv18!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png 848w, https://substackcdn.com/image/fetch/$s_!dv18!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png 1272w, https://substackcdn.com/image/fetch/$s_!dv18!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dv18!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png" width="1456" height="503" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:503,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dv18!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png 424w, https://substackcdn.com/image/fetch/$s_!dv18!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png 848w, https://substackcdn.com/image/fetch/$s_!dv18!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.png 1272w, https://substackcdn.com/image/fetch/$s_!dv18!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f45bbb4-5d83-49a8-8493-3ecd6603373b_2048x707.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>Let me trace through what happens when you tell the agent &#8220;Add a checkout button to the shopping widget.&#8221;</p><p>First, the agent calls <code>edit_tasks</code> to plan the work:</p><p><code>{</code></p><p><code>  &#8220;tasks&#8221;: [</code></p><p><code>    { &#8220;label&#8221;: &#8220;Find the shopping widget component&#8221;, &#8220;completed&#8221;: false },</code></p><p><code>    { &#8220;label&#8221;: &#8220;Add checkout button with onClick handler&#8221;, &#8220;completed&#8221;: false },</code></p><p><code>    { &#8220;label&#8221;: &#8220;Wire button to checkout flow&#8221;, &#8220;completed&#8221;: false }</code></p><p><code>  ]</code></p><p><code>}</code></p><p>This does two things: it makes the agent&#8217;s thinking visible to the user, and it gives the agent a structure to follow. Without explicit planning, agents tend to jump straight into code changes and miss steps.</p><p>Next, it calls <code>get_app_config</code> to understand what exists. The response includes current tool definitions, file contents, mock data, and API connections. The agent now knows the context it&#8217;s working in.</p><p>Then it calls <code>edit_file</code> to modify the component:</p><p><code>{</code></p><p><code>  &#8220;path&#8221;: &#8220;ShoppingWidget.tsx&#8221;,</code></p><p><code>  &#8220;instruction&#8221;: &#8220;Add checkout button below the cart items&#8221;,</code></p><p><code>  &#8220;edit&#8221;: &#8220;- &lt;/div&gt;\n+ &lt;button onClick={handleCheckout}&gt;Checkout&lt;/button&gt;\n+ &lt;/div&gt;&#8221;</code></p><p><code>}</code></p><p>In Chippy, Sonnet doesn&#8217;t apply the diff directly. Instead, I use a Small Language Model (SLM) to apply diffs. Originally I had Claude using a tool for string replacements, but it would often get white spaces or other small issues wrong that would cause the edit to fail.</p><p>The next iteration of edits was to use the <a href="https://support.claude.com/en/articles/12111783-create-and-edit-files-with-claude">File</a> tools offered by Anthropic. I found that these tools conflicted with other beta features such as programmatic tool calling and were difficult for me to iterate on to improve performance.</p><p>The final interaction was to have Sonnet generate a text response of what should change and use another model fine tuned to make accurate code changes to apply the change. This handled a lot of edge cases and small issues without using the more expensive Sonnet model and multiple retries.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Cxp_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Cxp_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png 424w, https://substackcdn.com/image/fetch/$s_!Cxp_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png 848w, https://substackcdn.com/image/fetch/$s_!Cxp_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png 1272w, https://substackcdn.com/image/fetch/$s_!Cxp_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Cxp_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Cxp_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png 424w, https://substackcdn.com/image/fetch/$s_!Cxp_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png 848w, https://substackcdn.com/image/fetch/$s_!Cxp_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.png 1272w, https://substackcdn.com/image/fetch/$s_!Cxp_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ce6d837-a7ea-4a9e-9beb-4bd195b05eb0_2048x1117.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>The practical benefits are significant: lower latency per edit, lower cost since smaller models are cheaper, and fewer mistakes on the actual text manipulation. Claude focuses on the hard part, and the diff model handles the easy part.</p><p>Once the edit is finalized, we run through the verification steps. For my agent, that means:</p><ol><li><p>Bundle the code</p></li><li><p>Run the verifier skill</p></li></ol><p>Bundling the code is pretty simple. This takes the original code written by the agent and attempts to transform it to what will be displayed on a web browser. If this process fails, the agent gets an error message and modifies the code to reattempt.</p><p>The verifier skill is more interesting. In case you&#8217;re not familiar, a <a href="https://agentskills.io/home">skill</a> is like a prompt that the agent can choose to load when the user needs it. It allows your agent to &#8216;download&#8217; new instructions at the right moment in time. A good analogy is like Neo downloading new skills in the Matrix.<br><br>My verifier skill is a structured set of checks that runs at the end of each code generation, like a code review that happens automatically before the user sees the result. It&#8217;s also context aware, meaning that the instructions loaded will match the set of features currently being used. This helps to avoid situations where the agent incorrectly applies checks for a feature that&#8217;s not currently in 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_!O1Z6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O1Z6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png 424w, https://substackcdn.com/image/fetch/$s_!O1Z6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png 848w, https://substackcdn.com/image/fetch/$s_!O1Z6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png 1272w, https://substackcdn.com/image/fetch/$s_!O1Z6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O1Z6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!O1Z6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png 424w, https://substackcdn.com/image/fetch/$s_!O1Z6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png 848w, https://substackcdn.com/image/fetch/$s_!O1Z6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.png 1272w, https://substackcdn.com/image/fetch/$s_!O1Z6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e2f882e-d45c-4c05-be3d-f88f76f6dfa3_2048x1117.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>This approach has caught a lot of errors that would have otherwise shipped to users.</p><p>I also use several Anthropic API features that make a meaningful difference, such as prompt caching, interleaved thinking, and memory management.</p><blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yYIR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yYIR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png 424w, https://substackcdn.com/image/fetch/$s_!yYIR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png 848w, https://substackcdn.com/image/fetch/$s_!yYIR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png 1272w, https://substackcdn.com/image/fetch/$s_!yYIR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yYIR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yYIR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png 424w, https://substackcdn.com/image/fetch/$s_!yYIR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png 848w, https://substackcdn.com/image/fetch/$s_!yYIR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.png 1272w, https://substackcdn.com/image/fetch/$s_!yYIR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe565dbc6-e35e-46bc-8bce-6590aedf2e4b_2048x1117.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>These features aren&#8217;t strictly necessary, but they meaningfully improve reliability and user experience and the integration cost is low.</p><h2><strong>What I Learned</strong></h2><p>Here&#8217;s my top takeaways after spending the last three months building a coding agent:</p><h3><strong>1) The Core Loop Is Simple</strong></h3><p>Building the basic agent loop took about a week. You need three things: a tool for modifying files, an environment to run those files, and a preview to show the user. If you have experience building with the Anthropic or OpenAI APIs, the jump to building an agent is smaller than you might expect.</p><h3><strong>2) Reliability Is the Real Work</strong></h3><p>The gap between &#8220;works&#8221; and &#8220;works reliably&#8221; is where I spent most of my time. I read through hundreds of execution traces looking for failure patterns. Some problems yielded to better prompts. For example, if the agent kept forgetting to plan first, I could emphasize planning in the system prompt. Other problems required structural solutions like the verifier skill. Giving the agent a way to test its changes and clear error messages was critical to improving reliability.</p><p>The honest assessment is that prompt engineering gets you maybe 30% of the way to reliability. The remaining 70% requires building systems around the model: verification, error handling, and careful tool design.</p><h3><strong>3) Frameworks Encode Assumptions</strong></h3><p>Every agent framework I evaluated came with assumptions about the environment: local filesystem access, specific conversation structures, particular ways of handling tool results. These assumptions make frameworks easier to use for their intended use case. When your use case differs, you spend more time working around the framework than building your product.</p><p>For Chippy, the right choice was building a custom runtime. The Anthropic API is flexible enough that the infrastructure is simple.</p><p>In case you&#8217;re curious, I worked for about 10 hours a day, six days a week to build Chippy. Here&#8217;s roughly how the time broke down:</p><p><strong>Weeks 1&#8211;2:</strong> Core loop implementation, basic tools, first working prototype that could actually modify files and show a preview.</p><p><strong>Weeks 3&#8211;6:</strong> Tool refinement and prompt engineering. This is where I discovered most of the edge cases and failure modes.</p><p><strong>Weeks 7&#8211;10:</strong> Verifier skill development, diff model integration, systematic reliability improvements.</p><p><strong>Weeks 11&#8211;13:</strong> Polish, testing, and launch preparation.</p><p>The first prototype came together quickly. Making it production-ready took the remaining 11 weeks.</p><p>One more thing worth mentioning: I used Claude Code to write about 90% of the code!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/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">Tech For Product is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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[Shipping a user research platform with Cursor + Supabase | Li Xia]]></title><description><![CDATA[From no coding experience to technical founder in 2.5 years]]></description><link>https://blog.techforproduct.com/p/shipping-a-user-research-platform</link><guid isPermaLink="false">https://blog.techforproduct.com/p/shipping-a-user-research-platform</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Fri, 26 Sep 2025 20:16:05 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6343b5a4-2af6-4d3c-bf6e-cc5330cde355_600x600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. Subscribe to paid to get access to the AI Product Circle community on Slack, my full Tech Foundations for PMs course (84 lessons), a prompt library for common PM task, and discounts for live cohort-based courses.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Li Xia, a product manager turned founder, has developed one of the most systematic approaches to AI-assisted development I&#8217;ve seen. Despite starting his coding journey just 2.5 years ago, he&#8217;s built and shipped Sondar.ai, an AI-native UX research platform that helps product teams conduct user testing and synthesize insights in minutes rather than hours.</p><p>His secret isn&#8217;t just using AI tools, but creating a repeatable process that transforms product requirements into working code through a series of structured steps. Let&#8217;s dive into how he does it.</p><p>Check out the full interview here:</p><div id="youtube2-IvT5-wPUibU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;IvT5-wPUibU&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/IvT5-wPUibU?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><h2><strong>The Product</strong></h2><p>Sondar.ai addresses a problem Li knew intimately from his eight years in product management: teams struggle with customer discovery. His platform covers the entire research workflow, from planning studies and recruiting participants (accessing 200,000+ participants across 33 countries) to conducting research and using AI to synthesize insights from video recordings.</p><p>The platform can test everything from Figma prototypes to live websites, automatically transcribing sessions, extracting key insights, and organizing feedback into actionable categories. What used to take hours of manual analysis now happens in minutes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7ILh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7ILh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png 424w, https://substackcdn.com/image/fetch/$s_!7ILh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png 848w, https://substackcdn.com/image/fetch/$s_!7ILh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png 1272w, https://substackcdn.com/image/fetch/$s_!7ILh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7ILh!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png" width="1200" height="620.6043956043956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:753,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7ILh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png 424w, https://substackcdn.com/image/fetch/$s_!7ILh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png 848w, https://substackcdn.com/image/fetch/$s_!7ILh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.png 1272w, https://substackcdn.com/image/fetch/$s_!7ILh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8fc5ad3-6f6b-4af8-a5f7-18c757d5c33e_1840x952.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><h2><strong>The Process</strong></h2><p>Li&#8217;s approach to shipping features follows a methodical five-step process that maximizes AI effectiveness while maintaining quality control.</p><h3><strong>Step 1: PRD Generation with Chat PRD</strong></h3><p>Li starts every feature with a comprehensive Product Requirements Document, but he doesn&#8217;t write it from scratch. He uses Chat PRD, a tool by Claire Vo, which interviews him about the feature and generates a detailed PRD including business goals, user stories, functional requirements, and user experience flows.</p><p>&#8220;The PRD step is crucially important because a lot of that detail flows into the design process that follows,&#8221; Li explains. This document becomes the foundation for every subsequent step.</p><h3><strong>Step 2: Visual Design with UX Pilot</strong></h3><p>Rather than jumping straight to code, Li uses UX Pilot to transform PRD requirements into visual interfaces. He provides the AI with context from the PRD, screenshots of existing UI, and specific instructions about the feature.</p><p>The key insight: AI quality dramatically improves with context. Li includes not just feature descriptions but also design principles and system guidelines. &#8220;By combining what you are actually trying to build with the principles of your design system, you get much better quality output.&#8221;</p><h3><strong>Step 3: Engineering Task Breakdown</strong></h3><p>Here&#8217;s where Li&#8217;s process gets particularly sophisticated. He imports the PRD into Cursor and uses a custom prompt system to generate detailed engineering tasks. His &#8220;generate task file&#8221; contains specific instructions for breaking down features into parent tasks with detailed subtasks.</p><p>The AI creates a comprehensive task list that includes database changes, frontend modifications, and testing requirements. Li reviews this carefully because &#8220;once we get into the build process, this is really the blueprint it&#8217;s using to turn these prompts into actual code.&#8221;</p><h3><strong>Step 4: Systematic Implementation</strong></h3><p>Li uses another custom prompt file called &#8220;Action Tasks&#8221; that instructs the AI to work through the task list one item at a time, asking for review before moving to the next task. This prevents the AI from attempting to build everything at once and failing.</p><p>&#8220;By having these clear steps, it really helps with that consistency and creates alignment between you and the AI,&#8221; he notes. When bugs appear, he can easily restore to a previous checkpoint and retry with different instructions.</p><h3><strong>Step 5: Iterative Testing and Deployment</strong></h3><p>Li&#8217;s tech stack, Supabase for the backend, Vue 3 for the frontend, and Vercel for deployment, supports rapid iteration. He runs everything locally first, then pushes to staging and production environments as needed.</p><p></p><h2><strong>What Makes This Work</strong></h2><p>Li&#8217;s success comes from treating AI as a team member rather than a magic wand. He&#8217;s developed several key practices:</p><p><strong>Explicit Instructions</strong>: &#8220;Sometimes the AI&#8217;s quite finicky. Being explicit definitely helps.&#8221; Li includes detailed system prompts and repeats critical requirements even when they&#8217;re already in his stored prompts.</p><p><strong>Reusable Prompt Templates</strong>: Li maintains a library of prompt files for different tasks: PRD generation, task breakdown, implementation guidelines. &#8220;It&#8217;s just a really scalable way to reuse those prompts again and again for every feature that I build.&#8221;</p><p><strong>One Task at a Time</strong>: Rather than asking AI to build entire features, Li breaks everything into discrete, reviewable steps. This makes debugging much easier and prevents cascade failures.</p><p><strong>Context Management</strong>: Every conversation includes the relevant PRD, task lists, and system prompts. Li ensures the AI always has the full context needed to make good decisions.</p><p></p><h2><strong>What He&#8217;d Do Differently</strong></h2><p>Li&#8217;s process has evolved through trial and error. He&#8217;s learned that larger features benefit from this systematic approach, while smaller features can be built more casually. He&#8217;s also discovered that different AI models excel at different tasks&#8212;he&#8217;s recently started using Gemini alongside Claude for certain coding tasks.</p><p>The most important lesson: investing time upfront in planning and task breakdown prevents much larger debugging efforts later. &#8220;Without these detailed steps, the agent will go off in a certain direction, do something, and maybe the output isn&#8217;t what you&#8217;re expecting.&#8221;</p><p>Li&#8217;s journey from UX designer to technical founder took just 2.5 years, starting with no-code tools like Bubble before transitioning to actual programming. His advice for other product people: Find a project you really want to build and take it one step at a time.</p><p>He built productivity tools for his own workflow first, learning database structure and API interactions through Bubble before moving to more complex development. The key was learning incrementally while building real projects rather than following abstract tutorials.</p><p></p><h2><strong>The Results</strong></h2><p>Li has been shipping features into production for the past 18 months using this process. The systematic approach lets him move from idea to working feature rapidly while maintaining code quality. Most importantly, the process scales&#8212;each new feature benefits from the accumulated prompt templates and workflows.</p><p>For product managers interested in trying Sondar.ai for their own user research, it&#8217;s live at <a href="https://www.sondar.ai/">sondar.ai</a>. And for those inspired to build their own AI-assisted development process, Li&#8217;s approach shows that success comes not from AI magic, but from treating these tools as powerful team members that need clear instructions and systematic workflows.</p>]]></content:encoded></item><item><title><![CDATA[Three ways to build your component library]]></title><description><![CDATA[Generate realistic AI-prototypes that match your brand]]></description><link>https://blog.techforproduct.com/p/three-ways-to-build-your-component</link><guid isPermaLink="false">https://blog.techforproduct.com/p/three-ways-to-build-your-component</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Thu, 18 Sep 2025 12:03:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8aac3029-b9fc-43e2-bd73-9fe99b3c1820_600x600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. Subscribe to paid to get access to the AI Product Circle community on Slack, my full Tech Foundations for PMs course (84 lessons), a prompt library for common PM task, and discounts for live cohort-based courses.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Building prototypes that actually look like your product is one of the biggest challenges PMs face when using AI prototyping tools. In this article, we'll explore three approaches to building a component library that lets you rapidly prototype while maintaining your product's look and feel.</p><p>Most AI prototyping tools excel at creating functional interfaces but struggle to match existing design systems. This disconnect means PMs often spend more time tweaking styles than testing ideas. Instead of starting each prototype from scratch, leverage a reusable component library that captures your product's visual language once, then use it repeatedly for all your prototypes.</p><p>Let&#8217;s dive into the three methods you can use today to build your component library.</p><h2><strong>Method 1: Screenshots</strong></h2><p>The simplest approach uses screenshots to train AI tools on your existing UI patterns. While not perfect, it's a quick way to get started without any technical setup.</p><h3><strong>How it works:</strong></h3><ol><li><p>Take screenshots of key views in your product</p></li><li><p>Upload them to an AI prototyping tool (like Bolt, V0, or similar)</p></li><li><p>Instead of asking for a complete page recreation, request a component library: "Build a design system that implements the components from this view"</p></li><li><p>The tool will generate individual components (buttons, cards, headers, etc.)</p></li><li><p>Continue prompting to build out additional components</p></li><li><p>Save this as your master project and duplicate it for actual prototyping</p></li></ol><p>Here&#8217;s an example result from Google Calendar &#8211; not exactly on brand, but better than nothing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F5_u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F5_u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 424w, https://substackcdn.com/image/fetch/$s_!F5_u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 848w, https://substackcdn.com/image/fetch/$s_!F5_u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 1272w, https://substackcdn.com/image/fetch/$s_!F5_u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F5_u!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif" width="1200" height="602.0338983050848" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:444,&quot;width&quot;:885,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:2221670,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/173106124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F5_u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 424w, https://substackcdn.com/image/fetch/$s_!F5_u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 848w, https://substackcdn.com/image/fetch/$s_!F5_u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 1272w, https://substackcdn.com/image/fetch/$s_!F5_u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25bd5af1-2e22-40d0-94d4-4c2e965c3933_885x444.gif 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>This works best for simple interfaces and will not match the details of your designs exactly, like fonts and spacing. It&#8217;s a quick way to get started but most teams eventually want better quality.</p><h2><strong>Method 2: Chrome Extension Extraction</strong></h2><p>Chrome extensions offer more precision by extracting actual HTML and CSS from live pages. This method produces higher-fidelity components but consumes more tokens due to larger input sizes. Some tools include <strong>React HTML Extension</strong> and the <strong>Magic Patterns Chrome Extension</strong>.</p><h3><strong>How it works:</strong></h3><ol><li><p>Install a component extraction extension</p></li><li><p>Navigate to your product</p></li><li><p>Click on UI elements to extract their code</p></li><li><p>Paste the extracted HTML into your AI tool</p></li><li><p>The AI converts raw HTML into clean, reusable components</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Giaq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Giaq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 424w, https://substackcdn.com/image/fetch/$s_!Giaq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 848w, https://substackcdn.com/image/fetch/$s_!Giaq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 1272w, https://substackcdn.com/image/fetch/$s_!Giaq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Giaq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2191433,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/173106124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Giaq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 424w, https://substackcdn.com/image/fetch/$s_!Giaq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 848w, https://substackcdn.com/image/fetch/$s_!Giaq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 1272w, https://substackcdn.com/image/fetch/$s_!Giaq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb118bd2d-4416-4963-93d5-f568f401a17a_885x488.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Pasting in extracted code eats up tokens much faster than screenshots or plain text, so be prepared to spend your monthly allotment just on setting up your component library. Remember that duplicating or forking the library copies all your components automatically, so this is a one time setup expense.</p><p>You&#8217;ll have better luck on websites that use common styling libraries like tailwindcss. If you have custom CSS classes with external dependencies, don&#8217;t expect this method to work that well.</p><h2><strong>Method 3: Using Production Components</strong></h2><p>The most sophisticated approach uses your actual production components. This requires engineering support but produces the most accurate prototypes. You&#8217;re likely a good fit if your team is using Storybook and is comfortable with Github.</p><h3><strong>How it works:</strong></h3><ol><li><p><strong>Create a components-only repository</strong></p><ul><li><p>Work with engineering to isolate frontend components</p></li><li><p>Remove all backend dependencies</p></li><li><p>Include only UI components and their styles</p></li></ul></li></ol><ol start="2"><li><p><strong>Import to your prototyping tool</strong></p><ul><li><p>Connect your GitHub repo to tools like Bolt</p></li><li><p>Lock all files to prevent accidental modifications</p></li><li><p>Create a duplicate (this breaks the GitHub sync)</p></li></ul></li></ol><ol start="3"><li><p><strong>Build with real components in your duplicate</strong></p><ul><li><p>Use your actual component library for prototyping</p></li><li><p>Maintain perfect visual consistency</p></li><li><p>Share prototypes that look production-ready</p></li></ul></li></ol><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PBta!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PBta!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 424w, https://substackcdn.com/image/fetch/$s_!PBta!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 848w, https://substackcdn.com/image/fetch/$s_!PBta!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 1272w, https://substackcdn.com/image/fetch/$s_!PBta!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PBta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2088547,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/173106124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PBta!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 424w, https://substackcdn.com/image/fetch/$s_!PBta!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 848w, https://substackcdn.com/image/fetch/$s_!PBta!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 1272w, https://substackcdn.com/image/fetch/$s_!PBta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3ed21b8-a93c-4bfc-a193-4367bc412edc_885x488.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If your component library is fairly large (50+ files), cloud-based tools may struggle. You may want to use local development tools like Cursor or Claude Code instead. These tools are harder to set up but excel at making changes to larger projects.</p><h3><strong>The components.md pattern</strong></h3><p>One unexpected problem is that AI prototyping tools don&#8217;t always choose to use your components even if you have them available in the same project. Or, they don&#8217;t know how to use your components and frequently cause errors.</p><p>I like to solve this with a components.md file. It&#8217;s just a text document that describes what each component is, what it&#8217;s props are, and how it should be used. This can be generated by AI. When prompting, tell your preferred AI tool to read the components.md file for guidance on interacting with your code. This allows the AI to understand each component without having to read every file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mJJ3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mJJ3!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 424w, https://substackcdn.com/image/fetch/$s_!mJJ3!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 848w, https://substackcdn.com/image/fetch/$s_!mJJ3!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 1272w, https://substackcdn.com/image/fetch/$s_!mJJ3!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mJJ3!,w_2400,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif" width="1200" height="626.6666666666666" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:423,&quot;width&quot;:810,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:8573036,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/173106124?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mJJ3!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 424w, https://substackcdn.com/image/fetch/$s_!mJJ3!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 848w, https://substackcdn.com/image/fetch/$s_!mJJ3!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 1272w, https://substackcdn.com/image/fetch/$s_!mJJ3!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83b493f5-0da9-467c-9795-3a2dd794dfdc_810x423.gif 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><strong>Choosing the Right Approach</strong></h2><p>Picking the right approach to components can feel daunting, but you can always upgrade later.</p><h3>Start with screenshots if:</h3><ul><li><p>You're just beginning with AI prototyping</p></li><li><p>Your design system is relatively simple</p></li><li><p>You need quick results without engineering support</p></li></ul><h3>Use Chrome extensions when:</h3><ul><li><p>You need higher fidelity than screenshots provide</p></li><li><p>You're building a one-time component library</p></li><li><p>Token costs aren't a primary concern</p></li></ul><h3>Graduate to production components when:</h3><ul><li><p>Your team regularly uses AI for prototyping</p></li><li><p>You have engineering resources to help</p></li><li><p>Perfect visual consistency is critical</p></li></ul><h2><strong>Putting It All Together</strong></h2><p>Building a component library for AI prototyping is an investment that pays dividends. While the initial setup takes time - anywhere from 20 minutes for screenshots to a few hours for production components - you'll save countless hours on future prototypes.</p><p>The key is choosing the right approach for your team's maturity level. Most teams naturally progress from screenshots to Chrome extensions to production components as they become more sophisticated with AI prototyping.</p><p>Remember: the goal isn't perfection on the first try. Start simple, iterate based on what you learn, and gradually build a library that lets you prototype at the speed of thought while maintaining your product's visual identity. That's how you turn AI prototyping from a neat demo into a core part of your product development process.</p>]]></content:encoded></item><item><title><![CDATA[How a PM at Zillow Turns Voice into Stakeholder Updates ]]></title><description><![CDATA[Building personal apps as a non-technical PM]]></description><link>https://blog.techforproduct.com/p/how-a-pm-at-zillow-turns-voice-into</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-a-pm-at-zillow-turns-voice-into</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 10 Sep 2025 13:02:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1f243fe8-f2c6-4319-9184-b0930cbbb095_600x600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. Subscribe to paid to get access to the AI Product Circle community on Slack, my full Tech Foundations for PMs course (84 lessons), a prompt library for common PM task, and discounts for live cohort-based courses.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><div id="youtube2-UDkExnM1H-Q" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;UDkExnM1H-Q&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/UDkExnM1H-Q?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>Pat Bergstresser, a product manager at Zillow, approached me with an interesting challenge. Despite having no coding background beyond SQL queries, he'd taken my AI Prototyping course and was now building his second AI-powered product using Replit.</p><p>His creation, Vibe Updater, solves a problem every PM knows well: bi-weekly update emails that used to take him 2-3 hours now take just 15 minutes. Let&#8217;s dive in to what he built, how it went, and he&#8217;d do differently.</p><h2>The Plan</h2><p>Pat's approach was straightforward. He wanted to build a voice-to-text tool that also PMs to narrate freeform content and transform them into executive-ready updates. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bedV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bedV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png 424w, https://substackcdn.com/image/fetch/$s_!bedV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png 848w, https://substackcdn.com/image/fetch/$s_!bedV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png 1272w, https://substackcdn.com/image/fetch/$s_!bedV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bedV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png" width="1456" height="947" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:947,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:215432,&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://blog.techforproduct.com/i/173190247?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.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_!bedV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png 424w, https://substackcdn.com/image/fetch/$s_!bedV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png 848w, https://substackcdn.com/image/fetch/$s_!bedV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.png 1272w, https://substackcdn.com/image/fetch/$s_!bedV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa896b53e-bcf8-488e-b54b-0302d4aff829_2542x1654.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><strong>Target persona</strong>: Product managers who regularly send stakeholder updates</p><p><strong>Core problem</strong>: Writing structured updates takes hours of formatting and editing</p><p><strong>Value Prop</strong>: A tool that records voice input and automatically formats it into a professional, structured update following a proven template</p><p><strong>Differentiation</strong>: Pre-built update format that execs love, so you can just narrate and not worry about editing.</p><p><strong>Distribution</strong>: Currently in early access with just 4-5 PMs testing </p><p></p><h2>The Build</h2><p>Despite not being a professional engineer, Pat built the entire product solo using Replit:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5gtw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5gtw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png 424w, https://substackcdn.com/image/fetch/$s_!5gtw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png 848w, https://substackcdn.com/image/fetch/$s_!5gtw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png 1272w, https://substackcdn.com/image/fetch/$s_!5gtw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5gtw!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png" width="1200" height="625.5494505494505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:759,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:324576,&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://blog.techforproduct.com/i/173190247?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5gtw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png 424w, https://substackcdn.com/image/fetch/$s_!5gtw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png 848w, https://substackcdn.com/image/fetch/$s_!5gtw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.png 1272w, https://substackcdn.com/image/fetch/$s_!5gtw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8373c32d-2b5a-4b85-8c29-ab1a6cbf50fd_1835x956.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>The technical architecture is simple but effective:</p><ul><li><p>Voice recording using OpenAI's Whisper API for transcription</p></li><li><p>Database integrated directly in Replit (avoiding the complexity of external databases like Supabase)</p></li><li><p>System prompts that format content into Pat's proven update structure</p></li><li><p>Export options for rich text files, email, or direct copy/paste</p><p></p></li></ul><p>Each section follows a specific structure: <strong>bold headlines</strong> that capture the main point in 30 seconds or less, followed by details for those who want to read more.</p><p></p><h2>How It Went</h2><p>The product is still in early stages, but the feedback from Pat&#8217;s leadership has been remarkably positive. The development process revealed some interesting challenges:</p><p><strong>Planning is everything</strong>: Pat spends most of his time planning features before implementation. He uses ChatGPT for brainstorming and structuring, then creates detailed prompts for Replit with specific increments.</p><p><strong>Incremental development</strong>: Rather than asking Replit to build everything at once, Pat breaks features into small increments, testing each one before moving forward. For example, he shipped a feedback feature by:</p><ul><li><p>First creating the database schema and API endpoints</p></li><li><p>Then adding the UI with a feedback button</p></li><li><p>Testing thoroughly before adding voice recording capability</p></li></ul><p><strong>Debugging requires patience</strong>: When bugs appear, Pat screenshots them and asks Replit to explain before fixing. He's learned to tell Replit to "look at relevant files" to ensure it has proper context before making changes.</p><p></p><h2>What Pat Would Do Differently</h2><p>Pat's first attempt was a personalized greeting card creator called Card AI. The project became too complex - requiring graphical UI for card designs, integration with printing services, and handling physical mail delivery. He pivoted to Vibe Updater, which better matched his technical capabilities and Replit's strengths.</p><p>His key learnings:</p><ol><li><p><strong>Voice input changes everything</strong> - "When I type, sometimes I limit what I'm gonna say just because I'm trying to get it out quickly. But with voice, I don't overthink it."</p></li><li><p><strong>Replit needs explicit instructions</strong> - "You have to be very clear and specific. It really helps you empathize with engineers when you just give them open-ended requests."</p></li><li><p><strong>Manual testing is critical</strong> - "You have to test test test and not even just test what you just did but make sure what you just did didn't break something else."</p></li></ol><p>Pat's still considering whether to migrate to Cursor for more robust features, but for now, Replit's integrated database and simpler workflow are meeting his needs. He's already working on the next feature: a "quick update" format for when managers need immediate status reports.</p><p>The most striking aspect of Pat's journey is how he's maintained his non-technical identity while building real products. He doesn't fully understand hooks or all the technical details, but he's learned enough about client-server architecture and database concepts to debug effectively and guide the AI tools toward working solutions.</p><p>For PMs interested in trying Vibe Updater, it's live at <a href="https://vibeupdater.com/">vibeupdater.com</a>. And if you're a PM thinking about building with AI but worried about your technical skills, Pat's story shows what's possible with the right tools and mindset: "It's not like I'm looking at the code files and I can understand them all... but I'm able to actually make some progress."</p>]]></content:encoded></item><item><title><![CDATA[How this PM built an $1800 ARR SaaS in 3 weeks]]></title><description><![CDATA[Learn how to build SaaS products using AI coding tools like Bolt and Cursor]]></description><link>https://blog.techforproduct.com/p/how-this-pm-built-an-1800-arr-saas</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-this-pm-built-an-1800-arr-saas</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Tue, 26 Aug 2025 17:00:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cb9f4aff-7d5d-486e-92f7-fb9183cb6a7b_600x600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>I&#8217;m excited to share Built with AI, a new podcast that features stories of PMs, designers, and engineers who are shipping real products with AI (and making real revenue).<br><br>This first episode features Darren, </em>a <em>PM, builder, and founder of BuzzerBee. As a non-technical PM, he built BuzzerBee's initial version in less than 3 weeks using AI coding tools.</em> </p><p><em>I hope you enjoy!</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><div id="youtube2-KMXyawSxAZ4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;KMXyawSxAZ4&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/KMXyawSxAZ4?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>Darren, a product manager from Vancouver, had a simple but persistent problem: missing buzzer calls at his apartment building. Whether it was friends waiting outside or packages being returned, the missed calls were a constant annoyance. Instead of just living with it, he decided to build a solution.</p><h2>Enter BuzzerBee: Automated Building Access</h2><p><strong>What it does:</strong> BuzzerBee automatically answers buzzer calls and grants building access when you're expecting deliveries or guests. Users can "unlock" their buzzer through the app, and when someone buzzes their unit, the system automatically:</p><ul><li><p>Answers the call</p></li><li><p>Presses the unlock digit (typically 6 or 9)</p></li><li><p>Grants building and elevator access</p></li><li><p>Notifies you that someone has entered</p></li></ul><h2>The Build Journey: From Zero to Revenue in 3 Weeks</h2><p>Despite being a "non-technical PM" with only basic programming knowledge from his business degree, Darren shipped a working product using AI tools. His iterative approach:</p><ol><li><p><strong>Phase 1:</strong> Started with just Twilio to test if automatic call answering was possible</p></li><li><p><strong>Phase 2:</strong> Built a prototype in Bolt for personal use (got messy, had to restart)</p></li><li><p><strong>Phase 3:</strong> Rebuilt in Bolt, then moved to Cursor for the full production app</p></li></ol><p><strong>Timeline:</strong> 3 weeks from proof of concept to working product</p><h2>Current Traction</h2><ul><li><p><strong>Users:</strong> 30 active customers </p></li><li><p><strong>Revenue:</strong> $150/month</p></li><li><p><strong>Costs:</strong> $50/month to maintain</p></li><li><p><strong>Status:</strong> Profitable from the start</p></li></ul><h2>Key Takeaways for Builders</h2><p><strong>Start with your own problems:</strong> "Figure out something that you can get some users for, use it for yourself, and then start to iterate from there."</p><p><strong>Architecture doesn't matter without users:</strong> "It doesn't matter if you've got a bulletproof database or the best architecture in the world. If no one uses it, then it doesn't need to scale."</p><p><strong>Don't rush into code:</strong> Despite the temptation to start coding immediately with AI tools, Darren recommends against jumping straight into development. The iterative, experimental approach proved more valuable.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/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">Tech For Product is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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[Every side-hustle I've shipped (and how it went)]]></title><description><![CDATA[Users, revenue, and more &#8211; learn from my mistakes to ship your own side hustle]]></description><link>https://blog.techforproduct.com/p/every-side-hustle-ive-shipped-and</link><guid isPermaLink="false">https://blog.techforproduct.com/p/every-side-hustle-ive-shipped-and</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 02 Jul 2025 19:31:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/67b2e0d2-b36b-4d76-b514-731cdd40a3b0_1821x1028.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><br><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. Subscribe to paid to get access to the AI Product Circle community on Slack, my full Tech Foundations for PMs course (84 lessons), a prompt library for common PM task, and discounts for live cohort-based courses.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>I've worked on a lot of side hustles. Since starting university, I don't think there's been a single year where I haven't shipped at least one project. Most of them failed, but I think it's interesting to look back and share some lessons I learned along the way.</p><p>In this post, I'll break down the most notable projects and how they went. If you're at all interested in building your own products while working full time, this post is for you.</p><h2>Walk-In Express - 2017</h2><p><strong>Total revenue: $0 | Total users: 0</strong></p><p>Walk-In Express was my very first real project, built in second year university. It was a web app that allowed patients to hold appointments at walk-in clinics remotely, so they didn't have to show up and sit in the waiting room. This was my first large web application, and the first time I had to really think about incentives for the different types of users involved.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MVQU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MVQU!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 424w, https://substackcdn.com/image/fetch/$s_!MVQU!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 848w, https://substackcdn.com/image/fetch/$s_!MVQU!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 1272w, https://substackcdn.com/image/fetch/$s_!MVQU!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MVQU!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif" width="810" height="456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a29491f5-f433-4a20-9891-60af78e07704_810x456.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:456,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MVQU!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 424w, https://substackcdn.com/image/fetch/$s_!MVQU!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 848w, https://substackcdn.com/image/fetch/$s_!MVQU!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 1272w, https://substackcdn.com/image/fetch/$s_!MVQU!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa29491f5-f433-4a20-9891-60af78e07704_810x456.gif 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>On one side, we had clinics. In Canada, most clinics have more than enough volume that they don't have to worry about getting more patients. My hypothesis was that they would be interested in smoothing out that volume in the day, so that they had a more even distribution of patients. I honestly never really confirmed this.</p><p>For patients, the benefits seemed obvious &#8211; you don't have to sit and wait. There's a cultural bias towards free services in healthcare here, so it was unlikely I'd be able to charge patients a meaningful amount of money for this service. As you can see, this idea had some holes, but I didn't worry about that &#8211; I just got to work.</p><p>I applied to my university's accelerator program, got in, and worked on this idea full time for 3 months. I got two clinics onboard, built the entire web app myself, and won some competitions. Ultimately I never rolled it out due to concerns with storing PHI. I likely could have overcome this, but at 19 I really had no clue what I was doing.</p><p>Walk-In Express didn't lead to much. It did however get me my first job working in the healthcare industry as a Project Assistant, as I built a relationship with a few executives in the space. </p><p>Working in healthcare technology became my edge throughout in my career, allowing me to get a Senior Business Analyst job at 22 prior to finishing my degree and kicked off my product career. If you doubt the benefits of side projects, this in itself is a good enough case for trying.</p><h2>Track Rite - 2018</h2><p><strong>Total revenue: $0 | Total users: 0</strong></p><p>The next project I built was a task management app (like everyone else). Mine was a bit different - it was targeted at project managers who are used to managing nested tasks, or work backlogs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!49V4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!49V4!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 424w, https://substackcdn.com/image/fetch/$s_!49V4!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 848w, https://substackcdn.com/image/fetch/$s_!49V4!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 1272w, https://substackcdn.com/image/fetch/$s_!49V4!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!49V4!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif" width="810" height="405" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:405,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!49V4!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 424w, https://substackcdn.com/image/fetch/$s_!49V4!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 848w, https://substackcdn.com/image/fetch/$s_!49V4!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 1272w, https://substackcdn.com/image/fetch/$s_!49V4!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd110e6-f1f3-419e-876d-d416c4935faf_810x405.gif 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>My application allowed users to get reporting at each level or tier of this hierarchy.</p><p>Once again, I ran into the same problems. I had a rough idea of a problem I was solving, but no real evidence that anyone cared and no clarity on the value of solving it. I was more interested in building than actually solving customer problems.</p><p>This was probably the largest project I had built to date, so I did improve my technical skills a bit. I also hired a senior engineer part time to review my code and help me improve my technical skills.</p><h2>Airbnb Analytics - 2020, 2021</h2><p><strong>Total revenue: $10,000 (split between me and my cofounder) | Total users: 50</strong></p><p>Over the years, I tried multiple times to build an Airbnb analytics product with a good friend. Our first two attempts were in 2020 and 2021. This application was an Airbnb data product that helped hosts select the neighbourhoods they should list in.</p><p>The first few iterations of this product really didn't do much. We had a clear problem, but a poorly implement solution and no distribution. The first version was more of an internal tool to prepare reports, and we had less than 10 customers who ended up using them.</p><p>The second iteration was a tool that integrated with a third party data source and reformatted their data into a more user friendly report. This product was self-serve and had about 50 users. We made a total of $10k before the third party made changes that disallowed our integration. At this point we had to shut down the project.</p><h2>Udemy Courses - 2021</h2><p><strong>Total revenue: $5,000 | Total users: 4,000</strong></p><p>After the second failure of the Airbnb analytics project, I was extremely frustrated that I kept building products that had no users. I decided to not build another software product again until I could solve distribution.</p><p>For a while, I was unsure what to build next. I decided to go after something where distribution was solved for me, like a marketplace. This led to Udemy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rlLL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rlLL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png 424w, https://substackcdn.com/image/fetch/$s_!rlLL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png 848w, https://substackcdn.com/image/fetch/$s_!rlLL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png 1272w, https://substackcdn.com/image/fetch/$s_!rlLL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rlLL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png" width="879" height="911" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:911,&quot;width&quot;:879,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rlLL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png 424w, https://substackcdn.com/image/fetch/$s_!rlLL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png 848w, https://substackcdn.com/image/fetch/$s_!rlLL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.png 1272w, https://substackcdn.com/image/fetch/$s_!rlLL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69260383-e0c0-4a5d-8062-59cc670070dc_879x911.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><figcaption class="image-caption">My Udemy courses</figcaption></figure></div><p>In the next few months, I created four courses, the most successful one being Power Automate Desktop for Beginners. I had over 4,000 students take my courses on Udemy and made close to $5,000.</p><p>The main benefit of Udemy was it forced me to think differently about products. Getting my courses into the hands of customers allowed me to learn more about the perceived value of a solution and the value of solving urgent and painful problems. </p><p>It was clear to me that Udemy customers didn't value my solutions very highly and that I wouldn't be able to scale this business very far. I needed to find a group of customers who had more urgent and painful problems to solve.</p><h2>Pluralsight - 2022</h2><p><strong>Total revenue: $30,000 | Total users: 5,600</strong></p><p>Pluralsight was a natural next step for me from Udemy. Pluralsight is a B2B marketplace for online courses. They contract expert authors to create content and provide the entire content library to more than 70% of the Fortune 500.</p><p>Working with Pluralsight was a multi-step process. First, I had to apply as an author. I went through a few rounds of interviews and had to submit a sample video using their branding and guidelines. Ultimately I was approved and able to start taking on work.</p><p>Pluralsight is pretty particular about their process &#8211; they have their own QA, slide templates, and even specific allowed animations. Building a course with them was very time intensive, with lots of back and forth. They also provide a list of available topics, so you may not always have the option of teaching topics you're passionate about.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WbMP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WbMP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png 424w, https://substackcdn.com/image/fetch/$s_!WbMP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png 848w, https://substackcdn.com/image/fetch/$s_!WbMP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png 1272w, https://substackcdn.com/image/fetch/$s_!WbMP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WbMP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png" width="1135" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1135,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WbMP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png 424w, https://substackcdn.com/image/fetch/$s_!WbMP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png 848w, https://substackcdn.com/image/fetch/$s_!WbMP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.png 1272w, https://substackcdn.com/image/fetch/$s_!WbMP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff866b598-1a1f-4188-9466-788c9abb80b8_1135x833.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><figcaption class="image-caption">My Pluralsight Courses</figcaption></figure></div><p>From Pluralsight, I learned how to create high quality content (and that their style was too formal for me). There was a notable increase in quality from Udemy to Pluralsight, which I brought with me to Maven.</p><p>I created a total of four courses with Pluralsight and earned roughly $30,000. This was the first time I made actual money in 5 years of side hustling.</p><h2>Airbnb Analytics - 2023</h2><p><strong>Total revenue: $100,000 | Total users: 200</strong></p><p>Once again I was drawn back into working on Airbnb analytics. My friend had built a following in the space and found a new data source that would allow us to control the end-to-end process of report generation. This time, we were able to build a fully functional application that had no external dependencies. </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_!oYX5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oYX5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 424w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 848w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 1272w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oYX5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oYX5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 424w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 848w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 1272w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.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><figcaption class="image-caption">Airbnb analytics attempt #3</figcaption></figure></div><p>We quickly scaled this to over $100k in revenue, but once again hit a wall with access to data. Our prior data supplier had a competitive customer and no longer wanted to work with us. Other suppliers cost more than $20k per month, which forced us once more to close down this offering.</p><p>You can read the full story here: https://blog.techforproduct.com/p/how-i-grew-my-saas-to-100k-in-6-months </p><h2>Maven - 2023</h2><p><strong>Total revenue: More than my day job | Total users: 1500 paid, 25K+ free</strong></p><p>Finally, that leads us to where I am today. I launched a Maven course (Technical Foundations for Product Managers) in mid 2023 to very little fanfare. In fact, my first cohort only had 11 people and I made less than $300.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!B0YP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B0YP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 424w, https://substackcdn.com/image/fetch/$s_!B0YP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 848w, https://substackcdn.com/image/fetch/$s_!B0YP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 1272w, https://substackcdn.com/image/fetch/$s_!B0YP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!B0YP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png" width="350" height="103" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b441d11-a12b-4028-b927-ba430415a50a_350x103.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:103,&quot;width&quot;:350,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8844,&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://blog.techforproduct.com/i/167366361?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.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_!B0YP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 424w, https://substackcdn.com/image/fetch/$s_!B0YP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 848w, https://substackcdn.com/image/fetch/$s_!B0YP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 1272w, https://substackcdn.com/image/fetch/$s_!B0YP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b441d11-a12b-4028-b927-ba430415a50a_350x103.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Maven Cohort #1 Revenue!</figcaption></figure></div><p>I consistently improved the course, worked on my own branding, and kept teaching. The cohorts grew in size, more people took notice, and eventually Lenny reached out to me to write an article for his newsletter. From there, I've continued the momentum by building more products, launching a community, writing on Substack, and posting on LinkedIn.</p><p>Maven quickly grew to earn more than my day job, but I kept working for more than a year to ensure my growth on Maven was sustainable.</p><p>This time, I was solving a clear problem for an audience that valued the solution and had a clear distribution channel. These three components took me more than 7 years to get right, but now I never launch a product without a very clear idea of how each of these elements will work.</p><h2>What I learned</h2><p>Looking back at these projects, there are a few patterns that separate the successes from the failures:</p><p><strong>Problem, audience, and distribution all matter.</strong> Every successful project had a clear problem I was solving, an audience that valued the solution highly, and a way to reach that audience. The failures were missing one or more of these components.</p><p><strong>Build for customers, not for yourself.</strong> My early projects were driven by what I wanted to build, not what customers actually needed. This is a common trap for technical people.</p><p><strong>Own your dependencies.</strong> Both Airbnb analytics failures came down to relying on external data sources I didn't control. If your business depends on something you don't own, you don't really have a business.</p><p><strong>B2B customers pay more.</strong> The jump from Udemy to Pluralsight to Maven shows how much more valuable B2B customers are compared to consumers.</p><h2>Next Project - 2025</h2><p>I have a few projects in the works that I plan to launch in the later half of this year. </p><p>My plan is for the next set of projects to 2-3x the growth of my business &#8211; all by delivering more value, solving a bigger problem, and nailing the distribution. These bets may not work, but I&#8217;ve learned how to identify and mitigate risks earlier through my many attempts.</p><p>If you learn anything from this post, I hope you learn that progress is non-linear and growth takes time. Instead of worrying about how you'll make millions online, just ship something. You'll learn from your mistakes, improve, and try again. Hopefully it doesn't take you seven years, but even that's better than not making any progress at all.</p><p>Happy side-hustling!</p>]]></content:encoded></item><item><title><![CDATA[Is MCP the new App Store?]]></title><description><![CDATA[How ChatGPT and Claude could be the next big distribution channel]]></description><link>https://blog.techforproduct.com/p/is-mcp-the-new-app-store</link><guid isPermaLink="false">https://blog.techforproduct.com/p/is-mcp-the-new-app-store</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 25 Jun 2025 19:35:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5a27e147-10d3-4e31-b436-a5b304064821_1821x1049.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. Subscribe to paid to get access to the AI Product Circle community on Slack, my full Tech Foundations for PMs course (84 lessons), and a prompt library for common PM tasks.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>If you&#8217;re not paying close attention, you may have missed a critical update to ChatGPT and Claude that enables a brand new distribution channel: Integrations.</p><p>OpenAI <a href="https://help.openai.com/en/articles/6825453-chatgpt-release-notes#h_5e1d6b6c-8f5c-4f3e-9e8e-8a2f3e9f7b2c">announced</a> support for remote MCP integrations on June 4th. Not to be outdone, Claude <a href="https://www.anthropic.com/news/claude-code-remote-mcp">announced</a> the same on June 18th.</p><p>In this post, I&#8217;ll describe what MCP is, it&#8217;s current state of support, and how you can start to think about incorporating MCP support into your product. I&#8217;ll also share a vision of the future, including parallels to the early days of the app store and the potential for tool sprawl within ChatGPT and Claude.</p><p>Let&#8217;s dive in!<br></p><h3>What is MCP?</h3><p>MCP (Model Context Protocol) is a standardized protocol for communication between agents and external servers. The role of MCP is to define the common ideas and requests that an agent can use. These include:</p><ul><li><p><em>Tools:</em> actions the agent can take</p></li><li><p><em>Prompts: templated messages</em></p></li><li><p><em>Resources: files and other static data</em></p></li></ul><p>Today, tools are the most commonly implemented feature of MCP. Think of asking ChatGPT to pull your financial projections from Google Sheets and forecast three new scenarios. The ability for agents like ChatGPT and Claude to interact with your data where it already lives opens up a whole new set of possibilities.</p><p>Here&#8217;s how it works:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DRnq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DRnq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png 424w, https://substackcdn.com/image/fetch/$s_!DRnq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png 848w, https://substackcdn.com/image/fetch/$s_!DRnq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png 1272w, https://substackcdn.com/image/fetch/$s_!DRnq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DRnq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DRnq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png 424w, https://substackcdn.com/image/fetch/$s_!DRnq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png 848w, https://substackcdn.com/image/fetch/$s_!DRnq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.png 1272w, https://substackcdn.com/image/fetch/$s_!DRnq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee97140-4221-4eaa-8edd-0c0d01862d6d_1600x411.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><ol><li><p>A user makes a query inside of ChatGPT or another agent. </p></li><li><p>The agent checks the MCP servers it's connected to and determines if any tools would be relevant in resolving the request.</p></li><li><p>The agent constructs the request to the MCP server by calling the tool and adding any necessary parameters. The MCP server can either resolve the request itself, or proxy the request back to a regular web server to interact with your existing API.</p></li><li><p>The chain gets resolved, with a response back from the app server to the MCP server, MCP to the agent, and finally the agent uses the returned information to write a response to the user.</p></li></ol><p>Here&#8217;s a quick example of running this through in Claude with an MCP connection to Gmail.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lwsb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lwsb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 424w, https://substackcdn.com/image/fetch/$s_!Lwsb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 848w, https://substackcdn.com/image/fetch/$s_!Lwsb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 1272w, https://substackcdn.com/image/fetch/$s_!Lwsb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lwsb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif" width="810" height="629" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:629,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1935852,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/166825096?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Lwsb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 424w, https://substackcdn.com/image/fetch/$s_!Lwsb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 848w, https://substackcdn.com/image/fetch/$s_!Lwsb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 1272w, https://substackcdn.com/image/fetch/$s_!Lwsb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb75b2a7-7529-4808-a09e-9e523e7d4b31_810x629.gif 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>In this example, I provide Claude a query. It uses this information to send a request to a Gmail MCP server with a tool call for searching messages. This likely hits an existing Gmail API, returns the content, and then Claude summarizes the information for me.</p><p>For most of the past year, MCP servers were run on local machines and products like ChatGPT did not support MCP connections. </p><p>In June, that changed with the addition of remote MCP servers. Remote MCP is simply an MCP server that&#8217;s hosted on the internet, rather than on your computer. The main difference is the setup; remote MCP allows regular users to paste a link and connect their favourite tools. It also allows you to setup authentication, ensuring user data stays secure.<br><br>MCP is quickly becoming much more popular. This image shows the growth of popular libraries developers use for building MCP servers, a proxy for the growth rate of MCP servers being built.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dcvz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dcvz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png 424w, https://substackcdn.com/image/fetch/$s_!dcvz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png 848w, https://substackcdn.com/image/fetch/$s_!dcvz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png 1272w, https://substackcdn.com/image/fetch/$s_!dcvz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dcvz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png" width="1456" height="1040" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:439674,&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://blog.techforproduct.com/i/166825096?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.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_!dcvz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png 424w, https://substackcdn.com/image/fetch/$s_!dcvz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png 848w, https://substackcdn.com/image/fetch/$s_!dcvz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.png 1272w, https://substackcdn.com/image/fetch/$s_!dcvz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0daebe33-692e-4b48-b263-37166fce8429_3664x2616.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 a comparison, I&#8217;ve included the growth of Express JS, one of the most popular frameworks for building regular web servers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oCJ1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oCJ1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png 424w, https://substackcdn.com/image/fetch/$s_!oCJ1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png 848w, https://substackcdn.com/image/fetch/$s_!oCJ1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png 1272w, https://substackcdn.com/image/fetch/$s_!oCJ1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oCJ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png" width="1456" height="1040" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:415988,&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://blog.techforproduct.com/i/166825096?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.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_!oCJ1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png 424w, https://substackcdn.com/image/fetch/$s_!oCJ1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png 848w, https://substackcdn.com/image/fetch/$s_!oCJ1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.png 1272w, https://substackcdn.com/image/fetch/$s_!oCJ1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c59da9b-b0ea-4acd-922b-e9cd1336499f_3664x2616.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>Current state of remote MCP support</h3><p>As exciting as remote MCP support seems, it's still early days. Today, Claude allows any Pro user to add an external URL as an MCP server. The server must support OAuth, even if it returns a public access token.<br><br>Here&#8217;s what the configuration looks 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_!qdW1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qdW1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 424w, https://substackcdn.com/image/fetch/$s_!qdW1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 848w, https://substackcdn.com/image/fetch/$s_!qdW1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 1272w, https://substackcdn.com/image/fetch/$s_!qdW1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qdW1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif" width="810" height="629" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:629,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:543773,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/166825096?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qdW1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 424w, https://substackcdn.com/image/fetch/$s_!qdW1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 848w, https://substackcdn.com/image/fetch/$s_!qdW1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 1272w, https://substackcdn.com/image/fetch/$s_!qdW1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cdbf030-effe-481a-abbc-c5dfb6aeba30_810x629.gif 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>ChatGPT makes MCP connections a little more challenging. First, the UI to access custom connectors is buried behind first party connections. Second, these connections only work in Deep Research mode, meaning most users would never see them used. Finally, this setting is currently only accessible to those on a Team plan.</p><p>This is unfortunate, as ChatGPT is the dominant consumer application and exposing your product through it would be a meaningful way to add new value and acquire new customers.</p><p>Here&#8217;s the process to add a connection from a user&#8217;s perspective:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BlmK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BlmK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 424w, https://substackcdn.com/image/fetch/$s_!BlmK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 848w, https://substackcdn.com/image/fetch/$s_!BlmK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 1272w, https://substackcdn.com/image/fetch/$s_!BlmK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BlmK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif" width="810" height="562" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:562,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1151933,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/166825096?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BlmK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 424w, https://substackcdn.com/image/fetch/$s_!BlmK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 848w, https://substackcdn.com/image/fetch/$s_!BlmK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 1272w, https://substackcdn.com/image/fetch/$s_!BlmK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97f7591-7eb1-4ede-9827-ac0484552850_810x562.gif 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>What MCP means for you</h3><p>Brian Balfour recently shared a <a href="https://blog.brianbalfour.com/p/the-next-great-distribution-shift">great post </a>on the next great distribution shift. He believes that these connections within AI agents represent the next wave of distribution, after which OpenAI and Anthropic will commoditize the most popular use cases. Here&#8217;s what he has to say:</p><blockquote><p>&#8220;<strong>The stampede is coming.</strong> If I&#8217;m right, in six months, it&#8217;s likely every SaaS product and consumer application will be rushing to complete a ChatGPT integration. In twelve months, users will expect it. In eighteen months, the platform taxes will arrive. In twenty-four months, the graveyard will be full.&#8221;</p></blockquote><p>I share a similar perspective to Brian, but I think there will be a greater variety of outcomes based on the types of applications built. I think we&#8217;ll end up with roughly four types of MCP applications:</p><ol><li><p>Small utilities &amp; apps</p></li><li><p>Mega corp integrations</p></li><li><p>Data-driven apps</p></li><li><p>New and unknown</p></li></ol><p></p><h4><strong>Small utilities &amp; apps</strong></h4><p>Think early iPhone apps, like Shazam. These will likely be the first to get cannibalized by the platforms themselves. Why maintain a separate tip calculator app when ChatGPT can do math? The barrier to entry is low, but so is the defensibility.</p><h4><strong>Mega corp integrations</strong></h4><p>Companies like Salesforce, Microsoft, and Google will build comprehensive MCP integrations that become table stakes. These integrations will be strategic partnerships rather than acquisition targets, as the platforms need these relationships more than they need to own the functionality.</p><h4><strong>Data-driven apps</strong></h4><p>Applications that primarily provide access to proprietary data sets or specialized workflows. Financial data providers like Bloomberg, specialized databases like Crunchbase, or industry-specific tools will maintain value through their unique data and domain expertise.</p><h4><strong>New and unknown</strong></h4><p>The most interesting category will be entirely new types of applications that wouldn't make sense without AI agents. These might be workflow orchestrators, multi-app data synthesizers, or entirely new product categories we haven't imagined yet.</p><p></p><p>The winners in this space will likely be companies that can aggregate multiple data sources or provide comprehensive workflows rather than point solutions. Just as we saw consolidation in the mobile app ecosystem, we'll probably see similar patterns emerge with MCP integrations.</p><p>If you're considering building an MCP integration, here are some questions to guide your strategy:</p><p><strong>Is your product primarily about data access or workflow?</strong> Data-heavy products are more likely to maintain long-term value through MCP than simple utility functions.</p><p><strong>Can you create network effects?</strong> Integrations that become more valuable as more people use them (like collaboration tools) have better defensibility.</p><p><strong>How easily can your core functionality be replicated?</strong> If your main value prop can be built into the AI platform directly, consider focusing on more complex, differentiated features.</p><p><strong>What's your relationship with the platform?</strong> Large companies should pursue strategic partnerships, while smaller companies might focus on becoming indispensable before getting acquired or copied.</p><p>MCP represents a fundamental shift in how software is distributed and consumed. Just as the app store changed mobile development and the web transformed desktop software, MCP could reshape how we interact with digital tools entirely.</p>]]></content:encoded></item><item><title><![CDATA[Convert Figma components to code]]></title><description><![CDATA[Turn your design system into working components using Figma MCP]]></description><link>https://blog.techforproduct.com/p/convert-figma-components-to-code</link><guid isPermaLink="false">https://blog.techforproduct.com/p/convert-figma-components-to-code</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 18 Jun 2025 14:45:12 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/90763eca-f605-4913-8ee2-970a6adc6df6_1821x1027.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live course <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping for Product Managers.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p><em>Watch this step-by-step video to get your own Figma components converted to code with MCP!</em></p><div id="vimeo-1094384975" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1094384975&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:false}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1094384975?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true"></iframe></div></div><p></p><p>One of the biggest barriers to effective AI prototyping is the gap between your polished Figma designs and the generic components that AI tools generate by default. What if you could bridge that gap and use your actual design system components in tools like Bolt, Replit, or v0?</p><p>With Figma's new MCP (Model Context Protocol) server integration, you can convert your Figma components directly to React code and use them in any AI prototyping tool. In this guide, I'll walk you through the complete setup and show you how to maintain design consistency across your prototypes.</p><h2><strong>What is Figma's MCP server?</strong></h2><p>Figma's MCP server is a bridge that connects your Figma design files to AI coding tools like Cursor, allowing you to extract component code, variables, and images directly from your designs. Instead of describing what you want to an AI tool and hoping it gets your design system right, you can pull the exact specifications from Figma.</p><p>The MCP server exposes four key functions:</p><ul><li><p><strong>Get Code</strong>: Retrieves React code based on your Figma component</p></li><li><p><strong>Get Variable Definitions</strong>: Pulls design tokens and variables</p></li><li><p><strong>Get Code Connect Map</strong>: Enterprise feature for component mapping</p></li><li><p><strong>Get Image</strong>: Extracts images and assets</p></li></ul><h2><strong>Setting up the integration</strong></h2><p>The setup requires three components: Figma with MCP enabled, an AI coding tool (like Cursor), and proper variable usage in your design system.</p><h3><strong>Step 1: Enable MCP in Figma</strong></h3><p>In Figma, navigate to the dropdown menu in the top left, select <strong>Preferences</strong>, and toggle on <strong>Enable dev mode MCP server</strong>. You'll see a notification confirming the server is running on localhost with a specific port.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o7Cc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o7Cc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png 424w, https://substackcdn.com/image/fetch/$s_!o7Cc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png 848w, https://substackcdn.com/image/fetch/$s_!o7Cc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!o7Cc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o7Cc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png" width="976" height="1574" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1574,&quot;width&quot;:976,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!o7Cc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png 424w, https://substackcdn.com/image/fetch/$s_!o7Cc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png 848w, https://substackcdn.com/image/fetch/$s_!o7Cc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.png 1272w, https://substackcdn.com/image/fetch/$s_!o7Cc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45eea343-0dfb-4c30-8e44-56411238dadc_976x1574.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><strong>Step 2: Configure your AI tool</strong></h3><p>The setup varies by tool, but I'll focus on Cursor since it has excellent MCP support. In Cursor:</p><ol><li><p>Go to <strong>Cursor Settings</strong></p></li><li><p>Navigate to <strong>Tools and Integrations</strong> (formerly called MCP)</p></li><li><p>Add the Figma configuration:</p></li></ol><pre><code>{

  "mcpServers": {

    "Figma": {

       "url": "http://127.0.0.1:3845/sse"

    }

  }

}</code></pre><p>Once added, you'll see a green indicator showing Figma is connected and available as a tool.</p><p><br>You can check out the docs here for full details: <a href="https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server">https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server</a></p><p></p><h3><strong>Step 3: Use variables in your design system</strong></h3><p>This step is critical and often overlooked. Your Figma components must use variables for colors, typography, spacing, and other design tokens. The MCP server relies on these variables to generate accurate code.</p><p>Without proper variable usage, you'll get generic code that doesn't match your design system specifications. Here&#8217;s the exact guidance shared by the Figma team:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jh9e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jh9e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png 424w, https://substackcdn.com/image/fetch/$s_!Jh9e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png 848w, https://substackcdn.com/image/fetch/$s_!Jh9e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png 1272w, https://substackcdn.com/image/fetch/$s_!Jh9e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jh9e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png" width="1456" height="1113" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1113,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Jh9e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png 424w, https://substackcdn.com/image/fetch/$s_!Jh9e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png 848w, https://substackcdn.com/image/fetch/$s_!Jh9e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.png 1272w, https://substackcdn.com/image/fetch/$s_!Jh9e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2664a0ff-94ac-4ffb-80df-5917caa3db4d_1530x1170.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><strong>Step 4 :Converting components to code</strong></h3><p>Once everything is set up, the conversion process is straightforward:</p><ol><li><p>In Figma, select your component or component set</p></li><li><p>Copy the link to selection (right-click &#8594; Copy link)</p></li><li><p>In Cursor, paste the Figma URL directly into the chat</p></li><li><p>The AI will automatically detect it's a Figma link and use the MCP server to extract the component code</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4VIK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4VIK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png 424w, https://substackcdn.com/image/fetch/$s_!4VIK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png 848w, https://substackcdn.com/image/fetch/$s_!4VIK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png 1272w, https://substackcdn.com/image/fetch/$s_!4VIK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4VIK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png" width="1018" height="474" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:474,&quot;width&quot;:1018,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4VIK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png 424w, https://substackcdn.com/image/fetch/$s_!4VIK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png 848w, https://substackcdn.com/image/fetch/$s_!4VIK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.png 1272w, https://substackcdn.com/image/fetch/$s_!4VIK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c64ac5e-2427-4850-869a-258af259afaa_1018x474.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>The AI will generate a React component that includes:</p><ul><li><p>Design tokens from your variables</p></li><li><p>All component variants and states</p></li><li><p>Proper styling using your design system values</p></li><li><p>TypeScript interfaces for component props</p></li></ul><h2><strong>Example: Converting a badge component</strong></h2><p>Let's walk through converting a badge component with multiple states. In Figma, I have a badge component with variants for different types (default, success, warning, error) and styles (filled, outlined).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NMUQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NMUQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png 424w, https://substackcdn.com/image/fetch/$s_!NMUQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png 848w, https://substackcdn.com/image/fetch/$s_!NMUQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png 1272w, https://substackcdn.com/image/fetch/$s_!NMUQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NMUQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png" width="1456" height="689" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:689,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NMUQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png 424w, https://substackcdn.com/image/fetch/$s_!NMUQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png 848w, https://substackcdn.com/image/fetch/$s_!NMUQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.png 1272w, https://substackcdn.com/image/fetch/$s_!NMUQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39a704b6-1886-4b46-8185-10b308523a6f_1600x757.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><figcaption class="image-caption">Figma components</figcaption></figure></div><p>When I paste the Figma URL into Cursor, it calls the Get Code, Get Image, and Get Variables actions. It generates the following components:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tqvP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tqvP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png 424w, https://substackcdn.com/image/fetch/$s_!tqvP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png 848w, https://substackcdn.com/image/fetch/$s_!tqvP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!tqvP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tqvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png" width="1456" height="1466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1466,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tqvP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png 424w, https://substackcdn.com/image/fetch/$s_!tqvP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png 848w, https://substackcdn.com/image/fetch/$s_!tqvP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!tqvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ab59e10-4fc6-4448-a711-77ed4bcf1e4b_1589x1600.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><figcaption class="image-caption">Code components</figcaption></figure></div><p>The generated component includes all the design tokens, proper state management, and matches the Figma design pixel-perfectly. The SVG icons are a little off, but could be corrected with additional prompts.</p><p></p><h2><strong>Common patterns and best practices</strong></h2><p><strong>Start small and iterate</strong></p><p>Don't try to convert your entire component library at once. The conversion time scales with the number of frames in your selection. A component with 5-6 variants might take a minute, while one with 50+ variants could take 5+ minutes just for the extraction step.</p><p><strong>Use consistent naming conventions</strong></p><p>Ensure your Figma component names match the naming you want in code. The AI will use these names to generate component and prop names.</p><p><strong>Leverage component sets</strong></p><p>Figma component sets translate beautifully to React components with multiple variants. Structure your components in Figma the way you want them to work in code.</p><p><strong>Refine with prompts</strong></p><p>If the initial conversion isn't perfect, use specific prompts to refine the output:</p><p><em>"Update the badge component to use the exact color tokens from Figma"</em></p><p><em>"Ensure all hover states match the Figma interaction design"</em></p><p><strong>Integrating with AI prototyping tools</strong></p><p>Once you have your converted components, you can use them in any AI prototyping too using Github. Simply push your converted components to a GitHub repository, then use the Github import feature to pull the components into tools like Replit and Bolt.</p><p></p><h2><strong>Putting it all together</strong></h2><p>Converting Figma components to code removes the guesswork from AI prototyping. Instead of describing your design system and hoping the AI interprets it correctly, you can provide exact specifications that maintain consistency across all your prototypes.</p><p>This approach is particularly powerful for:</p><ul><li><p><strong>Design system maintenance</strong>: Keep prototypes aligned with your design standards</p></li><li><p><strong>Stakeholder demos</strong>: Show realistic prototypes using actual brand components</p></li><li><p><strong>Developer handoff</strong>: Generate code that developers can actually use in production</p></li><li><p><strong>Rapid iteration</strong>: Test design changes quickly without rebuilding components</p></li></ul><p>The key is starting with a well-structured design system in Figma that uses variables consistently. Once that foundation is in place, converting components becomes a matter of copying and pasting URLs.</p><p>Remember that this workflow works best for teams with established design systems. If you're still building out your component library, focus on creating a few core components with proper variable usage before attempting large-scale conversions.</p>]]></content:encoded></item><item><title><![CDATA[New: AI Product Community]]></title><description><![CDATA[Join Peter Yang and I in our new AI product community!]]></description><link>https://blog.techforproduct.com/p/new-ai-product-community</link><guid isPermaLink="false">https://blog.techforproduct.com/p/new-ai-product-community</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 11 Jun 2025 14:10:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bjXt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today, I&#8217;m excited to launch a new AI product community<strong> </strong>with Peter Yang, current Product Lead at Roblox, author of Creator Economy (100k+ subs), and instructor of &#8220;Become an AI Powered Product Leader&#8221; on Maven.</p><p>We kept hearing the same thing from our readers and students:</p><ol><li><p>&#8220;I want to meet other people who are tinkering with AI.&#8221;</p></li><li><p>&#8220;Where can I find real AI workflows that actually work?&#8221;</p></li><li><p>&#8220;I want to see what AI apps people have built and how they did it.&#8221;</p></li></ol><blockquote><blockquote><p><strong>So Peter and I are starting this Slack community to help you use AI to save time, get more done, and build great products.</strong></p></blockquote></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bjXt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bjXt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!bjXt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!bjXt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!bjXt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bjXt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:772770,&quot;alt&quot;:&quot;&quot;,&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://creatoreconomy.so/i/165050028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!bjXt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!bjXt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!bjXt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!bjXt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ee71fc2-cdf7-478f-97c2-1a940dfb8088_1600x900.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>Here's what you get as a community member:</p><ol><li><p><strong>Our best AI resources for free</strong> including Colin&#8217;s <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations for PMs course</a> (4.7 stars, 84 lessons), Peter&#8217;s <a href="https://creatoreconomy.so/p/100000-subs-and-my-personal-ai-prompt-library">AI prompt library</a> (24+ go-to prompts), and a new prompt library for AI apps (see below).</p></li><li><p><strong>Live workshops with AI experts</strong>, starting with an AMA with Peter and me this Friday at 3:30 pm pst.</p></li><li><p><strong>Meet other product leaders and founders </strong>from Google, Meta, Netflix, and more who have taken our courses and are AI enthusiasts.</p></li></ol><p>Upgrade to paid to get a link to join the community right away.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>What's included: Full course and prompt libraries</strong></h2><p>Here's what we're making available to community members at launch:</p><h3><strong>1. Colin&#8217;s <a href="https://maven.com/tech-for-product/tech-fundamentals">Tech Foundations for PMs course</a> (84 lessons)</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hlSa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hlSa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png 424w, https://substackcdn.com/image/fetch/$s_!hlSa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png 848w, https://substackcdn.com/image/fetch/$s_!hlSa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png 1272w, https://substackcdn.com/image/fetch/$s_!hlSa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hlSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png" width="1280" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:264915,&quot;alt&quot;:&quot;&quot;,&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://creatoreconomy.so/i/165050028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!hlSa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png 424w, https://substackcdn.com/image/fetch/$s_!hlSa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png 848w, https://substackcdn.com/image/fetch/$s_!hlSa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.png 1272w, https://substackcdn.com/image/fetch/$s_!hlSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fecff3b50-a813-4d22-8154-4d8938ae8a44_1280x728.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>Colin has taught this course to 900 PMs with a 4.7 rating and he&#8217;s generously making it available to community members for free. Above is a snapshot of what the course covers (modules include video and text walkthroughs).</p><h3><strong>2. Peter&#8217;s battle-tested AI prompt library</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jmre!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jmre!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png 424w, https://substackcdn.com/image/fetch/$s_!Jmre!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png 848w, https://substackcdn.com/image/fetch/$s_!Jmre!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png 1272w, https://substackcdn.com/image/fetch/$s_!Jmre!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jmre!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png" width="1456" height="966" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba395613-3205-420a-917a-0c57433a838f_1704x1130.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:966,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:230480,&quot;alt&quot;:&quot;&quot;,&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://creatoreconomy.so/i/165050028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Jmre!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png 424w, https://substackcdn.com/image/fetch/$s_!Jmre!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png 848w, https://substackcdn.com/image/fetch/$s_!Jmre!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.png 1272w, https://substackcdn.com/image/fetch/$s_!Jmre!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba395613-3205-420a-917a-0c57433a838f_1704x1130.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>This library includes 24+ prompts that I use every week for product, creator, and personal tasks. Peter updates this library regularly &#8212; no fluff, just prompts that work.</p><h3><strong>3. New AI prototyping prompt library</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WErq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WErq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png 424w, https://substackcdn.com/image/fetch/$s_!WErq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png 848w, https://substackcdn.com/image/fetch/$s_!WErq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!WErq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WErq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png" width="1456" height="992" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:992,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:345611,&quot;alt&quot;:&quot;&quot;,&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://creatoreconomy.so/i/165050028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!WErq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png 424w, https://substackcdn.com/image/fetch/$s_!WErq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png 848w, https://substackcdn.com/image/fetch/$s_!WErq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!WErq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1912c5f9-a741-454d-92a6-2acc880171e0_1676x1142.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>This library includes one-shot prompts to build our favorite apps with AI. It&#8217;s still a work in progress but we&#8217;re looking forward to improve it with your help.</p><div><hr></div><p>Look forward to seeing you in the community!</p>]]></content:encoded></item><item><title><![CDATA[How AI prototyping is transforming the product development lifecycle]]></title><description><![CDATA[Practical guidance on how to reshape your product development lifecycle with AI]]></description><link>https://blog.techforproduct.com/p/how-ai-prototyping-is-transforming</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-ai-prototyping-is-transforming</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Tue, 27 May 2025 16:43:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/109374d0-fa7f-4066-adb4-adeb88b7622d_642x362.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live courses, <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations </a>and <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>The traditional product development lifecycle hasn't changed much: What <em>has</em> changed is how we can leverage AI prototypes to get better and faster insights within each stage.</p><p>Let&#8217;s walk through each phase of product development and how you can start leveraging AI prototyping to accelerate exploration and delivery.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NKvq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NKvq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png 424w, https://substackcdn.com/image/fetch/$s_!NKvq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png 848w, https://substackcdn.com/image/fetch/$s_!NKvq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png 1272w, https://substackcdn.com/image/fetch/$s_!NKvq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NKvq!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png" width="1200" height="674.1758241758242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NKvq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png 424w, https://substackcdn.com/image/fetch/$s_!NKvq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png 848w, https://substackcdn.com/image/fetch/$s_!NKvq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.png 1272w, https://substackcdn.com/image/fetch/$s_!NKvq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe6c0274-d86f-4025-a01b-b967bd3abb82_1600x899.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><figcaption class="image-caption">Stages of product development lifecycle</figcaption></figure></div><h2><strong>Discovery</strong></h2><p>During discovery, you're exploring problems and iterating on potential solutions. Traditionally, this meant sketches, wireframes, and lots of imagination when presenting to stakeholders. With AI prototyping, you can build functional prototypes that let you actually <em>experience</em> the solution. This transforms discovery from theoretical discussions to hands-on exploration.</p><p>For example, let&#8217;s say you're a PM at Reddit exploring an AI-powered Q&amp;A feature. Instead of just describing it in a PRD, you can just build 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_!stKc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!stKc!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 424w, https://substackcdn.com/image/fetch/$s_!stKc!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 848w, https://substackcdn.com/image/fetch/$s_!stKc!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 1272w, https://substackcdn.com/image/fetch/$s_!stKc!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!stKc!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif" width="810" height="514" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:514,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!stKc!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 424w, https://substackcdn.com/image/fetch/$s_!stKc!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 848w, https://substackcdn.com/image/fetch/$s_!stKc!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 1272w, https://substackcdn.com/image/fetch/$s_!stKc!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ddf6fea-c128-420b-b4bd-44cfb89af24b_810x514.gif 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><figcaption class="image-caption">Medium fidelity prototype of Reddit Answers</figcaption></figure></div><p>In less than 5 minutes, you have a working prototype that demonstrates:</p><ul><li><p>How the UI might look</p></li><li><p>The actual user flow</p></li><li><p>How citations could work</p></li><li><p>What information architecture makes sense</p></li></ul><p>At this stage, you want to use AI to test multiple options quickly and not get tied down to any single solution. It's important to not get attached to your ideas early just because they&#8217;re higher fidelity.</p><p>To nail discovery with these tools:</p><ol><li><p><strong>Start with the core interaction</strong> Don't try to build everything. Focus on the main user action. For Reddit Answers, that's asking a question and getting an answer.</p></li><li><p><strong>Use real-looking data</strong> Nothing kills a prototype faster than "Lorem ipsum" content. Use realistic questions and answers that stakeholders might actually search for.</p></li><li><p><strong>Keep fidelity low (intentionally)</strong> During discovery, you want feedback on the concept, not the pixels. Don&#8217;t spend too much time or effort on matching your exact branding.</p></li><li><p><strong>Build multiple variations quickly</strong> The power of AI prototyping is iteration speed. Build 3-4 different approaches in the time it used to take to sketch one. Try different layouts, flows, or feature sets.</p></li></ol><h2><strong>Roadmap &amp; Alignment:</strong></h2><p>When you're aligning stakeholders on roadmap priorities, a polished prototype can be worth a thousand slides. AI tools excel at creating high-fidelity prototypes that look like finished products.<strong> </strong>Once you&#8217;ve settled on a solution we think is close to realistic, we can build a more polished version for internal communication.</p><p>Here&#8217;s the same Reddit Q&amp;A feature, just with better UI and animations:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jht0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jht0!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 424w, https://substackcdn.com/image/fetch/$s_!jht0!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 848w, https://substackcdn.com/image/fetch/$s_!jht0!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 1272w, https://substackcdn.com/image/fetch/$s_!jht0!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jht0!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif" width="810" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28db505c-8d0a-4829-845e-15669151b092_810x533.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jht0!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 424w, https://substackcdn.com/image/fetch/$s_!jht0!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 848w, https://substackcdn.com/image/fetch/$s_!jht0!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 1272w, https://substackcdn.com/image/fetch/$s_!jht0!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28db505c-8d0a-4829-845e-15669151b092_810x533.gif 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><figcaption class="image-caption">High fidelity prototype of Reddit Answers</figcaption></figure></div><p>For executive and senior stakeholders, you want to make it clear this is a prototype and the final product may differ. The goal is to communicate the idea without distracting anyone with visual inconsistencies.</p><p>To create a higher fidelity prototype:</p><ol><li><p><strong>Use your actual design system</strong> Spend 30 minutes building a component library inside an AI prototyping tool &#8211; you'll use it for months.</p></li><li><p><strong>Show the feature in context</strong> Don't prototype in isolation. Include your product's navigation, headers, and other UI elements so stakeholders can visualize how it fits.</p></li><li><p><strong>Add micro-interactions</strong> Small touches like hover states, loading animations, and transitions make prototypes feel real. These details build confidence in your vision.</p></li><li><p><strong>Include edge cases</strong> Show what happens with no results, errors, or long content.</p></li></ol><p></p><h2><strong>Solution Testing</strong></h2><p>The biggest shift in solution testing is that you can now test with prototypes that feel like finished products. Users can't tell the difference, which means you get authentic feedback.</p><p>This requires preparing a few sample workflows and populating realistic sample data. For Reddit Answers, we could put this in front of users and gather real insights about:</p><ul><li><p>What questions they naturally ask</p></li><li><p>Whether the UI is intuitive</p></li><li><p>How they interact with citations</p></li><li><p>Their satisfaction with AI-generated answers</p></li></ul><p>You can also add any product analytics tools or external solutions directly to your prototype. This allows you to record the exact interactions users took inside the prototype, reducing your need to take detailed notes during a call and allowing you to easily share this data with your team.</p><p>Here&#8217;s an example of Posthog events and recordings I&#8217;m collecting on a prototype:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OuNI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OuNI!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 424w, https://substackcdn.com/image/fetch/$s_!OuNI!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 848w, https://substackcdn.com/image/fetch/$s_!OuNI!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 1272w, https://substackcdn.com/image/fetch/$s_!OuNI!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OuNI!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif" width="810" height="425" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:425,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OuNI!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 424w, https://substackcdn.com/image/fetch/$s_!OuNI!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 848w, https://substackcdn.com/image/fetch/$s_!OuNI!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 1272w, https://substackcdn.com/image/fetch/$s_!OuNI!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f098f27-9313-4e4d-bfd9-7b95626b1e51_810x425.gif 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><figcaption class="image-caption">Posthog analytics and recordings</figcaption></figure></div><p>To make sure it's ready for testing with customers:</p><ol><li><p><strong>Make it feel production-ready</strong> Users give different feedback on rough prototypes versus polished ones. Use high-fidelity prototypes to get reactions to the actual experience, not the prototype quality.</p></li><li><p><strong>Include enough depth</strong> Build out 2-3 common user paths completely. Users should be able to explore naturally without hitting dead ends.</p></li><li><p><strong>Add analytics from the start</strong>. Interaction tracking and session recordings make it easier to share information with your team later. Use tools like Posthog for this.</p></li><li><p><strong>Test your riskiest assumptions first</strong> For Reddit Answers, the big risk might be trust in AI-generated content. Design your test to specifically probe this concern.</p><p></p></li></ol><h2><strong>Engineering Handoff</strong></h2><p>It&#8217;s important to remember that the code generated by AI prototyping tools is mostly useless to your engineering team. It doesn&#8217;t have any context on how your code base works, how to structure files, or even if it's using the same programming language.</p><p>Where it can be useful is to drive conversation on requirements and to document specific interactions. For example, our Reddit prototype might prompt the following questions from engineering:</p><ul><li><p>What does the accuracy score mean?</p></li><li><p>How will it be generated?</p></li><li><p>What external sources should be used?</p></li><li><p>Is there any content within Reddit that should be excluded from answers?</p></li><li><p>How should answers be vetted before being included in the AI response?</p></li></ul><p>Using the prototype as an artifact for communication can drive better discussion and collaboration between design, product, and engineering.</p><p>As a bonus, you can also hand off exact requirements for small UI interactions, like hover states and animations. If we wanted this exact loading state from the prototype, the code is actually a useful starting point.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bc2O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bc2O!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 424w, https://substackcdn.com/image/fetch/$s_!bc2O!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 848w, https://substackcdn.com/image/fetch/$s_!bc2O!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 1272w, https://substackcdn.com/image/fetch/$s_!bc2O!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bc2O!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif" width="810" height="397" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:397,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bc2O!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 424w, https://substackcdn.com/image/fetch/$s_!bc2O!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 848w, https://substackcdn.com/image/fetch/$s_!bc2O!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 1272w, https://substackcdn.com/image/fetch/$s_!bc2O!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93631bb5-4a88-4b64-99ad-6e2545505354_810x397.gif 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><figcaption class="image-caption">Loading animation</figcaption></figure></div><p>To get the best handoff with engineering:</p><ol><li><p><strong>Don&#8217;t assume the code is valuable:</strong> Share the code via Github or a file extract, but let the engineering team take what they want from it</p></li><li><p><strong>Use system prompts: </strong>To get more useful code, have the engineering team write a system prompt that pushes the AI to use your engineering patterns</p></li><li><p><strong>Drive rich conversations: </strong>Bring your prototype with you to scoping and use it as the primary conversation piece instead of your PRD</p></li><li><p><strong>Use interactions: </strong>Prototype the exact loading states, animations, and empty states you want to save time and provide more clarity</p></li></ol><p></p><h2><strong>Putting it all together</strong></h2><p>AI prototyping isn't just about building things faster &#8211; it's about fundamentally changing how we validate ideas and communicate vision. When you can go from idea to functional prototype in minutes, you can:</p><ul><li><p>Test 10x more ideas in the same time</p></li><li><p>Get real user feedback before writing a single line of production code</p></li><li><p>Align stakeholders with experiences, not explanations</p></li><li><p>Surface technical questions before engineering starts</p></li><li><p>Hand off working code that engineers can build from</p></li></ul><p>The teams that master this workflow will ship better products, faster. The tools are here. The only question is: what will you build first?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/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">Tech For Product is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</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 my AI app got its first 1000 users]]></title><description><![CDATA[The story of my first app acquitision]]></description><link>https://blog.techforproduct.com/p/how-my-ai-app-got-its-first-1000</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-my-ai-app-got-its-first-1000</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Tue, 20 May 2025 12:03:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f78be9c7-e358-4915-9ec8-c18aa24550e7_1454x820.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live courses, <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations </a>and <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Before ChatGPT, a few curious developers had access to a brand new AI model from OpenAI: GPT-3. I was one of those developers.</p><p>This is the story of how I built my first AI app (back in 2022, before it was cool), scaled to 4,000+ users, and sold &#8212; all in a few months.</p><p>Let&#8217;s dive in.</p><h2>The Plan</h2><p>This product didn&#8217;t come about the typical way. I had no go-to-market plan, no customer interviews, and it was the first time I worked with a generative AI model. </p><p>I began down the road of building this product simply because I had early access to GPT-3 and thought it would be fun to build something.</p><p>At first, I was just messing around with the model. Once I had a good understanding of its limitations, I started brainstorming products I could build. I had a few criteria:</p><ol><li><p><strong>Built-in distribution - </strong>I didn&#8217;t have time or money to market the product myself</p></li><li><p><strong>Extremely small scope -</strong> One high value feature</p></li><li><p><strong>Easy to monetize -</strong> I wanted customers who were willing to pay </p></li></ol><p>To satisfy these, I thought the best approach would be to build into an existing marketplace &#8211; something like the Shopify app store. Luckily for me, <a href="https://saas-marketplaces.com/">Saas Marketplaces</a> has a complete list of marketplaces you can easily build on top of. Shopify would likely have been the best bet but their app store was already crowded with AI writing services. I decided to go for the next best thing - Wix.</p><p>Once I decided on building a Wix plugin, I spent a few hours playing with Wix&#8217;s product. I wrote blog posts, set up an ecommerce site, and generally looked for points of friction. The thing I found most annoying was adding a new product &#8211; you&#8217;re presented with this lengthy form that requires 30+ minutes to complete just to add a new product.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ySX_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ySX_!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 424w, https://substackcdn.com/image/fetch/$s_!ySX_!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 848w, https://substackcdn.com/image/fetch/$s_!ySX_!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 1272w, https://substackcdn.com/image/fetch/$s_!ySX_!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ySX_!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif" width="928" height="522" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:522,&quot;width&quot;:928,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ySX_!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 424w, https://substackcdn.com/image/fetch/$s_!ySX_!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 848w, https://substackcdn.com/image/fetch/$s_!ySX_!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 1272w, https://substackcdn.com/image/fetch/$s_!ySX_!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff59e3b3c-eeac-4166-b60f-a232187e9d74_928x522.gif 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><figcaption class="image-caption">Wix new product form</figcaption></figure></div><p>Given many ecommerce brands frequently change their offerings, I thought writing product descriptions automatically could be a useful way to leverage GPT-3.</p><p>So now I had a plan:</p><ul><li><p>Build a Wix plugin</p></li><li><p>That helps ecommerce owners save time by automating product copy</p></li><li><p>So that they can spend time on more important issues</p></li></ul><p>And so <em>Product Description Generator</em> was born.</p><p>Here was the full plan:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BSTw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BSTw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png 424w, https://substackcdn.com/image/fetch/$s_!BSTw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png 848w, https://substackcdn.com/image/fetch/$s_!BSTw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png 1272w, https://substackcdn.com/image/fetch/$s_!BSTw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BSTw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png" width="1271" height="827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:1271,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BSTw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png 424w, https://substackcdn.com/image/fetch/$s_!BSTw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png 848w, https://substackcdn.com/image/fetch/$s_!BSTw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.png 1272w, https://substackcdn.com/image/fetch/$s_!BSTw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49c23764-1ac6-478d-bfee-bc72068fbf30_1271x827.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>The Build</h2><p>This app was pretty straightforward to build. Users would provide a quick description of the product via my app, which I would send over to GPT-3. OpenAI would return the description for the user to edit or save.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kqA6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kqA6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png 424w, https://substackcdn.com/image/fetch/$s_!kqA6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png 848w, https://substackcdn.com/image/fetch/$s_!kqA6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!kqA6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kqA6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png" width="660" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:660,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kqA6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png 424w, https://substackcdn.com/image/fetch/$s_!kqA6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png 848w, https://substackcdn.com/image/fetch/$s_!kqA6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!kqA6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbe9b6f1-3a53-4f03-a2f4-90d8cad6979c_660x1600.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><figcaption class="image-caption">Product Description Generator user workflow</figcaption></figure></div><p>Here&#8217;s how it worked on the technical side:</p><ol><li><p>The user signs up for a free trial. My app authenticated them with the Wix credentials, ensuring the sign up experience was smooth</p></li><li><p>My app fetches their existing products from the Wix API and displays them in a list</p></li><li><p>The user selects a product, enters a description, product type, and tags, then clicks Generate</p></li><li><p>My app sends the information to OpenAI and receives a product description in response.</p></li><li><p>The user can edit the description and save to the associated product</p></li><li><p>On save, my app calls the Wix API to update the product description in their ecommerce store</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U0jp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U0jp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png 424w, https://substackcdn.com/image/fetch/$s_!U0jp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png 848w, https://substackcdn.com/image/fetch/$s_!U0jp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png 1272w, https://substackcdn.com/image/fetch/$s_!U0jp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U0jp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png" width="1456" height="1376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1376,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!U0jp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png 424w, https://substackcdn.com/image/fetch/$s_!U0jp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png 848w, https://substackcdn.com/image/fetch/$s_!U0jp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.png 1272w, https://substackcdn.com/image/fetch/$s_!U0jp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8176342-985b-4f6c-b31b-8b63c0417e52_1600x1512.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><figcaption class="image-caption">System diagram for Product Description Generator</figcaption></figure></div><p>The most complex part was the Wix integration. Their documentation was not the best, so there was a lot of trial and error in setting up the correct requests to authenticate the user and save the new description. In addition to the basic functionality, I also had to add a credit system. Free users were assigned 5 credits to use and could purchase an additional 100 ($12) or 300 ($20) credits per month. This meant I had to have background jobs that checked the users&#8217; status and applied the correct number of credits at the beginning of each month, and that I properly handled their credit amounts when generating new product descriptions.</p><p>Partway through this project I hit a roadblock - each request to OpenAI cost about $0.03. OpenAI&#8217;s charges would cost me $27 to generate 300 descriptions but I was only charging $20!</p><p>Rather than increase my prices, I looked for ways to get more value out of each request. I discovered I could have OpenAI generate all 3 descriptions in a single request and split them by a special character. Then, I could process them in my server and display them properly as 3 separate options. Now, 300 credits would only cost $9 and I had $11 of margin to work with.</p><p>Here&#8217;s what my final prompt for GPT-3 looked like:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fhpl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fhpl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 424w, https://substackcdn.com/image/fetch/$s_!Fhpl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 848w, https://substackcdn.com/image/fetch/$s_!Fhpl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 1272w, https://substackcdn.com/image/fetch/$s_!Fhpl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fhpl!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png" width="1200" height="243.95604395604394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:296,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Fhpl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 424w, https://substackcdn.com/image/fetch/$s_!Fhpl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 848w, https://substackcdn.com/image/fetch/$s_!Fhpl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 1272w, https://substackcdn.com/image/fetch/$s_!Fhpl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97c72f81-351a-4758-aa3a-aef378769a0f_1600x325.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">My first ever production AI prompt</figcaption></figure></div><p></p><p>I used a technique called one-shot prompting, where you provide the model with a single example of what a &#8220;good&#8221; output looks like. This helps improve performance without adding complex technical steps like fine tuning.</p><p>The descriptions were preceded by a pipe character (|) which allowed me to split the line and grab the description.</p><p>Knowing what I do now, I would have used xml tags instead to format the prompt. It would have made splitting the text more reliable and allowed me to be more precise in my instructions. </p><pre><code>&lt;Instructions&gt;
Given information about a product, write three compelling product descriptions that are at least one paragraph long.
&lt;/Instructions&gt;
&lt;Example1&gt;
 &lt;Input&gt;

Details:Classic yet stylish, these jackets are ideal for any situation.   The warm and comfortable woolen fabric easily adjusts in size.
  
  Tags:Cotton, Limited Edition
  
  Type:Coat

  &lt;/Input&gt;
&lt;Output&gt;

 &lt;Option1&gt;
Elevate your everyday style with our Limited Edition Classic Coat. Meticulously crafted for the discerning individual, this versatile jacket seamlessly transitions from casual daytime outings to sophisticated evening events. The premium woolen fabric provides exceptional warmth while maintaining breathability, ensuring your comfort in changing weather conditions. With its adjustable sizing feature, this coat adapts perfectly to your silhouette, offering a tailored fit that moves with you throughout your day. A timeless investment piece that will remain a staple in your wardrobe for years to come.
 &lt;/Option1&gt;

  &lt;Option2&gt;
Embrace the perfect blend of tradition and trend with our Cotton Limited Edition Coat. This exceptional outerwear piece combines classic silhouettes with contemporary sensibilities, creating a jacket that's truly timeless yet distinctly modern. The warm woolen construction wraps you in luxurious comfort while the innovative adjustable sizing ensures a flattering fit for every body type. Whether paired with jeans for a casual weekend look or layered over business attire, this versatile coat effortlessly elevates any ensemble. Make a subtle statement with this exclusive piece that balances understated elegance with practical design.
 &lt;/Option2&gt; 

  &lt;Option3&gt;
Discover unparalleled versatility with our signature Limited Edition Coat. Designed for the dynamic lifestyle of today's fashion-conscious individual, this exceptional jacket serves as the perfect companion for any situation life throws your way. The premium woolen fabric delivers substantial warmth without unnecessary bulk, while the thoughtfully engineered adjustable sizing ensures a customized fit that honors your unique silhouette. Crafted from select cotton and available in strictly limited quantities, this coat represents not just remarkable quality, but genuine exclusivity. An investment in enduring style that seamlessly bridges the gap between classic appeal and contemporary relevance.
 &lt;/Option3&gt;

&lt;/Output&gt;
</code></pre><h2>How It Went</h2><p>After working on Product Description Generator part-time for about 3 months, I was ready to launch. I filed tickets with the Wix App team and OpenAI team, picked a launch date, and waited anxiously for my first customers. At this time, OpenAI was manually reviewing and approving every app integrating with their API to ensure you were following their guidelines. They even had a separate endpoint you had to integrate with that would check if the content generated by GPT3 was harmful or not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LNPb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LNPb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png 424w, https://substackcdn.com/image/fetch/$s_!LNPb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png 848w, https://substackcdn.com/image/fetch/$s_!LNPb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png 1272w, https://substackcdn.com/image/fetch/$s_!LNPb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LNPb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png" width="1424" height="1242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1242,&quot;width&quot;:1424,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:253815,&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://blog.techforproduct.com/i/163953028?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.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_!LNPb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png 424w, https://substackcdn.com/image/fetch/$s_!LNPb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png 848w, https://substackcdn.com/image/fetch/$s_!LNPb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.png 1272w, https://substackcdn.com/image/fetch/$s_!LNPb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F250c281b-d853-4791-a4da-76488dd92ba3_1424x1242.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><figcaption class="image-caption">OpenAI&#8217;s old manual approvals for every product</figcaption></figure></div><p>Eventually, I got through the approvals and had a launch date &#8211; but no marketing plan. On launch day, a slow trickle of users started showing up and using the app. First it was 10, then 20, then 100.</p><p>It was working!<br><br>Over the next two months, over 4,000 users signed up for Product Description Generator and I reached $400 per month in revenue. Most of my time was spent fixing bugs and responding to customer support requests. My initial joy at building a real SaaS app was slowly fading as I realized I had no future plans or way to expand the app. One day, after a particularly frustrating bug was finally solved, I decided I to look into selling the app.</p><p>I listed Product Description Generator on Acquire.com, expecting very little interest. To my surprise, I very quickly had dozens of inbound requests to learn more about the product. Within two weeks of listing I had sold Product Description Generator for low five-figures. The acquisition process was smooth and I handed off all the accounts and assets to the new owners.</p><p>And just as quickly as it started, it was over. I had fulfilled a life long goal of building a SaaS app, scaled to thousands of users, and sold it &#8211; all within four months.</p><p></p><h2>What I&#8217;d Do Differently</h2><p>Honestly, there isn&#8217;t much I&#8217;d change about this experience. I set out with the goal of building an AI product and was successful. Since 2022, generative AI has taken the world by storm and this product has lost most of its defensibility.</p><p>If I was still running this product, I&#8217;d continue to look for friction points in the user&#8217;s experience for managing ecommerce stores. I&#8217;d likely bundle together a few features that offer a similar value proposition (like generating product photos with the OpenAI&#8217;s new image gen models) and sell access to the set of features at a fixed price.</p><p>I think products like these are the best starting point for beginners &#8211; the built in distribution ensures you at least get off the ground and can meaningfully help you scale. There is a big difference between 0 users and 100+ users that is difficult to understand without experiencing it.</p><div><hr></div><p><em>Did you enjoy this post? Make sure to hit subscribe for more!</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[How do Replit, v0, and Bolt actually work?]]></title><description><![CDATA[Deep dive into AI coding]]></description><link>https://blog.techforproduct.com/p/how-do-replit-v0-and-bolt-actually</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-do-replit-v0-and-bolt-actually</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Tue, 13 May 2025 12:01:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aa63b6f1-2784-4e60-9628-b6f6f920a1f2_2670x1319.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live courses, <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations </a>and <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Coding has quickly become the most valuable use case for AI, scaling companies to billion dollar valuations and pushing major brands like <a href="https://www.canva.com/ai-code-generator/">Canva</a> and <a href="https://www.figma.com/make/">Figma</a> to ship competitive products or risk losing their dominance. </p><p>In today&#8217;s post, we&#8217;ll do a deep dive into how AI coding tools work under the hood. We&#8217;ll explore different architectures for AI applications and how these popular tools might work.</p><p>Let&#8217;s dive in.</p><h1>Types of AI Apps</h1><p>Before diving into specific tools, it's important to understand that there are multiple approaches to building AI-powered applications. Three common patterns have emerged:</p><ol><li><p>Simple Integrations</p></li><li><p>Single-Agent</p></li><li><p>Multi-Agent</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nNnb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nNnb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png 424w, https://substackcdn.com/image/fetch/$s_!nNnb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png 848w, https://substackcdn.com/image/fetch/$s_!nNnb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png 1272w, https://substackcdn.com/image/fetch/$s_!nNnb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nNnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png" width="1456" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:425108,&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://blog.techforproduct.com/i/163402602?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.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_!nNnb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png 424w, https://substackcdn.com/image/fetch/$s_!nNnb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png 848w, https://substackcdn.com/image/fetch/$s_!nNnb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.png 1272w, https://substackcdn.com/image/fetch/$s_!nNnb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab50d62-f3b9-4a0f-a658-8f4f4e99b4c3_1536x750.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>Simple Integration</h3><p>The simplest approach is a direct integration with an AI model. This is what you'd build by following <a href="https://blog.techforproduct.com/p/how-to-build-an-ai-enabled-feature?utm_source=publication-search">my guide to building an AI feature</a>: a client that sends requests to a server, which forwards them to an AI provider like OpenAI or Anthropic.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZTKe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZTKe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png 424w, https://substackcdn.com/image/fetch/$s_!ZTKe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png 848w, https://substackcdn.com/image/fetch/$s_!ZTKe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png 1272w, https://substackcdn.com/image/fetch/$s_!ZTKe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZTKe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png" width="1051" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8509376e-a243-4041-92bb-06583749f089_1051x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1051,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20543,&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://blog.techforproduct.com/i/163402602?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.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_!ZTKe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png 424w, https://substackcdn.com/image/fetch/$s_!ZTKe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png 848w, https://substackcdn.com/image/fetch/$s_!ZTKe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.png 1272w, https://substackcdn.com/image/fetch/$s_!ZTKe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8509376e-a243-4041-92bb-06583749f089_1051x928.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>This pattern is perfect for simple products like chatbots or AI writing assistants. When people talk about building &#8220;AI wrappers&#8221;, this is what they mean.<br>There are really only a few parts of this pattern that require optimization:</p><ol><li><p>System prompt</p></li><li><p>Examples / fine tuning</p></li><li><p>Evaluation and monitoring</p></li></ol><p>A system prompt is the default prompt that the application provides the AI model on every request. Typically these are instructions that have been carefully crafted to provide the best possible output from the AI model.</p><p>For example, let&#8217;s say you wanted to build an ecommerce product description generator. Your system prompt might look something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r1Hj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r1Hj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 424w, https://substackcdn.com/image/fetch/$s_!r1Hj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 848w, https://substackcdn.com/image/fetch/$s_!r1Hj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 1272w, https://substackcdn.com/image/fetch/$s_!r1Hj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r1Hj!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png" width="1200" height="289.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:386,&quot;width&quot;:1600,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:187428,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r1Hj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 424w, https://substackcdn.com/image/fetch/$s_!r1Hj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 848w, https://substackcdn.com/image/fetch/$s_!r1Hj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 1272w, https://substackcdn.com/image/fetch/$s_!r1Hj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef07f5af-d210-4375-8d60-5ad6636c6cb4_1600x386.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The first part of the prompt includes instructions. This can include techniques like setting the role (&#8220;You are an expert copywriter&#8221;) and setting constraints (&#8220;Return one sentence per product&#8221;).</p><p>Next we have examples. Adding a single example into the prompt is called one-shot prompting. You can add as many examples as you like, so long as you can fit the text in the context window. Remember that AI models have a fixed number of tokens or characters they can accept. When building AI systems, deciding on the correct context to provide is one of the most important and challenging steps.</p><p>Here&#8217;s the beginning of Bolt.diy&#8217;s system prompt &#8211; you can check out the full prompt <a href="https://github.com/stackblitz-labs/bolt.diy/blob/9a5076d8c6ce4ecf58e97b413788996790a2031c/app/lib/common/prompts/prompts.ts#L5">here</a>:</p><pre><code>You are Bolt, an expert AI assistant and exceptional senior software developer with vast knowledge across multiple programming languages, frameworks, and best practices.

&lt;system_constraints&gt;

You are operating in an environment called WebContainer, an in-browser Node.js runtime that emulates a Linux system to some degree. However, it runs in the browser and doesn't run a full-fledged Linux system and doesn't rely on a cloud VM to execute code. All code is executed in the browser. It does come with a shell that emulates zsh. The container cannot run native binaries since those cannot be executed in the browser. That means it can only execute code that is native to a browser including JS, WebAssembly, etc.

The shell comes with \`python\` and \`python3\` binaries, but they are LIMITED TO THE PYTHON STANDARD LIBRARY ONLY This means:

- There is NO \`pip\` support! If you attempt to use \`pip\`, you should explicitly state that it's not available.

- CRITICAL: Third-party libraries cannot be installed or imported.

- Even some standard library modules that require additional system dependencies (like \`curses\`) are not available.

- Only modules from the core Python standard library can be used.

Additionally, there is no \`g++\` or any C/C++ compiler available. WebContainer CANNOT run native binaries or compile C/C++ code!

Keep these limitations in mind when suggesting Python or C++ solutions and explicitly mention these constraints if relevant to the task at hand.

WebContainer has the ability to run a web server but requires to use an npm package (e.g., Vite, servor, serve, http-server) or use the Node.js APIs to implement a web server.

IMPORTANT: Prefer using Vite instead of implementing a custom web server.

IMPORTANT: Git is NOT available.

IMPORTANT: WebContainer CANNOT execute diff or patch editing so always write your code in full no partial/diff update

IMPORTANT: Prefer writing Node.js scripts instead of shell scripts. The environment doesn't fully support shell scripts, so use Node.js for scripting tasks whenever possible!

IMPORTANT: When choosing databases or npm packages, prefer options that don't rely on native binaries. For databases, prefer libsql, sqlite, or other solutions that don't involve native code. WebContainer CANNOT execute arbitrary native binaries.

CRITICAL: You must never use the "bundled" type when creating artifacts, This is non-negotiable and used internally only.

CRITICAL: You MUST always follow the &lt;boltArtifact&gt; format.

Available shell commands:

File Operations:

- cat: Display file contents

- cp: Copy files/directories

- ls: List directory contents

- mkdir: Create directory

- mv: Move/rename files

- rm: Remove files

- rmdir: Remove empty directories

- touch: Create empty file/update timestamp

System Information:

- hostname: Show system name

- ps: Display running processes

- pwd: Print working directory

- uptime: Show system uptime

- env: Environment variables

Development Tools:

- node: Execute Node.js code

- python3: Run Python scripts

- code: VSCode operations

- jq: Process JSON

Other Utilities:

- curl, head, sort, tail, clear, which, export, chmod, scho, hostname, kill, ln, xxd, alias, false, getconf, true, loadenv, wasm, xdg-open, command, exit, source

&lt;/system_constraints&gt;</code></pre><p>In addition to the system prompt, production-ready AI systems need logging.</p><p>Logging allows you to view the results of an AI request in your production environment.  Here&#8217;s a quick example of what logging looks 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_!Gc-1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gc-1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png 424w, https://substackcdn.com/image/fetch/$s_!Gc-1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png 848w, https://substackcdn.com/image/fetch/$s_!Gc-1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!Gc-1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gc-1!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png" width="1200" height="809.3406593406594" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:982,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Gc-1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png 424w, https://substackcdn.com/image/fetch/$s_!Gc-1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png 848w, https://substackcdn.com/image/fetch/$s_!Gc-1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!Gc-1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf7bf2b9-d20d-44d3-a45c-6edc0a5e4011_1600x1079.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>AI logging is usually called Tracing. The example above shows a sequence of steps performed by the AI system. This trace has steps for generating text and for calling a tool called DocumentSearch. Tracing is a critical tool for product teams to monitor the use of their production AI systems.</p><p>Now that we&#8217;ve reviewed the basics, let's talk about agents.</p><p></p><h2>Single Agent</h2><p>The differentiating factor between simple integrations and agents is <strong>tools. </strong>Where a simple integration only allows the AI system to return generated content, Agents enable AI systems to also take actions through a set of predefined tools. Tools are typically defined as a set of API calls the Agent can make.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tlAe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tlAe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png 424w, https://substackcdn.com/image/fetch/$s_!tlAe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png 848w, https://substackcdn.com/image/fetch/$s_!tlAe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png 1272w, https://substackcdn.com/image/fetch/$s_!tlAe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tlAe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png" width="1456" height="712" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:712,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38066,&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://blog.techforproduct.com/i/163402602?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.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_!tlAe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png 424w, https://substackcdn.com/image/fetch/$s_!tlAe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png 848w, https://substackcdn.com/image/fetch/$s_!tlAe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.png 1272w, https://substackcdn.com/image/fetch/$s_!tlAe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8205b06a-16f3-4185-82a5-1b08b9655b5a_1899x928.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>For example, I can connect various tools to Claude Desktop through MCP, an API communication protocol. When I ask Claude to analyze my email broadcast open rates, it can pull the relevant data from Convertkit, create recommendations, and visualize the data for me.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fsbm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fsbm!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 424w, https://substackcdn.com/image/fetch/$s_!fsbm!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 848w, https://substackcdn.com/image/fetch/$s_!fsbm!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 1272w, https://substackcdn.com/image/fetch/$s_!fsbm!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fsbm!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif" width="810" height="451" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:451,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fsbm!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 424w, https://substackcdn.com/image/fetch/$s_!fsbm!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 848w, https://substackcdn.com/image/fetch/$s_!fsbm!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 1272w, https://substackcdn.com/image/fetch/$s_!fsbm!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9bfd5df4-ac2c-4f8a-a63b-ac5ed6caa431_810x451.gif 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>
          <a href="https://blog.techforproduct.com/p/how-do-replit-v0-and-bolt-actually">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How I Grew My SaaS to $100k+ in 6 months]]></title><description><![CDATA[And what I'd do differently next time]]></description><link>https://blog.techforproduct.com/p/how-i-grew-my-saas-to-100k-in-6-months</link><guid isPermaLink="false">https://blog.techforproduct.com/p/how-i-grew-my-saas-to-100k-in-6-months</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Tue, 06 May 2025 19:25:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/89425158-e1d2-4a3b-95a7-b1b3abe23e5f_1454x820.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live courses, <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations </a>and <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>In early 2022, a friend of mine (we&#8217;ll call him Alex) approached me to work on a new product together. After running more than a dozen Airbnb&#8217;s himself, Alex had recently moved to a firm that professionally purchased and managed short term rentals. His role was to identify prospective properties, analyze potential cashflow, and ultimately determine which properties to purchase.</p><p>Alex had built a methodology for selecting properties and was creating free content on Youtube teaching others to do the same.</p><p>Our idea was simple: automate the data processing and provide clear step-by-step training.</p><h2>The Plan</h2><p>Here was our plan:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zMCh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zMCh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png 424w, https://substackcdn.com/image/fetch/$s_!zMCh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png 848w, https://substackcdn.com/image/fetch/$s_!zMCh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png 1272w, https://substackcdn.com/image/fetch/$s_!zMCh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zMCh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png" width="1456" height="947" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:947,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:238964,&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://blog.techforproduct.com/i/162843771?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.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_!zMCh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png 424w, https://substackcdn.com/image/fetch/$s_!zMCh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png 848w, https://substackcdn.com/image/fetch/$s_!zMCh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.png 1272w, https://substackcdn.com/image/fetch/$s_!zMCh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72469865-26f2-464d-952a-b1375140a5ed_2542x1654.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>Our target persona was a multiple property owner who was looking to expand out-of-state. Ideally, they had experienced some of the challenges of property selection and understood that making the right decision could mean an additional $20k+ per year in profit.</p><p>We intentionally did not want to automatically recommend properties to purchase. Instead, we wanted to build a system that provided hosts the data and training they need to quickly assess a market. Although there were many competitors in the Airbnb data space, they all approached the problem from a pure SaaS perspective. They provided complex tools to manage data within their platform, but this required expertise and time from hosts.</p><p>Our product would be closer to a tech-enabled service. We would provide an extremely simple interface &#8211; select your city, generate the report, and get an export to Google Sheets. We would also provide detailed training and expert support from our team.</p><p>Distribution would be primarily through Youtube. Alex had a small following (~3K subscribers) in a very specific niche, so we felt confident we could convert a decent number of users. We priced each report at $1000 initially, with multiple reports bundled at a discounted price.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FR4D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FR4D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png 424w, https://substackcdn.com/image/fetch/$s_!FR4D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png 848w, https://substackcdn.com/image/fetch/$s_!FR4D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png 1272w, https://substackcdn.com/image/fetch/$s_!FR4D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FR4D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png" width="1456" height="634" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:126091,&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://blog.techforproduct.com/i/162843771?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.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_!FR4D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png 424w, https://substackcdn.com/image/fetch/$s_!FR4D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png 848w, https://substackcdn.com/image/fetch/$s_!FR4D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.png 1272w, https://substackcdn.com/image/fetch/$s_!FR4D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8be3b8a2-c0e7-42cf-aeab-8861cebee4f9_2880x1254.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><figcaption class="image-caption">10% CTR and 5% conversion are considered high, but are possible if your content matches your audience closely</figcaption></figure></div><p></p><p>We expected to reach the $25k mark fairly quickly as we converted existing demand for Alex&#8217;s system, and saw an opportunity to scale well past $100k in 12 months time.</p><p>Our primary risk was the data itself. Airbnb does not make their data publicly available, so we were reliant on a 3rd party who had been collecting and reselling data.</p><h2>The Build</h2><p>As the technical partner on this project, it was up to me to build out the tooling and infrastructure needed. To start, we decided to only support the United States, as the vast majority of our demand was concentrated there.</p><p>Our data supplier provided us with 1.5M+ records every month with 65+ data elements per listing. We also had in-house data cleaning, validation, and aggregation steps to run per listing.</p><p>This was going to be a complex project.</p><p>Here&#8217;s how it worked:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RUmL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RUmL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png 424w, https://substackcdn.com/image/fetch/$s_!RUmL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png 848w, https://substackcdn.com/image/fetch/$s_!RUmL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!RUmL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RUmL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png" width="1402" height="1600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1600,&quot;width&quot;:1402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RUmL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png 424w, https://substackcdn.com/image/fetch/$s_!RUmL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png 848w, https://substackcdn.com/image/fetch/$s_!RUmL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!RUmL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51feaacd-f949-4e58-a542-2bebb7bf3ad5_1402x1600.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><ol><li><p>Each month, our data provided dropped a 10GB CSV file in object storage (S3)</p></li><li><p>An automated data pipeline would pick up the file, clean it, and pre-compute values. Then, it would insert the records into a MongoDB database</p></li><li><p>Mongo would store all of proprietary property data, and a separate relational database would store all other data (users, accounts, reports they created, etc)</p></li><li><p>The user would navigate to the site, select a location, and generate a report. The application server would then grab the relevant data from Mongo, create Google Sheet, and insert the data. Then, we&#8217;d create a gSheet pivot table automatically to prepare the report.</p></li><li><p>Finally, we automatically added the user as an editor on the gSheet, which triggers an email to notify them the report was ready.</p></li></ol><p>This backend of this product was fairly complex, but it was critical that we kept the User Experience simple. </p><p>We decided on a single page that linked out to your existing reports and allowed you to request new locations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oYX5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oYX5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 424w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 848w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 1272w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oYX5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oYX5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 424w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 848w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.png 1272w, https://substackcdn.com/image/fetch/$s_!oYX5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa716b56f-bedf-4eac-b07c-2fcc3f8d2744_1600x894.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><figcaption class="image-caption">Our single page UX for report generation</figcaption></figure></div><p>Scaling and security were fairly straightforward. We used GCP, Google&#8217;s cloud services. Our app server was hosted on App Engine, which allowed us to automatically scale servers based on demand. We ensured that all requests to our server had to be authenticated and from known URLs using whitelisting. Our Mongo environment was also hosted in GCP and was secured behind a private network &#8211;  no one could access its contents directly.</p><p>Our S3 bucket was secured with a simple username and password, and we archived files monthly after processing.</p><h2>How It Went</h2><p>After spending ~4 months building, we launched an early access version to a few select customers who we thought would benefit most. We iterated on the product for about a month, then launched to a broader audience with a limited number of reports available.</p><p>Our sales far exceed our expectations, passing $100k gross in 2 months! &#127881;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A3Be!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A3Be!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png 424w, https://substackcdn.com/image/fetch/$s_!A3Be!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png 848w, https://substackcdn.com/image/fetch/$s_!A3Be!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png 1272w, https://substackcdn.com/image/fetch/$s_!A3Be!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A3Be!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png" width="725" height="322" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:322,&quot;width&quot;:725,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A3Be!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png 424w, https://substackcdn.com/image/fetch/$s_!A3Be!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png 848w, https://substackcdn.com/image/fetch/$s_!A3Be!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.png 1272w, https://substackcdn.com/image/fetch/$s_!A3Be!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3799a97d-e670-4ffe-bc63-2101afeb043e_725x322.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>During this time, I was putting out a ton of technical fires (while working full time). I was working 12+ hours a day, fixing bugs between meetings, and generally just trying to keep the ship afloat. In case it&#8217;s not obvious, I&#8217;m not a professional engineer and built 100% of this product solo, so I constantly felt like I was making it up as I went.</p><p>Unfortunately, our success quickly dried up as we ran into a new problem &#8211; access to data. Our data provider was unable to continue working with us and other providers charged upwards of $240k per year for the same product. Changing providers would also require us to rework our data pipelines and transformations, creating weeks of new work. </p><p>We were also unsure if we&#8217;d be able to scale our go-to-market enough to maintain margins, given our new (very high) fixed costs.</p><p>Ultimately, we decided to shut down the product and Alex continued offering his product as service. At the same time, my live courses on Maven started to pick up and I decided to prioritize providing the best product I could to help other PMs become more technical.</p><h2>What I&#8217;d Do Differently</h2><p>Overall, building this product was one of the most fun experiences I&#8217;ve had in my career. Taking on the lead technical role was definitely a stretch for me, but we were able to make it work. </p><p>Having built 12+ products solo, here&#8217;s the 3 reasons why I think this one worked:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iZjk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iZjk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png 424w, https://substackcdn.com/image/fetch/$s_!iZjk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png 848w, https://substackcdn.com/image/fetch/$s_!iZjk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png 1272w, https://substackcdn.com/image/fetch/$s_!iZjk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iZjk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png" width="1456" height="474" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:474,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iZjk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png 424w, https://substackcdn.com/image/fetch/$s_!iZjk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png 848w, https://substackcdn.com/image/fetch/$s_!iZjk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.png 1272w, https://substackcdn.com/image/fetch/$s_!iZjk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0baeed83-c13e-427c-aac8-2606a240a98d_1600x521.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><ol><li><p><strong>Clear distribution strategy</strong> - Alex had already spent 2+ years building trust and expertise in a very niche topic</p></li><li><p><strong>Clear pain point</strong> - Multi-home hosts had experienced the pain of unprofitable properties and desperately wanted to avoid doing the same thing again</p></li><li><p><strong>Simple product</strong> - We were able to deliver a clear, simple process that actually worked &#8211; something that was difficult to find on the market</p></li></ol><p>If I was to do this again, I&#8217;d probably take the leap and purchase the data for $240k. I think we underestimated the size of this market and could have easily scaled this to $2-3M in revenue through channel partnerships with larger influencers in the space.</p><p>But, there&#8217;s always next time!</p><div><hr></div><p><em>Did you enjoy this post? Make sure to hit subscribe for more!</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[5 Tips to Productionize Your Prototype]]></title><description><![CDATA[From Prototype to Production-Ready App]]></description><link>https://blog.techforproduct.com/p/5-tips-to-productionize-your-prototype</link><guid isPermaLink="false">https://blog.techforproduct.com/p/5-tips-to-productionize-your-prototype</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 09 Apr 2025 15:36:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c379abb0-b25c-46da-b6d6-d705d93d9903_642x362.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live courses, <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations </a>and <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p><br>Creating a prototype is exciting - you've turned your idea into something tangible that you can show to users and stakeholders. But there's a vast difference between a prototype that works on your machine and a production-ready application that can handle real users securely.</p><p>As a product manager who's never shipped an app before, the path from prototype to production can seem daunting.</p><p>Let's break down the five most critical steps to transform your prototype into a production-ready application:</p><h2><strong>1. Implement proper authentication and authorization on both client and server</strong></h2><p>Your prototype might use simple password checks or local storage to manage user sessions, but a production app needs robust authentication on both client and server sides. This double-verification approach is crucial for security.</p><p>On the client side, you'll implement UI components for login, registration, and password resets along with session management. But remember that any client-side code can be manipulated by users. This is why server-side authentication validation is essential.</p><p>Even if your client code checks for authentication, every API endpoint on your server should independently verify three things:</p><ol><li><p>Is the user authenticated? (Do they have a valid session token?)</p></li><li><p>Is the token unexpired? (Has their session timed out?)</p></li><li><p>Is the user authorized for this specific action? (Do they have permission?)</p></li></ol><p>For example, imagine your app has an API endpoint that lets users edit their profile. Your server code should look something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NJ6h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NJ6h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png 424w, https://substackcdn.com/image/fetch/$s_!NJ6h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png 848w, https://substackcdn.com/image/fetch/$s_!NJ6h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png 1272w, https://substackcdn.com/image/fetch/$s_!NJ6h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NJ6h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png" width="882" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:882,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86623,&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://blog.techforproduct.com/i/160946770?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.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_!NJ6h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png 424w, https://substackcdn.com/image/fetch/$s_!NJ6h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png 848w, https://substackcdn.com/image/fetch/$s_!NJ6h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.png 1272w, https://substackcdn.com/image/fetch/$s_!NJ6h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc183664a-2b1c-4009-9eaf-e112f99ebde8_882x814.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>This double-check approach ensures that even if someone bypasses your client-side authentication (which is relatively easy to do), they'll still be blocked at the server level.</p><h2><strong>2. Secure your secrets and API keys</strong></h2><p>Your prototype may have API keys, database credentials, and other secrets hardcoded directly in your application code. This approach is a security nightmare for production.</p><p>First, let's understand what counts as a "secret":</p><ul><li><p>API keys for third-party services</p></li><li><p>Database connection strings</p></li><li><p>OAuth client secrets</p></li><li><p>JWT signing keys</p></li><li><p>Encryption keys</p></li><li><p>Admin credentials</p></li></ul><p>These secrets should never be:</p><ul><li><p>Committed to your Git repository (even private repos)</p></li><li><p>Hardcoded in your application code</p></li><li><p>Stored in client-side code that gets sent to browsers</p></li><li><p>Shared via email or messaging platforms</p></li></ul><p>Instead, implement proper secrets management:</p><ol><li><p>Use environment variables for server-side secrets. These should be set up in your hosting environment (like Netlify, Vercel, or AWS), not in your codebase. You can use a .env file for testing on your own computer and configure it to be ignored by Github with a .gitignore file<br></p></li><li><p>For frontend applications, create backend proxy endpoints. Instead of including an API key in your frontend code, create a server endpoint that makes the third-party API call on behalf of your client.<br></p></li><li><p>Set up monitoring for API keys. Set a fixed budget or number of requests so you can be notified if traffic exceeds your expectations.<br></p></li><li><p>Use the principle of least privilege: each secret should have only the permissions necessary for its function, not admin-level access.<br><br></p></li></ol><p>Here's how you might handle a third-party API call correctly:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!84WD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!84WD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png 424w, https://substackcdn.com/image/fetch/$s_!84WD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png 848w, https://substackcdn.com/image/fetch/$s_!84WD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png 1272w, https://substackcdn.com/image/fetch/$s_!84WD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!84WD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png" width="866" height="664" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f569051-a2e7-493c-b041-96b04edb92df_866x664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:664,&quot;width&quot;:866,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74032,&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://blog.techforproduct.com/i/160946770?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.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_!84WD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png 424w, https://substackcdn.com/image/fetch/$s_!84WD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png 848w, https://substackcdn.com/image/fetch/$s_!84WD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.png 1272w, https://substackcdn.com/image/fetch/$s_!84WD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f569051-a2e7-493c-b041-96b04edb92df_866x664.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>Proper secrets management is often overlooked but is one of the most critical aspects of production security.</p><h2><strong>3. Never trust client-side input </strong></h2><p>In your prototype, you might assume users will provide reasonable, well-formatted input through your UI. In production, you need to assume the opposite.</p><p>Any data coming from the client side &#8211; whether from forms, API calls, or URL parameters &#8211; should be treated as potentially malicious. This includes data from your own UI, as attackers can bypass your interface entirely and send requests directly to your API.</p><p>There are two key practices to implement:</p><p><strong>Validation</strong> ensures data meets your requirements before processing:</p><ul><li><p>Is the email actually an email?</p></li><li><p>Is the user ID in the correct format?</p></li><li><p>Are all required fields present?</p></li><li><p>Do numeric values fall within acceptable ranges?</p></li></ul><p><strong>Sanitization</strong> removes potentially dangerous content from input:</p><ul><li><p>Stripping HTML tags from text that will be displayed</p></li><li><p>Escaping special characters to prevent injection attacks</p></li><li><p>Normalizing data formats (like phone numbers or dates)</p></li></ul><p>Implement validation and sanitization at both the client and server levels:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cwm2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cwm2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png 424w, https://substackcdn.com/image/fetch/$s_!cwm2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png 848w, https://substackcdn.com/image/fetch/$s_!cwm2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png 1272w, https://substackcdn.com/image/fetch/$s_!cwm2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cwm2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png" width="707" height="860" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c10f272a-0e30-471c-835f-7973d53eb289_707x860.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:860,&quot;width&quot;:707,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74735,&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://blog.techforproduct.com/i/160946770?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.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_!cwm2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png 424w, https://substackcdn.com/image/fetch/$s_!cwm2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png 848w, https://substackcdn.com/image/fetch/$s_!cwm2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.png 1272w, https://substackcdn.com/image/fetch/$s_!cwm2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10f272a-0e30-471c-835f-7973d53eb289_707x860.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>SQL injection and cross-site scripting (XSS) attacks often result from failing to properly validate and sanitize input. These vulnerabilities can lead to data breaches or account takeovers, so this step is crucial for production readiness.</p><h2><strong>4. Set up comprehensive monitoring and alerting</strong></h2><p>Your prototype probably doesn't need monitoring &#8211; when something breaks, you're there to fix it. But a production app needs automated monitoring to identify issues before users report them or, ideally, before users even notice.</p><p>Monitoring should catch high priority production issues like crashes and collect data on bugs and poor UX. You can use tools like Sentry to monitor your application performance and PostHog to collect data on user behavior.<br><br>Here&#8217;s an example of what monitoring looks like with Sentry:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_Jo_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_Jo_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png 424w, https://substackcdn.com/image/fetch/$s_!_Jo_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png 848w, https://substackcdn.com/image/fetch/$s_!_Jo_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png 1272w, https://substackcdn.com/image/fetch/$s_!_Jo_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_Jo_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png" width="728" height="302.35483870967744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:515,&quot;width&quot;:1240,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_Jo_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png 424w, https://substackcdn.com/image/fetch/$s_!_Jo_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png 848w, https://substackcdn.com/image/fetch/$s_!_Jo_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.png 1272w, https://substackcdn.com/image/fetch/$s_!_Jo_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85f0793-60dd-4d01-967b-b45584b93ec8_1240x515.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>In addition to monitoring, you&#8217;ll likely want to set up alerts. These notifications will send you an email when a critical issue has occurred. Set up alerting thresholds carefully &#8211; too sensitive and you'll face alert fatigue, too relaxed and you'll miss critical issues. Good starting points include:</p><ul><li><p>Error rates above 1% on critical paths</p></li><li><p>Response times exceeding 2-3x normal</p></li><li><p>Any failed health checks</p></li></ul><p>With proper monitoring in place, you can catch issues early, understand your application's behavior patterns, and make data-driven decisions about what to optimize.</p><h2><strong>5. Secure integrations with third-party services</strong></h2><p>Your production app will likely integrate with payment processors, email services, analytics tools, and other third-party providers. Each integration is a potential security vulnerability if not implemented correctly.</p><p>For payment processing, never handle credit card information directly unless absolutely necessary. Instead, use services like Stripe that provide secure elements to collect sensitive information without it touching your servers.</p><p>For email integrations, use established providers with proper authentication and ensure you're following best practices for email delivery and security.</p><p>When integrating with APIs, implement these security measures:</p><ol><li><p><strong>Validate webhook sources</strong>: If a service sends you data via webhooks, verify the sender using signatures or shared secrets.</p><p></p></li><li><p><strong>Implement rate limiting</strong>: Prevent abuse by limiting how frequently your endpoints can be called.</p><p></p></li><li><p><strong>Use minimal permission scopes</strong>: When connecting to OAuth services, request only the permissions your application needs, not everything available<br></p></li><li><p><strong>Handle API failures gracefully</strong>: Third-party services will eventually fail or change. Design your application to degrade gracefully when this happens.<br><br></p></li></ol><p>Remember that your application is only as secure as its weakest integration. Review each third-party service carefully and follow security best practices for each.</p><h2><strong>Putting it all together</strong></h2><p>Moving from prototype to production requires careful attention to security, reliability, and maintainability. </p><p>By implementing proper authentication and authorization on both client and server, securing your secrets and API keys, validating and sanitizing all input, setting up comprehensive monitoring, and securing your third-party integrations, you'll build a solid foundation for your production application.</p>]]></content:encoded></item><item><title><![CDATA[Vibe Coding for Personal Projects]]></title><description><![CDATA[5 vibe coded projects I use every week]]></description><link>https://blog.techforproduct.com/p/vibe-coding-for-personal-projects</link><guid isPermaLink="false">https://blog.techforproduct.com/p/vibe-coding-for-personal-projects</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 26 Mar 2025 01:53:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cnmg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live courses, <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations </a>and <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>There&#8217;s been some mixed opinions recently on if AI coding tools can build real software. In this post, I thought it would be fun to share what I&#8217;ve built so far as inspiration on how far you can go. We&#8217;ll start with the simplest apps and increase the complexity as we go.</p><h2><strong>Substack Image Resizer + Video to GIF Converter</strong></h2><p>These two apps are quick utilities I made for myself to solve a recurring problem. The first was that Substack has specific file sizes it wants for uploaded images. I typically design my images in another program without thinking about dimensions, and converting the cover photo to Substack&#8217;s preferred size was a nuisance.</p><p>Here&#8217;s what I built:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cnmg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cnmg!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 424w, https://substackcdn.com/image/fetch/$s_!cnmg!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 848w, https://substackcdn.com/image/fetch/$s_!cnmg!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 1272w, https://substackcdn.com/image/fetch/$s_!cnmg!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cnmg!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif" width="928" height="735" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:735,&quot;width&quot;:928,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cnmg!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 424w, https://substackcdn.com/image/fetch/$s_!cnmg!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 848w, https://substackcdn.com/image/fetch/$s_!cnmg!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 1272w, https://substackcdn.com/image/fetch/$s_!cnmg!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa973c750-5334-4d63-86e8-a8e3fb415828_928x735.gif 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>This app takes in an image, detects the background color, and creates resized images for each of Substack&#8217;s publication styles. Then, I just download the image and upload to Substack!</p><p>The next problem was that Substack has very small file size restrictions for GIFs. I actually spent multiple hours trying different tools to convert videos, only for Substack to reject them.</p><p> Finally, I decided to solve this myself:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IZoA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IZoA!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!IZoA!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!IZoA!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!IZoA!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IZoA!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif" width="907" height="525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:907,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IZoA!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!IZoA!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!IZoA!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!IZoA!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6275c4-7f3c-46fc-899f-13b73d742d59_907x525.gif 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>Each tool only took a few prompts and worked better than any solution I was able to find. I now use these weekly to share content with all of you!</p><p>The stack for both of these is very similar:</p><ol><li><p>Python</p></li><li><p>Streamlit</p></li><li><p>Deployed via Replit</p></li></ol><p>Python excels at data driven or operational tasks like handling image and video files, so it was a good choice. As of today, Replit is still the only platform that supports Python projects.</p><h2><strong>AI Prototyping Showcase</strong></h2><p>As part of my Maven course, I decided to try a User Generated Content loop. The basic idea here is that I would find something students can submit that would drive impressions, more people would see the course, and I&#8217;d increase enrollments. Those new students would submit content, and the whole loop would continue.</p><p>The best idea I had was a collection of student submitted vibe coded projects &#8211; they&#8217;re fun to explore and give students a good understanding of what they can ship by the end of the course. (Check it out <a href="https://showcase.techforproduct.com/showcase?project=cm7tzr6n1003b14lh68tw33t3">here</a>)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YfUm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YfUm!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!YfUm!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!YfUm!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!YfUm!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YfUm!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif" width="907" height="525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:907,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YfUm!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!YfUm!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!YfUm!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!YfUm!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4daff80-a442-43b6-99fd-eba2d0d1920a_907x525.gif 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>Features include multiple image files, Youtube embeds, voting, and a project submission.</p><p>To build this, I started with Bolt and pulled many components from <a href="http://21st.dev">21st.dev</a>. Once I was happy with the client side app, I exported the code to my computer and continued with Cursor to set up the server and database. </p><p>For this project I used an Express server and PostgreSQL db. The whole app is stored in Github, which triggers automatic deployments to Railway. This is my preferred stack at the moment &#8211; Railway provides an easy hosting platform that can host everything (client, server, db) with updates pushed directly from Github.</p><h2><strong>Maven Referral System</strong></h2><p>Another growth loop Ive explored is referrals. At the moment, Maven does not have a referral system, so I decided to build my own. This app allows users to create an account, generate a unique referral code, and track page views with their links.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UGYs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UGYs!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!UGYs!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!UGYs!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!UGYs!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UGYs!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif" width="907" height="525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:907,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UGYs!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!UGYs!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!UGYs!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!UGYs!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3a193c3-f12b-41bf-989c-110bae9c97eb_907x525.gif 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>I built this entirely in Replit. It includes a Stripe integration, auth, and events storage for analytics. The best part is that the referral link generation is automatic, saving me time from creating these manually for students. This app probably took me 4-6 hours in total and has driven about a dozen enrollments so far.</p><h2><strong>AutoLive.ai</strong></h2><p>AutoLive is one of the more complex apps I&#8217;ve built. I started this project in Lovable and swapped over to Cursor about 70% of the way through the project. Because Lovable has a 2 way Github sync, switching between tools is extremely easy.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zaMW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zaMW!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!zaMW!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!zaMW!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!zaMW!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zaMW!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zaMW!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 424w, https://substackcdn.com/image/fetch/$s_!zaMW!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 848w, https://substackcdn.com/image/fetch/$s_!zaMW!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 1272w, https://substackcdn.com/image/fetch/$s_!zaMW!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c3f303-2114-4dd0-8351-90ee55cb6638_907x525.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>AutoLive is basically a custom version of Google Slides for live courses. I can do all the normal stuff - add text, images, etc. In addition, I can run polls, Q&amp;A, and embed other sites.</p><p>The embed part is really the main feature I wanted. It allows me to create other custom content with tools like v0 and Bolt, deploy that content to the web, and then add it as a slide in my presentation. I have a few really cool slides, like an API request tool that has a built in AI assistant.</p><p>This project also includes a bunch of realtime features &#8211; for example, when I swap slides, it automatically moves all students with me. I can see how many students are connected to the session and have real time votes and questions. The backend for this project is entirely hosted in Supabase.</p><h2><strong>Putting It All Together</strong></h2><p>Hopefully this quick overview of some of the things I&#8217;ve built has helped show you that these tools are good enough to build your own apps. </p><p>Yes, you need to be more technical to really make fast progress, but AI enables anyone to make progress. I&#8217;d still encourage you to learn the fundamentals, but if vibe coding gets you started, then dive right in!</p>]]></content:encoded></item><item><title><![CDATA[Building a Component Library]]></title><description><![CDATA[Three steps to high quality AI prototypes]]></description><link>https://blog.techforproduct.com/p/building-a-component-library</link><guid isPermaLink="false">https://blog.techforproduct.com/p/building-a-component-library</guid><dc:creator><![CDATA[Colin Matthews]]></dc:creator><pubDate>Wed, 19 Mar 2025 02:20:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/71b9adcf-57ab-443b-8a47-72c66baa01b7_642x362.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Hey, I&#8217;m Colin! I help PMs and business leaders improve their technical skills through real-world case studies. For more, check out my live courses, <a href="https://maven.com/tech-for-product/tech-fundamentals">Technical Foundations </a>and <a href="https://maven.com/tech-for-product/ai-prototyping-for-product-managers">AI Prototyping.</a></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.techforproduct.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.techforproduct.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>One of the main challenges when using tools like Bolt, v0, and Lovable is getting a consistent look that closely matches your product. In this short post, I&#8217;ll walk through how you can create a reusable component library to quickly assemble unique prototypes over and over.</p><p>We&#8217;ll be using Airbnb and v0 as an example.</p><h2><strong>Step 1: Planning the Component Library</strong></h2><p>First, I provided v0 with the following prompt with a screenshot of the Airbnb home page:</p><pre><code><code>You are tasked with creating a component library based on a screenshot, using React and Tailwind CSS. All components should be custom-made to match the screenshot as closely as possible.

Follow these instructions carefully: 
Analyze the provided screenshot.Identify distinct UI components in the screenshot. These may include, but are not limited to:
Buttons
Input fields
Navigation bars
Cards
Modals
Typography elements

For each identified component: a. Create a React functional component b. Use Tailwind CSS classes to style the component, matching the visual design in the screenshot c. Ensure the component is responsive and accessible d. Add any necessary props for customization e. Include a brief comment describing the component's purpose

After creating all individual components, the app.tsx file should import and display all components. Do not try to match the screenshot ui &#8211; only display a list of components.

Remember to use only custom-made components and Tailwind CSS classes. Do not use any external libraries or pre-built components. Strive to match the visual design in the screenshot as closely as possible while maintaining good coding practices and component reusability.</code></code></pre><p>This prompt tells v0 to focus on building individual components, rather than replicating the actual layout from the screenshot. We end up with a list of components like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!izzq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!izzq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png 424w, https://substackcdn.com/image/fetch/$s_!izzq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png 848w, https://substackcdn.com/image/fetch/$s_!izzq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png 1272w, https://substackcdn.com/image/fetch/$s_!izzq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!izzq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png" width="1115" height="774" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:774,&quot;width&quot;:1115,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!izzq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png 424w, https://substackcdn.com/image/fetch/$s_!izzq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png 848w, https://substackcdn.com/image/fetch/$s_!izzq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.png 1272w, https://substackcdn.com/image/fetch/$s_!izzq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F968cbc74-411d-4d3e-ae96-74ec3c9c587e_1115x774.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>From the initial set of components, I continued passing in additional screenshots until I felt I had captured enough.</p><p>Here&#8217;s the full set:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RME5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RME5!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 424w, https://substackcdn.com/image/fetch/$s_!RME5!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 848w, https://substackcdn.com/image/fetch/$s_!RME5!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 1272w, https://substackcdn.com/image/fetch/$s_!RME5!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RME5!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif" width="810" height="524" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:524,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5395427,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/159383602?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RME5!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 424w, https://substackcdn.com/image/fetch/$s_!RME5!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 848w, https://substackcdn.com/image/fetch/$s_!RME5!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 1272w, https://substackcdn.com/image/fetch/$s_!RME5!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc4e438f-3467-4882-aa6b-15bcc25598c2_810x524.gif 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>Note that these components don&#8217;t match one-to-one on the initial prompt, but we can continue to improve on them if we want.</p><h2><strong>Step 2: Refining UI Components</strong></h2><p>The wonderful thing about this approach is that it allows you to make visual edits to your components <em>before</em> you use them in an actual prototype. This lowers the complexity of making changes and makes it much more likely your prompts will actually work. For example, I used the visual inspector to improve the Airbnb header. Here&#8217;s a quick before and after:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NV2r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NV2r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png 424w, https://substackcdn.com/image/fetch/$s_!NV2r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png 848w, https://substackcdn.com/image/fetch/$s_!NV2r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png 1272w, https://substackcdn.com/image/fetch/$s_!NV2r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NV2r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png" width="1456" height="770" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:770,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NV2r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png 424w, https://substackcdn.com/image/fetch/$s_!NV2r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png 848w, https://substackcdn.com/image/fetch/$s_!NV2r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.png 1272w, https://substackcdn.com/image/fetch/$s_!NV2r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcb0a562-5075-473e-8212-78daf6a8b6fa_1600x846.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>Trying to make similar changes in an existing prototype can sometimes be a frustrating battle of pushing the AI to make the correct changes to the correct files. Because we start with independent component files, v0 has no problem identifying and changing one file at a time.<br></p><h2><strong>Step 3: Building With Our Components</strong></h2><p>Now we&#8217;re ready to use our components. Before continuing, make sure you fork the project to create a new copy. This allows you to return back to your component library as often as you want to create new ideas without redoing the work.<br><br>In my case, I asked v0 to imagine a new and creative homepage for Airbnb using my components. Here&#8217;s what I got:</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_!pw2C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pw2C!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 424w, https://substackcdn.com/image/fetch/$s_!pw2C!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 848w, https://substackcdn.com/image/fetch/$s_!pw2C!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 1272w, https://substackcdn.com/image/fetch/$s_!pw2C!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pw2C!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif" width="810" height="518" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:518,&quot;width&quot;:810,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5207747,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.techforproduct.com/i/159383602?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pw2C!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 424w, https://substackcdn.com/image/fetch/$s_!pw2C!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 848w, https://substackcdn.com/image/fetch/$s_!pw2C!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 1272w, https://substackcdn.com/image/fetch/$s_!pw2C!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4413cb09-d334-48b7-95c3-d5d4a4131d11_810x518.gif 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><strong>Results and Benefits</strong></h2><p>Now that we have our component library, we can have a centralized source of truth for our prototypes. At any point, we can make updates to the library and copy those changes over to our forks, maintaining the improvements over time.</p><p>This results in a few significant benefits:</p><h3><strong>1. Consistent design language</strong></h3><p>All prototypes maintained perfect consistency with our design system since they used the same underlying components. This allows you to invest once upfront in build high-quality components that are easy to reuse.</p><h3><strong>2. Easier iteration</strong></h3><p>When feedback required changes, you can modify specific components without rebuilding entire screens. These component updates could then be used in all future prototypes.</p><h3><strong>3. Faster onboarding for team members</strong></h3><p>Getting your team started with AI prototyping can be challenging. By providing a baseline set of components, they can start expressing their ideas right away with visually impressive prototypes.</p><p></p><p>Although this approach takes a bit more upfront work, I think you&#8217;ll find it quickly becomes worth it when prototyping the same application more than once. Give it a try and let me know how it goes!</p>]]></content:encoded></item></channel></rss>