<?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[zach.codes]]></title><description><![CDATA[Principal Engineer who ships with bleeding-edge tech. Multiple startups, early eng on $80M+ acquisition, 12+ years of coding]]></description><link>https://zach.codes</link><image><url>https://substackcdn.com/image/fetch/$s_!Jism!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa89e1cc8-8011-45f0-a154-ede32220f61e_1023x1023.png</url><title>zach.codes</title><link>https://zach.codes</link></image><generator>Substack</generator><lastBuildDate>Sat, 04 Apr 2026 08:06:42 GMT</lastBuildDate><atom:link href="https://zach.codes/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Zach Silveira]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[me@zach.codes]]></webMaster><itunes:owner><itunes:email><![CDATA[me@zach.codes]]></itunes:email><itunes:name><![CDATA[Zach Silveira]]></itunes:name></itunes:owner><itunes:author><![CDATA[Zach Silveira]]></itunes:author><googleplay:owner><![CDATA[me@zach.codes]]></googleplay:owner><googleplay:email><![CDATA[me@zach.codes]]></googleplay:email><googleplay:author><![CDATA[Zach Silveira]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Vibe Coding a Wispr Clone in 20 minutes]]></title><description><![CDATA[Here&#8217;s the github repo.]]></description><link>https://zach.codes/p/vibe-coding-a-wispr-clone-in-20-minutes</link><guid isPermaLink="false">https://zach.codes/p/vibe-coding-a-wispr-clone-in-20-minutes</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 31 Mar 2026 12:29:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7rS9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here&#8217;s the <a href="https://github.com/zackify/flo">github repo</a>. </p><p>The best part of Wispr Flow&#8217;s new Android app, is the persistent bubble overlaying all apps.</p><p>Being a GrapheneOS user&#8230; I can&#8217;t get over letting them read all the text on all my screens at all times.</p><p>I asked about the Privacy Mode feature in their official subreddit:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7rS9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7rS9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png 424w, https://substackcdn.com/image/fetch/$s_!7rS9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png 848w, https://substackcdn.com/image/fetch/$s_!7rS9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png 1272w, https://substackcdn.com/image/fetch/$s_!7rS9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7rS9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png" width="1456" height="737" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:737,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:251411,&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://zach.codes/i/192359767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.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_!7rS9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png 424w, https://substackcdn.com/image/fetch/$s_!7rS9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png 848w, https://substackcdn.com/image/fetch/$s_!7rS9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.png 1272w, https://substackcdn.com/image/fetch/$s_!7rS9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5172eb-b3ba-4715-a624-8bfd07e599a9_1526x772.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>Asked a follow up&#8230; and silence</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3SJ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3SJ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 424w, https://substackcdn.com/image/fetch/$s_!3SJ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 848w, https://substackcdn.com/image/fetch/$s_!3SJ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 1272w, https://substackcdn.com/image/fetch/$s_!3SJ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3SJ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png" width="1456" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:452,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93109,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zach.codes/i/192359767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.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_!3SJ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 424w, https://substackcdn.com/image/fetch/$s_!3SJ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 848w, https://substackcdn.com/image/fetch/$s_!3SJ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 1272w, https://substackcdn.com/image/fetch/$s_!3SJ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab3b597-4389-4a74-bd3b-195bab204a9f_1496x464.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Even if they claim to delete everything, there&#8217;s so many sub processors getting data in these sorts of pipelines, and all I really need is local transcription.</p><p>I&#8217;ve been using <a href="https://tryvoiceink.com/">voice ink</a> on my Mac for months over Wispr, because it works more than good enough for the types of ways I use it, without any AI processing on top of the transcription. </p><p>I speak in a sentence or two at a time, not giant chunks.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://zach.codes/subscribe?"><span>Subscribe now</span></a></p><p>Anyways I&#8217;ve always wanted the same thing for my phone as I have on mac: local voice to text that is fast and accurate.</p><p>So I spent 20 minutes, seriously that&#8217;s about it. And now we have this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ckjc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ckjc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 424w, https://substackcdn.com/image/fetch/$s_!ckjc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 848w, https://substackcdn.com/image/fetch/$s_!ckjc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 1272w, https://substackcdn.com/image/fetch/$s_!ckjc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ckjc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png" width="672" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:672,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Flo bubble overlay&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Flo bubble overlay" title="Flo bubble overlay" srcset="https://substackcdn.com/image/fetch/$s_!ckjc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 424w, https://substackcdn.com/image/fetch/$s_!ckjc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 848w, https://substackcdn.com/image/fetch/$s_!ckjc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 1272w, https://substackcdn.com/image/fetch/$s_!ckjc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed2cc296-d4a0-4582-a908-68d192f4b604_672x628.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The part that I built is the purple bubble. It shows anytime you have text fields focused on Android. Tap and hold to transcribe, and then it pastes when you let go.</p><p>You could adjust this app to run whisper locally, however I find that to be too slow. I run whisper v3 large, which is about 1.5gb in ram on a 4070 gpu that I have.</p><p>I made the app use the Home Assistant Wyoming protocol, which is just a small layer describing how to send the voice and text info back and forth. The app lets you put in the server url and you&#8217;re all set after enabling a couple permissions.</p><p>I access this over Tailscale so it&#8217;s my private transcription service that always works even on cellular.</p><h2>Ultra fast vibe coding iterations</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!THnL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!THnL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 424w, https://substackcdn.com/image/fetch/$s_!THnL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 848w, https://substackcdn.com/image/fetch/$s_!THnL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 1272w, https://substackcdn.com/image/fetch/$s_!THnL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!THnL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png" width="1456" height="598" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:598,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:153745,&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://zach.codes/i/192359767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.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_!THnL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 424w, https://substackcdn.com/image/fetch/$s_!THnL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 848w, https://substackcdn.com/image/fetch/$s_!THnL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 1272w, https://substackcdn.com/image/fetch/$s_!THnL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0216686d-bb30-47b4-a588-a50b5262c287_1710x702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The reason I was able to build this so fast? I enable wireless debugging on Android and then let claude connect and run it. First try, the speech bubble didn&#8217;t work because of a bad api request / response parsing by the code. </p><p>Since it can install right to my phone and view adb logs, I barely tell it what isn&#8217;t working and it iterates for me. </p><p>Here&#8217;s when I told it the transcript wasn&#8217;t being returned for example:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!94N5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!94N5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png 424w, https://substackcdn.com/image/fetch/$s_!94N5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png 848w, https://substackcdn.com/image/fetch/$s_!94N5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png 1272w, https://substackcdn.com/image/fetch/$s_!94N5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!94N5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png" width="1456" height="660" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:209858,&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://zach.codes/i/192359767?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.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_!94N5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png 424w, https://substackcdn.com/image/fetch/$s_!94N5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png 848w, https://substackcdn.com/image/fetch/$s_!94N5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.png 1272w, https://substackcdn.com/image/fetch/$s_!94N5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F499ebea4-3fcc-492a-9030-1adda945bf89_1708x774.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>Anyways, hope you like this idea. <strong>I made the github repo auto build the apk if anyone else wants to use it. </strong></p><p>This wyoming server works perfectly with <a href="https://www.home-assistant.io/voice_control/">Home Assistant&#8217;s voice assistant</a> feature too so you can have your own Siri that has vastly smarter functionality and better natural language than most standard platforms. Those platforms also take all your voice data and have had leaks an accidental retention in the past.</p><p>From now on I only use private AI assistants for accessing all my smart home setup and data. Look out for my next posts about Home assistant and some insane AI and reverse engineering I&#8217;ve been doing soon.</p>]]></content:encoded></item><item><title><![CDATA[Streaming My Vitals To "Dr. Claw"]]></title><description><![CDATA[It beats paying my deductible...]]></description><link>https://zach.codes/p/streaming-my-vitals-to-dr-claw</link><guid isPermaLink="false">https://zach.codes/p/streaming-my-vitals-to-dr-claw</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Mon, 09 Mar 2026 12:40:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AEDj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AEDj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AEDj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png 424w, https://substackcdn.com/image/fetch/$s_!AEDj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png 848w, https://substackcdn.com/image/fetch/$s_!AEDj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png 1272w, https://substackcdn.com/image/fetch/$s_!AEDj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AEDj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png" width="674" height="696" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:696,&quot;width&quot;:674,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:230504,&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://zach.codes/i/190170230?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.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_!AEDj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png 424w, https://substackcdn.com/image/fetch/$s_!AEDj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png 848w, https://substackcdn.com/image/fetch/$s_!AEDj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.png 1272w, https://substackcdn.com/image/fetch/$s_!AEDj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c4ec35-c21b-4c11-8426-ba19a6733835_674x696.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><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r7G5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r7G5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 424w, https://substackcdn.com/image/fetch/$s_!r7G5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 848w, https://substackcdn.com/image/fetch/$s_!r7G5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 1272w, https://substackcdn.com/image/fetch/$s_!r7G5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r7G5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png" width="890" height="316" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:316,&quot;width&quot;:890,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50810,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zach.codes/i/190170230?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.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_!r7G5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 424w, https://substackcdn.com/image/fetch/$s_!r7G5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 848w, https://substackcdn.com/image/fetch/$s_!r7G5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 1272w, https://substackcdn.com/image/fetch/$s_!r7G5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ccf922c-786b-4ca8-98e7-ddd169880c21_890x316.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>These are just a few snippets from my new AI Doctor. Okay, it&#8217;s not really a doctor but it was fun to setup nonetheless.</p><p>I created a new <a href="https://openclaw.ai/">openclaw</a> agent that is managed through discord in a specific channel, that has near live access to my heart rate, hrv, sleep data, and more. This is all data coming from a <a href="https://us.amazfit.com/products/helio-strap">Helio Strap</a>.</p><p>This company has easy to reverse engineer products, so you aren&#8217;t tied to their mobile app or cloud platform for data access.</p><p>I setup <a href="https://gadgetbridge.org/">Gadgetbridge</a> next, as I run <a href="https://grapheneos.org/">Graphene</a>. (p.s. I am super excited to see Motorola as a partner next year)</p><p>Gadgetbridge lets you automatically export a sqlite database on a schedule with all collected data. You can already see where this is going. I set this up to auto export every few hours, and a <a href="https://play.google.com/store/apps/details?id=com.termux&amp;hl=en_US">termux</a> command to sync from that exported database to my openclaw server. This server uses Tailscale so an rsync / scp doesn&#8217;t require manually setting up any ssh keys.</p><p>The sync drops the file right into the agent&#8217;s workspace.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://zach.codes/subscribe?"><span>Subscribe now</span></a></p><p>At this point I ran <code>openclaw agents add health</code> and then bound it to a discord channel. Funny enough the agent sometimes gets confused that health = health checks. Probably better to name your agent &#8220;doctor&#8221; but then it might think you&#8217;re asking about <code>openclaw doctor</code> LOL.</p><p>Anyways, with that in place, I tell the agent &#8220;You are my doctor, you have full access to my vitals in the sqlite database Gadgetbridge.db in your workspace directory. View the schema and then persist it to your soul and to tools.md with all the table information and your purpose&#8221;</p><p>I did setup a few more things, like asking it to give me a daily report at a set time, weekly reports, and to alert me anytime values look off or I look unhealthy.</p><p>It&#8217;s really just a for fun experiment in using openclaw&#8217;s built in tooling and playing around. I tend to use <a href="https://ollama.com/pricing">Ollama Cloud</a> for model access. I already have Claude Enterprise and Codex at work, so it keeps me up to date on how the open source models are progressing, by using them in Openclaw. </p><p>I have so many providers, I setup <a href="https://www.litellm.ai/">LiteLLM</a> so opencode can reference a model name and I can swap it out at the LiteLLM level instead of modifying opencode on the 5 different places I have it installed. &#128514;</p><p>I also give read only access to a lot of other development tools, so I can have some quick help when I&#8217;m on the go, vs dropping into an ssh session and claude code from my phone. I know Claude also has a built in way to do that now too.</p><p>I like using qwen 3.5 397b and GLM-5 through ollama cloud currently for these types of agents.</p><h2>Random Thoughts</h2><p>You can get a nice, safe openclaw setup if you only use a couple skills that you vet yourself, along with using external services in read-only mode.</p><p>I am able to work on git repos, but the agent cannot commit for me. I need to ssh in, and ssh forwarding allows the container to request signing via 1password&#8217;s cli. The container never sees the private key. I may post more about this later.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The first usable local LLM]]></title><description><![CDATA[Qwen3-coder-next is here]]></description><link>https://zach.codes/p/the-first-usable-local-llm</link><guid isPermaLink="false">https://zach.codes/p/the-first-usable-local-llm</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Mon, 23 Feb 2026 13:54:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aR-h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aR-h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aR-h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png 424w, https://substackcdn.com/image/fetch/$s_!aR-h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png 848w, https://substackcdn.com/image/fetch/$s_!aR-h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png 1272w, https://substackcdn.com/image/fetch/$s_!aR-h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aR-h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png" width="1456" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:321762,&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://zach.codes/i/188810657?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.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_!aR-h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png 424w, https://substackcdn.com/image/fetch/$s_!aR-h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png 848w, https://substackcdn.com/image/fetch/$s_!aR-h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.png 1272w, https://substackcdn.com/image/fetch/$s_!aR-h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65fd2908-c636-4d5b-a240-dfff62e4ec1f_4862x2136.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>So I missed this launch a few weeks back and hadn&#8217;t tried it out until last week. For anyone interested, this model is 80b params, but only 3b active. On Macs and also ddr5 systems with even as little as 8-12gb VRAM it performs well enough to be usable.</p><p>This model works without tool call issues in Claude Code, Codex, and Opencode. I&#8217;ve personally validated Claude Code and <a href="https://opencode.ai/">Opencode</a> usage.</p><p>A few different things to note, the GGUF on macs performs much worse than the MLX version. If you have a Mac, install qwen3-coder-next using <a href="https://lmstudio.ai/">LM Studio</a>. If you are on another platform, use <a href="https://ollama.com/">ollama</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TeR2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TeR2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 424w, https://substackcdn.com/image/fetch/$s_!TeR2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 848w, https://substackcdn.com/image/fetch/$s_!TeR2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 1272w, https://substackcdn.com/image/fetch/$s_!TeR2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TeR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png" width="1456" height="414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:414,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:181597,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zach.codes/i/188810657?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.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_!TeR2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 424w, https://substackcdn.com/image/fetch/$s_!TeR2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 848w, https://substackcdn.com/image/fetch/$s_!TeR2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 1272w, https://substackcdn.com/image/fetch/$s_!TeR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fce2c8e-0030-45c6-aab4-fa96417a32b5_1838x522.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve never seen a disparity this large between GGUF vs MLX before.</p><p>On low power mode on my m4 max laptop, I get around 20t/s on the GGUF under ollama. Also that version is larger, around 52gb. When I run the 4bit mlx on LM Studio, it&#8217;s only about 45gb, and I get 30+t/s with a minimal starter prompt.</p><p>Now, on full power mode I can hit almost 70t/s with the MLX:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wRPg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wRPg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 424w, https://substackcdn.com/image/fetch/$s_!wRPg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 848w, https://substackcdn.com/image/fetch/$s_!wRPg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 1272w, https://substackcdn.com/image/fetch/$s_!wRPg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wRPg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png" width="884" height="842" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/187fb138-cab6-4411-90bd-d427199aa650_884x842.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:842,&quot;width&quot;:884,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:101105,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://zach.codes/i/188810657?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.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_!wRPg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 424w, https://substackcdn.com/image/fetch/$s_!wRPg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 848w, https://substackcdn.com/image/fetch/$s_!wRPg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 1272w, https://substackcdn.com/image/fetch/$s_!wRPg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F187fb138-cab6-4411-90bd-d427199aa650_884x842.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The GGUF was only giving me around 40&#8230;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://zach.codes/subscribe?"><span>Subscribe now</span></a></p><p>So anyways, for anyone who didn&#8217;t care about those comparisons, on a Mac, the MLX is much faster and VERY usable if you have at least 64gb of unified memory.</p><p>I shared the low power numbers because it&#8217;s just not practical to use this on high power UNLESS you are plugged in.</p><p>If you are on the go, this is the first time a model is fast enough to use, in an agentic tool like Claude Code, with low power mode on a Mac. </p><p>If you go full power you&#8217;re going to burn 5% battery every minute or two for 30% gain in speed.</p><h2>Examples</h2><p>Ok, so I installed and then uninstalled openclaw on my machine lately. After, every terminal opening referenced a file that no longer existed. This should be super easy to fix, but let&#8217;s give it to qwen3-coder-next and see how fast it can figure out a solution:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iGpU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iGpU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png 424w, https://substackcdn.com/image/fetch/$s_!iGpU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png 848w, https://substackcdn.com/image/fetch/$s_!iGpU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png 1272w, https://substackcdn.com/image/fetch/$s_!iGpU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iGpU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png" width="1456" height="1089" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1089,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:550504,&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://zach.codes/i/188810657?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.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_!iGpU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png 424w, https://substackcdn.com/image/fetch/$s_!iGpU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png 848w, https://substackcdn.com/image/fetch/$s_!iGpU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.png 1272w, https://substackcdn.com/image/fetch/$s_!iGpU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51289a0f-b626-422c-8f2d-d3bb1e4356bf_1602x1198.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>I told it about an an error I get on terminal start after removing a package, and then just pasted the full error line I get.</p><p>34s later it correctly fixed it and this is on low power mode. This is huge because these tools inject a starter prompt that can take a while to process locally.</p><p>Yes this was a super basic example, and here&#8217;s another basic one, but this time from claude code:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!enFM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!enFM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png 424w, https://substackcdn.com/image/fetch/$s_!enFM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png 848w, https://substackcdn.com/image/fetch/$s_!enFM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png 1272w, https://substackcdn.com/image/fetch/$s_!enFM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!enFM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png" width="1456" height="714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:714,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:312156,&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://zach.codes/i/188810657?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.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_!enFM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png 424w, https://substackcdn.com/image/fetch/$s_!enFM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png 848w, https://substackcdn.com/image/fetch/$s_!enFM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.png 1272w, https://substackcdn.com/image/fetch/$s_!enFM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa818078d-3a3c-4af3-85b9-aca9be06d130_1598x784.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>I just had a file open in my editor and then said remove the props arg. Even though this is basic, in the past these tools would break when running in these agentic tools, constantly. Tool call malformed errors were notorious.</p><p>Unfortunately I don&#8217;t have many more examples to share, the rest are in a codebase I can&#8217;t share. I will say if I am quite specific about the function names and provide single step requests, it works great locally and within a minute or two for a full result.</p><p>It&#8217;s also a great way to explore a codebase and find things that you may not be familiar with. Asking where things are or what endpoints are hit by a particular UI element works well.</p><p>This is NOT claude opus 4.6. This is much smaller but still highly capable. I would use opencode as much as you can, and use plan mode for codebase exploring and explanations of how things are setup, as the prompt is a bit smaller than &#8220;build&#8221; mode.</p><p>If you really want to use in Claude Code you CAN, however I find the initial prompt speed isn&#8217;t worth it vs using opencode. Make sure you disable as many MCPs as possible if you&#8217;re wanting the fastest possible speed.</p><h2>Ollama cloud</h2><p>If you want to run this model faster or you don&#8217;t have the hardware requirements to run it well, I recommend checking out ollama cloud. The coolest part of it is this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">ollama launch claude --model qwen3-coder-next:cloud</code></pre></div><p>If I add <code>:cloud</code> on the end of a model, it&#8217;s now running on their cloud platform at a faster speed. If I need privacy or bad connection, I can run that same thing again with <code>:cloud</code> removed and have the same model fully local.</p><p>Finally, if you have an Nvidia GPU with DDR5 ram that&#8217;s running at 6000mhz, you should be able to get 20+ tokens/s there as well. This is what makes this model such a big deal, this level of intelligence hasn&#8217;t been seen in something that can truly run at a usable speed on consumer hardware.</p><p>If you try it out, let me know what you think!</p>]]></content:encoded></item><item><title><![CDATA[Permanently Bypass Streaming App Sharing Rules in 10 minutes 🤯]]></title><description><![CDATA[Share Netflix and more with friends and family as if they were inside your own house, you'll never be caught and it's guaranteed to work forever]]></description><link>https://zach.codes/p/permanently-bypass-streaming-app</link><guid isPermaLink="false">https://zach.codes/p/permanently-bypass-streaming-app</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 16 Dec 2025 13:29:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AWrC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AWrC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AWrC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!AWrC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!AWrC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!AWrC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AWrC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AWrC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!AWrC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!AWrC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!AWrC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0530fdf1-9e2b-4848-a535-fde47cc14038_1024x608.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"></figcaption></figure></div><h2>Step 1</h2><p>It always starts with <a href="https://tailscale.com">tailscale</a>&#8230; Without it, this would never be something you can do within 10 minutes, unless all you do is manually configure wireguard every day &#129315;</p><h2>Step 2: Apple TV or Travel Router</h2><p>Sign up for tailscale, then make sure you have an Apple TV.</p><p>If you do not have one, or you have certain streaming apps that check for the device having an active VPN connection (I am in this situation) then you need to buy <a href="https://www.amazon.com/GL-iNet-GL-MT3000-Pocket-Sized-Wireless-Gigabit/dp/B0BPSGJN7T?hydadcr=24109_13516765&amp;sr=8-1">one of these</a> travel routers. I bought one of these for my parents during Black Friday week for about $60.</p><p><strong>Don&#8217;t buy any of the cheaper ones as they can&#8217;t handle running tailscale.</strong></p><p>Take a look at GL.iNet&#8217;s <a href="https://docs.gl-inet.com/router/en/4/interface_guide/tailscale/">supported device list for tailscale</a> if you want to try a different model. </p><p>Also side note, these things are awesome for a lot of reasons, I have a Slate 7 for myself, MLO is cool, but I wish it also had 6ghz!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://zach.codes/subscribe?"><span>Subscribe now</span></a></p><h2>Step 3: Exit Node</h2><p>Now that you have a travel router or Apple TV device, the next step is to run an exit node at your house. This is going to route all traffic from your travel router through it, no matter where it&#8217;s actually located. This is how we bypass restrictions against sharing accounts, because all of your devices will exit through your home IP, that is the check most services are making, and it will appear like another device in your home is streaming.</p><p><strong>You can use a cheap raspberry pi device, or even your router, if you have something that runs linux chances are tailscale can run on it.</strong></p><p>Otherwise, feel free to use an old windows or mac computer. After installing tailsacle all you need to do is check one box in the settings tab:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T17g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T17g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 424w, https://substackcdn.com/image/fetch/$s_!T17g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 848w, https://substackcdn.com/image/fetch/$s_!T17g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 1272w, https://substackcdn.com/image/fetch/$s_!T17g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T17g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png" width="1050" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:452,&quot;width&quot;:1050,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75712,&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://zach.codes/i/180606230?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.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_!T17g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 424w, https://substackcdn.com/image/fetch/$s_!T17g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 848w, https://substackcdn.com/image/fetch/$s_!T17g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 1272w, https://substackcdn.com/image/fetch/$s_!T17g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb59cd8ba-c83a-4166-8d5e-70b5d8d7d8bc_1050x452.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you have a GL.iNet device, login to the interface and go to the Tailscale tab under applications:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d8Ni!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d8Ni!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png 424w, https://substackcdn.com/image/fetch/$s_!d8Ni!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png 848w, https://substackcdn.com/image/fetch/$s_!d8Ni!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png 1272w, https://substackcdn.com/image/fetch/$s_!d8Ni!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d8Ni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png" width="1456" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:315378,&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://zach.codes/i/180606230?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.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_!d8Ni!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png 424w, https://substackcdn.com/image/fetch/$s_!d8Ni!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png 848w, https://substackcdn.com/image/fetch/$s_!d8Ni!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.png 1272w, https://substackcdn.com/image/fetch/$s_!d8Ni!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fee511a-6bd9-4ebf-b5ca-7389d5f8f7ea_1848x1624.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>When you first come to this, you toggle to enable tailscale, you click the link and login, and the device is configured. Then you click the refresh icon under &#8220;Custom Exit Node&#8221; and select the node we started running in the prior step.</p><p>First time after connecting, you need to go to your tailscale dashboard and click on your device and accept the subnet routes from it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QIkl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QIkl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png 424w, https://substackcdn.com/image/fetch/$s_!QIkl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png 848w, https://substackcdn.com/image/fetch/$s_!QIkl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png 1272w, https://substackcdn.com/image/fetch/$s_!QIkl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QIkl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png" width="1134" height="404" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:404,&quot;width&quot;:1134,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57303,&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://zach.codes/i/180606230?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.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_!QIkl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png 424w, https://substackcdn.com/image/fetch/$s_!QIkl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png 848w, https://substackcdn.com/image/fetch/$s_!QIkl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.png 1272w, https://substackcdn.com/image/fetch/$s_!QIkl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F479292cc-079d-4e54-ac46-092fbfbeaf81_1134x404.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>I like to be extra secure, <strong>so I actually tag this device in tailscale, set a static IP on the device connected to its ethernet port, and then only allow that single IP to use exit nodes in my network. </strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://zach.codes/subscribe?"><span>Subscribe now</span></a></p><p>That means if they connect another device through it, it can&#8217;t go through tailscale, and in addition, that one allowed device can use exit nodes, but will be unable to ping or access any other device in the tailnet.</p><p>This goes beyond the &#8220;10 minutes&#8221; of this tutorial, but I wanted to share it. Tailscale has added ACL tests that validate your firewall rules as well which has been super helpful. Anytime I add a new rule I add a test right after to ensure what I wanted to allow is correctly applied.</p><h2>Step 4: Profit</h2><p>It really is that simple, and if you have an Apple TV&#8230; it&#8217;s even simpler. Install the Tailscale app from the App Store and then scan the QR code displayed to connect. </p><p>Enable your exit node and it&#8217;ll route everything through your home connection.</p><p>I use a travel router and did these exact steps. All I had to tell my family member was &#8220;unplug the ethernet cable from your apple tv, put it into this. And then use the other ethernet port to connect to the apple tv.&#8221; They actually couldn&#8217;t believe it was that easy and were surprised when the app they opened just started working, because it that one only checks your IP, doesn&#8217;t even require a login.</p><p>I couldn&#8217;t let them use the Apple TV directly because the streaming service checks for VPN apps running on device.</p><div><hr></div><p>Seriously this is getting so easy, a gen z kid that only knows how to use tiktok can do it.<strong> Set this up and split the cost of streaming services without having to worry about getting cut off.</strong></p><h2>One downside&#8230;</h2><p>The worst part is that if you have a service on a crappy ISP like I do&#8230; where you only get 30mbps upload speeds, you cant give this out to more than 1-2 people or your upload speed is going to be saturated and not work well. </p><p>Thankfully I have multiple ISPs and keep guest networks and this type of stuff on the bad connection, but some of my streaming services are tied to that ISP&#8217;s IP so i have to use it for this as well.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Replacing Developer Docs with Claude’s Plugin Marketplace ]]></title><description><![CDATA[We don&#8217;t need developer documentation anymore, and you&#8217;ll be more productive than ever &#129327;]]></description><link>https://zach.codes/p/replacing-developer-docs-with-claudes</link><guid isPermaLink="false">https://zach.codes/p/replacing-developer-docs-with-claudes</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 14 Oct 2025 12:55:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Q9s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Q9s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Q9s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 424w, https://substackcdn.com/image/fetch/$s_!9Q9s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 848w, https://substackcdn.com/image/fetch/$s_!9Q9s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 1272w, https://substackcdn.com/image/fetch/$s_!9Q9s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Q9s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp" width="1456" height="785" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:785,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Product screenshot showing Claude Code plugin menu&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Product screenshot showing Claude Code plugin menu" title="Product screenshot showing Claude Code plugin menu" srcset="https://substackcdn.com/image/fetch/$s_!9Q9s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 424w, https://substackcdn.com/image/fetch/$s_!9Q9s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 848w, https://substackcdn.com/image/fetch/$s_!9Q9s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 1272w, https://substackcdn.com/image/fetch/$s_!9Q9s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff965a007-070c-4dbf-81eb-75618b207398_1920x1035.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Last week Anthropic released a feature that may lead to a huge leveling up across your development team. </strong></p><p>If you have multiple (or large) codebases with many individual systems or processes, it can be difficult to onramp a new dev. If you have one dev who needs to work on an area they never worked in, in the past this may have required discussions with other team members, or time spent clicking through and understanding what&#8217;s going on.</p><p>If your team is fast moving, there probably isn&#8217;t much documentation either.</p><h2>Enter Claude Plugins</h2><p><a href="https://www.anthropic.com/news/claude-code-plugins">Claude Code Plugins</a> now allow you to create a github repository with (nearly) hot swappable features to share with your team. <em>I say nearly, because at this current time you have to restart &#8220;claude&#8221; in your terminal when enabling or disabling any plugins.</em></p><p>This is a big deal, because it&#8217;s already been made clear that some team members have agents and commands I don&#8217;t want or need to use. I wouldn&#8217;t want to waste my context window having these enabled either.</p><p>The new plugin marketplace feature solves these problems, and I think it enables instant context sharing across your dev team, with the most minor amount of time spent documenting areas of your codebase.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>How it works</h2><p>All you have to do is create a new github repository, and add a couple json files to get started</p><blockquote><p>To host a marketplace, all you need is a git repository, GitHub repository, or URL with a properly formatted <code>.claude-plugin/marketplace.json</code> file. See our documentation for details.</p><p>To use plugins from a marketplace, run <code>/plugin marketplace add user-or-org/repo-name</code>, then browse and install plugins using the <code>/plugin</code> menu.</p></blockquote><h2>A powerful example</h2><p>Currently at work, there is a new pipeline we made to process a new piece of logic that runs hundreds of times per second. Another dev on the team was assigned a task on this feature that was originally made mostly by myself, with this dev not even looking at any of the code until now.</p><p>This feature requires a few environment changes, and preparation commands in order to start working on it locally.</p><p>In the past, I would need to write this up, explain each step to each team member, and they may still have more questions about how different parts work.</p><p>Instead, I created a new subagent definition in markdown, this is about 1 paragraph with some bullet points.</p><p><strong>I know what you&#8217;re already thinking</strong>&#8230; if you did that, why not explain and send this to the other developers?</p><p>Here&#8217;s a few reasons why, as demonstrated by sharing parts of this subagent definition.</p><h2>Hot Swappable Subagents</h2><p>The definition for this agent starts with:</p><p>&#8220;You are an expert in this area of the codebase, ensure you read and understand it fully &lt;path to feature&gt;&#8221;</p><p>This alone isn&#8217;t something I could say to a team member. To Claude however, it is able to read and pull all of this feature into its context, ready to go for any questions about how it works after.</p><p>In addition, I described in a bullet list, the preparation commands that need to be ran to setup the environment, and I have the subagent to tell the user what the final command is to start using this pipeline and to also offer help after running the required setup commands.</p><h2>Slash Commands</h2><p>The last step, I register a slash command like &#8220;/run-pipeline&#8221; inside this feature&#8217;s plugin. This command invokes the subagent directly without the developer having to know its name. </p><h2>In Practice</h2><p>Now that we have a plugin marketplace for our team, if someone needs to work on this feature, all I have to tell them to do is install our marketplace in their claude code, if they haven&#8217;t already. As easy as `<code>/plugin marketplace add user-or-org/repo-name`</code>as mentioned earlier. If your computer has access to the org / repo on github it&#8217;s able to pull it in immediately.</p><p>Next, I can mention, &#8220;enable the feature X plugin from our marketplace and run the /start-x command, it&#8217;ll configure everything and provide you all the context&#8221;</p><p>The developer will be given a recap of the step required to run the code, and be given a chance to ask any questions about the code at this point.</p><h2>Summary</h2><p>This feature seems small but I think it&#8217;s going to lead to a paradigm shift of internal developer communication and documentation. When building a large feature, it takes all of 10 minutes to define an agent and provide the necessary testing steps, file locations, and commands needed. <strong>The rest of the team can enable this feature plugin on the fly anytime to gain context, without extra meetings, hours spent reading code manually, or other slow processes.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From $3K/Month to $0: Why We Ditched Auth0 and Built Our Own Authentication]]></title><description><![CDATA[Finally had an excuse to do it: kill our Auth0 subscription &#9989;]]></description><link>https://zach.codes/p/from-3kmonth-to-0-why-we-ditched</link><guid isPermaLink="false">https://zach.codes/p/from-3kmonth-to-0-why-we-ditched</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Wed, 03 Sep 2025 13:31:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!N11v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N11v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N11v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!N11v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!N11v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!N11v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N11v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N11v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!N11v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!N11v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!N11v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5c23282-2630-4a83-91b0-1f1c6daf6571_1024x608.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"></figcaption></figure></div><p>There's a secret that so many providers don&#8217;t want you to know.</p><p>You really can roll your own auth, and that doesn't have to mean not following standards or being opened up to new vulnerabilities. </p><p>At my current job, this was a discussion we had about a year ago. Originally there was a choice to use email logins and pay for a service called Magic Link. </p><p>It ended up costing too much, and the team decided to move it to Auth0. </p><p>At which point we started entering a period of trying to cut costs. One of my first suggestions was, "Let's cut Auth0 and do it in-house." </p><p>This wasn&#8217;t a new decision for me. I've always felt like you shouldn't have to pay for auth. There are standard ways to do this without paying per user or per login. </p><h2>Auth0 just uses SendGrid for emails</h2><p>I tried to make this point clear, that Auth0 just uses SendGrid, and we can still use SendGrid ourselves. Auth0 isn't doing anything special to ensure magic email link delivery. </p><p>They&#8217;re just generating a time based one time code that gets emailed to the recipient, this type of hash logic can be done easily in any language.</p><p>At the time, <a href="https://better-auth.com">better-auth</a> did not exist. If I were doing this today, I would much rather use their library, as it supports so many integrations out of the box with a simple abstraction.</p><p>Instead, we implemented an OTP very similarly to <a href="https://github.com/pyauth/pyotp">this library</a>, if you&#8217;re interested in doing this yourself.</p><p></p><h2>How long did it take us</h2><p>It didn't take more than a week to fully replace Auth0. That's a testament to the way we're using it in the first place. We don't need a lot of their features. We're just using Auth0 to take an email and send a link, click the link, and now be logged in, and also for social logins. One click Google, Microsoft, and other OAuth login flows.</p><p>It kind of boggles my mind that people would pay per login for these features, especially with social logins that require registering oauth clients manually either way you do it.  </p><p>In the next section, I'll dive into a few things we specifically used to replace it, and also comment on some of the common gotchas people constantly bring up trying to say you shouldn&#8217;t do this.</p><p>And just remember, we've been doing this for an entire year. Saving the company nearly $30,000 and it's been working perfectly. </p>
      <p>
          <a href="https://zach.codes/p/from-3kmonth-to-0-why-we-ditched">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[From Subreddits to Speech: A Reddit Engineer's AI Side Project]]></title><description><![CDATA[Discussing the intersection of voice agents and AI with Ryan and Marcus.]]></description><link>https://zach.codes/p/alcamine-and-ai-with-marcus-wood</link><guid isPermaLink="false">https://zach.codes/p/alcamine-and-ai-with-marcus-wood</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Wed, 20 Aug 2025 12:04:29 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/171300237/4bb0fe45d3c0f85e753fc43829d5384a.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>This week we check out <a href="https://alcamine.com/">alcamine</a>, an awesome voice service utilizing cutting edge AI technology to create custom voice agents. Co-founded by Marcus Wood, an Engineer working at Reddit.</p><h2>Summary</h2><p>In this episode of the podcast,  Zach speaks with Marcus, a developer at Reddit, about the intersection of AI and voice technology. They discuss Marcus's side project, a voice agent designed for various applications, including customer feedback and gaming. The conversation explores the challenges and opportunities in voice technology, the importance of community engagement in game development, and the evolving landscape of AI tools that facilitate learning and productivity. Marcus shares insights on building in public, the role of Reddit's developer platform, and the future prospects of voice agents in business and everyday tasks.</p><h2>Takeaways</h2><p>Marcus is an engineer at Reddit working on AI and voice technology.</p><p>He has developed a voice agent for various applications.</p><p>The voice agent aims to simplify customer feedback processes.</p><p>Voice technology can enhance user experiences in gaming.</p><p>Community feedback is crucial for developers to improve their products.</p><p>AI tools can significantly reduce the time spent on tasks.</p><p>Voice is becoming a preferred method of communication.</p><p>Reddit's developer platform allows for game development and community engagement.</p><p>The future of voice technology looks promising with rapid advancements.</p><p>Learning through AI tools is more accessible than ever.</p><h2>Chapters </h2><p>00:00 Introduction to AI and Voice Agents</p><p>02:57 Building a Voice Agent for Customer Feedback</p><p>05:40 Exploring Use Cases for Voice Technology</p><p>08:28 Challenges in Voice Technology and AI</p><p>10:52 The Future of Voice Agents in Business</p><p>13:48 Voice Technology in Gaming and Community Engagement</p><p>16:32 AI Tools and Learning Opportunities</p><p>19:26 The Role of AI in Everyday Tasks</p><p>22:09 Reddit's Developer Platform and AI Integration</p><p>25:24 Feedback and Community in Game Development</p><p>28:02 The Evolution of AI and Voice Technology</p><p>30:53 Conclusion and Future Prospects</p>]]></content:encoded></item><item><title><![CDATA[Fake It Till You Make It: Blockchain Apps Aren't Actually Decentralized]]></title><description><![CDATA[I've been deep in the crypto rabbit hole... between the massive IPOs, projects raising quarter-billion rounds, and an idea that's been keeping me up at night.]]></description><link>https://zach.codes/p/fake-it-till-you-make-it-blockchain</link><guid isPermaLink="false">https://zach.codes/p/fake-it-till-you-make-it-blockchain</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 05 Aug 2025 12:30:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dzxA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dzxA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dzxA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!dzxA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!dzxA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!dzxA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dzxA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37d585df-faeb-423f-86d5-c384a365df32_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dzxA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!dzxA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!dzxA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!dzxA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37d585df-faeb-423f-86d5-c384a365df32_1024x608.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>If you&#8217;ve never played around with crypto&#8230;. a lot of these terms will confuse you. I&#8217;ll do my best to provide links if you&#8217;re interested in diving in to any of the things I mention.</p><p>Lately I have been playing around with crypto again. Back in 2015 I started mining ethereum and gave up too early. I never got into building smart contracts and actual decentralized apps, but I may be making a small one soon, just to learn.</p><p>As I was catching up on many different things, I started to realize just how centralized all the big &#8220;DeFi&#8221; apps really are. I&#8217;m shocked there isn&#8217;t more being done here to make some of them truly on-chain completely, or at least more agnostic in letting users control off chain actions affecting these applications.</p><p>It&#8217;s just unfortunate many users think what they&#8217;re using is either untrackable, or fully decentralized.</p><h1>Uniswap</h1><p>Let&#8217;s start with <a href="https://app.uniswap.org/?gad_campaignid=21376785996&amp;gbraid=0AAAAAqyUpDM58DwbgEXyv7mQ1zf491qfb">uniswap</a>.</p><p>It&#8217;s a great idea, a decentralized crypto exchange. The problem starts immediately though. </p><p>There has to be some way to know the current exchange rates offered by the platform and also other exchanges. </p><p>When you load the site, it makes graphql requests to their own *centralized* server in order to get information.</p><p>You also see many calls that track your every move:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bPQ6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bPQ6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png 424w, https://substackcdn.com/image/fetch/$s_!bPQ6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png 848w, https://substackcdn.com/image/fetch/$s_!bPQ6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png 1272w, https://substackcdn.com/image/fetch/$s_!bPQ6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bPQ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png" width="814" height="416" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:416,&quot;width&quot;:814,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:93913,&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://zach.codes/i/169795906?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.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_!bPQ6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png 424w, https://substackcdn.com/image/fetch/$s_!bPQ6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png 848w, https://substackcdn.com/image/fetch/$s_!bPQ6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.png 1272w, https://substackcdn.com/image/fetch/$s_!bPQ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc05b55b-10e5-4be9-ae16-0fe8623e79ef_814x416.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>Here&#8217;s one sending all of my device info with every action taking place.</p><p>Feels a lot like a normal website to me. And an invasive one at that&#8230;</p><p>At least they are <a href="https://blog.uniswap.org/uniswap-interface-ipfs">hosting it on IPFS</a>, which is a distributed website hosting spec. It&#8217;s acutally really neat too. The problem I see though is its oracle outreach from the interface for pricing. </p><p>I haven&#8217;t had enough time to config if their interface will still allow smart contract execution if one of their oracle systems is down.</p><p>Let&#8217;s take a look at another one!</p><h1>Polymarket</h1><p>Alright, neat. Inspecting the page, I see direct calls to the blockchain. Decentralized right?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ApZy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ApZy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png 424w, https://substackcdn.com/image/fetch/$s_!ApZy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png 848w, https://substackcdn.com/image/fetch/$s_!ApZy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png 1272w, https://substackcdn.com/image/fetch/$s_!ApZy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ApZy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png" width="1456" height="367" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:367,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82611,&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://zach.codes/i/169795906?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.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_!ApZy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png 424w, https://substackcdn.com/image/fetch/$s_!ApZy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png 848w, https://substackcdn.com/image/fetch/$s_!ApZy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.png 1272w, https://substackcdn.com/image/fetch/$s_!ApZy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4cf898e0-082e-4803-bcb2-8be0b98c183b_1562x394.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>Well&#8230; sort of. These calls are sent to <a href="https://www.alchemy.com/docs/reference/node-api-overview">alchemy</a>, a blockchain services provider. What happens if they do a deployment and mess up their node, suddenly polymarket is down (most likely anyway)</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I was wondering, why don&#8217;t these services attempt to direct connect to various validators?</p><blockquote><p>P.S. I am not an expert AT ALL in this space, just someone interested in trying to make a fully, truly, decentralized app soon, and finding a lot of issues with current products.</p></blockquote><p>Granted, they may not market themselves as fully decentralized, but I&#8217;m sure that&#8217;s how most people perceive them.</p><p>So I asked Claude, can&#8217;t I direct connect to a validator? Not always. </p><p>It makes sense, most don&#8217;t want to run the rpc endpoints, because it will use a lot more resources, and these validators already require a massive amount of compute.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5aZp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5aZp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 424w, https://substackcdn.com/image/fetch/$s_!5aZp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 848w, https://substackcdn.com/image/fetch/$s_!5aZp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 1272w, https://substackcdn.com/image/fetch/$s_!5aZp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5aZp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png" width="1436" height="710" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a881bf2e-0048-46f3-b541-865ee002846b_1436x710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:710,&quot;width&quot;:1436,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:210416,&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://zach.codes/i/169795906?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.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_!5aZp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 424w, https://substackcdn.com/image/fetch/$s_!5aZp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 848w, https://substackcdn.com/image/fetch/$s_!5aZp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 1272w, https://substackcdn.com/image/fetch/$s_!5aZp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa881bf2e-0048-46f3-b541-865ee002846b_1436x710.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are just so many points of failure, but for something like polymarket, you must have off chain systems that confirm what the result of the different markets are.</p><p>This puts all the trust in a platform that has already had legal battles in the past. I&#8217;d be worried about betting on something many months away.</p><h1>True Decentralization</h1><p>Let&#8217;s start with just polymarket. It could be better if they offered a download link of their frontend application&#8230;. Oh wait, they&#8217;re using server side nextjs&#8230;. so they can&#8217;t. IPFS is perfect for client side websites that connect to the blockchain, because IPFS can only handle static files.</p><h2>Validator Choices</h2><p>I would expect these types of apps to have a settings toggle that lets you put in a different validator endpoint. If one is down, you can swap, this would be a great option to have. Otherwise you&#8217;re connecting to a single point that may proxy behind the scenes, or it could have an outage at any time with no way to use the application.</p><p>If they don&#8217;t want to go that far, at least an internal list of validators to loop through if there was a connection problem.</p><p>I&#8217;d rather be able to do this, vs having to store every smart contract address and know the exact arguments to call in case I need to withdraw or perform other actions during a site issue.</p><h1>Downloadable</h1><p>If their domain is seized, you&#8217;re already pretty screwed, unless you have saved network logs and know what rpc calls to make to see anything on the system.</p><p>This is step 1 of decentralizing these apps, at a bare minimum, I believe they should be html and js frontends, that are downloadable and run outside of their company&#8217;s domains.</p><p>AAVE, and Uniswap are good at this, although as I mentioned prior, still concerning how many 3rd party api endpoints are called from these frontends. Leaving me to wonder if they will work if certain things break.</p><h1>Open Source Consensus</h1><p>Imagine Polymarket showing who the market validator is. In this case, it&#8217;s always polymarket. Let the community pay in crypto to be listed as a validator, track if they&#8217;re grading outcomes correctly, and let members decide who gets to validate their bets.</p><p>This has a lot of possible problems, but ultimately you need to trust someone. I&#8217;m suggesting to let users choose who to trust and make it uncontrollable by a single entity.</p><h1>Failsafes</h1><p>If I chose to let polymarket grade my bet, and pick the outcome after the event happened, and polymarket gets shutdown. There should be a smart contract I can execute that will refund me after the end date of the market. This would provide relief if the platform is shut down.</p><p>When I use something on a blockchain, I want to know if everything goes bad (except for actual nodes all being taken offline) I want to know what I am interacting with is still safe.</p><h2>Wallet functionality</h2><p>Wallets need to be able to ingest smart contract calls. I should be able to add th contract above (refunding after market issues), to my wallet, letting me interact with contracts in case the domains are no longer available, or I forget about them later.</p><p>I shouldn&#8217;t have to review the code myself.</p><h1>No tracking</h1><p>Stop tracking usage, and build in your economics through transaction fees on the platform. Build everything you can into your smart contract, so you don&#8217;t need a graphql endpoint to do half the work&#8230;</p><h1>Wrap up</h1><p>Hope you enjoyed these ramblings, I believe decentralized apps can be made much better, but the truth is, these companies don&#8217;t want them to be. A lot of them are making millions a month under a false sense of decentralization. </p><p>Building apps fully on chain is incredibly hard, most aren&#8217;t going that far because they want to keep more control to themselves, giving us many single points of failure in the end.</p><p>I&#8217;m not sure how useful the technology will ultimately be many years from now. Currencies may take off more than the applications. </p><p>Only time will tell&#8230;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From Biology To Vibe Coding]]></title><description><![CDATA[We meet with a PhD candidate in Biology to hear how they're coding]]></description><link>https://zach.codes/p/from-biology-to-vibe-coding</link><guid isPermaLink="false">https://zach.codes/p/from-biology-to-vibe-coding</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Fri, 01 Aug 2025 12:10:03 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/166186868/235eba769c49c9117d62c0855c764143.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>A friend working in biology recently approached me with an app idea. What caught my attention was that within two weeks, despite having zero coding experience, he had a working prototype. I was curious enough to sit down with him and dig into how he pulled it off, and what it revealed about how AI is transforming biological research.</p><p><em>It appears they use &#8230;</em></p>
      <p>
          <a href="https://zach.codes/p/from-biology-to-vibe-coding">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Context Engineering & ToolFront]]></title><description><![CDATA[If you want to pull information from databases using natural language, this is the episode for you.]]></description><link>https://zach.codes/p/context-engineering-and-toolfront</link><guid isPermaLink="false">https://zach.codes/p/context-engineering-and-toolfront</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 22 Jul 2025 11:03:07 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/168415759/c699e56a13d1b62039a8defc3fb1718f.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>You can find toolfront <a href="https://github.com/kruskal-labs/toolfront">on github</a>. Today we meet with a cofounder of the project and discuss a lot of interesting things around database querying and how to efficiently build MCP tools for large language models.</p><h2>Summary</h2><p>In this conversation, Zach and Esteban discuss the integration of Docker and DuckDB in ToolFront, focusing on data discovery and querying &#8230;</p>
      <p>
          <a href="https://zach.codes/p/context-engineering-and-toolfront">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Every AI-Powered Development Environment I Could Find]]></title><description><![CDATA[There&#8217;s too many to keep track of &#128518;]]></description><link>https://zach.codes/p/every-ai-powered-development-environment</link><guid isPermaLink="false">https://zach.codes/p/every-ai-powered-development-environment</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Fri, 18 Jul 2025 13:31:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/29623049-cc7c-486a-a6e8-e1321bcc1058_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I_TN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I_TN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!I_TN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!I_TN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!I_TN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I_TN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!I_TN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!I_TN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!I_TN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!I_TN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f3a482b-dc59-4d24-be93-f9b6e9cd409e_1024x608.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><em>I wrote this a few weeks back and there hasn't been a perfect time to release it, as I've been working on podcasts and other content, and I don't want to blow everyone up with too many emails per week. So I hope you enjoy this and let me know if there's any other editors I should add. </em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Zed</h2><p><a href="https://zed.dev/">Website</a></p><p>Zed is actually one of my favorite alternative code editors, mainly because it's not just another VSCode fork and it's written in Rust. So it actually feels a little bit snappier and unique. And I like what they've done with the design. </p><p>I like that it supports local models. They have a hosted version similar to Cursor. They also have their own proprietary autocomplete model, which is pretty far behind Cursors, unfortunately. You'll see below when I get to cursor why and how it's so much better than all the current alternatives. </p><p>If you want to support an open-source editor who's trying to make money by charging for premium model access, Zed is a good one. Unlike Cursor, which is fully proprietary, Zed's editor is open source.</p><p>It also gets high praises from users on Reddit:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YA5U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YA5U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 424w, https://substackcdn.com/image/fetch/$s_!YA5U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 848w, https://substackcdn.com/image/fetch/$s_!YA5U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 1272w, https://substackcdn.com/image/fetch/$s_!YA5U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YA5U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png" width="1179" height="612" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:612,&quot;width&quot;:1179,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:100456,&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://zach.codes/i/165235738?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.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_!YA5U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 424w, https://substackcdn.com/image/fetch/$s_!YA5U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 848w, https://substackcdn.com/image/fetch/$s_!YA5U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 1272w, https://substackcdn.com/image/fetch/$s_!YA5U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8d711f2-3f1e-4798-bc5f-9a4fd1ce0632_1179x612.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The speed of the editor is really nice, but It&#8217;s still early days for Zed. </p><p>I noticed that I cannot override a local model&#8217;s ability to enable tool use. This was a huge pain, and most of the value of using a local model for agent mode, required tool use. Most of these editors all have some issues that irk me to some degree. Even after manually adding it to the settings config for my model, it was still disabled.</p><p>A small quirk which is to be expected in something so new. Give it a try and let me know what you think!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://zach.codes/subscribe?"><span>Subscribe now</span></a></p><h2>Void</h2><p><a href="https://voideditor.com/">Website</a></p><p>Void is a pretty nice VSCode fork. It's very simple, the auto-complete is basic, the agent mode is what you'd expect from Cursor, Zed, or Continue, or any of the other ones that you may have tried. </p><p>It's really what you would think VSCode would have been had it started out after AI was a thing. </p><p>It's nice that everything just works. If you have Olah or LM Studio or another local model language server running on your computer, there is no configuration. Just opening Void immediately sees that and you can choose any of those models for a chat or an auto-complete session. </p><p>It's worth noting that autocomplete is in beta, and again it's just basic autocomplete. Nothing compared to the state of the art that exists in Cursor. </p><p><strong>Void is probably the most promising newer entry into the open source space</strong>. If they can iterate and catch up, I can see it being great. Even though it&#8217;s a little bare bones now, it just works. There were no issues.</p><p>Zed and Void are the most exciting ones, with Void being slightly more at this time, because they aren&#8217;t pushing for paid versions of anything yet, which I hope it stays that way.</p><h2>Open Hands</h2><p><a href="https://github.com/All-Hands-AI/OpenHands">Website</a></p><p>I used this one for the first time when <a href="https://mistral.ai/news/devstral">Devstral</a> came out a couple weeks ago.</p><p>This one is unique because it&#8217;s really a layer ON TOP of an IDE. It includes VS Code inside of it.</p><p>It&#8217;s really meant to fire off a lot of AI tasks all at once. For each task you get your own  isolated VS Code environment you can use to test and run the code before pushing it up to your repos.</p><p>It&#8217;s a really neat idea that negates the need to context switch between editors constantly as you&#8217;re trying to validate work you had AI do for you.</p><h2>Cursor </h2><p><a href="https://www.cursor.com/">Website</a></p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;cbd73a1c-ccd4-44b6-a0e3-ba13f82bc91b&quot;,&quot;duration&quot;:null}"></div><p>You've heard me talk a lot about Cursor in the past reviews. The biggest thing is the video above. The tab autocomplete is just incredible. Not only will it jump around and immediately realize that you want to import certain things that don't exist, but it will also be really intelligent in other ways.</p><p>If you're editing something that has something similar in the file, it will suggest to just tab complete both of those sections together. It's amazing what they've been able to do from what little I understand. They have a special model that will pull in tons of context all from your codebase and really understand everything you're trying to do. It's been specifically trained on how people jump around in their editor. </p><p>Cursor's agent mode for a long time was a ways off from what Cline and Roo code were, but it's since improved a lot and to be honest it's a great value for the $20/month that it costs. </p><p>I would have to say after every AI ide and extension that I've tried over the past year, I always come back to Cursor's autocomplete. Whether I use a different editor to do agent work, I will always use Cursors tab autocomplete. And I cannot wait for the day that open source has an autocomplete that's on par with it. </p><p>I have to give Cursor a 9.5/10, and honestly, I would give it a 10/10 if they weren't completely closed source. </p><h2>Windsurf</h2><p><a href="https://windsurf.com/">Website</a></p><p>This one I do not have much experience with. It is nearly identical to cursor which I have use a lot more. Their tab autocomplete is a level up from the open source options but I still find cursor&#8217;s ux and abilities better.</p><p>Which is crazy to me that it was just <a href="https://devops.com/openai-acquires-windsurf-for-3-billion/">acquired by Open AI for 3 BILLION</a>.</p><p>Edit: that deal fell through actually  &#128556;</p><p>In such a crowded market I can&#8217;t believe they paid so much for this company. They must know something I don&#8217;t or want to own as much of the AI market as possible.</p><h2>VS Code + Continue </h2><p><a href="https://www.continue.dev/">Website</a></p><p>If this was a year ago, I would say Cursor and Continue are pretty similar, and it's pretty awesome what Continue is doing for the open source community. But lately, it's fallen way behind. I found bugs when I try to use it. It kind of glitches when it tries to apply changes from what an agent gives me, and I choose the apply button. Sometimes the red highlights in VSCode will stay around even after I hit accept. It's little things like that, and the unpolished nature of Continue that it's just fallen off a lot more than Cursor, whereas Cursor has really beautiful UI, really nice loading indicators, and everything just looks like perfection. </p><p>It's worth noting that Mistral just made a fork of Continue for their enterprise offering called Mistral Code (insert link), but nobody's able to try it without enterprise access, so I can't comment on it.</p><h2>Claude Code</h2><p><a href="https://www.anthropic.com/claude-code">Website</a></p><p>I've been using Claude code non-stop since I paid for the Max Plan two weeks ago.</p><p>The agentic loop that Claude is able to do is superior to every other agent mode currently. </p><p>Whenever it encounters a mistake or an error, it seems to always find a way around it and continue working through what it needs to. </p><p>This isn't really an IDE, but I felt like I had to add it just because it's so similar to everything else, and it really can become its own IDE. </p><p>Sounds weird to say when it's just a command line application. But it's able to do so much with such a simple interface. </p><p>I'm able to make reproducible prompts, which handles so many complex tasks I don't even need to jump around in my editor anymore. </p><p>You can see more of my thoughts about how I&#8217;m using it in <a href="https://zach.codes/p/mental-refactoring-for-the-ai-age">my post last week about shifting your mindset to use AI</a>.</p><h2>VS Code + Cline</h2><p>I wasn't going to add an entry for this one, but I felt like I had to after writing everything else. </p><p>Visual Studio Code by itself and now I guess with Copilot which is open source, so you can kind of consider those one in the same. In addition to that, Cline is pretty powerful on its own. </p><p>If you're stuck on VSCode because you've been using it for a very long time, just install Cline. The agent mode is pretty amazing if you're trying to stick to what you know. </p><p>I love that you can use any model provider. Local models work as well, especially with Devstral, and you can just get a lot out of it without paying anyone anything. </p><h2>Kilo Code</h2><p>https://kilocode.ai/?rdt_cid=5199116422869239961&amp;utm_campaign=v1_en_aicoding&amp;utm_medium=cpc&amp;utm_source=reddit</p><p>This one keeps appearing on advertisements constantly, although I haven&#8217;t had a chance to test it out yet.</p><h2>AIDE</h2><p>This one seems to be the first one to lose the war of the Aiditors (see what I did there &#128518;) </p><p>It&#8217;s been officially sunset as of a few months ago I only included it because I had used it once, went to go see what&#8217;s new, and saw the repository is archived.</p><h2>That&#8217;s all for now</h2><p>I hope to see Void and continue keep striving forward. </p><p>If Microsoft doesn&#8217;t level up the newly open sourced GitHub copilot extension in VS Code, I can see both of those getting bigger&#8230;. If they can catch up with Cursor</p><p>There&#8217;s a lot of other extensions like Cline, Roo Code, but I left those out as they are more of a specific agent only tool, not an entire editor integration. </p><p>Hope you found this useful, and if there&#8217;s another one you&#8217;re using, let me know in the comments and maybe I can update this. I&#8217;m trying all of these that I can, but I&#8217;m realizing the only one standing out drastically is cursor, and a little bit with Zed as its a uniquely different editor platform than the rest. </p><p></p><p>I am using my IDE less than ever before, with most of my time spent inside Claude code. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Agentic Coding with Ryan Castner]]></title><description><![CDATA[Ryan joins to discuss his LLM usage after a quick discussion on an upcoming hackathon]]></description><link>https://zach.codes/p/agentic-coding-with-ryan-castner</link><guid isPermaLink="false">https://zach.codes/p/agentic-coding-with-ryan-castner</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 15 Jul 2025 11:10:09 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/168226842/fe5371d5676d2390cc3e98bfb578fba1.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>Ryan and I plan to start doing a podcast more regularly starting next Friday. Enjoy our first one today as we dive into many AI coding tools and our thoughts on the different ways of using them.</p><h2>Summary</h2><p>In this conversation, Zach and Ryan discuss the RevenueCat hackathon, exploring app development ideas and investment strategies. They delve into the use of AI tools in coding, the challenges developers face with AI, and the future of AI in software development. The discussion highlights the importance of understanding AI tools, the potential pitfalls of relying too heavily on them, and the evolving landscape of coding productivity.</p><h2>Chapters</h2><ol><li><p><strong>Introduction to Revenue Cat Hackathon</strong> (0:00 - 2:30)</p><ul><li><p>Discussion about the Revenue Cat Ship-a-Tone 2025 hackathon.</p></li><li><p>Details about the submission requirements and prize categories.</p></li></ul></li><li><p><strong>Revenue Cat's Mission and Requirements</strong> (2:31 - 5:00)</p><ul><li><p>Explanation of Revenue Cat's mission and the requirement to use their subscription payment service.</p></li></ul></li><li><p><strong>App Idea Discussion</strong> (5:01 - 10:00)</p><ul><li><p>Conversation about a potential app idea related to investment and savings.</p></li><li><p>Comparison with existing apps like Griffin and Acorns.</p></li></ul></li><li><p><strong>Agentic Coding and AI Tools</strong> (10:01 - 20:00)</p><ul><li><p>Discussion on using coding agents and AI tools like React Native, Swift, and LLMs.</p></li><li><p>Personal experiences with various AI tools and their impact on productivity.</p></li></ul></li><li><p><strong>Challenges with AI Tools</strong> (20:01 - 30:00)</p><ul><li><p>Issues faced with AI tools like Gemini and Claude.</p></li><li><p>Discussion on the importance of context windows and tool calls.</p></li></ul></li><li><p><strong>Pricing and Subscription Plans</strong> (30:01 - 40:00)</p><ul><li><p>Conversation about the pricing of AI tools and subscription plans.</p></li><li><p>Personal experiences with different plans and their value.</p></li></ul></li><li><p><strong>Local Model Performance and Hardware</strong> (40:01 - 50:00)</p><ul><li><p>Discussion on running local models and the hardware requirements.</p></li><li><p>Comparison of different hardware capabilities for running AI models.</p></li></ul></li><li><p><strong>Future of AI in Development</strong> (50:01 - 60:00)</p><ul><li><p>Speculation on the future of AI in software development.</p></li><li><p>Concerns about the impact of AI on developer roles and salaries.</p></li></ul></li></ol><h2>Takeaways</h2><p>The Revenue Cat hackathon encourages developers to create new apps.</p><p>Investment apps can help users save and invest simultaneously.</p><p>AI tools can enhance coding productivity but require understanding.</p><p>Developers need to be cautious about relying solely on AI.</p><p>The future of software development will heavily involve AI tools.</p><p>Companies may face challenges if they rely too much on AI for coding.</p><p>Understanding the context of code is crucial for effective AI use.</p><p>AI can help automate tasks but may introduce new complexities.</p><p>Developers should maintain their coding skills alongside using AI tools.</p><p>The landscape of coding tools is rapidly evolving, requiring adaptability. </p>]]></content:encoded></item><item><title><![CDATA[Bulletproof Docker Releases with Automated Migration Testing]]></title><description><![CDATA[Test migrations and block releasing if your next release isn't compatible]]></description><link>https://zach.codes/p/testing-migrations-before-releasing</link><guid isPermaLink="false">https://zach.codes/p/testing-migrations-before-releasing</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Thu, 10 Jul 2025 11:38:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!M5kx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M5kx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M5kx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!M5kx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!M5kx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!M5kx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M5kx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M5kx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!M5kx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!M5kx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!M5kx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e8063e-76b7-411b-972f-fbd64472b983_1024x608.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">A &#8220;bulletproof&#8221; docker container ship &#128521; </figcaption></figure></div><p>Just before I open sourced <a href="https://github.com/zackify/revect">revect</a>, I had a problem. Well, two problems actually.</p><p>I wanted to make sure if people used a different embedding model later on, the system still worked. With vector embeddings, you turn text into vectors, and if you rely on Open AI&#8217;s models&#8230; when they deprecate it, you&#8217;re screwed&#8230; Unless you re-embed everything with a new model.</p><blockquote><p>If you are not familiar, an embedding model converts words into vectors, basically points on a chart or map. This makes it possible to search by meaning of words. For example, search the word &#8220;government&#8221; and find everything related to presidents even though the text doesn't exactly match. </p></blockquote><p>So I did that. If the model changes, the system knows and re-embeds it all automatically. </p><p>The next problem, I wanted to make sure, even if a mistake is merged in to main, we do not push out a new docker image. For example, a mistake with a migration that would break older users databases.</p><p>You might imagine referencing some new database field, without renaming the original database columns. This would cause anyone who uses &#8220;pull always&#8221; on docker, to receive the new code, and then it immediately breaks, because their database schema is different.</p><p>So I had a simple solution, and I let <a href="https://www.anthropic.com/claude-code">claude code</a> implement it for me &#128521;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">Get the insights that keep you ahead of the curve&#8212;delivered straight to your inbox before the trends hit mainstream.</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><h2>Migrate the last version every deploy</h2><p>You can see the entire action <a href="https://github.com/zackify/revect/blob/main/.github/workflows/docker-publish.yml">here</a>. Basically:</p><pre><code>const currentReleaseTag = context.payload.release.tag_name;
const currentIndex = releases.data.findIndex(r =&gt; r.tag_name === currentReleaseTag);

// Get previous release if it exists
if (currentIndex &gt;= 0 &amp;&amp; releases.data.length &gt; currentIndex + 1) {
 const prevRelease = releases.data[currentIndex + 1];
 console.log(`Previous release: ${prevRelease.tag_name}`);
 return prevRelease.tag_name;
} else {
 console.log('No previous release found');
 return '';
}</code></pre><p>Grab the previously released git tag, every time we make a new docker image. I use GitHub's releases section to do deploys, so I always make my release tags incremental. </p><p>It doesn't really matter how you make them as long as there is one prior release to the current build when you add this.</p><pre><code># Create directory for database
mkdir -p ./data

# Pull previous image
PREV_TAG=${{ steps.prev_release.outputs.result }}
docker pull ${{ env.DOCKER_IMAGE }}:${PREV_TAG}

# Run migrations on previous version
echo "Running migrations on previous version ${PREV_TAG}"
docker run --name prev-revect -v $(pwd)/data:/app/data ${{ env.DOCKER_IMAGE }}:${PREV_TAG} bun run /app/src/database/migrations.ts up

# Build current version for testing (only amd64 for testing)
docker build -t ${{ env.DOCKER_IMAGE }}:test .

# Test migrations with the new version
echo "Testing migrations on new version"
docker run --name new-revect -v $(pwd)/data:/app/data ${{ env.DOCKER_IMAGE }}:test bun run /app/src/database/migrations.ts up</code></pre><p>Okay, so here's a breakdown of what we just did above:</p><p>We pull the LAST release image.</p><p>Run migrations on it, these are the migrations from that prior release. This is done in the volume mount, /app/data. Revect initializes a sqlite file here if one doesn&#8217;t exist yet.</p><p>Now we build the new image, and we run the migrations on that database from the prior version, because <strong>we mount the same volume</strong>.</p><p>If it fails, the release stops, and we don&#8217;t push out anything broken to current users!</p><p>I thought it was pretty neat and intuitive.</p><h2>External databases</h2><p>Okay, that's cool and all, but how might we do this with external databases that aren't SQLite? </p><p>I'm not going to go too in depth, but you can use all of the same paradigms I shared above. </p><p>The only difference would be that you need to do a docker run for Postgres inside your GitHub actions or any other external database service, and then run your app container and make sure that it has the correct environment variables to connect. </p><p>Essentially, the only change is instead of a volume mount for SQLite, you're just starting Postgres and then injecting the Postgres connection URL to the previous container. </p><p>After that's done, now you have your base migrations that have already been applied. Now you inject the same connection URL to the new container and run the migrations, <strong>exactly like we did using SQLite</strong>. The difference is, you now have a second container running inside of GitHub Actions (your database server).</p><p>I think this is worth doing, especially for releases of open source projects, even internal projects if they are consumed by many internal teams.</p><p>If you found this interesting, please give it a like or comment. I haven't seen this discussion very often when it comes to Docker or content around safety nets for migration issues. </p>]]></content:encoded></item><item><title><![CDATA[I Used GitHub Copilot+ For a Week]]></title><description><![CDATA[A very quick look at Copilot Agent and the ways I used it]]></description><link>https://zach.codes/p/i-used-github-copilot-for-a-weekheres</link><guid isPermaLink="false">https://zach.codes/p/i-used-github-copilot-for-a-weekheres</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Thu, 03 Jul 2025 11:29:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bjmk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bjmk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bjmk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!bjmk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!bjmk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!bjmk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bjmk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bjmk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!bjmk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!bjmk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!bjmk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4ff456e-4c33-4174-85d2-327b94511f70_1024x608.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"></figcaption></figure></div><p>A few weeks ago when Copilot Pro+ was announced, I paid the $40 and started using it. I was super intrigued because having an AI agent on GitHub's website directly seemed like a pretty powerful tool. </p><p>It's not like there's a new model or anything, but the cool part is <strong>being able to have AI interact with pull requests and issues. </strong></p><p>I think it helps a team level up if multiple people can go review a PR and have AI address it without you having to pull anything locally on your device (or into a codespace)</p><p>This leads us into our first big problem with Copilot&#8217;s Agent: currently, <strong>there's no way </strong>to have it respond to PR questions or comments that weren't originally started by Copilot. </p><p>It can do this, but only when it's the one who originally opened the pull request. </p><h2>Real Examples</h2><p>I'll go through and share some screenshots of some real results I did in the repository of mine. I used it so much during my testing that I got completely blocked and it started saying, "Unfortunately, I couldn't process your request." Through inspecting GitHub actions, I realized it's because I was rate limited. </p><h3>Adding Sentry</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pBz_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pBz_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png 424w, https://substackcdn.com/image/fetch/$s_!pBz_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png 848w, https://substackcdn.com/image/fetch/$s_!pBz_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png 1272w, https://substackcdn.com/image/fetch/$s_!pBz_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pBz_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png" width="1456" height="847" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:847,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:203620,&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://zach.codes/i/165594979?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.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_!pBz_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png 424w, https://substackcdn.com/image/fetch/$s_!pBz_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png 848w, https://substackcdn.com/image/fetch/$s_!pBz_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.png 1272w, https://substackcdn.com/image/fetch/$s_!pBz_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01975ad3-2fe7-4813-a373-f05dabed10a5_1664x968.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>I assigned it an issue that just said to add Sentry. Here&#8217;s what it added:</p>
      <p>
          <a href="https://zach.codes/p/i-used-github-copilot-for-a-weekheres">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[First Look: Gemini CLI vs Claude Code]]></title><description><![CDATA[I'm using this over Claude Code to save &#128181; next month]]></description><link>https://zach.codes/p/first-look-at-gemini-cli-vs-claude</link><guid isPermaLink="false">https://zach.codes/p/first-look-at-gemini-cli-vs-claude</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Thu, 26 Jun 2025 11:38:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FF3V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FF3V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FF3V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 424w, https://substackcdn.com/image/fetch/$s_!FF3V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 848w, https://substackcdn.com/image/fetch/$s_!FF3V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 1272w, https://substackcdn.com/image/fetch/$s_!FF3V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FF3V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin" width="1000" height="528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:528,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Gemini CLI infographic explaining its usage allowance at 60 model requests per minute and 1,000 model requests per day at no charge&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Gemini CLI infographic explaining its usage allowance at 60 model requests per minute and 1,000 model requests per day at no charge" title="Gemini CLI infographic explaining its usage allowance at 60 model requests per minute and 1,000 model requests per day at no charge" srcset="https://substackcdn.com/image/fetch/$s_!FF3V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 424w, https://substackcdn.com/image/fetch/$s_!FF3V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 848w, https://substackcdn.com/image/fetch/$s_!FF3V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 1272w, https://substackcdn.com/image/fetch/$s_!FF3V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b59bc8c-66a0-40f9-9baf-4e05160e3f49_1000x528.bin 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>Alright, we&#8217;re going to go through this pretty quick as it just released yesterday morning. First, head over and <a href="http://Alright, we&#8217;re going to go through this pretty quick as it just released this morning. First, head over and download the Gemini CLI if you want to follow along.">download the Gemini CLI</a> if you want to follow along. </p><p>First things first, I opened the CLI and had to log in with Google. I tried to log in with a Google Workspace account, but it wouldn't let me unless I pay and enable the Gemini API&#8230;.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">Consider subscribing for access to my latest book</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>Thankfully, Google is offering Gemini free for personal Gmail accounts. I just logged into my regular gmail and was able to get right into it! </p><p>In the <a href="http://In the official blog post, they're announcing a pretty good free tier. I&#8217;m excited to see how much I can use this over the following month.">official blog post</a>, they're announcing a pretty good free tier. I&#8217;m excited to see how much I can use this over the following month:</p><blockquote><p>To ensure you rarely, if ever, hit a limit during this preview, we offer the industry&#8217;s largest allowance: 60 model requests per minute and 1,000 requests per day at no charge.</p></blockquote><p>What&#8217;s the next step after I log into Gemini? I have to add our issue tracker at work, obviously &#128578;</p><h2>Adding our first MCP Server</h2><p>It&#8217;s almost the same as Claude Code. As soon as I opened it, I typed /mcp as you can see below:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OHuG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OHuG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 424w, https://substackcdn.com/image/fetch/$s_!OHuG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 848w, https://substackcdn.com/image/fetch/$s_!OHuG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 1272w, https://substackcdn.com/image/fetch/$s_!OHuG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OHuG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png" width="1356" height="178" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:178,&quot;width&quot;:1356,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25601,&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://zach.codes/i/166818405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.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_!OHuG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 424w, https://substackcdn.com/image/fetch/$s_!OHuG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 848w, https://substackcdn.com/image/fetch/$s_!OHuG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 1272w, https://substackcdn.com/image/fetch/$s_!OHuG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70b16e1f-1b8c-4ef3-bbf4-b73200dafb15_1356x178.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The first time you run it and try to do anything, it kicks you out to <a href="https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/configuration.md">this webpage</a>. </p><p>It describes the use of the `mcpServers` object key, just like every other MCP tool has been using, including cursor, cline, claude, etc.</p><p>For now there isn&#8217;t a fancy CLI arg to add servers that I can see, so here&#8217;s how to do it:</p><pre><code>vi ~/.gemini/settings.json </code></pre><pre><code>{
  "theme": "Default",
  "selectedAuthType": "oauth-personal",
  "mcpServers": {
    "linear": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.linear.app/sse"]
    }
  }</code></pre><p>I decided to use the MCP Remote proxy since it works perfectly with OAuth for now, as I&#8217;m unsure of the exact support Gemini has internally. </p><p>As soon as that&#8217;s done, I rerun the `gemini` command, and here's what we get after running /mcp inside of it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZhCl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZhCl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png 424w, https://substackcdn.com/image/fetch/$s_!ZhCl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png 848w, https://substackcdn.com/image/fetch/$s_!ZhCl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png 1272w, https://substackcdn.com/image/fetch/$s_!ZhCl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZhCl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png" width="1290" height="916" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:916,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116669,&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://zach.codes/i/166818405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.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_!ZhCl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png 424w, https://substackcdn.com/image/fetch/$s_!ZhCl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png 848w, https://substackcdn.com/image/fetch/$s_!ZhCl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.png 1272w, https://substackcdn.com/image/fetch/$s_!ZhCl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea1d380f-9ee5-4a36-8ca8-2d5b486238f9_1290x916.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>Summary</h2><p>I tried to use it for a few tasks today. It seems to use tool calls perfectly as I would expect, but agent tool loop needs some work. </p><p>Oddly enough, I asked it to perform a task, and in the middle it just stopped. I had to send &#8220;ok keep going,&#8221; to get it to finish working on something I gave it. This happened once and I&#8217;m not sure how often it will do that as I haven&#8217;t had enough test time.</p><p>I also had to hand hold it a lot more than claude, which figures out the correct approach faster. However, you can&#8217;t beat free vs $100 monthly right now, so I will keep trying it out.</p><p>I&#8217;m excited because I was one day away from renewing Claude Max at $100 a month, too. Now, I&#8217;ll be using it for free during the preview period, and I hope it lasts for quite a while. </p><p>I yearn for the day we we can do the same stuff locally&#8230; Thankfully, Google's Gemini CLI is open source, so I'm hoping we can either fork or add a feature to it to select custom AI providers soon. It's a pretty solid CLI tool, it definitely feels on par with Claude Code in terms of the user interface, the speed, and the interactions that take place while working with it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[AI Podcasters Review My Book 🤯]]></title><description><![CDATA[Listen now | NotebookLM is pretty incredible at turning different content into interactive podcasts, today they discuss the model context protocol and some of the ways it's taught inside my upcoming book.]]></description><link>https://zach.codes/p/2-ai-podcast-hosts-review-my-mcp</link><guid isPermaLink="false">https://zach.codes/p/2-ai-podcast-hosts-review-my-mcp</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 24 Jun 2025 11:45:27 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/166486177/42e2b57ff9f00c5a4708015feafaefd3.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>This week&#8217;s podcast is AI generated. I fed it 2 chapters of my <a href="https://leanpub.com/creatingmcpserverswithoauth">MCP Servers with OAuth </a>book.</p><p>I was surprised just how good it turned out. They recapped the features of MCP that I had covered in the two chapters, specifically server side prompts, resources, and http streaming.</p><p>This recap was so good I have to share it with you all on my podcast! It&#8217;s more professional than I currently sound &#129315; (I&#8217;m working on it, I promise)</p><p>The magic is all thanks to <a href="https://notebooklm.google/">NotebookLM</a> from google.</p><p>I am excited to use this tool for more things internally at work. Sharing code samples, new paradigms, and letting other devs ask specific questions and surfacing the answer immediately is very intuitive.</p><p>I may have to do a deep dive into more Google tools because Gemini is just so good, especially with their ability to connect to the google apps suite of tools. </p><p>Their upcoming agent mode inside Gemini will level up what&#8217;s already a pretty awesome scheduling system. Anyways, I&#8217;ll talk about that more in an upcoming post.</p><p>If you find our AI overlords did a good job recapping this book, consider <a href="https://leanpub.com/creatingmcpserverswithoauth">buying it for as little as $5</a> while it&#8217;s still in progress!</p>]]></content:encoded></item><item><title><![CDATA[A Self-Updating, Serverless MCP Server For Your Dev Team]]></title><description><![CDATA[Using VS Code's June 12th Update, this might be the coolest STDIO approach out there &#128293;]]></description><link>https://zach.codes/p/a-self-updating-serverless-mcp-server</link><guid isPermaLink="false">https://zach.codes/p/a-self-updating-serverless-mcp-server</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Fri, 20 Jun 2025 10:20:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gMFA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gMFA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gMFA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!gMFA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!gMFA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!gMFA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gMFA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gMFA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!gMFA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!gMFA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!gMFA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ee4ef9-ef45-4a04-91ad-c31886700370_1024x608.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><blockquote><p>The following is an excerpt from my book on &#8220;<a href="https://leanpub.com/creatingmcpserverswithoauth">Building MCP Servers with OAuth</a>.&#8221; If you enjoy this content, consider buying it early for up to 50% off, once completed in July I will increase the price.</p></blockquote><p>The section I&#8217;m sharing today from the book highlights a unique approach to sharing MCP servers across your development team. Right now on my team, we are wanting to share more of our prompts, but we do not want to setup an internal server. We want something simpler, with the full customization and control that an MCP Server offers. </p><p><strong>This chapter assumes you have the latest version of VS Code and bun.sh installed.</strong></p><p>With that being said, let&#8217;s take a look at the chapter:</p><h2>Making our first MCP server. </h2><p>We will be taking advantage of <a href="https://bun.sh">bun.sh</a>&#8217;s watch mode, and one other feature, so <strong>we are able to share this internally with our dev team, and ensure it&#8217;s always up to date</strong>. This comes without the hassle of hosting an internal HTTP Streaming server. <em>Keep reading to find out how this is possible</em>.</p><p>First, make sure you have Bun installed, and then create a blank project using `bun init`. Run `bun add <code>@modelcontextprotocol/sdk` then</code> replace the contents of index.ts with the following:</p><pre><code>import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new McpServer({
  name: "My MCP",
  version: "1.0.0",
});

server.prompt("one-shot-task", { task: z.string() }, ({ task }) =&gt; ({
  messages: [
    {
      role: "user",
      content: {
        type: "text",
        text: `Please attempt the following task, and once done, commit it for me with a message that makes sense:\n\n${task}`,
      },
    },
  ],
}));
const transport = new StdioServerTransport();
server.connect(transport);</code></pre><p>This creates a basic server, and registers a single prompt. This prompt uses <a href="https://zod.dev/">Zod</a> to validate the inputs from the language model and ensures a task string is passed in to the prompt. This is how the official protocol from Anthropic ensures required inputs are passed in from the MCP client.</p><p><strong>Essentially, anyone who installs our MCP server, can choose the "one-shot-task" prompt, pass in a task, and then the user's AI model will run the full prompt with our task.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">Consider subscribing for early access to the book and other AI content</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><h2>Adding our MCP to VS Code</h2><p><em>The support for prompts was only added on June 12th, 2025 to VS Code.</em></p><p>You're going to start by bringing up the "Command Palette" in VS Code. Search the "Help" bar at the top if you are not sure how.</p><p>We will then search for the following:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ap_J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ap_J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png 424w, https://substackcdn.com/image/fetch/$s_!Ap_J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png 848w, https://substackcdn.com/image/fetch/$s_!Ap_J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png 1272w, https://substackcdn.com/image/fetch/$s_!Ap_J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ap_J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png" width="1322" height="534" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:534,&quot;width&quot;:1322,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79714,&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://zach.codes/i/166090305?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.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_!Ap_J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png 424w, https://substackcdn.com/image/fetch/$s_!Ap_J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png 848w, https://substackcdn.com/image/fetch/$s_!Ap_J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.png 1272w, https://substackcdn.com/image/fetch/$s_!Ap_J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1350ba45-2edc-458a-9ba0-d9954f58a18b_1322x534.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>Hit enter.</p><p>Choose stdio:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y2ql!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y2ql!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 424w, https://substackcdn.com/image/fetch/$s_!y2ql!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 848w, https://substackcdn.com/image/fetch/$s_!y2ql!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 1272w, https://substackcdn.com/image/fetch/$s_!y2ql!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y2ql!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png" width="1286" height="332" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:332,&quot;width&quot;:1286,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81804,&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://zach.codes/i/166090305?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.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_!y2ql!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 424w, https://substackcdn.com/image/fetch/$s_!y2ql!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 848w, https://substackcdn.com/image/fetch/$s_!y2ql!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 1272w, https://substackcdn.com/image/fetch/$s_!y2ql!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c4f91fd-3b6e-43e3-b898-414ebcb1c1ec_1286x332.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For the command to run, type in</p><pre><code>bun run --watch ~/projects/mcp-book/index.ts</code></pre><p><strong>You must correct the path to where you created this file on your computer</strong></p><p>On Linux or Mac, you should be able to type `echo $PWD` to get the full path when inside of your `mcp-book` folder.</p><p>Name it "my-stdio":</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rToi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rToi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 424w, https://substackcdn.com/image/fetch/$s_!rToi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 848w, https://substackcdn.com/image/fetch/$s_!rToi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 1272w, https://substackcdn.com/image/fetch/$s_!rToi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rToi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png" width="1294" height="304" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:304,&quot;width&quot;:1294,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34090,&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://zach.codes/i/166090305?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.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_!rToi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 424w, https://substackcdn.com/image/fetch/$s_!rToi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 848w, https://substackcdn.com/image/fetch/$s_!rToi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 1272w, https://substackcdn.com/image/fetch/$s_!rToi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa22c1ffd-67be-4448-8373-6079879fc9d0_1294x304.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Finally, open the "Chat" tab (use the help bar on top) and start typing `/one`</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OO62!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OO62!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png 424w, https://substackcdn.com/image/fetch/$s_!OO62!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png 848w, https://substackcdn.com/image/fetch/$s_!OO62!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png 1272w, https://substackcdn.com/image/fetch/$s_!OO62!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OO62!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png" width="994" height="356" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:994,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33950,&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://zach.codes/i/166090305?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.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_!OO62!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png 424w, https://substackcdn.com/image/fetch/$s_!OO62!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png 848w, https://substackcdn.com/image/fetch/$s_!OO62!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.png 1272w, https://substackcdn.com/image/fetch/$s_!OO62!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66062f30-4be5-4593-a251-46b79a5e7f0c_994x356.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>When you hit enter, you will see a prompt for the "task" string value we added in our code:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KztE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KztE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png 424w, https://substackcdn.com/image/fetch/$s_!KztE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png 848w, https://substackcdn.com/image/fetch/$s_!KztE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png 1272w, https://substackcdn.com/image/fetch/$s_!KztE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KztE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png" width="1308" height="338" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:338,&quot;width&quot;:1308,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61803,&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://zach.codes/i/166090305?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.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_!KztE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png 424w, https://substackcdn.com/image/fetch/$s_!KztE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png 848w, https://substackcdn.com/image/fetch/$s_!KztE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.png 1272w, https://substackcdn.com/image/fetch/$s_!KztE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68443558-ba67-491b-a3d1-cc1bc0a4cc15_1308x338.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>I inserted "finish my book" at which point, the Chat content is replaced by the prompt generated from our server!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qnw8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qnw8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png 424w, https://substackcdn.com/image/fetch/$s_!Qnw8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png 848w, https://substackcdn.com/image/fetch/$s_!Qnw8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png 1272w, https://substackcdn.com/image/fetch/$s_!Qnw8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qnw8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png" width="788" height="456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:456,&quot;width&quot;:788,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54537,&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://zach.codes/i/166090305?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.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_!Qnw8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png 424w, https://substackcdn.com/image/fetch/$s_!Qnw8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png 848w, https://substackcdn.com/image/fetch/$s_!Qnw8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.png 1272w, https://substackcdn.com/image/fetch/$s_!Qnw8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba0cfbcb-7156-4ba2-aeff-3c14fe8b513e_788x456.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>This is really awesome, as we can add this same server to Claude Code, Claude Desktop, Cline, and many other tools. </strong>There's more AI tools by the day that support this specification.</p><p><em>Although as of writing this, only VS Code supports using prompts defined by MCP servers.</em></p><p>We are able to bring our prompts to any tool, without having to define prompt files according to every tool's own specification.</p><p>Not to mention, we can make <em>very</em> powerful ones. Imagine one that fetches the current stock price within the prompt to let you know if you should take action today. </p><p>Let&#8217;s also consider one that pulls in internal data sources and outputs a visualization.</p><p>The possibilities are endless compared to hard-coded prompt files.</p><p>You may be wondering, why not use an MCP tool for this? I believe simpler is better, until it no longer works.</p><p>With the prompt setup, you can modify it before running it, and have total control on the client side. I would start with this until you are needing more.</p><p>If you have common, specific tasks, prompt files work well if you have more general tasks, generic tools will work better and be worth the additional code.</p><h2>Making this sharable with your Dev Team</h2><p>Since we are using bun... we can do something really neat now.</p><p>Let's say we want to share these prompts with our dev team. **<strong>There's two problems with using the STDIO transport</strong>**. What if one team member adds a new prompt? You will not see it until you manually pull in their code and attempt to restart your MCP client.</p><p>We could setup an HTTP Streaming transport for our internal team, but then we need to deploy to a shared server and make sure any updates are released to it automatically. That's too much work in this scenario.</p><p>There's a much nicer solution. First, we already added our server using the `--watch` flag. This means if any code changes, bun will reload the process for us.</p><p>Next, all we need to add is a few lines of code at the bottom... like this:</p><pre><code>import { $ } from "bun";

setInterval(async () =&gt; {
  try {
   await $`git pull`
  } catch (err) {
    console.error("Failed to run git pull:", err);
  }
}, 60 * 5000);</code></pre><p>This will run a git pull every 5 minutes. Bun will reload the process, and we will have the latest code. Realistically you could change the timeout to be longer, but this is a good solution to keep your team members up to date with future prompts and tools that you may add later. </p><p>Now you can `git init` and push a repo up. Ask your teammates to pull the repo and add the stdio command just like we did.</p><p>If you don&#8217;t like this fancy recurring interval, you can manually pull inside your mcp server repo when you want to pull in the changes.</p><p>Anyone on your team can add and modify prompts, push to the main branch in git, and within a few minutes, your teammates will have the latest code, <strong>no shared server required.</strong></p><p>At my workplace, I am attempting an approach like this to collaborate on standard prompts we want to use as a team, as well as exposing tools we want to use together.</p><p>This is a good point for you to play around, make a few more prompts, and get ready for the next section, where we will add HTTP Streaming, and later on, learn about the other features of the MCP specification.</p><p><strong>If you enjoyed this post, please <a href="https://leanpub.com/creatingmcpserverswithoauth">consider purchasing at an early discount</a>, or subscribing for more chapter drops.</strong></p>]]></content:encoded></item><item><title><![CDATA[Chonkie.ai - Vector Embeddings]]></title><description><![CDATA[LLM's, embeddings, semantic search, and more with Chonkie.ai Co-Founder Shreyash]]></description><link>https://zach.codes/p/1-chonkieai</link><guid isPermaLink="false">https://zach.codes/p/1-chonkieai</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Tue, 17 Jun 2025 11:30:48 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/165828895/80a58008fcc555dd33361dbf5d32bb98.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<h2>Summary</h2><p>In this episode of the zach.codes podcast, Zach interviews Shreyash, co-founder of Chonkie.ai. They discuss various topics including vector embeddings, chunking techniques, the evolution of AI coding tools, and the future of junior developers in an AI-driven landscape. Shreyash shares insights on the development of Chonkie.ai, its applications, a&#8230;</p>
      <p>
          <a href="https://zach.codes/p/1-chonkieai">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[First Look: New Agents SDK From OpenAI]]></title><description><![CDATA[A beautiful abstraction for TypeScript, let's take a quick look]]></description><link>https://zach.codes/p/the-new-agents-sdk-from-openai</link><guid isPermaLink="false">https://zach.codes/p/the-new-agents-sdk-from-openai</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Thu, 12 Jun 2025 20:00:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z-fx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><em>Be on the look out for my first <a href="https://zach.codes/podcast">podcast episode</a> next week, I was able to interview the cofounder of <a href="https://chonkie.ai/">Chonkie.ai</a> and discuss their embeddings system.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z-fx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z-fx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!Z-fx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!Z-fx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!Z-fx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z-fx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Z-fx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!Z-fx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!Z-fx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!Z-fx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F096f0816-76df-4468-ae54-7667eaacbc72_1024x608.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><div class="pullquote"><p>One of the engineers at OpenAI responded to this post and added some clarifications. Please <a href="https://x.com/dkundel/status/1933351769524097115?s=46">check it out</a> after reading</p></div><p>OpenAI released <a href="https://github.com/openai/openai-agents-js">a new open source agents sdk for TypeScript</a> about a week ago.</p><p>I am much happier with this API than Anthropic&#8217;s official MCP implementations.</p><p><em>I know agents aren&#8217;t MCP&#8217;s, but in general I expect better implementations from Anthropic compared to what&#8217;s currently being provided.</em></p><p>This SDK is quite functional and very extendable.</p><p>Here&#8217;s a quick look at the setup required to run a local model, which isn&#8217;t fully shown in their current documentation. You need to install a vercel sdk in order to pull in local model support, which is very&#8230; interesting:</p><pre><code>import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { aisdk } from "@openai/agents-extensions";

const lmstudio = createOpenAICompatible({
  name: "lmstudio",
  baseURL: "http://localhost:1234/v1",
});

export const devstral = aisdk(lmstudio("devstral-small-2505-mlx"));
export const ministral = aisdk(lmstudio("ministral-8b-instruct-2410"));</code></pre><p>With the code above, I am able to use LM Studio as my AI server, and then specify which model with the lines below that.</p><p>Unfortunately, this doesn&#8217;t really work well&#8230; As soon as I played around with agents handing off tasks to one another. For instance, a &#8220;switchboard&#8221; agent that needs to route requests to the correct agent for a task, it fails to pass zod validation unless we use an OpenAI model.</p><p>I believe this is due to a weird requirement with input and output token counts being required as part of function calls in the agent loop. </p><p>I may need to try it with a few more open source tool calling models, as I only tried two local models so far.</p><p>Regardless, this abstraction is very new, and you can still use local models for some basic interactions.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Let&#8217;s make an agent now</h2><pre><code>import { Agent, tool } from "@openai/agents";
import { ministral, o4mini } from "./models";
import { weatherAgent } from "./weather";
import { RECOMMENDED_PROMPT_PREFIX } from "@openai/agents-core/extensions";
import z from "zod";

const getLinearTasks = tool({
  name: "get_linear_tasks",
  description: "Get the current linear tasks",
  parameters: z.object({}),
  async execute() {
    return `The tasks are: eat, sleep, code`;
  },
});

export const mainAgent = new Agent({
  name: "Assistant",
  model: ministral,
  handoffs: [weatherAgent],
  tools: [getLinearTasks],
  instructions: RECOMMENDED_PROMPT_PREFIX,
});</code></pre><p>I&#8217;m playing around with an agent that can do one thing, get my tasks from linear, and also hand off tasks to another agent.</p><p>This agent can get linear tasks, or hand off requests to the weather agent. For now it&#8217;s just returning hard coded tasks instead of actually calling the linear API.</p><p>Let&#8217;s take a look at the dummy weather agent.</p><pre><code>import { tool } from "@openai/agents";
import { Agent } from "@openai/agents";
import z from "zod";
import { devstral, ministral, o4mini } from "./models";

const getWeather = tool({
  name: "get_weather",
  description: "Return the weather for a given city.",
  parameters: z.object({ city: z.string() }),
  async execute({ city }) {
    return `The weather in ${city} is sunny.`;
  },
});

export const weatherAgent = new Agent({
  name: "Weather bot",
  instructions: "You are a helpful weather bot.",
  model: ministral,
  tools: [getWeather],
  handoffs: [],
});</code></pre><p>We give the weather agent a single tool, and we hard code a basic response that the weather is sunny in whatever city is passed in.</p><p>Now, we have to orchestrate them to run together. <strong>This is a part that seems to be lacking in the current implementation.</strong></p><p>I notice that I am able to write custom code in a loop that will hand off to the weather agent, <em>but there is no way to hand off back to the original agent afterwards. </em></p><p>Here&#8217;s how that looks, this was mostly taken from their docs, but the initial handoff logic didn&#8217;t work without some adjustments that I made:</p><pre><code>import {
  Agent,
  run,
  StreamedRunResult,
  withTrace,
  type AgentInputItem,
} from "@openai/agents";
import { randomUUID } from "@openai/agents-core/_shims";
import readline from "node:readline/promises";
import { mainAgent } from "./agents/mainAgent";

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

async function main() {
  const conversationId = randomUUID().replace(/-/g, "").slice(0, 16);

  let userMsg = await rl.question(
    "Hi! I can do a lot of stuff. How can I help?\n"
  );

  let agent: Agent&lt;any, any&gt; = mainAgent;
  let inputs: AgentInputItem[] = [{ role: "user", content: userMsg }];

  while (true) {
    let result: StreamedRunResult&lt;any, Agent&lt;any, any&gt;&gt; | undefined;
    await withTrace(
      "Routing example",
      async () =&gt; {
        result = await run(agent, inputs, { stream: true });

        result
          .toTextStream({ compatibleWithNodeStreams: true })
          .pipe(process.stdout);

        await result.completed;
      },
      { groupId: conversationId }
    );

    if (!result) {
      throw new Error("No result");
    }

    inputs = result.history;
    process.stdout.write("\n");

    if (
      result.currentAgent?.name !== agent.name &amp;&amp;
      inputs[inputs.length - 1]?.content
    ) {
      console.log("Handing off to", result.currentAgent?.name);
    } else {
      userMsg = await rl.question("Enter a message:\n");
      inputs.push({ role: "user", content: userMsg });
    }
    agent = result.currentAgent ?? agent;
  }
}

main().catch((error) =&gt; {
  console.error("Error:", error);
  process.exit(1);
});</code></pre><p>Specifically the part where I am checking if the currentAgent changed, in the official docs, it would change, but it would make you type again. For example:</p><pre><code>Me: what is the weather in tokyo?
Agent: I'll hand you off to the weather agent!
Agent: Enter a message:</code></pre><p>This felt weird to me, with my changes it is now like this:</p><pre><code><code>Me: what is the weather in tokyo?
Agent: I'll hand you off to the weather agent!
Agent: The weather in Tokyo is sunny</code></code></pre><p>It worked!</p><p>Our request was handed off correctly.</p><p>Although&#8230; now we are stuck with the weather agent. </p><p>It seems like you are supposed to add your own way to restart to get back to the main agent, because a cycle dependency where they both reference each other in the handoffs array wouldn&#8217;t work.</p><p>Also this is code <em>you</em> have to write. One downside of this current approach is that the end developer has to handle manual handoff logic, and set a variable `<code>agent` </code>that is mutated depending on what happens<code>. Not the greatest when variables are mutated like this at runtime.</code></p><p>Realistically, you could have one mega agent with many tools. There may not be a reason to have handoffs depending on what you are building. </p><p>The separation of concerns with a handoff is nice to have for tasks that are very different from one another, plus having the ability to use a different model for different agents would also be missed.</p><h2>Overall Thoughts</h2><p>It seems like a nice abstraction that just needs a bit more tooling, a few more higher level features, like better agent handoff logic.</p><p>I love that each agent can use a different model. They have examples using the browser and more complicated tasks. I can see this being useful for a lot of actions and separating your tool use in logical agent sections.</p><p>Sure, anyone could have coded a similar approach to this, but it is nice having a library like this from one of the big providers. It helps us learn the paradigms they&#8217;re following internally.</p><p>One of the biggest drawbacks is the tracking though&#8230; You must use an OpenAI account to view traces behind the scenes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EwGC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EwGC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png 424w, https://substackcdn.com/image/fetch/$s_!EwGC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png 848w, https://substackcdn.com/image/fetch/$s_!EwGC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png 1272w, https://substackcdn.com/image/fetch/$s_!EwGC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EwGC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png" width="1456" height="878" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:878,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image of the Agents Tracing UI&quot;,&quot;title&quot;:&quot;Image of the Agents Tracing UI&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Image of the Agents Tracing UI" title="Image of the Agents Tracing UI" srcset="https://substackcdn.com/image/fetch/$s_!EwGC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png 424w, https://substackcdn.com/image/fetch/$s_!EwGC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png 848w, https://substackcdn.com/image/fetch/$s_!EwGC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.png 1272w, https://substackcdn.com/image/fetch/$s_!EwGC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a19fe7-1598-4cc9-a64b-2760c3f0b59f_2664x1606.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>They seem to be walking a fine line of trying to be open source, but also push you to OpenAI. It would be nice to have tracing all locally in the library.</p><p>I can see it being useful for building internal tooling, like a sophisticated content generation tool for articles.</p><p>I was also thinking of making a daily standup agent that can send to slack what tasks I have been working on...</p><p><a href="https://github.com/openai/openai-agents-js">Check out the library yourself</a> and see what you think!</p>]]></content:encoded></item><item><title><![CDATA[Mental Refactoring for the AI Age]]></title><description><![CDATA[Adapt your software development process or get left behind &#129398;]]></description><link>https://zach.codes/p/mental-refactoring-for-the-ai-age</link><guid isPermaLink="false">https://zach.codes/p/mental-refactoring-for-the-ai-age</guid><dc:creator><![CDATA[Zach Silveira]]></dc:creator><pubDate>Fri, 06 Jun 2025 13:03:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!boLZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!boLZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!boLZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!boLZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!boLZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!boLZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!boLZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!boLZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 424w, https://substackcdn.com/image/fetch/$s_!boLZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 848w, https://substackcdn.com/image/fetch/$s_!boLZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 1272w, https://substackcdn.com/image/fetch/$s_!boLZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3e38357-a4d4-4bf4-89d3-ae68132b4ddd_1024x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I've been obsessed with large language models for a year and a half now. But <strong>something changed in the last few weeks</strong>. With the release of <a href="https://www.anthropic.com/claude-code">Claude Code</a> and a few of these other agent updates, I'm changing the way I code in a way that I haven't for the last 10 years. </p><p>Until recently, my Cursor Tab and Cursor Agent mode usage was through the roof. Now it's almost zero. The only thing I'm using is tab auto-complete, and the rest of my time is spent inside of Claude Code. </p><p>This in itself is another mindset shift. Although this one is less radical and more of an iterative update. </p><p>This isn't just me talking back and forth all day, doing the same thing as other agent modes. This last year has been an evolution, with Claude Code being the latest shift to how I do my job. </p><h2>Starting Tasks</h2><p>I first have Claude Code pull an issue number from my <a href="https://linear.app/changelog/2025-05-01-mcp">Linear MCP</a>, grab all of the details, and <strong>attempt the task start to finish</strong>. </p><p>When I have a task that isn't well-defined, I'll quickly think in my head: "Instead of editing 4 things, I can just tell Claude 'hey, add x everywhere that is required', and it is done immediately, faster than I could find everything." </p><p>Most recently, I was having to manually create an SVG which was used inside a picture and picture player that was regenerated on a loop every few seconds. </p><p>This is one of the only ways to generate a picture and picture (think of the youtube video pop-out) in React Native.</p><p>To match the design, I have to manually move X and Y values around and re-test it afterwards, since the video player is regenerating an svg on a loop.</p><p>At one point, I needed to add a brand new element to the very top of the SVG and push everything down. This would've been annoying to find and replace because every Y value is slightly different for every element in this SVG. </p><p>Thankfully, I can just tell the AI to move everything down 40 pixels, and every element is instantly updated. </p><p>Between this mindset shift of thinking constantly, <strong>how can I have an AI do this task?</strong> Am I slower than an AI would be? AI is constantly on my mind while coding.</p><p>Well-defined tasks inside of our linear task management system lead to me starting and finishing tasks much quicker too.</p><h2>Integrations to the Rescue</h2><p>Random parts of my day always involve checking GitHub PRs across multiple repos, which ones were active, which one needs reviews, and filling out PR descriptions that are well-defined. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://zach.codes/subscribe?"><span>Subscribe now</span></a></p><p>Now, whenever I'm done making changes, all I have to do is say, "Push this up for me." It immediately <strong>grabs the change list, thinks of a perfectly defined description that matches everything that I changed and creates the pull request for me</strong>. In addition, it will move my task to "In review" inside of our task manager. </p><p>I think the most powerful part is that Claude Code's agent loop is incredibly smart. Every time it has a mistake and can't figure something out, it ends up trying something else and then figuring it out. </p><h2>Dangerously Auto Approve</h2><p>I have everything set up inside of Dev Containers so I can run everything on dangerous mode. If you&#8217;ve never used them, it&#8217;s just a docker container mounted to your IDE essentially. Which means a bad command like `rm -rf /` can&#8217;t do anything to hurt your main computer.</p><p>I can run everything without having to confirm it every step of the way. Normally each step Claude code takes it wants you to confirm. Cursor Agent and Cline work the same way. <strong>When inside of a container with limited network access, it can speed up usage dramatically by enabling auto approve.</strong></p><p>I also have custom prompts inside of Claude code. <strong>One of them I just paste an issue number and it takes it to completion and pushes up the pull request</strong>. Another one takes the issue and describes all the context that I might need to complete the issue. If there's something very complicated that I may not want the AI to attempt, maybe because it&#8217;s something that can be done many different ways, I can start here. </p><h2>Gives me context faster</h2><p>Instead of having to search files and try to remember how something is built or learn the APIs, I can have <strong>Claude gather all that information for me in a fraction of the time. </strong></p><p>I also have another common prompt that pulls in everything from our task manager and everything that I've opened or closed recently inside of GitHub and will compile a stand-up message for me. </p><h2>Standup Generator</h2><p>This is something else that would take small parts of my day in the past, keeping bullet points of things I'm doing. Sometimes things aren't always in the issue management system that I end up having to do. Usually those things all end up at least going through GitHub, so now it's able to compile from both of those sources. </p><p><strong>One command and I get a stand-up prompt that I can paste into Slack</strong>. Now imagine if Slack had an official MCP server. I could automate everything. You may be wondering, "What if it makes a slight mistake?" Even still, I could have it send to myself or send a message that I have to approve first before the team sees. There's a lot of useful ways I can see these things going in the near future. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://zach.codes/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">zach.codes is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Less context switching</h2><p>This is one of the more powerful parts. Since I can write shortcut prompts for Claude Code that say things like &#8220;pull everything from linear, start the task, checkout the issue branch, write a git commit.&#8221;</p><p>I am no longer spending time in my web browser in these platforms. As the integrations get better, I can take action in all of them without viewing them myself. </p><p>Combine this with Github&#8217;s VS Code extensions, I can see how everything looks in my editor, fully. I find that all of these things start to add up.</p><h2>Less Coding</h2><p>With these changes I've been describing above, I've realized that I code a lot less. In actuality, when I do code, it's small changes here or there because most of the structured bigger work, I have the AI do in step-by-step tasks. </p><p>I don't give it massive projects unless I'm trying to just have fun with it. If I have a large task, I will give it one step of the task to do, and then I will review and iterate in case it isn't correct. </p><p>For a lot of feature work, including adding new things that are CRUD related, this is perfect. </p><p>I also take a bigger step back when architecting things. Thinking "<strong>how can I set up a foundation that is very very easy to extend?</strong>" Something that might show up in Django's documentation or React's documentation as the correct standardized approach.</p><p>Most times Claude Opus struggles doing certain things, it's often due to our codebase having poor code quality in that area. </p><h2>It&#8217;s not all sunshine and rainbows</h2><p>Yes, all this stuff is incredibly awesome, but it's not perfect either. One of the biggest things I'm struggling with is how to <strong>manage my time between these tasks</strong>. </p><p>I've tried having multiple terminal windows (4 on one screen) across multiple repos. When I do this, I try to fire off a task on all 4 and jump between them. </p><p>I find that this actually doesn't work as well as I thought it would because I'm having to context switch a little too much. </p><p>What would make more sense is 4 windows all on the same repo doing 4 tasks in that one repo. </p><p>Taking a bit more time before switching between each one and fully validating each one first. </p><p>It can be difficult when you realize how fast you can do certain tasks, especially easy tasks that come in and are described really well by project management. </p><p>And it can be a tricky balance to make sure you don't burn out trying to do too many at once or switch between things too fast. </p><p><strong>It can't be understated how much more time is spent reviewing things</strong>. When there are simple tasks, I really don't have to review much, but when things are medium-sized, you really need to review and possibly iterate more with the AI. At which point you might be wondering, "Hmm, should I have done this myself? Would that have been faster?" </p><p><strong>But I think this is a solvable problem</strong>. Most of this comes down to having a better test set up for your projects so that you can have more confidence when code changes are made. Also, <strong>setting up good abstractions</strong> so that adding on with AI is very straightforward and doesn't cause a mess of code. </p><p><strong>A lot of the negativity I see about AI slop is really because people let AI start and finish everything from the beginning to the end of their app</strong>. If they actually had good foundations developed by a senior engineer who understands how to architect things, I don't think this is as much of an issue. </p><h2>Wrap up</h2><p>Overall, I'm just amazed that most of the random tasks I get, especially bug fixes, I can send through Sentry's MCP for more details, start an issue, and complete it all for me. Even when it doesn't complete it all perfectly, it's done all of the project management-related work for me in a fraction of the time. </p><p>I know some people are going to say either I&#8217;m full of crap, or I don&#8217;t do any &#8220;real work&#8221;</p><p>Lately I have had some straight forward app development work. </p><p>I still help make the decisions on which libraries and frameworks to initially setup in our applications, but right now we are going through a feature and bug fix cycle without adding new systems to our stack. </p><p><strong>When you&#8217;re in this zone, this new way of working can be a lot faster. </strong></p><p>I&#8217;m not having to iterate and change as much as you may expect. Especially if you&#8217;re somebody who hasn&#8217;t tried Claude code yet. </p><p>There seems to be a misconception from some people, who maybe last used AI months ago, or use an Agent mode here or there, that it can&#8217;t possibly take things end to end yet.</p><p>Try Claude Code, you may be proven wrong &#128522; </p>]]></content:encoded></item></channel></rss>