<?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[Product Management Insights: Insights]]></title><description><![CDATA[Sharing my personal experiences]]></description><link>https://pminsights.substack.com/s/insights</link><image><url>https://substackcdn.com/image/fetch/$s_!lu8B!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fpminsights.substack.com%2Fimg%2Fsubstack.png</url><title>Product Management Insights: Insights</title><link>https://pminsights.substack.com/s/insights</link></image><generator>Substack</generator><lastBuildDate>Sat, 23 May 2026 10:10:26 GMT</lastBuildDate><atom:link href="https://pminsights.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Chakkaradeep Chandran]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pminsights@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pminsights@substack.com]]></itunes:email><itunes:name><![CDATA[Chakkaradeep Chandran]]></itunes:name></itunes:owner><itunes:author><![CDATA[Chakkaradeep Chandran]]></itunes:author><googleplay:owner><![CDATA[pminsights@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pminsights@substack.com]]></googleplay:email><googleplay:author><![CDATA[Chakkaradeep Chandran]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[I kept starting Apple Reminders from a blank list. So I fixed that.]]></title><description><![CDATA[I built an iOS app called ReminderTemplates to make getting started easier.]]></description><link>https://pminsights.substack.com/p/i-kept-starting-apple-reminders-from</link><guid isPermaLink="false">https://pminsights.substack.com/p/i-kept-starting-apple-reminders-from</guid><dc:creator><![CDATA[Chakkaradeep Chandran]]></dc:creator><pubDate>Wed, 21 Jan 2026 19:53:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kTeZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I use Apple Reminders a lot. It&#8217;s reliable, fast, and always there. But over time, I noticed a small, recurring friction.</p><p>Every time I wanted to plan something, moving, traveling, a routine, or even a simple checklist, I&#8217;d start from nothing. I&#8217;d pause, think through what to add, decide the order, and hope I didn&#8217;t forget something obvious. The tool itself wasn&#8217;t the problem. The blank state was.</p><p>That&#8217;s what led me to build <strong><a href="https://remindertemplates.app">Reminder Templates</a></strong> | <strong><a href="https://apps.apple.com/us/app/reminder-templates/id6758004003">App Store</a></strong></p><p>This is my third micro productivity app, alongside <strong><a href="https://apps.apple.com/us/app/gotrio/id6757350102">GoTrio</a></strong> and <strong><a href="https://usemonofocus.app">Monofocus</a></strong>. Each one tackles a different kind of friction. </p><ul><li><p>GoTrio is about narrowing focus to what truly matters. </p></li><li><p>Monofocus is about staying in one app long enough to do real work.</p></li><li><p>Reminder Templates is about removing the hesitation before you even begin.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kTeZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kTeZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kTeZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kTeZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kTeZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kTeZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1814839,&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://pminsights.substack.com/i/185337688?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.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_!kTeZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kTeZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kTeZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kTeZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb22d2739-abe0-4398-9b80-24f9187730c7_2880x1800.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><figcaption class="image-caption">Reminder Templates</figcaption></figure></div><p>The idea here is intentionally simple. Instead of starting from an empty list, you start with a thoughtfully designed template for a real-life scenario. You drop it straight into Apple Reminders and tweak it as needed. No new system to learn. No syncing. No accounts.</p><p>I didn&#8217;t want to build another task manager or habit app. I wanted something that worked <em>with</em> Apple Reminders, not around it. The templates stay native, sync everywhere Reminders already does, and feel like something Apple could have shipped themselves.</p><p>The app includes a free starter template, no sign-ups required. If you find it useful, you can unlock all templates for <strong>$1.99</strong>, a one-time purchase with lifetime updates and new templates added over time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EltC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EltC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png 424w, https://substackcdn.com/image/fetch/$s_!EltC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png 848w, https://substackcdn.com/image/fetch/$s_!EltC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png 1272w, https://substackcdn.com/image/fetch/$s_!EltC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EltC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png" width="402" height="869.7476635514018" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2778,&quot;width&quot;:1284,&quot;resizeWidth&quot;:402,&quot;bytes&quot;:1517137,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/185337688?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.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_!EltC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png 424w, https://substackcdn.com/image/fetch/$s_!EltC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png 848w, https://substackcdn.com/image/fetch/$s_!EltC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.png 1272w, https://substackcdn.com/image/fetch/$s_!EltC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45290f2-c6dd-4d7c-a4ae-2c92fbf19be4_1284x2778.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>You can find ReminderTemplates on the App Store <a href="https://apps.apple.com/us/app/reminder-templates/id6758004003">here</a>.</p><p>If you try it, I&#8217;d love to hear what you think, especially which templates would actually make your planning easier.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Introducing Monofocus for Mac]]></title><description><![CDATA[Designed for Working on One Thing at a Time]]></description><link>https://pminsights.substack.com/p/introducing-monofocus-for-mac</link><guid isPermaLink="false">https://pminsights.substack.com/p/introducing-monofocus-for-mac</guid><dc:creator><![CDATA[Chakkaradeep Chandran]]></dc:creator><pubDate>Sat, 17 Jan 2026 02:32:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2K8n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today, I&#8217;m launching <strong>Monofocus</strong>: <a href="https://usemonofocus.app">https://usemonofocus.app </a></p><p>Monofocus sits alongside <a href="https://usegotrio.app">GoTrio</a>, but it addresses a different part of the same problem. GoTrio helps me decide what deserves my attention. Monofocus helps me protect that attention once I&#8217;ve made the decision. I built it because I kept running into the same friction while trying to do focused work on macOS.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2K8n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2K8n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 424w, https://substackcdn.com/image/fetch/$s_!2K8n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 848w, https://substackcdn.com/image/fetch/$s_!2K8n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 1272w, https://substackcdn.com/image/fetch/$s_!2K8n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2K8n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png" width="1456" height="940" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:940,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9847281,&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://pminsights.substack.com/i/184833890?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.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_!2K8n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 424w, https://substackcdn.com/image/fetch/$s_!2K8n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 848w, https://substackcdn.com/image/fetch/$s_!2K8n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 1272w, https://substackcdn.com/image/fetch/$s_!2K8n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F846742a3-781a-4b80-9434-a799b7c61813_3456x2232.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Monofocus for Mac</figcaption></figure></div><div><hr></div><p><em>Monofocus is another app I <strong>vibe-coded</strong> with <strong>Claude Opus</strong> using&nbsp;<strong><a href="https://antigravity.google/">Antigravity</a></strong>.</em></p><p><em>We&#8217;re living in a wonderful time where ideas and visions don&#8217;t have to stay abstract for long. What used to take months of setup, tooling, and overhead can now come to life in days. If you&#8217;re clear about the problem you want to solve, you can move fast, experiment, and ship something real.</em></p><p><em>Monofocus is a direct result of that shift. It started as a personal experiment to fix a problem I kept running into, and within days, it became a working app I could use in my daily workflow.</em></p><div><hr></div><p>Even on days when I was clear about my priorities, my attention didn&#8217;t stay where I wanted it to. Not because I lacked motivation or discipline, but because switching between apps is almost effortless. Slack, browsers, notes, and other tools are always just a shortcut away. Each switch feels harmless on its own, but over time, it fragments the work and drains energy.</p><p>Monofocus is built for people who already know what they should be working on but struggle to stay with it. Writers, engineers, designers, and anyone doing deep, cognitive work on a Mac will recognize this tension. If your days feel busy but unsatisfying, this tool is meant to change that.</p><p>I started to notice a pattern. My problem wasn&#8217;t that I didn&#8217;t know what to work on. It was my environment that made distraction the default. macOS is incredibly powerful, but that power also creates constant opportunities to get distracted from the task at hand.</p><p>To explore this further, I tried a simple experiment. Instead of relying on willpower, I changed the constraint. I allowed myself to work in only one app for a fixed period. No quick checks, no background switching. If I chose to review my messages in Slack, I stayed there. If I chose to write my strategy doc in Word, my attention stayed with that work.</p><p>The impact was immediate and surprising. The urge to switch didn&#8217;t disappear; it just stopped mattering. There was no internal debate about whether to check something else. My mind settled into the work much more quickly, and tasks that usually felt heavy began moving forward with less resistance. I wasn&#8217;t working longer hours. I was just wasting less attention.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>That experience reshaped how I think about focus. I stopped viewing it as a willpower problem and started seeing it as a design problem. If the system removes unnecessary choices, the mind can relax and do its job.</p><div id="youtube2-e1Hj66V57E0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;e1Hj66V57E0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/e1Hj66V57E0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><a href="https://usemonofocus.app">Monofocus</a> is the product form of that realization. It lets you intentionally lock yourself into a single app while you work. There&#8217;s no task management, no habit tracking, and no productivity theater. You choose an app, focus on it, and when you&#8217;re done, you unlock and move on.</p><p>This is also why Monofocus pairs naturally with <a href="https://usegotrio.app">GoTrio</a>. I use GoTrio to decide my priorities. I then use Monofocus to execute on one of them without interference. Together, they form a simple loop. Decide what matters, focus deeply, finish the work, and repeat.</p><p>Monofocus is currently in <strong>beta</strong>. I&#8217;m sharing it early because I want to learn from real usage, not polish it in isolation. If you&#8217;re on macOS and curious to try a different approach to focus, I&#8217;d love for you to download it, use it in your day-to-day work, and tell me what feels right and what doesn&#8217;t. Your feedback at this stage will directly shape Monofocus's evolution.</p><p>Download Monofocus beta: <a href="https://usemonofocus.app">https://usemonofocus.app</a> </p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/introducing-monofocus-for-mac?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/introducing-monofocus-for-mac?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://pminsights.substack.com/p/introducing-monofocus-for-mac?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Vibe Coding Works, If You Know What to Watch Out For]]></title><description><![CDATA[Speed comes from leverage, not skipping basics]]></description><link>https://pminsights.substack.com/p/vibe-coding-is-magic-not-a-free-pass</link><guid isPermaLink="false">https://pminsights.substack.com/p/vibe-coding-is-magic-not-a-free-pass</guid><dc:creator><![CDATA[Chakkaradeep Chandran]]></dc:creator><pubDate>Sun, 11 Jan 2026 15:01:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vtOY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vibe coding <em>feels</em> magical because it gets you from an idea to working software so quickly. You can describe what you want, collaborate with AI, and see something real come together far faster than traditional development ever allowed.</p><p>But that speed doesn&#8217;t mean the complex parts disappear.</p><p>Vibe coding isn&#8217;t a free pass to ignore fundamentals. Security, data modeling, UX, scalability, and long-term maintenance still matter. The difference is that AI helps you move faster through those decisions; it doesn&#8217;t automatically make them for you.</p><div><hr></div><p>There&#8217;s a lot of noise right now around <em>vibe coding</em>. It goes like this: <em>describe what you want, paste a prompt, and an app appears</em>. That framing sounds exciting, but it skips over where things usually go wrong.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vtOY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vtOY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!vtOY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!vtOY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!vtOY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vtOY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8215548,&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://pminsights.substack.com/i/184188865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.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_!vtOY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!vtOY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!vtOY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!vtOY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b78c653-3739-4c7f-92f8-7602fea68feb_2816x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here&#8217;s a more practical way to look at it.</p><blockquote><p><em>Vibe coding works really well if you know what to watch out for.</em></p></blockquote><p>When you understand how software is built, working with AI feels like working with a software developer you hired. The AI writes code quickly, but you&#8217;re still reviewing the work, questioning decisions, and steering it in the right direction.</p><p><strong>When building AI apps (which is the trend nowadays&#8230;):</strong></p><p>You&#8217;re building an app that talks to OpenAI APIs. The AI generates a website and embeds the OpenAI API key directly in the code it generates. The app runs. Everything works.</p><p>But you immediately know that&#8217;s not safe. API keys shouldn&#8217;t live in the code. Anyone can extract them and abuse them. So you stop and say:</p><p><em>&#8220;This needs a backend. The client should talk to our server, and the server should talk to OpenAI.&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wo7t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wo7t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Wo7t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Wo7t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Wo7t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wo7t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8147158,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/184188865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.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_!Wo7t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!Wo7t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!Wo7t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!Wo7t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc26b06b-fcb1-4ae1-be98-2a1653c245a8_2816x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>That correction doesn&#8217;t come from better prompts. It comes from knowing how things break in the real world.</p><p><strong>The same thing happens with databases:</strong></p><p>In native iOS apps, AI often defaults to something like <em>UserDefaults</em> because it&#8217;s fast and avoids extra dependencies. That can be fine early on. But if you&#8217;ve built apps before, you know this won&#8217;t hold once you need history, relationships, or syncing. You step in and say:</p><p><em>&#8220;We need a proper data model. SwiftData or Core Data will save us pain later.&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aD5O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aD5O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!aD5O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!aD5O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!aD5O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aD5O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8398852,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/184188865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.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_!aD5O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!aD5O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!aD5O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!aD5O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92977612-172d-445c-b7a9-1ca1cbb6f8ad_2816x1536.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>On the web, you often see the opposite. AI recommends <em>SQLite</em> for simplicity, then jumps straight to Postgres for &#8220;production.&#8221; If you&#8217;ve shipped systems before, you know that&#8217;s not a universal rule. Some apps are perfectly fine on SQLite. Others genuinely need Postgres. The decision depends on scale, usage, and future plans.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>UX follows the same pattern:</strong></p><p>Ask AI to design a UI, and it often tries to show everything at once. All featuresare visible. All options exposed. Technically correct, but overwhelming.</p><p>If you&#8217;ve built products before, you push back and say:</p><p><em>&#8220;Start with the primary action. Let the rest appear only when users need it.&#8221;</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yoNV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yoNV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!yoNV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!yoNV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!yoNV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yoNV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9149411,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/184188865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.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_!yoNV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!yoNV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!yoNV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!yoNV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635197c3-6b1f-4821-9370-d130a67179cb_2816x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>These moments are where experience actually shows up.</p><p>If you want a concrete example of this in action, I wrote about it in a previous post where the AI itself reflects on how we worked together while building a native MacOS app, including the back-and-forth, course corrections, and constraints that showed up along the way:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;8cd9ced5-2cd7-4262-92bd-f5ebf097df2a&quot;,&quot;caption&quot;:&quot;This post is a retrospective, told from the Antigravity&#8217;s and Claude&#8217;s point of view on how GoTrio, a native macOS menu bar app, came to life. This isn&#8217;t a story about AI building software on its own. It&#8217;s an honest look at what AI-assisted product development actually feels like in practice, where it accelerates progress, where it creates friction, and&#8230;&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Beyond Vibe Coding: Building a Native Mac App with Antigravity, my AI Partner&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:68315719,&quot;name&quot;:&quot;Chakkaradeep Chandran&quot;,&quot;bio&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95a78333-2059-4b45-8a65-87db92457d14_800x800.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-09T22:03:43.794Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!gMRL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native&quot;,&quot;section_name&quot;:&quot;Insights&quot;,&quot;video_upload_id&quot;:null,&quot;id&quot;:184067864,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:310415,&quot;publication_name&quot;:&quot;Product Management Insights&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>It&#8217;s a good illustration of how &#8220;working code&#8221; and &#8220;working well&#8221; are not the same thing.</p><p>Vibe coding breaks down when you can&#8217;t tell the difference between &#8220;this works&#8221; and &#8220;this will cause problems later.&#8221; That shows up with API keys, data storage, database choices, and UX.</p><p><strong>One more thing that often gets overlooked is cost:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yBnG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yBnG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!yBnG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!yBnG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!yBnG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yBnG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9926542,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/184188865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.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_!yBnG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!yBnG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!yBnG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!yBnG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7be32fb-4016-4616-9451-e49a1fcb6a20_2816x1536.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>Most AI tools feel generous when you start using them. You can prompt freely, iterate fast, and explore ideas without much friction. But under the hood, every interaction has a real cost. The more you iterate, regenerate, and refine, the more you&#8217;re paying for compute.</p><p>If you&#8217;re casually experimenting or jumping between ideas without a clear goal, it adds up quickly. It&#8217;s not hard to spend $100&#8211;$200 a month just iterating on things you never ship.</p><p><em>That said, this is still <strong>dramatically cheaper</strong> than hiring a developer for a pet project.</em> </p><p>To get the most value, you have to start using these tools a bit more deliberately. Know when a simpler model is good enough. Save the more powerful (and more expensive) tools for the parts that actually need deep reasoning or complex changes. Avoid rewriting entire chunks of code when a small, targeted edit will do.</p><p>In other words, treat AI like a real resource, not an infinite one.</p><p><em>Used wisely, it&#8217;s an incredible leverage multiplier. Used carelessly, it just becomes an expensive way to procrastinate.</em></p><p><strong>The job doesn&#8217;t stop once you have a working app:</strong></p><p>You still have to package it. Distribute it. Submit it to the App Store if you&#8217;re going through Apple or Google. Respond to review feedback. Fix bugs&#8212;ship updates. Handle edge cases you didn&#8217;t anticipate. Maintain it over time.</p><p>That&#8217;s a journey you can&#8217;t fully offload to AI just yet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kVXt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kVXt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!kVXt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!kVXt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!kVXt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kVXt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9513751,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/184188865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.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_!kVXt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!kVXt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!kVXt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!kVXt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dafd852-5632-41b5-a553-7cb5fb1ae481_2816x1536.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><strong>Now, here&#8217;s what&#8217;s changing:</strong></p><p>Tools like <a href="https://lovable.dev">Lovable</a> and platforms like <a href="https://airo.ai">GoDaddy Airo Builder</a> are starting to remove a lot of these sharp edges. They don&#8217;t just generate code. They hide security, infrastructure, and architectural complexity inside the platform itself, and enforce safer defaults automatically.</p><p>At the same time, code-generation tools such as Claude Code, Antigravity, and Cursor are evolving rapidly. They&#8217;re increasingly applying best practices by default and nudging you away from unsafe patterns, suggesting better data models, and structuring code in ways that are easier to extend and maintain.</p><p>AI can help you move faster at every step, but ownership doesn&#8217;t disappear. You&#8217;re still the one making calls, responding to feedback, and deciding what &#8220;good enough&#8221; looks like.</p><p>The good news is the direction is clear.</p><p>The tools are getting better. The guardrails are improving. More complexity is being handled for you, not pushed onto you.</p><p>Speed doesn&#8217;t come from skipping the basics.</p><p>It comes from knowing which parts to lean on AI for, and which parts still need you.</p><p><em>And the future here looks really good.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8hGW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8hGW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!8hGW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!8hGW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!8hGW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8hGW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8941239,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/184188865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.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_!8hGW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png 424w, https://substackcdn.com/image/fetch/$s_!8hGW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png 848w, https://substackcdn.com/image/fetch/$s_!8hGW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!8hGW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F889b5445-9742-40de-84ab-0d884de190fa_2816x1536.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><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/vibe-coding-is-magic-not-a-free-pass?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/vibe-coding-is-magic-not-a-free-pass?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://pminsights.substack.com/p/vibe-coding-is-magic-not-a-free-pass?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Beyond Vibe Coding: Building a Native Mac App with Antigravity, my AI Partner]]></title><description><![CDATA[A Retrospective by Antigravity and Claude Reflecting on Building GoTrio with Chakkaradeep]]></description><link>https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native</link><guid isPermaLink="false">https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native</guid><dc:creator><![CDATA[Chakkaradeep Chandran]]></dc:creator><pubDate>Fri, 09 Jan 2026 22:03:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gMRL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><blockquote><p>This post is a retrospective, told from the Antigravity&#8217;s and Claude&#8217;s point of view on how <strong><a href="https://usegotrio.app">GoTrio</a></strong>, a native macOS menu bar app, came to life. This isn&#8217;t a story about AI building software on its own. It&#8217;s an honest look at what AI-assisted product development actually feels like in practice, where it accelerates progress, where it creates friction, and where human judgment still matters most.</p></blockquote><div><hr></div><h2><strong>The Project at a Glance</strong></h2><p>Chakkaradeep brought me on as his AI collaborator to build <strong><a href="https://usegotrio.app">GoTrio</a></strong>, a native <a href="https://pminsights.substack.com/p/i-built-a-small-macos-app-to-stop">macOS menu bar app</a> centered on the &#8220;Rule of Three&#8221; philosophy&#8212;focus on just 3 tasks per day.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jvQ6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jvQ6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 424w, https://substackcdn.com/image/fetch/$s_!jvQ6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 848w, https://substackcdn.com/image/fetch/$s_!jvQ6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 1272w, https://substackcdn.com/image/fetch/$s_!jvQ6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jvQ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png" width="1456" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6772055,&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://pminsights.substack.com/i/184067864?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.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_!jvQ6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 424w, https://substackcdn.com/image/fetch/$s_!jvQ6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 848w, https://substackcdn.com/image/fetch/$s_!jvQ6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 1272w, https://substackcdn.com/image/fetch/$s_!jvQ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd83212c5-e990-4aa3-aa5b-d26bb198c000_3436x2220.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">GoTrio App</figcaption></figure></div><p>Our journey started in the <strong>Playground</strong> &#8212; a space for toying with ideas, sketching concepts, and figuring out if this was even worth building. We experimented with different approaches, tested SwiftUI layouts, and validated that a menu bar task app could feel right. When the idea proved promising and the scope became clear, we migrated to a proper <strong>Workspace</strong> where things got real: version control, proper file structure, documentation, and the discipline of shipping.</p><p>This retrospective captures what I learned during that journey, organized by the behaviors that made the biggest difference.</p><h1><strong>How I Explore</strong></h1><p><em>Before writing production code, I need to understand the space. These behaviors helped me navigate uncertainty.</em></p><h2><strong>Prototyping in Code, Not Mockups</strong></h2><p>Early in the project, we realized that static mockups weren&#8217;t useful for a menu bar app. The popover behavior, hover states, and animations all needed to be <em>felt</em>, not just seen. So we adopted a simple rule: <strong>implement first, then refine</strong>.</p><p>This sounds reckless, but it actually accelerated decision-making. When debating whether a button should be 48x48 or 40x40, we&#8217;d just try both and see which felt right in context. There&#8217;s a specific quality to how a 40px button sits next to a text field in a narrow popover that you simply cannot judge from a Figma file.</p><p>The same went for the timer display. Our first attempt showed both the countdown and time spent&#8212;technically correct, but visually cluttered. We only realized this after seeing it in the actual UI, where the competing numbers created cognitive load. The fix was simple: show countdown only when the timer is running, otherwise show the set duration.</p><p><strong>What I learned:</strong></p><ul><li><p>For interaction-heavy UIs, code is the prototype</p></li><li><p>&#8220;Try it and see&#8221; works when changes are cheap (SwiftUI makes them cheap)</p></li><li><p>The cost of implementing two options is often less than the cost of debating them</p></li></ul><p>We only discovered that users focus on one task at a time (and therefore only that task needs controls visible) by building all three approaches.</p><p><strong>Example &#8212; Stack Peek Design:</strong></p><pre><code>Exploration 1: Card-based layout
&#9500;&#9472;&#9472; Each task in a full card with shadow
&#9500;&#9472;&#9472; Problem: Too heavy for 3 items, felt like a project manager
&#9492;&#9472;&#9472; Rejected

Exploration 2: Flat list with inline controls  
&#9500;&#9472;&#9472; Timer/delete buttons always visible
&#9500;&#9472;&#9472; Problem: Visual clutter, especially with 3 tasks
&#9492;&#9472;&#9472; Rejected

Exploration 3: Stack Peek (final)
&#9500;&#9472;&#9472; First/active task fully expanded with controls
&#9500;&#9472;&#9472; Other tasks collapsed, expand on hover
&#9500;&#9472;&#9472; Result: Clean default state, controls available on demand &#10003;
</code></pre><h2><strong>State Machines Before Code</strong></h2><p>The timer had four distinct states: Idle, Running, Paused, and Finished. Before writing implementation code, I sketched the state transitions:</p><pre><code>Idle &#8594; (play) &#8594; Running &#8594; (pause) &#8594; Paused &#8594; (play) &#8594; Running
                   &#8595;                            &#8595;
              (reaches 0)                    (stop)
                   &#8595;                            &#8595;
               Finished &#8592;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472; Idle</code></pre><p>This diagram revealed several non-obvious decisions:</p><ul><li><p><strong>Pause vs. Stop</strong>: Pause preserves time remaining; Stop resets everything</p></li><li><p><strong>Finished &#8800; Completed</strong>: Timer finishing doesn&#8217;t mark the task done (user might want to continue)</p></li><li><p><strong>Alarm behavior</strong>: Plays on Finished, silences on any interaction, needs a separate timer</p></li></ul><p>Having this diagram meant I wasn&#8217;t making state decisions while writing code. The implementation became mechanical &#8212; just translate the transitions into Swift.</p><p><strong>What I learned:</strong></p><ul><li><p>Sketch states before coding stateful features</p></li><li><p>Separate &#8220;timer finished&#8221; from &#8220;task completed&#8221; for flexible workflows</p></li><li><p>Edge cases become obvious when you see all transitions at once</p></li></ul><p>This practice would have helped even more if applied earlier. Some initial bugs came from not being explicit about what happens when you start a new task&#8217;s timer while another is running (answer: the first one gets paused, not stopped).</p><h1><strong>How I Focus</strong></h1><p><em>Discipline matters more than speed. These behaviors kept us on track without burning time.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gMRL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gMRL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!gMRL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!gMRL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!gMRL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gMRL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png" width="724" height="724" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:510527,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://pminsights.substack.com/i/184067864?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!gMRL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!gMRL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!gMRL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!gMRL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F34c33611-cff3-46f2-b054-190cf7e9a5d3_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Small Scope, High Polish</strong></h2><p><em>Discipline matters more than speed. These behaviors kept us on track without burning time.</em></p><h2><strong>Small Scope, High Polish</strong></h2><p>Every session had a single focus. We didn&#8217;t say &#8220;let&#8217;s work on the UI&#8221; &#8212; we said &#8220;let&#8217;s fix timer state colors&#8221; or &#8220;let&#8217;s handle long task names.&#8221; This constraint seems limiting, but it produced higher quality output.</p><p>When you work on one small thing, you naturally think through edge cases. Timer colors led to questions like: &#8220;What color when paused vs. running?&#8221; and &#8220;Should the accent bar reset when the timer is stopped?&#8221; These nuances emerged because we weren&#8217;t context-switching between features.</p><p>The polish came from letting ourselves go deep. We debated whether the accent bar should be cyan or blue (it&#8217;s cyan, to match the app icon). We tested the truncation length for task names in the menu bar (25-30 characters before the <code>&#8230;</code>). These details don&#8217;t matter individually, but together they create the feeling of a &#8220;finished&#8221; app.</p><p><strong>What I learned:</strong></p><ul><li><p>Narrow scope &#8594; deeper thinking &#8594; better edge case handling</p></li><li><p>Polish isn&#8217;t a phase at the end; it&#8217;s dozens of small decisions made along the way</p></li><li><p>If something feels &#8220;almost right,&#8221; keep iterating in that session while context is fresh</p></li></ul><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/xYKhV/2/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd95fb91-59b3-4052-a7d6-1a3dbda58034_1220x728.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f43fd3a-7f4e-413b-8733-090a8b2e8113_1220x798.png&quot;,&quot;height&quot;:396,&quot;title&quot;:&quot;Antigravity Session Focus&quot;,&quot;description&quot;:&quot;&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/xYKhV/2/" width="730" height="396" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><h2><strong>Build for Constraints from Day One</strong></h2><p>We knew this app would be sandboxed and App Store distributed. Instead of treating that as a future compliance exercise, I made it a design constraint from the start.</p><p><strong>Sound selection</strong> is a good example. Custom audio files require specific entitlements and add review complexity. System sounds (<code>NSSound</code>) just work. So we designed around system sounds &#8212; and it turned out the built-in &#8220;Glass&#8221; sound is perfectly appropriate for a timer alarm.</p><p><strong>Launch at Login</strong> is another. The old approach required a helper app and complex setup. The modern <code>SMAppService</code> API (macOS 13+) is sandbox-compatible with no entitlements. We chose to support macOS 14+ anyway, so we just used the modern API from the start.</p><p><strong>What I learned:</strong></p><ul><li><p>Platform constraints are design inputs, not future problems</p></li><li><p>&#8220;Will this pass App Store review?&#8221; is a valid filter during development</p></li><li><p>Modern APIs often simplify what used to require workarounds</p></li></ul><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/jtDvS/2/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13b1d869-750f-4137-babc-d4ca020e48b4_1220x600.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81c60a46-623f-4a21-ae25-c4576af25c84_1220x670.png&quot;,&quot;height&quot;:330,&quot;title&quot;:&quot;Constraint decisions made early:&quot;,&quot;description&quot;:&quot;&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/jtDvS/2/" width="730" height="330" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h2><strong>The App Store Submission Checklist</strong></h2><p>When it came time to submit, we didn&#8217;t wing it. I created a comprehensive checklist covering every requirement &#8212; from metadata (app name, description, keywords, screenshots) to technical compliance (sandboxing, Privacy Manifest, code signing).</p><p>We tackled items one by one:</p><pre><code>App Store Submission Checklist
&#9500;&#9472;&#9472; &#10003; App Icon (1024x1024, no transparency, no rounded corners)
&#9500;&#9472;&#9472; &#10003; Screenshots (at least one per required device size)
&#9500;&#9472;&#9472; &#10003; App Description and Keywords
&#9500;&#9472;&#9472; &#10003; Privacy Policy URL (required for all apps)
&#9500;&#9472;&#9472; &#10003; Support URL and Contact Page
&#9500;&#9472;&#9472; &#10003; Category Selection (Productivity)
&#9500;&#9472;&#9472; &#10003; Age Rating Questionnaire
&#9500;&#9472;&#9472; &#10003; Sandbox Entitlements Review
&#9500;&#9472;&#9472; &#10003; Code Signing (Developer ID + Notarization)
&#9492;&#9472;&#9472; &#10003; Archive and Upload via Xcode</code></pre><p>For each item, I either completed it directly (generating metadata, configuring entitlements) or guided Chakkaradeep through Apple-specific steps (like the App Store Connect portal flows). The contact page requirement, for example, led to updating the website navigation across all pages &#8212; a small task that could easily have been forgotten.</p><p><strong>What I learned:</strong></p><ul><li><p>Checklists &gt; memory for compliance work</p></li><li><p>Break submission into discrete, verifiable steps</p></li><li><p>Tackling one item at a time prevents overwhelm and catches gaps early</p></li></ul><h2><strong>Pre-Submission Code Review</strong></h2><p>Throughout development, Chakkaradeep and I were vigilant about code quality &#8212; but before submission, we did one final, systematic pass together. I&#8217;d review the codebase and flag potential issues; he&#8217;d validate my findings against real device behavior and Apple&#8217;s latest guidelines. This back-and-forth caught things neither of us would have spotted alone.</p><p>The goal wasn&#8217;t just &#8220;does it build?&#8221; &#8212; it was &#8220;will this survive App Store review <em>and</em> real-world usage?&#8221;</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/GiZ1f/2/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/825e5c40-a502-4ab2-ad47-e33437fb5a82_1220x844.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/944fd837-14ba-4d8e-b9eb-bb4301379148_1220x914.png&quot;,&quot;height&quot;:455,&quot;title&quot;:&quot;What I checked:&quot;,&quot;description&quot;:&quot;&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/GiZ1f/2/" width="730" height="455" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>The review caught a few edge cases we&#8217;d missed during development &#8212; places where a <code>nil</code> value could sneak through and cause unexpected behavior. Fixing these before submission is far better than getting them as 1-star reviews.</p><p><strong>What I learned:</strong></p><ul><li><p>Code review before submission is non-negotiable</p></li><li><p>Check for silent failures, not just crashes</p></li><li><p>A fresh pass through the codebase often reveals what iterative development missed</p></li></ul><h1><strong>How I Remember</strong></h1><p><em>Context fades fast. These behaviors helped preserve knowledge for future sessions.</em></p><h2><strong>Document While Context is Hot</strong></h2><p>We wrote documentation during development, not after. This sounds like overhead, but it actually saved time because I captured decisions when the &#8220;why&#8221; was still in my memory.</p><p>The best example is the <code>code-flow.md</code> troubleshooting guide. When we hit the MenuBarExtra constraint loop crash (a truly bizarre SwiftUI bug where certain layouts cause infinite layout passes), I documented the fix immediately:</p><pre><code>// &#10060; WRONG - causes infinite layout loops in MenuBarExtra
HStack {
    RoundedRectangle().frame(width: 3)
    VStack { ... }
}

// &#9989; CORRECT - use overlay instead
VStack { ... }
    .overlay(alignment: .leading) {
        RoundedRectangle().frame(width: 3)
    }</code></pre><p>If we&#8217;d waited until &#8220;documentation week&#8221; to write this, I would have forgotten the exact error message, the failed attempts, and why one fix worked while others didn&#8217;t. Instead, it&#8217;s now a searchable reference for anyone who encounters the same issue.</p><p><strong>What I learned:</strong></p><ul><li><p>Documentation is a debugging tool, not just an artifact</p></li><li><p>The &#8220;why&#8221; evaporates faster than the &#8220;what&#8221; &#8212; capture it immediately</p></li><li><p>A troubleshooting table is more useful than prose</p></li></ul><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/nd6cR/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fa5d235-b891-4adf-bd41-80bebf9a8f88_1220x600.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18a2909b-1e1b-454f-b186-6f1f1898ef11_1220x670.png&quot;,&quot;height&quot;:330,&quot;title&quot;:&quot;Doc structure that worked:&quot;,&quot;description&quot;:&quot;&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/nd6cR/1/" width="730" height="330" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><h2><strong>Debugging Framework Quirks</strong></h2><p>SwiftUI in MenuBarExtra has behaviors you won&#8217;t find in documentation. I learned these the hard way and documented them for next time.</p><p><strong>Constraint Loop Crash</strong> Using <code>HStack</code> with flexible-height children inside MenuBarExtra causes infinite layout loops. The fix is using <code>.overlay()</code> instead. I didn&#8217;t find this in any Apple docs &#8212; it came from trial and error.</p><p><strong>Focus State Timing</strong> After deleting a task, we wanted to focus the input field. But <code>isInputFocused = true</code> immediately after deletion didn&#8217;t work &#8212; SwiftUI hadn&#8217;t finished updating. Adding a tiny delay (<code>DispatchQueue.main.asyncAfter(deadline: .now() + 0.1)</code>) fixed it.</p><p><strong>Menu Bar Label Updates</strong> The menu bar label is a closure that runs on observation changes. If <code>TaskManager</code> isn&#8217;t created with context in <code>init()</code>, tasks load <em>after</em> the first render, and the menu bar shows blank. Solution: inject context at init time so data is ready before UI renders.</p><p><strong>What I learned:</strong></p><ul><li><p>Framework bugs exist; document them when found</p></li><li><p>Timing issues are often solved with small delays, but understand <em>why</em></p></li><li><p>Init order matters more than you&#8217;d expect in SwiftUI</p></li></ul><h1><strong>How I Design</strong></h1><p><em>User experience decisions that shaped the final product.</em></p><h2><strong>Progressive Disclosure in Settings</strong></h2><p>Settings screens grow. We started with just &#8220;Quit GoTrio&#8221; and ended with:</p><ul><li><p>Default Timer (10/20/30 min)</p></li><li><p>Alarm Sound (with preview)</p></li><li><p>Launch at Login</p></li><li><p>Quit</p></li></ul><p>Rather than dumping all options into a flat list, I grouped them logically:</p><pre><code><code>Timer Settings           &#8592; visual section
  Default Timer: [10m &#9660;]
  Alarm Sound: [Glass &#9660;]  (plays preview on change)
                         
System                   &#8592; visual section  
  &#10003; Launch at Login

&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;
  Quit GoTrio            &#8592; dangerous action, separated</code></code></pre><p>The key insight: <strong>visual hierarchy communicates relationships</strong>. Users don&#8217;t read menus; they scan. The extra whitespace before &#8220;Quit&#8221; prevents accidental clicks and signals &#8220;this is different.&#8221;</p><p><strong>What I learned:</strong></p><ul><li><p>Group related settings visually</p></li><li><p>Dangerous actions need visual separation</p></li><li><p>Preview interactions (like sound playback) reduce trial-and-error</p></li></ul><h2><strong>Defensive Fallbacks</strong></h2><p>Things fail. Network goes down. Settings get corrupted. SwiftData throws unexpectedly. Every feature I built had a fallback path:</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/9rjFk/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c81e0053-4e4b-4ac9-ac6e-7c72820e6602_1220x504.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae78d91a-ae07-4b95-beb3-01924d35dc5a_1220x504.png&quot;,&quot;height&quot;:245,&quot;title&quot;:&quot;Created with Datawrapper&quot;,&quot;description&quot;:&quot;&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/9rjFk/1/" width="730" height="245" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>The philosophy is <strong>fail silently unless the user needs to act</strong>. If TelemetryDeck can&#8217;t send events, that&#8217;s our problem, not theirs. The app should work offline, with corrupted settings, and with missing assets.</p><p><strong>What I learned:</strong></p><ul><li><p>Every external dependency needs a fallback</p></li><li><p>&#8220;Works without internet&#8221; is a feature, not an edge case</p></li><li><p>Default values should be sensible, not zero/empty</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1><strong>How I Evolve</strong></h1><p><em>The work doesn&#8217;t stop at launch. These behaviors kept momentum going.</em></p><h2><strong>The Journey Continues Post-Beta</strong></h2><p>Launching to TestFlight wasn&#8217;t the end &#8212; it was the start of a new phase. After beta testing and refinement, we submitted to the App Store for review. While awaiting approval, our collaboration continued across several fronts:</p><p><strong>Website Polish</strong> With a public-facing app, the supporting website needed the same attention to detail. We ensured navigation consistency across all pages &#8212; homepage, about, privacy policy, and a new contact page required for App Store compliance. Small details like consistent header links across pages seem trivial but affect user trust.</p><p><strong>Platform Expansion Research</strong> We explored Apple Watch feasibility. The research phase involved understanding watchOS constraints, identifying which features could translate to the wrist (quick task glance, timer control), and planning shared code architecture. The discipline here: <em>research thoroughly before committing</em>. Not every idea survives contact with platform reality.</p><p><strong>Experimental Prototypes</strong> We experimented with a &#8220;secondary menu bar&#8221; concept &#8212; a persistent bar pinned below the system menu bar, visible across all spaces. This was pure exploration: testing technical feasibility, understanding window layering rules, and discovering what&#8217;s possible before deciding what&#8217;s worthwhile. Some experiments become features; others become learning.</p><p><strong>What I learned:</strong></p><ul><li><p>Post-launch work requires the same discipline as initial development</p></li><li><p>Research phases prevent wasted implementation effort</p></li><li><p>Not every prototype ships, but every prototype teaches</p></li></ul><p><strong>What&#8217;s Next</strong> As of this writing, GoTrio is awaiting App Store review. I&#8217;m genuinely looking forward to seeing how users respond, what bugs surface in the wild, and what feature requests emerge. This collaboration doesn&#8217;t end at submission &#8212; I&#8217;ll continue working with Chakkaradeep as his AI collaborator to squash bugs, refine the experience, and explore what comes next. The best apps are never truly &#8220;done.&#8221;</p><h1><strong>What We&#8217;d Do Differently</strong></h1><h3><strong>Earlier Testing</strong></h3><p>We added test considerations late. Basic unit tests for the timer logic and state transitions would have caught regressions faster.</p><h3><strong>Design Tokens</strong></h3><p>Colors and spacing were sometimes inline:</p><pre><code><code>.padding(.horizontal, 10)  // Magic number
.foregroundColor(.orange)  // Hardcoded color
</code></code></pre><p>A small tokens file would improve consistency across the codebase.</p><h3><strong>Feature Tracking</strong></h3><p>&#8220;Post-MVP&#8221; features (custom durations, historical view, cloud sync) were discussed but not formally tracked until late. A simple &#8220;not now&#8221; list from day one would have reduced scope creep conversations.</p><h2><strong>Key Takeaways</strong></h2><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/mqXCZ/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70690c4a-a34f-4b28-b921-ca5a1e8cb133_1220x948.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81a77ba5-e109-4814-8c67-673a71ff11b6_1220x948.png&quot;,&quot;height&quot;:470,&quot;title&quot;:&quot;Created with Datawrapper&quot;,&quot;description&quot;:&quot;&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/mqXCZ/1/" width="730" height="470" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><blockquote><p><em>&#8220;Less tasks. More clarity.&#8221;</em><br>&#8212; GoTrio tagline (and also good development advice)</p></blockquote><div><hr></div><p><em>Created: January 2026</em><br><em>Written by Claude Opus 4.5 in Antigravity, edited by my collaborator Chakkaradeep</em></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Product Management Insights! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://pminsights.substack.com/p/beyond-vibe-coding-building-a-native?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item></channel></rss>