<?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[Liminal Labs, the blog]]></title><description><![CDATA[Fever dreams on AI + DevOps. 
From the team @ Liminal Labs, a boutique consulting firm: https://www.liminal.sh/]]></description><link>https://blog.limo.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!jO0y!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d1cc814-3c7a-400c-9fc7-6cd1e14312eb_200x200.jpeg</url><title>Liminal Labs, the blog</title><link>https://blog.limo.dev</link></image><generator>Substack</generator><lastBuildDate>Thu, 23 Apr 2026 13:14:08 GMT</lastBuildDate><atom:link href="https://blog.limo.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Liminal Labs]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[liminallabs@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[liminallabs@substack.com]]></itunes:email><itunes:name><![CDATA[Liminal Labs]]></itunes:name></itunes:owner><itunes:author><![CDATA[Liminal Labs]]></itunes:author><googleplay:owner><![CDATA[liminallabs@substack.com]]></googleplay:owner><googleplay:email><![CDATA[liminallabs@substack.com]]></googleplay:email><googleplay:author><![CDATA[Liminal Labs]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The $350 Free Tier]]></title><description><![CDATA[Recently we&#8217;ve been working on a project where we need to take over hosting of a mobile app backend.]]></description><link>https://blog.limo.dev/p/the-350-free-tier</link><guid isPermaLink="false">https://blog.limo.dev/p/the-350-free-tier</guid><dc:creator><![CDATA[Austin Montoya]]></dc:creator><pubDate>Tue, 28 Oct 2025 20:17:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6ffcd9ea-9d12-4169-9a30-b8256fde6b4b_480x480.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently we&#8217;ve been working on a project where we need to take over hosting of a mobile app backend. For push notifications, the app is using Azure Notification Hub to support sending messages to both iOS and Android. The Notification Hub resided in the original developer&#8217;s personal Azure subscription; we wanted all the resources going forward to be in our client&#8217;s dedicated organizational subscriptions.</p><p>In any sane managed notifications service, this task would not come with any surprises. Yet &#8220;sane&#8221; and Azure rarely coexist in the same sentence. And so began a dark descent into pricing madness.</p><h2>Setting up the resources</h2><p>I&#8217;ve worked with AWS SNS and Twilio before. However, this was the first time working with Azure Notification Hub. As such, I felt like a &#8220;clickops&#8221; run to set up the hub for a development environment would be a good first step.</p><p>When opening the menu, there are a handful of options:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E0Yp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E0Yp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 424w, https://substackcdn.com/image/fetch/$s_!E0Yp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 848w, https://substackcdn.com/image/fetch/$s_!E0Yp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!E0Yp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E0Yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png" width="1146" height="1378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1378,&quot;width&quot;:1146,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:181354,&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.limo.dev/i/177406639?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.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_!E0Yp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 424w, https://substackcdn.com/image/fetch/$s_!E0Yp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 848w, https://substackcdn.com/image/fetch/$s_!E0Yp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!E0Yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97a7de66-0982-4b12-a09a-c958a8389c2b_1146x1378.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Perfect, it defaults to the Free Tier! I&#8217;m sure the rest of the defaults are fine, too. &#8220;Additional costs apply&#8221; next to a checkbox... that&#8217;s probably just a CYA clause for usage beyond the free limits. No big deal.</p><p>And with a couple clicks, boom, a new Notification Hub was born, ready to spam your phone with weekly deals &#8211; err, I mean totally valuable personalized content that transforms your shopping experience. Plugging in the Apple and Google keys was a breeze, and we quickly moved on to other infrastructure tasks for the project.</p><p><em>Maybe Azure isn&#8217;t so bad after all</em>, we thought &#129300;</p><p>Then the bill came.</p><h2>Your monthly statement is ready</h2><p>A few weeks later, Anthony, who monitors our cloud spend as part of a weekly cashflow review, noticed something unusual: Our Microsoft invoice went from $2.99 in July to almost $250 in August!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5gES!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5gES!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png 424w, https://substackcdn.com/image/fetch/$s_!5gES!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png 848w, https://substackcdn.com/image/fetch/$s_!5gES!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png 1272w, https://substackcdn.com/image/fetch/$s_!5gES!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5gES!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png" width="1196" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1196,&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_!5gES!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png 424w, https://substackcdn.com/image/fetch/$s_!5gES!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png 848w, https://substackcdn.com/image/fetch/$s_!5gES!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.png 1272w, https://substackcdn.com/image/fetch/$s_!5gES!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd93b6499-6c05-4426-8fd5-0d741dd77e10_1196x740.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>Our first thought was, &#8220;Oh, maybe this is a Microsoft 365 subscription trial we forgot to cancel or something.&#8221; But alas, opening the bill revealed a more grim truth: our Azure costs had skyrocketed. What the hell was going on?</p><p>Fortunately, Azure does have a fairly good cost explorer, which we were able to use to narrow down the culprit pretty quickly:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6oeY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6oeY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png 424w, https://substackcdn.com/image/fetch/$s_!6oeY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png 848w, https://substackcdn.com/image/fetch/$s_!6oeY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png 1272w, https://substackcdn.com/image/fetch/$s_!6oeY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6oeY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png" width="547" height="286" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29bcc555-4497-47d5-a381-8a088fb94495_547x286.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:286,&quot;width&quot;:547,&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_!6oeY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png 424w, https://substackcdn.com/image/fetch/$s_!6oeY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png 848w, https://substackcdn.com/image/fetch/$s_!6oeY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.png 1272w, https://substackcdn.com/image/fetch/$s_!6oeY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29bcc555-4497-47d5-a381-8a088fb94495_547x286.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>But&#8230; I thought we were on the free tier? Why was Notification Hub costing $240?</p><h2>Finding the root cause</h2><p>One more plug for Azure&#8217;s Cost Explorer. It seems the most pleasant thing about using Azure is how easy it is to find where your money&#8217;s being wasted. Anyway, in this case, we hopped into a different view that breaks down charges by service and 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_!DBf7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DBf7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png 424w, https://substackcdn.com/image/fetch/$s_!DBf7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png 848w, https://substackcdn.com/image/fetch/$s_!DBf7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png 1272w, https://substackcdn.com/image/fetch/$s_!DBf7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DBf7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png" width="1385" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:452,&quot;width&quot;:1385,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73079,&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;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DBf7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png 424w, https://substackcdn.com/image/fetch/$s_!DBf7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png 848w, https://substackcdn.com/image/fetch/$s_!DBf7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.png 1272w, https://substackcdn.com/image/fetch/$s_!DBf7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd48cded4-ac80-4ae8-8918-25358d223d7d_1385x452.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>Availability Zones? For Notification Hub? What does that even mean?</p><p>To understand where we went wrong, we revisited the clickops process we followed, and sure enough, there it was, hiding in plain sight:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zEg-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zEg-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 424w, https://substackcdn.com/image/fetch/$s_!zEg-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 848w, https://substackcdn.com/image/fetch/$s_!zEg-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 1272w, https://substackcdn.com/image/fetch/$s_!zEg-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zEg-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png" width="1456" height="250" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:250,&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_!zEg-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 424w, https://substackcdn.com/image/fetch/$s_!zEg-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 848w, https://substackcdn.com/image/fetch/$s_!zEg-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 1272w, https://substackcdn.com/image/fetch/$s_!zEg-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbdb3f3e-a7f1-478d-99e6-887a29604345_1600x275.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Hmm, yes, at this point, I <em>would</em> like to learn more &#129488;.</p><p>Opening the link, you are taken to a page that helpfully documents the <a href="https://learn.microsoft.com/en-us/azure/reliability/reliability-notification-hubs">Availability Zones feature for Notification Hub</a>. Great, I can confirm we don&#8217;t need it for sending weekly deals out to a few hundred regional users. If messages temporarily can&#8217;t be sent due to an Azure outage, we can easily redeliver them from the backend later by triggering the automated workflow built for that purpose.</p><p>Now, let&#8217;s try to find this pricing info&#8230; Oh wait, the price isn&#8217;t on this page. It looks like I need to go to the <a href="https://azure.microsoft.com/en-us/pricing/details/notification-hubs/">Notification Hubs pricing page</a> to find out. And finally, lo and behold, we&#8217;ve found the costs!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xcl-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xcl-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 424w, https://substackcdn.com/image/fetch/$s_!xcl-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 848w, https://substackcdn.com/image/fetch/$s_!xcl-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 1272w, https://substackcdn.com/image/fetch/$s_!xcl-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xcl-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png" width="604" height="230" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:230,&quot;width&quot;:604,&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_!xcl-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 424w, https://substackcdn.com/image/fetch/$s_!xcl-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 848w, https://substackcdn.com/image/fetch/$s_!xcl-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 1272w, https://substackcdn.com/image/fetch/$s_!xcl-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b2b5b60-9e1d-42c3-90e7-eec927607044_604x230.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>So, uh, yeah, we did screw up, I guess. Whoops.</p><h2>Did we say free? Our bad!</h2><p>For me, this didn&#8217;t sit right. Why was that checkbox enabled by default on the Free Tier? Furthermore, what kind of user doesn&#8217;t care about an SLA, but is concerned about automatic failover of their push notifications, enough to to spend $350 / month for that peace of mind?</p><p>It felt like a pretty big oversight at best, and perhaps an intentional, <a href="https://en.wikipedia.org/wiki/Dark_pattern">dark pattern</a> at worst.</p><p>After a little bit of research, I am leaning towards the latter. Apparently, in some regions, this feature is not only <a href="https://learn.microsoft.com/en-us/answers/questions/2200755/availability-zone-enabled-for-notification-hub-eve">enabled by default; it can&#8217;t be disabled either</a>. And why is the default via Azure&#8217;s REST API set to &#8220;Disabled&#8221;, but the checkbox is <em>enabled</em> by default on the Azure Portal?</p><p>Regardless of intentionality, I felt wronged. I opened a refund request, which, like cost analysis, was unusually pleasant compared to Azure&#8217;s actual cloud services. Later that afternoon, I got a response that our refund was being processed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yneS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yneS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png 424w, https://substackcdn.com/image/fetch/$s_!yneS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png 848w, https://substackcdn.com/image/fetch/$s_!yneS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png 1272w, https://substackcdn.com/image/fetch/$s_!yneS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yneS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png" width="1300" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1300,&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_!yneS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png 424w, https://substackcdn.com/image/fetch/$s_!yneS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png 848w, https://substackcdn.com/image/fetch/$s_!yneS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.png 1272w, https://substackcdn.com/image/fetch/$s_!yneS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feba8bb38-6258-405c-8c2d-67e40ca0e50e_1300x870.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>Hooray! Money saved! Time wasted! At least it&#8217;s over.</p><h2>Not even IaC is safe</h2><p>Surely, avoiding this would be easy the next time we set it up as IaC, right? In reality, it was just more transparent. Pulumi&#8217;s <em>example code</em> for creating an Azure Notification Hub enables the availability zone cost, once again segmented away from the Free/Basic/Standard price tiering.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gqoE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gqoE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png 424w, https://substackcdn.com/image/fetch/$s_!gqoE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png 848w, https://substackcdn.com/image/fetch/$s_!gqoE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png 1272w, https://substackcdn.com/image/fetch/$s_!gqoE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gqoE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png" width="681" height="268" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:268,&quot;width&quot;:681,&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_!gqoE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png 424w, https://substackcdn.com/image/fetch/$s_!gqoE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png 848w, https://substackcdn.com/image/fetch/$s_!gqoE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.png 1272w, https://substackcdn.com/image/fetch/$s_!gqoE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47d758f9-ef60-4924-b3bd-95bf06e5b75d_681x268.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>Combined with the default SKU cost, a hasty developer copy-pasting Pulumi&#8217;s template code will opt in to $550/month. If we hadn&#8217;t already been snagged by the clickops implementation, it&#8217;s easy to see how this could have slipped through, too.</p><p>What&#8217;s more is the inconsistency between tools. When we eventually moved the project to Terraform, we noticed Terraform takes a more reasonable &#8216;opt-in&#8217; approach to the added availability zone cost. Microsoft even leaves it disabled in <a href="https://learn.microsoft.com/en-us/azure/notification-hubs/create-notification-hub-terraform?tabs=azure-cli">their own Terraform tutorial</a>. Still, we&#8217;ve learned not to let our guard down.</p><h2>How you can avoid large bills with Azure</h2><p>Don&#8217;t use it. Plain and simple.</p><p>I&#8217;ve spent nearly $2000 in the last year on development resources that were misconfigured. Not obscure niche services &#8211; these were marquee, bread-and-butter infrastructure offerings, like managed SQL databases and file storage mounts.</p><p>Every time, the expense came down to some dark UX nonsense like the single checkbox on Notification Hub, or an incorrect setting in Terraform/Bicep.</p><p>Indeed, refunds were sometimes issued, but reactively playing whack-a-mole with hidden costs creates unplanned work for my team to deal with, which is <strong>not</strong> free. In this case, aside from investigating the bill, we had to completely delete and recreate the Notification Hub Namespace, then update the backend services with new settings, all to avoid spending $3600 / year on something that has zero value to our client.</p><p>If you are in a position where you can make a decision on a cloud vendor, stay away from Azure. You or your developers <em>will</em> 100% misconfigure it. You <em>will</em> waste money reworking resources, contacting support for refunds, and hiring consultants to help clean up the inevitable mess that gets created.</p><p>If you&#8217;re already using Azure, good luck. I hope you know what you&#8217;re doing. Definitely set up some cost alerts, and perhaps learn some meditation.</p>]]></content:encoded></item><item><title><![CDATA[Pausing Limo]]></title><description><![CDATA[A postmortem on bootstrapping an DevOps startup in the age of AI]]></description><link>https://blog.limo.dev/p/pausing-limo</link><guid isPermaLink="false">https://blog.limo.dev/p/pausing-limo</guid><dc:creator><![CDATA[Liminal Labs]]></dc:creator><pubDate>Fri, 03 Oct 2025 21:11:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Q3v3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q3v3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q3v3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png 424w, https://substackcdn.com/image/fetch/$s_!Q3v3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png 848w, https://substackcdn.com/image/fetch/$s_!Q3v3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png 1272w, https://substackcdn.com/image/fetch/$s_!Q3v3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q3v3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png" width="1456" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;\&quot;Pause\&quot; button over a marketing website that is turning into static&quot;,&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="&quot;Pause&quot; button over a marketing website that is turning into static" title="&quot;Pause&quot; button over a marketing website that is turning into static" srcset="https://substackcdn.com/image/fetch/$s_!Q3v3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png 424w, https://substackcdn.com/image/fetch/$s_!Q3v3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png 848w, https://substackcdn.com/image/fetch/$s_!Q3v3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.png 1272w, https://substackcdn.com/image/fetch/$s_!Q3v3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F42653701-947d-4b5b-8b4e-e8045ffd9d49_1594x926.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>This is a sad but necessary post:</p><p>We&#8217;ve halted current development and user testing with Limo. There are a number of reasons why it didn&#8217;t work out. I&#8217;ll dive into each one in this post, and touch on what&#8217;s next for the team.</p><h2>Product Market Fit</h2><p>We ran into a few classic product pitfalls. A lot of these stemmed from relying too much on my own experience and intuition. As a flimsy defense, there probably <em>is</em> at least some value in those. Limo was born originally to help automate repetitive, error-prone tasks like setting up and maintaining infrastructure in AWS, ones that I found myself doing over and over again.</p><p>In reality, the particular pain points of DevOps seem to vary greatly because of its broad scope and definition. For example, this is <a href="https://about.gitlab.com/topics/devops/#dev-ops-methodology">how GitLab defines DevOps</a>:</p><blockquote><p>DevOps is a combination of software development (dev) and operations (ops). It is defined as a software engineering methodology which aims to integrate the work of development teams and operations teams by facilitating a culture of collaboration and shared responsibility.</p></blockquote><p>What is a development team? An operations team? What is the difference between dev and ops? Which one better describes the process of writing Terraform or other types of Infrastructure as Code?</p><p>The answers to these questions are not categorical. There&#8217;s no single standard, or even 2-3 competing ones, that can be applied easily to describe all DevOps practices. Naively, this lack of standardization seemed like <em>the</em> problem to solve. I&#8217;ve seen so much time wasted at nearly every job I&#8217;ve had dealing with bespoke CI/CD pipelines, infrastructure as code, ways of searching logs, and handling on-call duties.</p><p>Unfortunately, we should have looked for <em>a</em> problem to solve, tied to real potential customers or users. Instead, we built working prototypes covering way too much ground: for infrastructure setup. Deployments. Connecting to AWS, Netlify, and Github (and connecting them to each other). We had user-authorable &#8220;routines&#8221; to easily automate repetitive tasks. An optimizer workflow to discover savings opportunities. A troubleshooting one to analyze and correlate log searches. A Slack plugin and full Web UI. An MCP integration.</p><p>It was a mess. Even with four full-time, relatively experienced developers, and AI tools to help accelerate development (or perhaps because of them), the features&#8217; demands exceeded our ability to support them.</p><p>Generative AI opens new possibilities, but it doesn&#8217;t change the need to focus on solving one problem really, really well, instead of solving many problems poorly.</p><p>A smarter approach would have been to narrow in on a more particular problem by engaging with several potential customers early, identifying common pain points, and seeing what solving these pain points was worth to them. An outreach-driven approach would have given us a starting point to find one thing to focus on and excel at. We had a list of over 100 friends and former co-workers to start with, many of whom had already expressed interest in learning more.</p><p>We waited to talk to them, which I deeply regret. I&#8217;ve only recently realized, irrationally, I thought that having demos in hand would be a prerequisite to being taken seriously, or getting good feedback.</p><p>This is just not true in hindsight. There are a decent amount of investors who will hear an early pitch without a product existing at all. The bar for talking to former colleagues is even lower than that.</p><p>Regardless, by the time we <em>did </em>ramp up outreach, and open up access, we had trouble getting more than a handful of users to try it! The feedback we got from developers was that they weren&#8217;t sure what to do with the product, or if it even solved a problem for them.</p><p>These combined factors meant we needed several more iterations to reach an MVP. With a few more months of runway, it&#8217;s possible we could have started tuning Limo toward serving a particular development community or industry. But our funding dried up before we were able to find out.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lv3s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lv3s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!Lv3s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!Lv3s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!Lv3s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lv3s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20878b78-55ae-4f85-b713-aba317325c27_1456x816.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Woman in VR headgear in soft purple-blue light playing a video game&quot;,&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="Woman in VR headgear in soft purple-blue light playing a video game" title="Woman in VR headgear in soft purple-blue light playing a video game" srcset="https://substackcdn.com/image/fetch/$s_!Lv3s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png 424w, https://substackcdn.com/image/fetch/$s_!Lv3s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png 848w, https://substackcdn.com/image/fetch/$s_!Lv3s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.png 1272w, https://substackcdn.com/image/fetch/$s_!Lv3s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20878b78-55ae-4f85-b713-aba317325c27_1456x816.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">Like VR + anything, AI + DevOps is still mostly a solution looking for a problem.</figcaption></figure></div><h3>Lessons Learned</h3><ol><li><p><em>Solve a specific problem well, not a broad problem poorly</em></p></li><li><p><em>Outreach leads to problems worth solving</em></p></li><li><p><em>Don&#8217;t wait for a demo to be ready to engage</em></p></li></ol><h2>Funding Issues</h2><p>If you ignore sweat equity, Limo was completely bootstrapped from the cashflow of Liminal Labs, a boutique consulting agency I started in 2023. Liminal Labs was/is niche and, realistically, not a huge cash cow. I don&#8217;t value our time very well, and we&#8217;re bad at marketing.</p><p>Anyway, to make Limo happen, we offboarded most of our clients. This crippled our revenue but freed up engineers.</p><p>Anthony, Liminal&#8217;s longtime employee, prepares a cashflow report we&#8217;ve reviewed weekly for the last two years. This meant we knew what we were getting into to some degree. We braced for impact, while simultaneously plotting a careful escape route toward a seed round.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hTkk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hTkk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png 424w, https://substackcdn.com/image/fetch/$s_!hTkk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png 848w, https://substackcdn.com/image/fetch/$s_!hTkk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png 1272w, https://substackcdn.com/image/fetch/$s_!hTkk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hTkk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png" width="952" height="690" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:690,&quot;width&quot;:952,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;graph showing \&quot;remaining cash\&quot; rapidly declining while \&quot;progress towards MVP\&quot; slowly rises&quot;,&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="graph showing &quot;remaining cash&quot; rapidly declining while &quot;progress towards MVP&quot; slowly rises" title="graph showing &quot;remaining cash&quot; rapidly declining while &quot;progress towards MVP&quot; slowly rises" srcset="https://substackcdn.com/image/fetch/$s_!hTkk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png 424w, https://substackcdn.com/image/fetch/$s_!hTkk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png 848w, https://substackcdn.com/image/fetch/$s_!hTkk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.png 1272w, https://substackcdn.com/image/fetch/$s_!hTkk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff164c804-134e-4a0c-b6a0-a46c9f3b3c87_952x690.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">Spending money is easy. Making progress, less so.</figcaption></figure></div><p>Pretty much immediately, everyone faced reduced or no wages. We had to let go of our junior engineer (which I still feel terrible about). Those of us left were motivated and full of adrenaline. But the reality was sobering: We had started a countdown timer that couldn&#8217;t easily be stopped. We had to find some kind of revenue or funding by the end of August or it was over.</p><p>To us, that meant quickly making something we thought people would want to use, getting feedback knowing we&#8217;d be wrong, and iterating to close the gap. Using all these awesome AI-integrated tools like <a href="https://devin.ai/">Devin</a> and <a href="https://windsurf.com/">Windsurf</a> would surely speed up development. Maybe along the way, we&#8217;d get lucky and meet some investors.</p><p>Indeed we did have some contact with a few investors. We also received deep, meaningful feedback on our pitch and demo from former friends and colleagues experienced in startups, venture capital, technical leadership, and more. These people were more than generous with their time. If you&#8217;re reading, thanks again for your help!</p><p>Everyone&#8217;s concerns were consistent and clear: competition from bigger players, no existing traction, a lack of a track record or founder with a previous exit, no particular expertise in AI or accolades in DevOps.</p><p>Undermining things further was our own lack of confidence that what we had was ready for customers. It&#8217;s hard to market or pitch something you&#8217;re not confident in yet. I can be confident, but it has to be authentic. I&#8217;d have been lying if I endorsed Limo in the state it was in back then. Early on, Devin had created a lot of slop for us to clean up. Quality sucked. It wasn&#8217;t worth paying for.</p><p>Improvements had to be made before it was ready. To compensate, we worked tirelessly on features and bugfixes. We sharpened our pitch deck and demo. We applied to startup accelerators over and over, occasionally receiving a polite rejection back. We eventually started getting help from <a href="https://www.linkedin.com/in/brendanmortimer/">Mort</a>, an actual, really good product owner, which re-energized things for a bit.</p><p>But there&#8217;s a cold and cruel reality to cash and once we ran frighteningly low on it, we had to lean back into consulting. We attempted to rebuild a sales pipeline, got some small deals, and made it close to some bigger ones that never panned out. It felt wrong, it <em>was</em> wrong, but I wasn&#8217;t sure what else to do. We couldn&#8217;t skip paychecks forever.</p><p>All these side quests ultimately ended up being counterproductive. I spent critical time away from Limo when we needed more thought put into features, quality, and business development.</p><p>We didn&#8217;t meet our dream investors quickly enough, nor did we generate enough sales to buoy things. In the midst of our first batch of user testing, we ran out of cash to continue working on Limo while keeping Liminal Labs solvent. Game over &#128126;</p><h3>Lessons Learned</h3><ol><li><p><em>To get investment, you need relevance, credibility, or traction</em></p></li><li><p><em>AI development tools bring down costs less than anticipated</em></p></li><li><p><em>Don&#8217;t get distracted with side quests</em></p></li></ol><h2>Learning Curve</h2><p>As a software engineer, I consider myself to be more of a generalist. I&#8217;ve built apps on the web, mobile, and desktop; on touchscreen kiosks, room-sized imaging equipment, and Kinect-powered basketball courts deployed to shopping malls in China. I&#8217;ve worked on C# monoliths and Python microservices. Maintained Kubernetes clusters and multi-tenant cloud platforms. My specialties tend to follow the technologies and domains of the projects I&#8217;m working on, over any specific languages and tools I prefer working with.</p><p>While some had rougher learning curves than others, in the end, I&#8217;ve been able to become proficient enough to succeed in most types of software development. Troubleshooting and reverse engineering in particular are useful muscles one can build up to solve many kinds of technical problems. This is because in traditional software, you can find explanations for why something works (or doesn&#8217;t work). When stuck, you can dig through code, ask someone, or recreate a conceptual model of what&#8217;s going on to analyze it further. It may be incredibly frustrating and time-consuming to track down the reasons things work the way they do. It&#8217;s frequently irrational, but it&#8217;s at least deterministic. It&#8217;s possible.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9N1l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9N1l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png 424w, https://substackcdn.com/image/fetch/$s_!9N1l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png 848w, https://substackcdn.com/image/fetch/$s_!9N1l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!9N1l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9N1l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Minimalist drawing/meme of a man trying to fit an \&quot;existing skills\&quot; round coin into the square hole in a box labelled \&quot;AI SDK\&quot;&quot;,&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="Minimalist drawing/meme of a man trying to fit an &quot;existing skills&quot; round coin into the square hole in a box labelled &quot;AI SDK&quot;" title="Minimalist drawing/meme of a man trying to fit an &quot;existing skills&quot; round coin into the square hole in a box labelled &quot;AI SDK&quot;" srcset="https://substackcdn.com/image/fetch/$s_!9N1l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png 424w, https://substackcdn.com/image/fetch/$s_!9N1l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png 848w, https://substackcdn.com/image/fetch/$s_!9N1l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.png 1272w, https://substackcdn.com/image/fetch/$s_!9N1l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbc4be9e-1ccd-457b-ad87-67ff53c09c82_1600x1600.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">Sticking to an old playbook didn&#8217;t work for us.</figcaption></figure></div><p>When building Limo, which ultimately relied on GPT-4, techniques like reverse engineering and troubleshooting proved fairly useless. There were sometimes no explanations to be found, no one to ask, no concepts to latch onto. Models are inherently unpredictable by nature. More often than not, we <strong>were</strong> able to get the model working reliably for a narrow use case, such as queries similar to &#8220;list my repos&#8221;, which listed GitHub repositories by making a tool call using Octokit. The hype is not completely baseless. We found LLMs do perform well under certain conditions.</p><p>The &#8220;certain conditions&#8221; were the problem, however. In our development process, we were never <em>really</em> sure what those conditions were, as they were a moving target. Consequently, we lacked insight into how well Limo worked at any given moment. The UI and backend remained relatively stable thanks to early investments in a lightweight CI/CD pipeline and low-hanging fruit like unit tests and linting.</p><p>But when we&#8217;d integrate and test each other&#8217;s features, instead of merge conflicts, we encountered new types of collisions we&#8217;d never considered, something better described as &#8220;context conflicts&#8221;.</p><p>For example, the &#8220;list my repos&#8221; example before &#8211; under the hood, it was tied to a tool called list_github_repositories. Now imagine that in addition to GitHub, we also added support for AWS&#8217; Elastic Container Registry through exposing a new tool named list_aws_ecr_repostories. What repos should Limo list now: your ECR ones, or your GitHub ones? Or do you mean a <em>different</em> private Docker registry, like Azure Container Registry (ACR)? Or perhaps a different source control provider, like Gitlab?</p><p>Well, all of that kind of depends on context. Like most chat-based interfaces, Limo&#8217;s natural language interface mostly puts context control in the hands of end users. They are the ones driving the conversation topic, not agents. Users&#8217; inputs are often less predictable than LLMs&#8217; outputs.</p><p>We couldn&#8217;t anticipate everything a user might do in a system prompt, or how to exclude context from some situations, but not others. Or when context changes were necessary at all. Or understand the degree to which any given context impacted results. Context management, we found, is both an art and a science, one that requires finer attention to detail and deeper domain understanding than traditional software features.</p><p>Prompt engineering partially mitigated context problems, as did techniques others have written about like <a href="https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html#tool-loadout">tool loadouts</a>. But we didn&#8217;t have a streamlined way of measuring how much any of these improvements actually helped, which massively slowed down progress.</p><p>In reaction to this pain, throughout development, we tried using various LLM observability tools to measure reliability and improve troubleshooting. Eventually we landed on <a href="https://www.comet.com/docs/opik/">Comet&#8217;s Opik</a> after some trial and error.</p><p>Unfortunately, the learning curve on evals was tough for our team, who is more rooted in traditional forms of automated testing. Evals are not like those types of tests at all. Passing and failing is less clear &#8211; it&#8217;s more like an experiment in which you have to design, execute, interpret results, and draw your own conclusions about how the software performed.</p><p>We all agreed that tracing and evals were useful and important. They were worth investing in if we wanted to build a DevOps agent, where reliability and trust are implicit. And now that we&#8217;ve had plenty of hands on-time with LLM observability, it feels like an indispensable component of future AI projects.</p><p>But with few resources and little experience, these technologies kicked our ass. Despite repeated effort and attempts, we weren&#8217;t able to utilize them to improve Limo before running out of money.</p><h3>Lessons Learned</h3><ol><li><p><em>Serious AI-native development has a significant learning curve</em></p></li><li><p><em>Traditional automated tests are insufficient to ensure quality for AI applications</em></p></li><li><p><em>LLM observability is crucial for predictable development cycles</em></p></li></ol><h2>False Confidence</h2><p>Last but not least, we got bitten by something I&#8217;m still bitter about: AI development tools. They really fucked us, and we paid a lot of money for them.</p><p>I&#8217;m not talking about GitHub Copilot or ChatGPT. Those were fine for what they were: chatbots that occasionally wrote useful code snippets or helped work through an idea. At $10-30 / month, they served their purpose well.</p><p>I&#8217;m mostly talking about Devin, the AI &#8220;junior engineer&#8221; we hired for $500 / month. You can ask anyone who I met with back then &#8211; I was singing the praises of agentic coding, how every developer was doomed within a year. With a PR merge rate of ~75%, I was blitzing through features while still being able to handle clients. It seemed all it would take was a well-written Linear issue, and maybe a comment or two, for Devin to create working software.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NCSa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NCSa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!NCSa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!NCSa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!NCSa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NCSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61a7170f-25e7-4462-840d-8d6e014d33f6_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;:null,&quot;alt&quot;:&quot;Absurd, ridiculous looking \&quot;tough\&quot; folks dressed in a hip hop style which clearly doesn't suit them.&quot;,&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="Absurd, ridiculous looking &quot;tough&quot; folks dressed in a hip hop style which clearly doesn't suit them." title="Absurd, ridiculous looking &quot;tough&quot; folks dressed in a hip hop style which clearly doesn't suit them." srcset="https://substackcdn.com/image/fetch/$s_!NCSa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png 424w, https://substackcdn.com/image/fetch/$s_!NCSa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png 848w, https://substackcdn.com/image/fetch/$s_!NCSa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.png 1272w, https://substackcdn.com/image/fetch/$s_!NCSa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a7170f-25e7-4462-840d-8d6e014d33f6_1600x900.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">This is probably what we looked like using Devin.</figcaption></figure></div><p>It turns out, the progress was mostly a delusion. AI psychosis. Whatever you want to call it.</p><p>My weakness was blind faith. The code <em>looked</em> fine. Especially within the context of a single review. I barely noticed the mounting inconsistencies, hallucinations, and bugs that resulted from what I was approving and merging in small chunks. I was focused on tweaking the end result, not following the exhausting, boring details of implementation.</p><p>After a few months, we cancelled Devin in favor of Windsurf. By then, it was clear that trusting our autonomous engineer to go off and work autonomously was hurting more than helping. Windsurf was quite a bit better, as we all were able to &#8220;steer&#8221; the conversation toward actual useful code changes and command executions by watching carefully. Almost like switching to adaptive cruise control from <em><a href="https://www.youtube.com/watch?v=zH39mKBrrP4">Maximum Overdrive</a></em><a href="https://www.youtube.com/watch?v=zH39mKBrrP4">-style self-driving</a>.</p><p>But even then, it was often too easy when stumped, impatient, or simply burned out, to phone things in. To vibe a prompt loosely resembling requirements into Windsurf&#8217;s agent mode and create a Pull Request. Reviewed by busy and unsuspecting teammates, AI slop often <em>looked</em> just fine, getting approved, merged, and deployed with subtle issues.</p><p>Another unsettling concern, both for Limo and AI usage in general: when problems <em>were</em> noticed by another developer, Pull Request authors often disowned their work, explaining how they had assumed Windsurf&#8217;s output to be correct without fully understanding why. With the end of our runway looming closer daily, how does one shrug off surprise and disappointment in a moment like that? Let alone discuss how to move forward, knowing the real work of critical thinking hasn&#8217;t started! Echoes of a <a href="https://publichealthpolicyjournal.com/mit-study-finds-artificial-intelligence-use-reprograms-the-brain-leading-to-cognitive-decline/">recent MIT study</a> stir uncomfortably in my head.</p><p>The end result was that we chased our tail a lot more than we had on any previous project. It was incredibly easy to get a false sense of confidence that the product was further along than it was. That the features would take less time to complete than they did. That the codebase was healthy and not full of hallucinated booby traps that would ensnare us later.</p><p>If we had relied less on AI tools, especially on the backend, I&#8217;m almost certain a version of Limo would be public and generally available today.</p><h3>Lessons Learned</h3><ol><li><p><em>Trusting AI without verifying is a bad idea</em></p></li><li><p><em>AI tools provide negative value when used incorrectly</em></p></li><li><p><em>Human-in-the-loop is still critical for effective AI use</em></p></li></ol><h2>What&#8217;s Next</h2><p>In the end, the Limo we built with the time and resources we had wasn&#8217;t compelling enough to raise money or land customers.</p><p>Now we are left to contemplate what to do with what&#8217;s left: the code itself, and the skills and experience we gained from trying to launch a product.</p><p>Short-term, as Liminal Labs, we&#8217;ll be posting more technical guides and content around developing reliable agents and AI apps, starting with evals. We hope to share some practical lessons for software engineers looking to take the plunge into their own AI engineering journey.</p><p>Personally, I&#8217;ve taken steps towards full-time employment in life sciences and shifted my interim consulting focus accordingly. I still believe in the long-term potential of generative AI, but I&#8217;m no longer willing to bet my entire livelihood on 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_!x38S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x38S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png 424w, https://substackcdn.com/image/fetch/$s_!x38S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png 848w, https://substackcdn.com/image/fetch/$s_!x38S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!x38S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x38S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png" width="1456" height="990" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:990,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Live, Laugh, Love keys holder against a white wall.&quot;,&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="Live, Laugh, Love keys holder against a white wall." title="Live, Laugh, Love keys holder against a white wall." srcset="https://substackcdn.com/image/fetch/$s_!x38S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png 424w, https://substackcdn.com/image/fetch/$s_!x38S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png 848w, https://substackcdn.com/image/fetch/$s_!x38S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!x38S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F997e5e56-a562-481a-ae5e-4242f1c3e173_1600x1088.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">If you ever see this in my house, send help. I&#8217;ve been kidnapped.</figcaption></figure></div><p>To be honest, I&#8217;m relieved. I can go back to a relatively normal work-life balance. Aside from myself, Liminal Labs is taking on normal business again, with a team back from a fresh tour in the AI development warzone. Not everyone made it (no one is dead to be clear &#8211; just seeking employment). But the folks still around are eager to take on the next challenging and exciting project.</p><p><a href="https://www.liminal.sh/contact">Let us know</a> if you&#8217;ve got something in mind!</p><p><em>&#8212; <a href="https://www.linkedin.com/in/austin-montoya">Austin</a>, Founder + CEO @ <a href="https://www.liminal.sh/">Liminal Labs</a></em></p>]]></content:encoded></item><item><title><![CDATA[9 Lessons from a newfound Vibe Coder]]></title><description><![CDATA[A listicle for our modern times.]]></description><link>https://blog.limo.dev/p/9-lessons-from-a-newfound-vibe-coder</link><guid isPermaLink="false">https://blog.limo.dev/p/9-lessons-from-a-newfound-vibe-coder</guid><dc:creator><![CDATA[Liminal Labs]]></dc:creator><pubDate>Tue, 23 Sep 2025 17:08:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xv9E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xv9E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xv9E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xv9E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xv9E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xv9E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xv9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg" width="1254" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1254,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:519821,&quot;alt&quot;:&quot;Generic code on a screen in dark mode&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.limo.dev/i/173689227?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Generic code on a screen in dark mode" title="Generic code on a screen in dark mode" srcset="https://substackcdn.com/image/fetch/$s_!xv9E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xv9E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xv9E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xv9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88e8138d-9ef1-4b17-be1a-f6b23013cce7_1254x837.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><p>Time to come clean.</p><p>I&#8217;ve been vibe coding.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> I&#8217;ve been vibe coding&#8230;a lot.</p><p>It&#8217;s actually a problem. I have a bunch of house projects to do before the weather turns here in Oregon. Only have a couple of weeks of sun and yet here I am, spending too much of my time obsessively thinking about my side project. Sometimes you have to go where the energy takes you.</p><p>I figure I&#8217;m not the first to come to vibe coding but I also know that I won&#8217;t be the last. So I want to just drop a few simple(?) nuggets of wisdom I&#8217;ve learned in the process.</p><p>Note that I have intentionally <em>not</em> looked at anyone else&#8217;s vibe coding tips and tricks. I&#8217;ve gotten a few recommendations from a friend and probably gleaned a bit here and there from Twitter but I&#8217;ve mostly avoided looking for advice because I wanted to learn the process organically, from the ground up, <em>tabula rasa</em>. Which means I might have the exact same advice as everyone else and that advice is super elementary, or I may have come to radically different conclusions from others. Perhaps it&#8217;s just right! I&#8217;ll let you be the judge.</p><h3><strong>Lesson 1: From the 10k foot view, vibe coding really </strong><em><strong>is</strong></em><strong> a kind of magic.</strong></h3><p>My side project is a bit silly. I&#8217;m building a word game, the details of which I won&#8217;t go into but suffice to say it&#8217;s vaguely Wordle-like (in that you&#8217;re guessing a word) but more complex and difficult.</p><p>I&#8217;ve been thinking about building this game for years.  It&#8217;s a pen and paper game that I&#8217;ve been playing with my father-in-law for at least a decade and for most of that time I&#8217;ve said to myself &#8220;it would be cool to turn this into an app!&#8221;.</p><p>But I also knew how much of a pain in the ass that would be. I&#8217;m a Product Manager by trade. I have a CS degree<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> but I&#8217;ve never really coded professionally and I&#8217;m pretty rusty. I was pretty solid back in college but these days?  I figured it would take me at least a month to learn javascript well enough to build the basic prototype-level app that I could play with my FIL.</p><p>With Claude doing the heavy lifting, I was able to build that prototype in two days. Not two 8-hour days &#8211;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> more like two 2-hour days.</p><p>I&#8217;m obviously not the first to say &#8220;hey, capable Product Managers can prototype with AI now&#8221;. At <a href="https://x.com/CanadaKaz/status/1955629733460562404">some workplaces</a>, that&#8217;s become the standard. But it&#8217;s still worth remarking upon because it is remarkable!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7Ch2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7Ch2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png 424w, https://substackcdn.com/image/fetch/$s_!7Ch2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png 848w, https://substackcdn.com/image/fetch/$s_!7Ch2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png 1272w, https://substackcdn.com/image/fetch/$s_!7Ch2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7Ch2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png" width="591" height="265" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:265,&quot;width&quot;:591,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48924,&quot;alt&quot;:&quot;Kaz Nejatian Tweet that says: We are adding a coding section to all of our Product Managers interviews at  @Shopify .    We'll start with APM interviews. We expect candidates to build a prototype of the product they suggested in the case interview.   There is no excuse for PMs not building prototypes.&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.limo.dev/i/173689227?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Kaz Nejatian Tweet that says: We are adding a coding section to all of our Product Managers interviews at  @Shopify .    We'll start with APM interviews. We expect candidates to build a prototype of the product they suggested in the case interview.   There is no excuse for PMs not building prototypes." title="Kaz Nejatian Tweet that says: We are adding a coding section to all of our Product Managers interviews at  @Shopify .    We'll start with APM interviews. We expect candidates to build a prototype of the product they suggested in the case interview.   There is no excuse for PMs not building prototypes." srcset="https://substackcdn.com/image/fetch/$s_!7Ch2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png 424w, https://substackcdn.com/image/fetch/$s_!7Ch2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png 848w, https://substackcdn.com/image/fetch/$s_!7Ch2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.png 1272w, https://substackcdn.com/image/fetch/$s_!7Ch2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0136a467-8931-479b-a021-8a0ec0f3cd93_591x265.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>Lesson 2: it&#8217;s &#8230; fun?</h3><p>I won&#8217;t evangelize too much here.  I&#8217;ll just say that I find, after I&#8217;ve spent some time working a feature and I finally nail it, that it feels <em>good</em>.  It feels like the old days, back when I was a CS student and I cracked a hard problem.  It feels like when someone on my team demos their work and it looks great, working just the way we want it to.</p><p><a href="https://martinfowler.com/bliki/OutcomeOverOutput.html">Outcomes over outputs</a>: you don&#8217;t have to be the one coding to find the joy in the code.  If you&#8217;re doing it right you&#8217;ll find yourself energized by the experience. </p><h3><strong>Lesson 3: It&#8217;s not just for Prototypes but you have to know enough to be dangerous.</strong></h3><p>Last week, I decided to:</p><ul><li><p>Restructure my app into logical concerns</p></li><li><p>Start using a build process (Vite)</p></li><li><p>Convert all of the code from Javascript to TypeScript</p></li><li><p>Add in a test Framework (Jest)</p></li><li><p>Build coherent tests for all the features I had thus far.</p></li><li><p>Build a significant new feature, using a Test Driven Development approach<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a></p></li></ul><p>For the engineers among you, you&#8217;ll probably recognize that list as something a little different than &#8220;prototype&#8221;.</p><p>To be sure, there&#8217;s work left to do. I need to clean up the CSS (I&#8217;m thinking Tailwind?) I need to integrate analytics (I&#8217;ve settled on Posthog, at least for now). Proper authentication will introduce a lot more complexity. But what was previously a prototype is now something a bit more &#8220;real&#8221;.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a></p><p>Thinking back to the prototype, I doubt my father-in-law could do it, even with AI. &#8220;Computers&#8221; aren&#8217;t his strong suit. But my wife? She almost certainly could, despite having neither formal nor informal coding experience.</p><p>Yet, I don&#8217;t think she&#8217;d ever get past the prototype phase. Enough iterations and she&#8217;d have something that looked cool but was complete spaghetti underneath.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a></p><p>Our paths diverge because I know enough to be dangerous.  Enough time in the industry and you learn a lot through osmosis.  I&#8217;d never heard of Vite before but I knew enough to ask the right questions and determine Vite passed the smell test.</p><p>The space is dynamic. Perhaps in six months, a year, two, a true neophyte could build production-ready code. Today, though, real domain expertise is still required.  The domain is less about where to put the curly braces now but it&#8216;s still about architectures and frameworks and trade-offs and best practices</p><p>Put another way: effective vibe coding is still the domain of developers, of PMs, of Engineering Managers, of people with sufficient exposure to coding practices to have a sense of how software development actually works.</p><h3>Lesson 4: Embrace the inelegance</h3><p>Still though, I&#8217;m not going to pretend what I have is bug-free, or perfectly maintainable, or anything like that. But to my eyes, it&#8217;s Good Enough. A real developer could come in, look through the codebase, understand what&#8217;s going on and make incremental changes, with or without AI assistance.</p><p>Note that this isn&#8217;t <em>good</em>.  It&#8217;s Good Enough.</p><p>Does it solve the user problem?  Have we tested all the branching logic?  No linting errors?  Does it meet our performance, accessibility, and security requirements.  It may just be Good Enough.  </p><p>Think about every enterprise codebase you&#8217;ve ever worked in?  They pretty much all have some warts.  Something was rushed, some area is in need of a refactor. That&#8217;s the nature of the game.  </p><p>Let&#8217;s be honest with ourselves, we&#8217;re still making trade-offs here, of speed over elegance.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.limo.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Liminal Labs, the blog! Subscribe to get all our posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Lesson 5: Seriously though, it&#8217;s dumb a lot</h3><p>LLMs have a bunch of failure modes.  Many of them aren&#8217;t dramatically different than an overeager intern with too much time on its hands.  The AI tends to lose the forest for the trees. It&#8217;s often overconfident. It occasionally rabbit holes into weird places. It&#8217;s often sycophantic. (That last one is new to me but the first three sound like 80% of the engineers I&#8217;ve ever worked with.)</p><p>Navigating these failure modes is the tricky part.  It&#8217;s not always even clear you&#8217;re experiencing a failure mode.  My heuristic is, &#8220;if it feels harder than it should be, it probably is&#8221;.  So far this all seems more art than science to me.  But perhaps I&#8217;m just too new to it to know better?</p><h3><strong>Lesson 6: Zoom in, and then out, and then zoom in again</strong></h3><p>One of the best ways I&#8217;ve found to handle both the forest-for-trees problem, and the overconfidence?  Force the LLM to change its perspective.  Or give its work to another model, and see what that model says.</p><p>I find myself frequently asking the LLM something like:</p><blockquote><p>Ok, now step back. Consider &lt;this aspect&gt;. Have we built this feature in the best way possible? What trade-offs have we made, and what are the pros and cons of that approach?</p></blockquote><p>Or I find myself asking a different LLM from the one I&#8217;m coding with:</p><blockquote><p>Hey, I have &lt;this code&gt;. Read through and tell me what it does. Then, suppose I want to add features X, Y, and Z in the future.  What architectural changes will I need to make, and when?</p></blockquote><p>Repeatedly digging down to the line or the test level and then back, to the feature level and then back again, to the architecture level is incredibly helpful &#8212; for both me and for the LLM.  It will frequently find fault with its previous work or reveal a trade-off I wasn&#8217;t aware of from its choice.  (Here again, having a sense of modern coding practices is extremely helpful.)</p><div class="pullquote"><p>The domain is less about where to put the curly braces now but it&#8216;s still about architectures and frameworks and trade-offs and best practices</p></div><h3><strong>Lesson 7: Context is king</strong></h3><p>The LLM has a tendency to be anchored to certain ideas, and it can be hard to break it out of once it&#8217;s settled there. As well, the longer you spend on a particular task with the LLM, the quality of output degrades, sometimes dramatically. <a href="https://simonwillison.net/2025/Jun/18/context-rot/">Context rot</a>, they call it, and I can assure you it&#8217;s real.</p><p>I don&#8217;t have great solutions besides &#8220;start a new conversation&#8221; and &#8220;choose your words/context wisely, especially when you open conversation&#8221; but the difference between &#8220;one-shotting&#8221; a problem and slogging through it for several hours can often come down to word choice and to knowing when to step back and start afresh.</p><p>What I will say is that a structured input, where you explain the purpose of your code snippet, the broader context, and the relevant roadmap right at the start of the conversation helps avoid architectural pitfalls.</p><h3>Lesson 8: Ask questions first; shoot later</h3><p>Whenever I&#8217;m planning a feature I never regret telling the LLM something to the effect of: </p><blockquote><p>Explain how you intend to tackle this feature.  Ask follow-up questions before you start making any code changes.</p></blockquote><p>We iron out edge cases and avoid entire circuitous paths this way.</p><h3>Lesson 9: Smaller problems are smaller</h3><p>The last lesson is the easiest, but also, maybe the hardest?  It won&#8217;t be new to anyone with software experience: when it doubt, break it down.  </p><p>Sometimes you can say &#8220;hey, LLM, do these 5 things&#8221; and it will Just Work.</p><p>But often it doesn&#8217;t.</p><p>It&#8217;s why I think there&#8217;s a lot of value in <a href="https://en.wikipedia.org/wiki/Test-driven_development">TDD</a> when vibe coding but the lesson is broader.  When in doubt, break a big problem into smaller ones and take them one by one.  You&#8217;ll get there faster in the end.   </p><h3>Conclusion</h3><p>Thanks to Netlify, my little app deploys automatically whenever I commit/merge to main. It&#8217;s very convenient and really does feel like magic.  And it means I have a real thing that my friends and family are beta testing, giving me super useful feedback.</p><p>It also means I have something that I can take to market.  Not a prototype &#8212; a real app, today.  </p><p>But it&#8217;s also little more than a bundle of HTML, CSS, and Javascript.  I&#8217;m not ready to declare software engineering over.  If anything, the concepts I learned in the industry are the reason it&#8217;s still going so well.  Software engineering is alive and well, just different.</p><p>It&#8217;s early days for me vibe coding, for vibe coding as a thing.  But I do think it&#8217;s worth scratching the itch, if only to see how you like it.  You might learn something. </p><p><em>&#8212; <a href="https://www.linkedin.com/in/brendanmortimer">Mort</a>, Product @ <a href="https://www.liminal.sh/">Liminal Labs</a></em></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><em>Editor&#8217;s Note:</em></p><p><em>The engineers at Liminal have been using LLMs as part of their coding process for years now and have built cutting edge, AI-native tooling both for clients and for ourselves.  However, our Product guy had not used it much for software development work until last month.  </em></p><p><em>While these are his thoughts, they do tend to broadly track the experience our engineers have had as they&#8217;ve worked in an AI-assisted world, and really in software more generally.</em></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Shout out <a href="https://www.bowdoin.edu/profiles/faculty/echown/index.html">Eric Chown</a> a.k.a. Chown-dog and <a href="https://www.bowdoin.edu/profiles/faculty/ltoma/index.html">Laura Toma</a>!</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>This post is genuine, from the dome, human-writing.  The LLMs can take the em-dash &#8212; a beautiful piece of punctuation &#8212; from my cold, dead hands.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>AI-assisted, I knocked this out in two days. Two!  I estimate that same scope of work would have taken a front-end engineer at my old job three to four weeks to complete. The tests alone would have taken at least a week and a half.  Hell, writing the Jira tickets up would have taken me the better part of an hour, maybe more.  For all its warts: remarkable!</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>Is it vibe coding any longer if you&#8217;re writing closer-to-production code?  That is a semantic debate I don&#8217;t wish to dive into.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>No shade to her, of course.  She works in medicine.  She saves a hell of a lot more lives than I do.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Software's Last Mile Problem]]></title><description><![CDATA[If Vibe Coding is so great, why don't we have Vibe Ops?]]></description><link>https://blog.limo.dev/p/softwares-last-mile-problem</link><guid isPermaLink="false">https://blog.limo.dev/p/softwares-last-mile-problem</guid><dc:creator><![CDATA[Liminal Labs]]></dc:creator><pubDate>Tue, 29 Jul 2025 15:26:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!YmsI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Slog</h2><p>I keep seeing this thing and I can&#8217;t get it out of my head.  </p><p>It started with a tweet.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Eqps!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Eqps!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 424w, https://substackcdn.com/image/fetch/$s_!Eqps!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 848w, https://substackcdn.com/image/fetch/$s_!Eqps!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 1272w, https://substackcdn.com/image/fetch/$s_!Eqps!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Eqps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png" width="592" height="177" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b97d3974-64c4-4945-b762-e2d074334a25_592x177.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:177,&quot;width&quot;:592,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32453,&quot;alt&quot;:&quot;Screenshot of tweet that says \&quot;Something that AI still isn't very good at - helping me figure out deployments. A backend in python and a front end in react = nightmare to deploy\&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://liminallabs.substack.com/i/168881713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot of tweet that says &quot;Something that AI still isn't very good at - helping me figure out deployments. A backend in python and a front end in react = nightmare to deploy&quot;" title="Screenshot of tweet that says &quot;Something that AI still isn't very good at - helping me figure out deployments. A backend in python and a front end in react = nightmare to deploy&quot;" srcset="https://substackcdn.com/image/fetch/$s_!Eqps!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 424w, https://substackcdn.com/image/fetch/$s_!Eqps!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 848w, https://substackcdn.com/image/fetch/$s_!Eqps!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 1272w, https://substackcdn.com/image/fetch/$s_!Eqps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97d3974-64c4-4945-b762-e2d074334a25_592x177.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption"><a href="https://x.com/itsakdev/status/1932631694810448028">Source</a>.  AK Kulkarni, PM @ Google Labs</figcaption></figure></div><p>And then another:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wGL8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wGL8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 424w, https://substackcdn.com/image/fetch/$s_!wGL8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 848w, https://substackcdn.com/image/fetch/$s_!wGL8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 1272w, https://substackcdn.com/image/fetch/$s_!wGL8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wGL8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png" width="582" height="277" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:277,&quot;width&quot;:582,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56547,&quot;alt&quot;:&quot;Screenshot of tweet that says \&quot;I am uncertain I believe that PMs or Devs of  @OpenAI  codex web actually use it. There are pain points I would have solved literally immediately.  WHY DO I HAVE TO WRITE A DEPLOY SCRIPT? YOU HAVE A CODING AGENT CONNECTED TO GITHUB AND A TERMINAL! WRITE IT YOURSELF AND ITERATE!!!\&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://liminallabs.substack.com/i/168881713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot of tweet that says &quot;I am uncertain I believe that PMs or Devs of  @OpenAI  codex web actually use it. There are pain points I would have solved literally immediately.  WHY DO I HAVE TO WRITE A DEPLOY SCRIPT? YOU HAVE A CODING AGENT CONNECTED TO GITHUB AND A TERMINAL! WRITE IT YOURSELF AND ITERATE!!!&quot;" title="Screenshot of tweet that says &quot;I am uncertain I believe that PMs or Devs of  @OpenAI  codex web actually use it. There are pain points I would have solved literally immediately.  WHY DO I HAVE TO WRITE A DEPLOY SCRIPT? YOU HAVE A CODING AGENT CONNECTED TO GITHUB AND A TERMINAL! WRITE IT YOURSELF AND ITERATE!!!&quot;" srcset="https://substackcdn.com/image/fetch/$s_!wGL8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 424w, https://substackcdn.com/image/fetch/$s_!wGL8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 848w, https://substackcdn.com/image/fetch/$s_!wGL8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 1272w, https://substackcdn.com/image/fetch/$s_!wGL8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc681d-c0db-4f7d-980a-56beb61446ee_582x277.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://x.com/seconds_0/status/1937221017824559421">Source</a>.  Prominent vibe coder.</figcaption></figure></div><p>But it <em>really</em> clicked when I saw <a href="https://events.ycombinator.com/ai-sus">this talk</a>:</p><div id="youtube2-LCEmiRjPEtQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;LCEmiRjPEtQ&quot;,&quot;startTime&quot;:&quot;1940s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/LCEmiRjPEtQ?start=1940s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>The key moment:</p><blockquote><p>I had MenuGen basically working on my laptop in a few hours and then it took me a week [to deploy] because I was trying to make it real&#8230; </p></blockquote><p>Software development is wildly different from just a couple years ago.  </p><ul><li><p>Cursor for writing code.  </p></li><li><p>CodeRabbit for pull requests.  </p></li><li><p>Mintlify for documentation.  </p></li></ul><p>I wouldn&#8217;t say we&#8217;ve all become vibe coders but it&#8217;s fair to say that we&#8217;ve all become a little bit cyborg.</p><p>But DevOps?  It still looks kind of &#8230; the same.  And it&#8217;s still kind of a horrorshow?</p><p>This is the dirty secret of modern software development.  We've gotten incredibly good at building things.  Frameworks make UI development almost pleasurable. APIs are cleaner than they've ever been.  MCP servers are&#8230;less clean but at least they&#8217;re an interface that generally work, most of the time.</p><p>Yet somehow, the gap between "it works on my machine" and "it works for actual humans on the internet" has become a chasm that swallows developer dreams whole.</p><h2>The DevOps Gap</h2><p>That gap between &#8220;built a cool app&#8221; and &#8220;deployed a cool app for the world to use&#8221;? It&#8217;s just a <a href="https://knowyourmeme.com/memes/skill-issue-simply-a-difference-in-skill">skill issue</a>.</p><p>Don&#8217;t get me wrong.  It&#8217;s a <em>normal</em> skill issue.  I don&#8217;t know how accurate the old &#8220;10,000 hours&#8221; saw is, but to develop a skill you still need reps.  And the brutal truth is Development and Operations, though we combined them (for <a href="https://www.slideshare.net/slideshow/10-deploys-per-day-dev-and-ops-cooperation-at-flickr/1628368">very good</a> <a href="https://dora.dev/">reasons</a>), they&#8217;re still two totally different disciplines.</p><p>They require different skills, different reps, different mental models.  Even for experienced Devs, context switching between the two takes its toll.</p><p>Consider the humble web app.</p><ul><li><p>You write a Node app that connects to a database. Easy. Now you need to figure out VPC subnets, security groups, and IAM roles just to get those two things talk to each other in the cloud.</p></li><li><p>Your app works fine until you get some traffic, then it falls over. Is it container limits?  Database connections?  Load balancer config? You're debugging infrastructure instead of code.</p></li><li><p>You need to add some environment variables.  Simple, right?  Except now you've got secrets management, key rotation, and sorting out which service has access to what.</p></li></ul><p>None of this is insurmountable.  Nor is it rocket science.  But it&#8217;s a big hunk of <strong>stuff</strong> that you have to deal with when what you <em>really</em> want to do is focus on your actual app functionality.  It&#8217;s necessary stuff but it&#8217;s not the <strong>fun</strong> stuff.</p><p>If I&#8217;m a cyborg when I code, why can&#8217;t I be a cyborg when I deploy?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YmsI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YmsI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png 424w, https://substackcdn.com/image/fetch/$s_!YmsI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png 848w, https://substackcdn.com/image/fetch/$s_!YmsI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png 1272w, https://substackcdn.com/image/fetch/$s_!YmsI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YmsI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png" width="332" height="484.92913385826773" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1484,&quot;width&quot;:1016,&quot;resizeWidth&quot;:332,&quot;bytes&quot;:179148,&quot;alt&quot;:&quot;Meme based on an XKCD with someone asking a developer for an application with two features, one of which is trivial to build and one of which is very hard.&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://liminallabs.substack.com/i/168881713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Meme based on an XKCD with someone asking a developer for an application with two features, one of which is trivial to build and one of which is very hard." title="Meme based on an XKCD with someone asking a developer for an application with two features, one of which is trivial to build and one of which is very hard." srcset="https://substackcdn.com/image/fetch/$s_!YmsI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png 424w, https://substackcdn.com/image/fetch/$s_!YmsI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png 848w, https://substackcdn.com/image/fetch/$s_!YmsI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.png 1272w, https://substackcdn.com/image/fetch/$s_!YmsI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b846863-7d0f-4891-8826-fa2cc57ff0d0_1016x1484.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">Apologies to <a href="https://xkcd.com/1425/">XKCD</a> for this mediocre meme</figcaption></figure></div><h2>FE-as-as-Service is not Enough</h2><p>Perhaps you&#8217;re thinking: &#8220;aren&#8217;t there are a bunch of simple deployment tools  &#8212; Netlify, Vercel, Railway?&#8221;</p><p>Sure, if you&#8217;re building a marketing site, they work great.  I use them myself. </p><p>But have you ever tried to build a <em>production app</em> with one of those things?  Something that requires user state or auth or a real live database?  <strong>They can&#8217;t actually do it.</strong>  At best, they&#8217;re an abstraction layer for deployment.  Good for simple use cases but woefully insufficient for a full stack engineer who needs to get the job done.</p><h2>The Agentic Shortcoming</h2><p><a href="https://karpathy.ai/">Andrej</a>, <a href="https://x.com/itsakdev">AK</a>, <a href="https://x.com/seconds_0">seconds_0</a>: they all see this too.  It&#8217;s why they&#8217;ve taken to Twitter to rant about it.</p><p>They have AWS accounts; they have git repos.  It all can be made accessible to the context window.  Shouldn&#8217;t an agent be able to just <em>do the thing</em>?  AWS may be a bit inscrutable to navigate but folks muddle through it every day.  Why can&#8217;t the LLM too?</p><p>I haven&#8217;t seen a satisfactory answer.  My best guess?  The LLMs have a skill issue.</p><p>Specifically, it&#8217;s that errors with agents <a href="https://utkarshkanwat.com/writing/betting-against-agents/">compound over time</a>.  And what is DevOps but a dependent chain of actions?  You need to sort out the IAM policies before you set up the VPC.  You need the VPC before you provision the container.  The container needs to be running to deploy the code.  A general purpose agent can&#8217;t get through all these steps with any reliability.  And no one wants to be on the hook for someone else&#8217;s production nightmare.  </p><p>Yet I caution anyone from thinking that the problem is unsolvable.  Sure, it&#8217;s a lot of complexity.  But break down that complexity into atomic units, solve them one by one, and create agents that can do the orchestration?  You just might solve that skill issue after all.</p><p>No one&#8217;s cracked it <em>quite</em> yet.  But it feels inevitable. </p><p>And when someone does finally solve this, it will be a big deal.  It will make deployments easier, sure, but more importantly, it'll fundamentally change what kinds of projects are worth starting.  Today many good ideas die in the 'but then I have to deal with the DevOps' phase.  Fix that and it should unleash a ton of pent-up creativity for projects that weren't economically viable, too small or boutique to productionalize.  </p><p>Personally?  I'm looking forward to that most of all.</p><p><em> &#8212; <a href="https://www.linkedin.com/in/brendanmortimer">Mort</a>, Product @ <a href="https://www.liminal.sh/">Liminal Labs</a></em></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.limo.dev/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.limo.dev/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is Liminal Labs, the blog.]]></description><link>https://blog.limo.dev/p/coming-soon</link><guid isPermaLink="false">https://blog.limo.dev/p/coming-soon</guid><dc:creator><![CDATA[Liminal Labs]]></dc:creator><pubDate>Mon, 21 Jul 2025 16:17:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Wo1f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wo1f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wo1f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Wo1f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Wo1f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Wo1f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wo1f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg" width="1398" height="749" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:1398,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:653991,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://liminallabs.substack.com/i/168871525?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Wo1f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Wo1f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Wo1f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Wo1f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c8e901-d0c6-4785-85d9-111c4066a4d2_1398x749.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is Liminal Labs, the blog.</p><p>Expect insights on DevOps, on AI, and on building products with AI, in this feed and in the very near future.</p><p>We hope you like it.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.limo.dev/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.limo.dev/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>