<script data-pm-proxy="intercept"></script><?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[.NET Web Academy]]></title><description><![CDATA[Learn modern .NET web development with Patrick, creator of the .NET Web Academy. From Blazor and C# to Clean Architecture and Vertical Slice, everything is taught step by step and made easy to understand.]]></description><link>https://dotnetwebacademy.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!iXsH!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0c227b7-0228-4898-a6d2-8d4e3ce94b55_500x500.png</url><title>.NET Web Academy</title><link>https://dotnetwebacademy.substack.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 01 Sep 2026 10:46:19 GMT</lastBuildDate><atom:link href="/__u/dotnetwebacademy.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Patrick God]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[dotnetwebacademy@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[dotnetwebacademy@substack.com]]></itunes:email><itunes:name><![CDATA[Patrick God]]></itunes:name></itunes:owner><itunes:author><![CDATA[Patrick God]]></itunes:author><googleplay:owner><![CDATA[dotnetwebacademy@substack.com]]></googleplay:owner><googleplay:email><![CDATA[dotnetwebacademy@substack.com]]></googleplay:email><googleplay:author><![CDATA[Patrick God]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Test I Use on Every New AI Tool: Would I Notice If It Disappeared?]]></title><description><![CDATA[Nine plugins you must install. Fourteen things that changed everything. I tried skills and went back to markdown files, and I think there is an actual argument for that.]]></description><link>https://dotnetwebacademy.substack.com/p/skills-plugins-frameworks-they-are</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/skills-plugins-frameworks-they-are</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 26 Aug 2026 16:02:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CO1q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.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="/__u/substackcdn.com/image/fetch/$s_!CO1q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!CO1q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:863987,&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://dotnetwebacademy.substack.com/i/212820716?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!CO1q!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93bd4dc9-a504-473a-a8a9-002faf396828_1280x720.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 aria-hidden="true" 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><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>Every few days there is a new list. The nine Claude Code plugins you must install. The fourteen things that changed everything. The skills framework you are apparently missing out on.</p><p>A developer in my community reads these obsessively, and he made an observation last night that I have not stopped thinking about. Some of them are from March, which makes them completely obsolete. And then the part that mattered: he does not think you need any of it. You tell the thing what you want, clearly, and it figures out the rest.</p><p>I agree with him, and this is not laziness or contrarianism. There is an actual argument, and I want to make it properly.</p><div><hr></div><h2>If you would rather see it than read about it</h2><p>Everything I am about to argue for is in the <strong><a href="https://sbdy.io/Z2KIYuK">Blazor AI Workshop</a></strong>. Three hours, recorded live and unedited, empty folder to a Blazor app deployed on Azure. No plugins, no frameworks, no skills. A constraints file, an architecture, and a lot of reading what came back.</p><div id="vimeo-1190059022" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1190059022&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:false}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1190059022?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true"></iframe></div></div><p>It is the principle applied to a real build, including the parts where something does not work. <strong><a href="https://sbdy.io/Z2KIYuK">You can get it here.</a></strong></p><p>Now, the argument.</p><div><hr></div><h2>I tried skills. I dropped them again.</h2><p>Let me be specific rather than vague, because I do not want this to read as dismissing something I never used.</p><p>When skills arrived, I tried them. I set some up, used them for a while, and then quietly went back to what I was doing before.</p><p>Not because they are bad. Because what I already had was doing the same job.</p><p>What I already had was markdown files. A constraints file that describes the architecture and the rules. Notes files where decisions get written down. That is it.</p><p>And every time I look properly at one of these new mechanisms, I find myself asking the same question: what does this do that a well-written file in my repository does not?</p><p>Sometimes there is an answer. Often there is not.</p><div><hr></div><h2>The pattern I keep noticing</h2><p>Here is a small example from the same conversation.</p><p>One of these lists recommended a compact command as a great tool. Compact your context when it gets long.</p><p>Except the tool already does that automatically. So the recommendation is to manually trigger something that happens on its own.</p><p>And honestly, when I see automatic compaction happen, my first thought is usually mild worry. What did it just decide was unimportant?</p><p>Someone in the session suggested the obvious alternative: start a fresh session and keep the old one open if you need to go back to it. No feature required. Just a second terminal window.</p><p>That is the pattern. A capability gets a name, the name gets a list post, and the list post gets shared as though something fundamental changed.</p><div><hr></div><h2>Why the churn is so intense right now</h2><p>I do not think the people writing these lists are acting in bad faith. Something more mechanical is going on.</p><p><strong>The tools genuinely are changing fast.</strong> </p><p>New features appear constantly. Some of them are significant. So there is always something new to write about, and no reliable way to tell in advance which ones matter.</p><p><strong>Novelty is easier to write than judgment.</strong> </p><p>"Here are nine new things" takes an afternoon. "Here is what actually held up over six months" takes six months.</p><p><strong>And nobody publishes the negative result.</strong> </p><p>I tried skills and went back to markdown files. That is a genuinely useful data point and it makes a terrible headline.</p><p>So the visible conversation is systematically biased towards new, and away from durable.</p><div><hr></div><h2>What actually holds up</h2><p>Here is the thing that has survived every tool change I have been through.</p><p><strong>Write down what you want, where the thing can read it.</strong></p><p>That is the whole idea. The architecture. The patterns you use and the ones you have banned. The decisions that are not visible in the code. What is off limits.</p><p>Call it a constraints file, call it a memory file, call it a dev bible like one member of my community does. The name does not matter. The mechanism does not matter much either.</p><p>What matters is that the thing doing the work can see what you have decided.</p><p>I keep arriving back here from completely different directions.</p><p>I was rebuilding an old side project recently, a game I had abandoned eighteen months ago. Different domain, different language, nothing to do with .NET. And within an hour I was telling it to write notes into markdown files. A notes file for problems, a feedback file for what I did not like, an inbox for ideas to handle later.</p><p>Nobody told me to do that. It is just what works, and it is what I end up doing regardless of the project or the tool.</p><div><hr></div><h2>How to evaluate the next shiny thing</h2><p>I am not saying ignore everything new. Some of it is genuinely useful. Loops and goals changed how I work, and I would not want to go back.</p><p>So here is the test I actually use.</p><p><strong>Does it do something a file cannot?</strong> </p><p>If a plugin's value is "it gives the model some instructions", you already have that. If it does something structurally different, like running work while you are asleep, that is worth attention.</p><p><strong>Does it survive a tool change?</strong> </p><p>Markdown in your repository works everywhere, including in tools that do not exist yet. Anything living inside one vendor's session state is temporary by definition.</p><p><strong>Is it solving a problem you actually have?</strong> </p><p>Most of these lists are written by people whose workflow is not yours. Security plugins, code review frameworks, front-end designer skills. If you have not personally hit the wall, you are buying a solution to a hypothetical.</p><p><strong>And would you notice if it disappeared?</strong> </p><p>This is the one I like most. I stopped using skills and my work did not change. That told me everything.</p><div><hr></div><h2>The thing underneath</h2><p>All of these mechanisms are variations on one idea: give the model relevant context at the right moment.</p><p>Skills do it. Constraints files do it. Plugins do it. Subagents do it, with the added benefit of keeping the reading out of your main session.</p><p>They are flavours of the same thing.</p><p>Which means if you understand the underlying idea, you can evaluate any new mechanism in about thirty seconds. And if you do not, you will keep installing things because someone said they changed everything.</p><p>The underlying idea has not changed in two years, and I do not think it is going to. Everything else is packaging.</p><div><hr></div><p>If you want to watch the principle applied end to end, the <strong><a href="https://sbdy.io/Z2KIYuK">Blazor AI Workshop</a></strong> is three hours of exactly that, with the full source code and a thirty day money back guarantee.</p><p>And if you are earlier on and want the foundation first, my free Blazor AI Jumpstart is <a href="https://sbdy.io/0fuP1KT">here</a>, at no cost.</p><p>Learn the principle. The features will keep arriving without your help.</p><p>Take care.</p>]]></content:encoded></item><item><title><![CDATA[Six Months, Ten Sessions: How .NET Devs Went From AI Tool to AI Judgment]]></title><description><![CDATA[Ten fortnightly sessions with working .NET developers, from February to August. I did not set out to document anything, but there is an arc in there worth writing down.]]></description><link>https://dotnetwebacademy.substack.com/p/six-months-ten-sessions-how-net-devs</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/six-months-ten-sessions-how-net-devs</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Thu, 20 Aug 2026 16:04:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cwpt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.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="/__u/substackcdn.com/image/fetch/$s_!cwpt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!cwpt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5578606-d9d3-4588-8035-050ec224db91_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:892021,&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://dotnetwebacademy.substack.com/i/211965458?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cwpt!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5578606-d9d3-4588-8035-050ec224db91_1280x720.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 aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In February, a group of us got on a call and talked about migrating to Blazor Web Apps, Azure, and how to choose an architecture.</p><p>AI barely came up.</p><p>Last week, the same fortnightly call was about billions of tokens, what corporations are allowing their developers to run, and who actually gets to decide the architecture now that a model can propose one.</p><p>Six months. Ten sessions. Roughly <strong><a href="https://sbdy.io/RJ0v32p">sixteen and a half hours of recorded conversation</a></strong>.</p><p>I did not set out to document anything. I just kept turning up every two weeks with a group of working .NET developers and talking about whatever was in front of us. But looking back at the titles in order, there is an arc there that I did not notice while it was happening, and I think it is worth writing down.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><div><hr></div><h2>February: AI was not the subject</h2><p>The first session was about architecture choices and moving to Azure. Ordinary, durable .NET concerns. The kind of conversation we could have had in 2022.</p><p>That is worth remembering, because six months is nothing. Half a year ago, a room of serious .NET developers could spend ninety minutes together and treat AI as a side topic.</p><h2>March: it arrives, as a tool among tools</h2><p>Session two was AI tools and Copilot, sitting alongside Blazor render modes. Note the framing. AI was one item on a list, roughly equal in weight to a rendering decision.</p><p>Most people I speak to are still, mentally, in March.</p><h2>May: the reality check</h2><p>By May the tone had changed. Not to enthusiasm, to scepticism. The session was a reality check on Claude Code, Copilot, agents, and what became the markdown file workflow.</p><p>This is the point where people had used the tools enough to be disappointed by them. Confident nonsense. Invented packages. Code that does not compile.</p><p>And it is exactly where the <strong><a href="https://youtu.be/6SM6o8kTscI">constraints file emerged</a></strong>, because a room full of people hitting the same wall independently starts looking for a way through it. Two weeks later the session was called "Beyond Copilot," which tells you which way they went.</p><h2>June: the terminal, the loops, and the money</h2><p>June is where it gets strange, in a good way.</p><p>First, people moved into the terminal and started <strong>leaving work running overnight</strong>. Someone described their loop as a night shift, which is a phrase I have used ever since.</p><p>Then, two weeks later, the token cost scare.</p><p>This one deserves more attention than it gets. A developer looked at their usage, saw a number, and had a genuine fright. Not because they had done anything unusual, but because the pricing model was impossible to reason about. One person put it plainly: they understand what a hundred a month means, they cannot calculate what a per-million-token price means for their actual work.</p><p>That session ended on why we still steer, which was not a coincidence. When the meter starts running, you stop letting the thing wander.</p><p>Then: <strong><a href="https://youtu.be/s82h2FHPPqE">MCP routing</a></strong>, and someone coding from their phone while away from their desk.</p><h2>July: the moat question</h2><p>July was the month it stopped being about tools and started being about people.</p><p>The mid-month session was legacy migration, which sounds technical and was not. A contractor who has spent two decades modernising old systems described watching the barrier that protected his niche dissolve. Old code was hard, that hardness was the moat, and the tools are unreasonably good at exactly that.</p><p>Two weeks later, the other side of the same coin. Someone had documentation, deployment configuration and change logs he had never typed a line of. Someone else pointed out that none of the rest of us could build what he was building, because we lack the years of financial expertise that tell you what a correct answer even looks like.</p><div class="pullquote"><p>The moat did not disappear. It moved from knowing the syntax to knowing the domain.</p></div><p>That was also the session where someone admitted he could not sleep, <strong><a href="/__u/dotnetwebacademy.substack.com/p/ai-made-me-more-productive-so-why">because he was too excited about what he could build</a></strong> in the hours he was about to waste being unconscious. Somebody else in the room called it an emerging illness among programmers. Nobody laughed, because everyone recognized it.</p><h2>August: governance and judgment</h2><p>The most recent session was about corporate limits on what developers are allowed to run, and who picks the architecture now.</p><p>Both of those are governance questions. Not technical ones.</p><p>Six months ago we were choosing between render modes. Now we are working out who is accountable when a model proposes a structure and a person approves it.</p><div><hr></div><h2>What the arc actually shows</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/RJ0v32p" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!YCOe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:669839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://sbdy.io/RJ0v32p&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dotnetwebacademy.substack.com/i/211965458?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!YCOe!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c8cbc-eaa1-4826-9c7d-5402d045e79a_1920x1080.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 aria-hidden="true" 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><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>Four stages, roughly, and they happened in this order:</p><p><strong>Tool.</strong> Something you might use, alongside other things you use.</p><p><strong>Workflow.</strong> Something you build a process around, with constraints, because unconstrained it produces plausible mess.</p><p><strong>Economics.</strong> Something with a meter attached, which changes how you use it in ways nobody warns you about.</p><p><strong>Judgment.</strong> Something that raises questions about accountability, expertise, and what you are actually being paid for.</p><p>Most public conversation about AI development is still stuck at stage one, arguing about which tool is best. The developers I sit with every fortnight went through all four stages in six months, and they did it because they were using this stuff on real client work with real money attached.</p><p>That is the thing I did not expect when I started these sessions. I thought I would be teaching. Mostly I have been taking notes.</p><div><hr></div><h2>Why I am writing this down</h2><p>Two reasons.</p><p>The first is that six months moved faster than any six months I have worked through, and I suspect the next six will too. Having a record of what people actually believed in March, and how wrong some of it turned out to be, seems worth keeping.</p><p>The second is more practical. Those ten sessions are <strong><a href="https://sbdy.io/RJ0v32p">sixteen and a half hours of recorded conversation</a></strong>, and they sit inside the <strong><a href="https://sbdy.io/RJ0v32p">.NET Web Academy</a></strong><a href="https://sbdy.io/RJ0v32p"> </a><strong><a href="https://sbdy.io/RJ0v32p">All Access Pass</a></strong>. Not as a bonus. They are the part that cannot be recorded in advance, because by the time I edited a course about June, it would be August.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://sbdy.io/RJ0v32p" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eOLR!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif" width="418" height="235.125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:640,&quot;resizeWidth&quot;:418,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;.NET Web Academy live session preview&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/RJ0v32p&quot;,&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=".NET Web Academy live session preview" title=".NET Web Academy live session preview" srcset="/__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!eOLR!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fba9878-2ecf-42d8-a041-9b6eb50c2438_640x360.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If you want to be in the room for the next ten, that is what the membership is for. Twice a month, no slides, no agenda, whatever people bring. Every session recorded, so it&#8217;s in the middle of your working afternoon, you watch it later.</p><p><strong><a href="https://sbdy.io/RJ0v32p">Join the All Access Pass</a></strong></p><p>The full course library and all the source code come with it. But the sessions are the reason it exists.</p><div><hr></div><p>Session eleven is on <strong><a href="https://sbdy.io/RJ0v32p">Tuesday, August 25</a></strong>. Join before then and you are in the room for it.</p><p>I have no idea what it will be about, which after ten of these is the part I have come to like most.</p><p>Take care,</p><p>Patrick</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[He bet his career on legacy code being hard. Then AI showed up.]]></title><description><![CDATA[A developer in my cohort built his whole business on legacy code being hard. Then AI made it easy. Here is what happened to the niche, and the exact method he uses now.]]></description><link>https://dotnetwebacademy.substack.com/p/he-bet-his-career-on-legacy-code</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/he-bet-his-career-on-legacy-code</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 22 Jul 2026 17:01:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kzxF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kzxF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kzxF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&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="/__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!kzxF!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d5e503-c5df-411a-992d-3e9d0d04f101_1280x720.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 is a developer in my cohort who built an entire career on one bet.</p><p>The bet was this: young developers do not want to touch old code. They want green fields, new frameworks, the shiny thing. So the old systems, the ones quietly running real companies, would always need someone. He would be that someone. Legacy modernization as a niche, all the way to retirement.</p><p>For twenty years it paid. And then AI arrived and went straight for the part he thought was safe.</p><p>He called it a black swan. I want to tell you what actually happened to his niche, because the same thing is happening to yours. And then I want to give you the method, the one he uses now on real client systems, because the story on its own is not much use to you.</p><div><hr></div><h2><strong>Modernizing old apps with your team</strong></h2><p>If your team is sitting on an aging .NET application, an old Web Forms system, an early MVC app, a desktop tool everyone is afraid to touch, and you want your developers to modernize it with AI instead of rewriting it by hand over months, that is exactly the kind of work I now run private workshops for. One focused day, your codebase, your team. <strong><a href="https://sbdy.io/C8H5dxb">You can request a team workshop here.</a></strong></p><p>Now, back to the bet.</p><div><hr></div><h2><strong>The niche that was supposed to be safe</strong></h2><p>His logic held for two decades, and honestly it was good logic.</p><p>He and his partners find what he calls a cash cow business. A company whose software still works, still makes money, but has aged badly. Web Forms. Early MVC. A desktop tool that three people understand and everyone else is afraid to touch. And they modernize it. His phrase for it is make it great again.</p><p>The work is unglamorous. It is high trust. It pays extremely well. And almost nobody young wants to do it, because there is no conference talk in migrating a fifteen year old billing system.</p><p>That scarcity was the entire moat. Old technology was a barrier to entry, and the barrier is what kept the work valuable.</p><p>Then large language models learned to read old code better than most humans can.</p><div><hr></div><h2><strong>Why AI is so good at legacy code</strong></h2><p>Here is the thing most developers have backwards.</p><p>The hardest part of modernizing a legacy system was never the typing. Anyone can type. The hard part was the understanding.</p><p>You inherit a solution with thirty projects. Strange patterns. Three different approaches to data access because three different contractors passed through. Decisions nobody remembers making and nobody dares reverse. And before you can safely change a single line, you have to reconstruct the whole thing in your head.</p><p>That reconstruction used to take weeks. Sometimes a month of billable time before the client saw anything at all.</p><p>Now you point a capable model at the entire solution and within hours you understand the architecture. What calls what. Where the risk is concentrated. What the previous developer was trying to do, and where they gave up.</p><p>Another developer I know, someone with a master&#8217;s degree in AI from the nineteen eighties, did exactly this. He fed a whole multi-project solution to a model and a couple of hours later he could talk intelligently about tradeoffs that would previously have taken him a week to even see.</p><p>Notice what actually happened there. The AI did not replace his judgment. It removed the slow, expensive, boring part that used to sit between him and his judgment.</p><div><hr></div><h2><strong>The black swan</strong></h2><p>So he called it a black swan, and I think that is exactly right. The thing that was supposed to protect his niche, the difficulty of old code, is the thing AI is best at dissolving.</p><p>But look closely at what did not change.</p><p>The client still needs someone they trust to make the call. The AI can explain a legacy system in two hours. It cannot decide what to keep and what to kill. It cannot tell you which risk is acceptable on a system that moves real money. It cannot sit in a room with a nervous CTO and say, we migrate this piece first, and here is why.</p><p>Someone has to steer.</p><p>So the niche did not disappear. It compressed. Work that took months takes weeks, which means he takes on more of it, delivers faster, and charges for outcomes rather than for the time he used to spend deciphering.</p><p>The moat moved. It used to be &#8220;I can understand this old code and you cannot.&#8221; Now it is &#8220;I can direct AI through this old code with judgment, and catch it when it is wrong.&#8221;</p><p>Here is how that is actually done.</p><div><hr></div><h2><strong>Step 1: The understanding pass, and do not write any code</strong></h2><p>Your first session with a legacy codebase is purely about understanding, and you let the AI do the reading.</p><p>The mistake almost everyone makes is opening with something like &#8220;modernize this application.&#8221; That prompt is worthless. It is too big and too vague, and the model will confidently produce something plausible and wrong.</p><p>Ask narrow questions with verifiable answers instead:</p><ul><li><p>Map the projects in this solution and tell me what each one is responsible for.</p></li><li><p>Trace what happens when a user submits an order, file by file.</p></li><li><p>Where does this application talk to the database, and how many different ways does it do that?</p></li><li><p>Which parts of this codebase have no tests at all?</p></li></ul><p>That last one is gold, because untested code is exactly where your migration risk lives.</p><p>And then verify two or three of the answers yourself. Open the files. Check it has not invented a service that does not exist. You are calibrating how far this model can be trusted on this specific codebase, before you let it write anything.</p><div><hr></div><h2><strong>Step 2: Write the rules down where the AI reads them</strong></h2><p>Before any code gets generated, you write your constraints into a file the AI reads every single time. I use AGENTS.md.</p><p>On a legacy project this is not optional. It is the highest leverage thing in the entire workflow.</p><p>What goes in it:</p><ul><li><p>The target architecture, explicitly. If you are moving to vertical slices, say so, and describe what a slice looks like in this project.</p></li><li><p>The .NET version you are actually on, or it will happily write code for one you do not have.</p></li><li><p>The patterns you want, and just as importantly the ones you have banned.</p></li><li><p>Which folders are off limits entirely.</p></li><li><p>How data access is done now, not the three legacy ways it used to be done.</p></li><li><p>And one line that saves enormous pain: do not add NuGet packages without asking me first.</p></li></ul><p>Because here is the failure mode every experienced developer hits. Left unconstrained, the model invents things. It hallucinates packages that do not exist. It writes code that does not compile. That is the moment people give up on AI and go back to typing everything by hand.</p><p>Constrain it, and the exact same model becomes reliable and genuinely fast.</p><p>That is the whole difference. Not a better model. Better boundaries.</p><div><hr></div><h2><strong>Step 3: Migrate one vertical slice, not one layer</strong></h2><p>This is where a lot of migrations die.</p><p>People modernize horizontally. All the data access, then all the services, then all the UI. And halfway through you have an application that is half old and half new and entirely broken, where nothing works until everything works.</p><p>Take one feature instead. The whole thing, top to bottom. One screen, its endpoint, its data access, its tests. Get it working in the new architecture while the old system keeps running around it.</p><p>The old name for this is the strangler fig pattern. New code grows around the old system, feature by feature, until one day there is nothing left of the original. It worked before AI. It works dramatically better with AI, because each slice now takes hours instead of days, and you can ship one a week to a client who can actually see it.</p><p>You always have something demonstrable. That matters more than people admit when someone is paying you for a migration.</p><div><hr></div><h2><strong>Step 4: Review it like a pull request from a talented junior</strong></h2><p>You read everything.</p><p>The contractor I opened this piece with still works in Visual Studio, still reviews every change, still participates in the entire process. He is not sitting back while it works. He is directing and checking, constantly.</p><p>Treat the output like a pull request from a talented junior who has never seen your business. Fast, capable, occasionally confidently wrong, and not accountable for what ships. You are.</p><p>And one more rule that is worth actual money. If it fails at the same thing twice, stop. Do not let it try a third time.</p><p>When a model is stuck, it does not get unstuck by retrying. It burns your budget going in circles and you finish the day with nothing to show. I know a developer who lost an entire working day and his whole monthly token allowance doing exactly that on one stubborn problem. When it fails twice, pull back and make the task smaller.</p><div><hr></div><h2><strong>Where this leaves you</strong></h2><p>The barrier that protected legacy work is gone. That is real. If your value was purely that you could read code nobody else wanted to read, that value is falling.</p><p>But the work did not vanish. It got faster, which means there is more of it, and the people who can direct AI through a difficult system with judgment are worth more than they were two years ago, not less.</p><p>That is the skill. Not typing faster. Directing well, and knowing when it is wrong.</p><div><hr></div><p>If your team is facing an old .NET system and you want them to learn to modernize it with AI properly, with control instead of chaos, that is exactly what I teach in private workshops. One day, your actual codebase. <strong><a href="https://sbdy.io/C8H5dxb">Request a workshop for your team here.</a></strong></p><p>And if you want to build this skill yourself first, I put the whole foundation into a free course, the <strong><a href="https://sbdy.io/hPPiXfv">Blazor AI Jumpstart</a></strong>. It costs nothing and it is the fastest way to feel this workflow for yourself.</p><p>Take care.</p>]]></content:encoded></item><item><title><![CDATA[AI made me more productive. So why am I working more?]]></title><description><![CDATA[AI made me more productive than ever. So why am I working more, not less? The honest answer, and the off switch I had to install by hand.]]></description><link>https://dotnetwebacademy.substack.com/p/ai-made-me-more-productive-so-why</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/ai-made-me-more-productive-so-why</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 15 Jul 2026 17:02:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!z8_I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.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="/__u/substackcdn.com/image/fetch/$s_!z8_I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!z8_I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:870384,&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://dotnetwebacademy.substack.com/i/206996804?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!z8_I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80f276ce-a63f-4054-9abe-83b7c127cfac_1280x720.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 aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>AI has made me more productive than I have ever been.</p><p>Which is why I keep getting stuck on one question.</p><p>Why am I working more than ever, not less?</p><div><hr></div><h2>This was supposed to buy me time</h2><p>That was the promise, was it not. AI does the heavy lifting, and you get your evenings back.</p><p>The productivity half is real. I am building things in hours that used to take weeks, shipping more than I ever have.</p><p>But the more-free-time half has gone the other way for me. I find myself back at the screen after dinner, thinking, if I just send one more prompt, I can get three more hours of work done while I do something else.</p><p>And when I talked about this with other experienced developers recently, they had all fallen into the exact same pattern. So I want to be honest about what is actually going on, because I think a lot of us are walking into this without noticing.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><div><hr></div><h2>AI removed my off switch</h2><p>Here is the mechanism, and once you see it, you cannot unsee it. AI did not just make each task faster. It removed the friction that used to make me stop.</p><p>It used to be that by the end of the day, the work was genuinely hard. My brain was tired. Building the next feature meant real mental effort, so at some point I would stop, because I was spent.</p><p>The difficulty itself was a built-in off switch. I worked until I could not, and then I went and had a life.</p><p>Now the next feature is one prompt away. It costs me almost no energy to set three hours of work in motion. So that natural stopping point is gone. I am not drained in the old way, because the AI is doing the heavy part. So I just keep going. One more prompt. One more thing. Each one is so cheap to start that there is no reason, in the moment, to stop.</p><div><hr></div><h2>Easy work does not mean less work</h2><p>So the productivity did not buy me free time. It raised my appetite for output.</p><p>That is the trap. When work becomes easy, you do not do the same amount in less time and then relax. You do far more, because there is always one more cheap prompt to send. The ceiling that used to be my own exhaustion just vanished, and nothing rose up to replace it.</p><p>And it is a sneaky trap, because it does not feel like overwork. It feels wonderful. It feels productive. You are shipping more than ever.</p><p>But you are also at the screen after dinner, prompting from your phone in the grocery line, running six projects at once. Which, if I am honest, is not good for my brain, and I know it even while I am doing it.</p><div><hr></div><h2>The off switch has to be a decision now</h2><p>So here is where I have landed, and I am still very much working on it.</p><p>The off switch used to be automatic. It was my own tiredness, and I could trust it to stop me. Now I have to install the off switch manually.</p><p>The boundary has to be a decision, not a feeling. Because the feeling, I am not even tired, I could easily do one more, is exactly what runs you into the ground. You do not get the warning your body used to give you, because your body is not doing the hard part anymore.</p><p>The whole promise of this technology was that we would work less, not that we would each run a tireless night shift we feel quietly obligated to feed. And if you are not deliberate about it, you get the second one. More output in the same hours, or more hours, and a mind that never gets to clock out.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><div><hr></div><h2>The skill nobody talks about</h2><p>So the real skill here is not a coding skill at all. It is knowing when to stop when nothing is forcing you to.</p><p>That might be the most important thing I am trying to figure out right now, and I do not have it solved.</p><p>If you are feeling more productive than ever and somehow also more drained, you are not doing it wrong, and you are not the only one. The tool removed your natural off switch. You have to put a new one back in on purpose.</p><p>So be more productive, and then actually take the time it gives you back. That is the part I keep forgetting, and I am starting to think it is the part that matters most.</p><div><hr></div><p>If you want to get the productive part right, building with AI on a foundation you actually understand so the time savings are real, I made a free course that walks you through exactly that setup. It is the free Blazor AI Jumpstart: <strong><a href="https://sbdy.io/ypANjmP">grab the free Blazor AI Jumpstart here</a></strong>.</p><p>Then go install your off switch. </p><p>Take care.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Future of an AI-Native Web]]></title><description><![CDATA[I built the tools. I pay for the tools. And lately I barely open any of them.]]></description><link>https://dotnetwebacademy.substack.com/p/the-future-of-an-ai-native-web</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/the-future-of-an-ai-native-web</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 08 Jul 2026 16:02:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VGEY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.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="/__u/substackcdn.com/image/fetch/$s_!VGEY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VGEY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:899094,&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://dotnetwebacademy.substack.com/i/205956758?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VGEY!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa1f7829-5c6e-4437-8813-624d976066ee_1280x720.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 aria-hidden="true" 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><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 want to admit something that is a little embarrassing for someone who builds software for a living.</p><p>I barely open my own tools anymore.</p><p>Quick context on why that is a strange thing for me to say.</p><p>I have been writing code for almost 30 years, from QuickBASIC and Turbo Pascal as a kid to about 20 years in .NET. I have built SaaS products, line-of-business apps, even video games. These days I teach thousands of developers, and I build my own tools.</p><p>Two of them are <strong><a href="https://stackbuddy.io">StackBuddy</a></strong>, which runs my Substack, and TeachStats, which tracks my business. I made them. I rely on them every day.</p><p>And lately I drive both of them, plus Kit for my email, entirely through Claude over an MCP connection, without opening their dashboards at all.</p><p>Instead I sit in one place, my terminal, and I talk to an AI.</p><p>Draft three Substack notes in my voice and schedule them. What did my last launch email actually convert? Pull my recurring revenue and tell me what changed this month.</p><p>It does all of it, across all three tools, and I never load a single web page.</p><p>The first time it really landed, I got that small jolt you feel when something has quietly changed and is not changing back. The tools did not get worse. The reason to visit them just evaporated.</p><p>So here is the thought I cannot put down. In an AI-native web, the tool matters far less than the feature you can reach through one interface.</p><div><hr></div><p>If you are a .NET developer who wants to get ahead of this shift, that is exactly what I built the <strong><a href="https://sbdy.io/pQiA92t">Blazor AI Accelerator</a></strong> for.</p><p>Four live weeks building real things with AI on a foundation you actually understand, and enrollment is open now. </p><div id="vimeo-1185911144" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1185911144&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1185911144?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/pQiA92t&quot;,&quot;text&quot;:&quot;Join the Blazor AI Accelerator&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/pQiA92t"><span>Join the Blazor AI Accelerator</span></a></p><p>If you would rather go at your own pace, my <strong><a href="https://sbdy.io/eH6FxAS">All Access Pass</a></strong> is the steady way to get there. More on both at the end. For now, let me show you what I mean.</p><div><hr></div><h2>The app as a destination is dying</h2><p>For twenty years, the unit of software was the app. You went somewhere. You logged in. You learned its menus and its buttons and its particular opinions about how things should be done.</p><p>The interface was the product. A lot of us spent our careers polishing those interfaces.</p><p>What is happening now is that the interface is being peeled off the top of the product. Underneath, the valuable part is still there. The data. The logic. The network. The thing the tool actually does. But the front door, the dashboard you used to live inside, is becoming optional.</p><p>The mechanism behind this has a boring name. MCP, the Model Context Protocol. Strip away the jargon and it is simply a standard way for a tool to hand its capabilities to an AI. Once a tool speaks it, the AI can use that tool as a set of actions, with no screen required.</p><p>I added MCP to <strong><a href="https://stackbuddy.io">StackBuddy</a> </strong>and to TeachStats. Overnight, they stopped being places I visit and became capabilities my AI can call.</p><p>And the moment that was true for all of my tools at once, my software stopped being a pile of browser tabs and turned into a single conversation.</p><div><hr></div><h2>What AI-native actually means</h2><p>Let me be precise, because the phrase gets thrown around. AI-native is not bolting a chat box onto the corner of your app. It is the inversion.</p><p>The app becomes a set of capabilities. The AI becomes the place you actually work. The polished screen becomes one optional view among many.</p><p>The user no longer picks a tool and then hunts for a feature. They state an intent, and the AI composes features across whatever tools can serve it. The boundary between tools goes invisible.</p><p>I do not think open <strong><a href="https://stackbuddy.io">StackBuddy</a></strong> anymore. I think schedule these, and the right capability quietly runs, wherever it happens to live.</p><p>Once you feel that, going back to clicking through five separate dashboards feels like dialing a rotary phone.</p><div><hr></div><h2>What this means if you build software</h2><p>If you make things, this is the part to sit with. Build capability-first, not interface-first. Expose what your product can do through an API and through MCP, not only through your own screens.</p><p>Because the moat is moving. It used to be your slick interface. The AI is busy commoditizing exactly that.</p><p>What it cannot commoditize is the underlying value, the proprietary data, the genuinely hard logic, the network only you have, and whether you are reachable by the AI layer at all. A tool that does not expose its capabilities simply becomes invisible in an AI-native web, no matter how beautiful its dashboard is.</p><p>That is an uncomfortable thing to say after a decade where interface craft was the job. But the value is concentrating into two places: what is hard to replicate, and being present in the AI&#8217;s toolbox when the moment comes to act.</p><div><hr></div><h2>The catch nobody is selling you</h2><p>Here is where I climb off the hype train, because there is a real cost and almost no one mentions it.</p><p>When one AI interface can drive all of your tools, it can also be confidently wrong across all of them at the same time. The exact orchestration that makes you powerful makes you dangerous the second you cannot evaluate what it is doing.</p><p>I have written before that there are two kinds of operator now. The pilot and the passenger.</p><p>In an AI-native web that line stops being about a single codebase and starts being about your entire stack. A passenger states an intent and accepts whatever happens across five tools because they cannot tell good from bad.</p><p>A pilot knows enough to catch the one action that is subtly wrong before it emails the wrong list of sixteen thousand people, or quietly misreports the revenue they are about to make a decision on.</p><p>So the skill that goes up in value is not operating any one tool. It is judgment, applied across an AI that suddenly has its hands on everything you own.</p><div><hr></div><h2>Where I think this goes</h2><p>Fewer dashboards get visited. Tools start competing to live inside the AI&#8217;s toolbox rather than to win one more tab in your browser. Open the app slowly turns into ask for the outcome.</p><p>And the products that win are the ones built capability-first, with a human kept firmly in the loop for the part machines are still bad at, which is knowing whether the answer is actually right.</p><p>I am not mourning the dashboard. I built a few good ones. But given the choice, I would rather build capabilities that show up wherever my users already are, including inside their AI, than fight for one more icon on their screen.</p><p>The future of the web is not more tools. It is fewer interfaces and a lot more judgment.</p><div><hr></div><h2>If you want to be the pilot, not the passenger</h2><p>This shift rewards the people who can build with AI and still steer it. Here are the two ways I can help you get there.</p><p>The fast, structured way is the <strong><a href="https://sbdy.io/pQiA92t">Blazor AI Accelerator</a></strong>. </p><p>Four live weeks, with me and a small group, building real things with AI on a foundation you actually understand, so when the AI reaches for all your tools at once, you are the one flying the plane. </p><p>Enrollment is open now.</p><div id="vimeo-1186020489" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1186020489&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1186020489?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><blockquote><p>&#8220;I knew how to use Copilot in Visual Studio, but I did not know how to use it efficiently. Confused about skills, agents, copilot-instructions.md files? Hash it all out in this AI Accelerator.&#8221; (Jeff, senior software engineer)</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/pQiA92t&quot;,&quot;text&quot;:&quot;Join the Blazor AI Accelerator&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/pQiA92t"><span>Join the Blazor AI Accelerator</span></a></p><p>And if you would rather go at your own pace, the <strong><a href="https://sbdy.io/eH6FxAS">All Access Pass</a></strong> gives you the full course library, twice-monthly live sessions where we work through exactly this kind of thing together, all the source code, and the community. It is the steady way to keep getting stronger, month after month.</p><p>Be the one who can tell the difference. </p><p>Take care.</p>]]></content:encoded></item><item><title><![CDATA[Why seniors should win the AI era (if they move now)]]></title><description><![CDATA[AI is fast but not wise. The developer who pairs judgment with fluency is the one nobody can replace. Here is how to become that.]]></description><link>https://dotnetwebacademy.substack.com/p/are-juniors-more-valuable-than-seniors</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/are-juniors-more-valuable-than-seniors</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 01 Jul 2026 16:01:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wiPH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!wiPH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!wiPH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:469858,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dotnetwebacademy.substack.com/i/204128041?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!wiPH!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafc6aa4e-b556-4bda-b134-3031caa98714_1376x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>A developer wrote to me this week.</p><p>His company is replacing senior roles with mid-level developers. Not because the mid-levels are cheaper, though they are. Because they are faster. </p><p>They work with AI in a way he does not, yet.</p><p>He watched it happen. Colleagues running several AI sessions at once. Agents writing whole plans from the requirements. Review agents in the CI pipeline. Pull requests flying.</p><p>And he sat there, a senior, and realized the ground had moved under him.</p><p>He is now looking for a new job. And he said something that stuck with me. He understood the decision. He could see exactly why the company made it.</p><p>I want to talk about that, because it is the most important thing happening in our field right now, and almost nobody is saying it plainly. </p><div><hr></div><h2>It is not juniors beating seniors</h2><p>The headline version of this story is scary and wrong. Juniors are not beating seniors. That is not what is happening.</p><p>What is happening is that AI-fluent developers are beating AI-illiterate ones.</p><p>Right now a lot of the AI-fluent ones happen to be earlier in their careers, because they had less to unlearn and jumped in first. But the dividing line is not age or years of experience. The line is whether you know how to work with these tools or not.</p><p>That is good news, for everyone, at every level.</p><p>Because fluency is learnable. If the advantage came from being a certain age, half of us would be stuck. It does not. It comes from a skill, and skills can be picked up by anyone willing to put in a few focused weeks.</p><p>So if you are panicking, you have the wrong frame. The question is not how do I compete with younger developers, or how do I keep up with the seniors.</p><p>The question is how do I become AI-fluent, fast.</p><p>Different question. Much more hopeful answer, no matter where you are in your career.</p><div><hr></div><p>If that is the question you are asking, that is exactly what I built the Blazor AI Accelerator for. </p><p>A four-week cohort that takes a .NET developer and makes them genuinely strong at modern AI-assisted work. Early-bird pricing ends today. </p><p>You can have a look here: <strong><a href="https://sbdy.io/ThQDOvH">see the Blazor AI Accelerator</a></strong>.</p><div id="vimeo-1185911144" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1185911144&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1185911144?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/ThQDOvH&quot;,&quot;text&quot;:&quot;Join the Blazor AI Accelerator&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/ThQDOvH"><span>Join the Blazor AI Accelerator</span></a></p><p>Now let me make the case for why your experience, however much you have, is worth more in this world, not less.</p><div><hr></div><h2>Why judgment is the thing that wins</h2><p>Here is the part that should change how you feel about all of it.</p><p>AI is fast. It is not wise.</p><p>It will write you a hundred lines that look perfect and quietly get the auth logic wrong. It will pick a pattern that works today and rots in six months. It will confidently do the wrong thing.</p><p>Who catches that?</p><p>The developer with judgment. The person who has seen the failure modes, who feels when something is off, who knows what good looks like. That judgment is the rarest and most valuable thing in an AI-heavy workflow, and experience is how you build it.</p><p>So the real winner is not the fastest prompter. It is the developer who pairs judgment with fluency.</p><p>The AI handles the speed. The human handles the part the AI cannot do, knowing whether the fast output is actually right.</p><p>If you are a senior, this is your advantage, and it is a big one. You already have the judgment. You just need the fluency on top.</p><p>And if you are earlier in your career, this is your map: build real fundamentals so you become the person who can tell good output from bad, and pick up the AI workflows alongside them.</p><p>The developers who pair those two things are the ones who will be hard to replace, at every level. The ones in trouble, at every level, are the ones who skipped one or the other.</p><div><hr></div><h2>What AI fluency actually looks like</h2><p>When that developer watched his colleagues, he saw a few specific things. Let me name them, because once they are named they stop being magic and start being learnable.</p><p>Running several AI sessions in parallel. Not one chat at a time, waiting. Multiple tasks moving at once, each in its own session, while you steer.</p><p>Agentic loops. Giving an agent a clear, bounded task and letting it work through the steps on its own, instead of hand-holding every line.</p><p>Agents in the pipeline. Review agents that read every pull request. Planning agents that turn a requirement into a task list automatically.</p><p>Connecting AI to real tools. Through things like MCP, so the AI can reach your database, your services, your systems, and actually do work, not just talk about it.</p><p>None of that is genius. It is a set of workflows.</p><p>Any developer can learn all of it in a few weeks. And the more experience you have to direct it and catch its mistakes, the more powerful it becomes in your hands.</p><div><hr></div><h2>The passenger and the pilot</h2><p>This is the idea I keep coming back to, and it fits here perfectly.</p><p>There are two ways to work with AI. As a passenger, or as a pilot.</p><p>A passenger types a prompt and accepts whatever comes back, because they cannot yet tell good from bad. When it works, great. When it quietly breaks, they do not notice until it is too late.</p><p>A pilot sets up the flight. They decide the structure, the boundaries, what the AI is allowed to touch. They let it run, and they catch it the moment it drifts, because they understand what it is doing.</p><p>And here is the thing. This is not about age.</p><p>Anyone can be a passenger. Anyone can become a pilot.</p><p>There are seniors who refuse to touch AI and have all that judgment grounded, unused. And there are juniors learning to fly faster than people twice their experience, because they are pairing real fundamentals with the tools.</p><p>The trap is not being young or being old. The trap is staying a passenger.</p><p>The developer who wins, the one nobody replaces, is the pilot who flies. Judgment plus fluency. That is the goal, at every stage of your career.</p><div><hr></div><h2>The clock is real, and that is okay</h2><p>I will not pretend there is no urgency. The developer who wrote to me is proof that this is happening now, not in five years. Companies are making these calls today.</p><p>But urgency is not doom.</p><p>The gap that got him in trouble is a few weeks of focused learning wide, not a few years. He is not behind because he is a senior. He is behind because he waited. The moment he stops waiting, his experience becomes the asset it always was.</p><p>Wherever you are in your career, the worst thing you can do is freeze, or decide it is too late and coast.</p><p>It is not too late.</p><p>If you have experience, you are closer than you think, because you already have the hard part, the judgment. If you are earlier on, you have less to unlearn. Both of those are advantages. Use the one you have.</p><div><hr></div><h2>What to do this week</h2><p>Do not try to learn everything at once. Pick one thing.</p><p>Take a real task you understand well, and instead of doing it by hand, try to direct an AI agent through it. Write the task out clearly. Set the boundaries. Let it run. Watch where it breaks, and learn from that.</p><p>Do that a few times and the fear starts to fade, because you see it for what it is. Not a colleague who is better than you. A set of workflows you can learn, and the better your fundamentals, the better you will be at steering them.</p><p>The developers who adapt are not going to lose to anyone. They are going to be the ones everyone else learns from.</p><p>Be that.</p><div><hr></div><p>If you want help getting there faster, here are the two ways I can do that.</p><p>The fast, structured way is the Blazor AI Accelerator. Four weeks, a small group of developers, working through these exact workflows with me live, the parallel sessions, the agents, MCP, shipping real work. It includes a full year of the All Access Pass on top.</p><p>Early-bird pricing ends today. If you want to close the gap quickly, this is the one: <strong><a href="https://sbdy.io/ThQDOvH">see the Blazor AI Accelerator</a></strong>.</p><div id="vimeo-1186020489" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1186020489&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1186020489?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><blockquote><p>&#8220;I knew how to use Copilot in Visual Studio, but I did not know how to use it efficiently. Confused about skills, agents, copilot-instructions.md files? Hash it all out in this AI Accelerator.&#8221; (Jeff, senior software engineer)</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/ThQDOvH&quot;,&quot;text&quot;:&quot;Join th Blazor AI Accelerator&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/ThQDOvH"><span>Join th Blazor AI Accelerator</span></a></p><p>If you would rather go at your own pace, the All Access Pass gives you the full course library, twice-monthly live sessions where we work through this kind of thing together, all the source code, and the community. </p><p>It is the steady way to keep getting stronger, month after month: <strong><a href="https://sbdy.io/gsChLLv">join the All Access Pass</a></strong>.</p><p>Either way, do not wait.</p><p>Take care,</p><p>Patrick</p>]]></content:encoded></item><item><title><![CDATA[A developer with half your experience just out-shipped you. Here's the good news.]]></title><description><![CDATA[It was never about speed. It's about who's steering. How to make your years of experience an advantage again, in four live weeks.]]></description><link>https://dotnetwebacademy.substack.com/p/ai-didnt-make-senior-net-developers</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/ai-didnt-make-senior-net-developers</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 24 Jun 2026 16:01:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5d85!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5d85!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5d85!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:478323,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dotnetwebacademy.substack.com/i/203004823?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!5d85!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7581c7f6-ea40-45cb-8ea7-a0d6b31ddc39_1376x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Let me tell you about a developer I talked to a few weeks ago. </p><p>Fifteen years in .NET. Genuinely good. The kind of person who has shipped real systems, mentored juniors, and knows where the bodies are buried in a legacy codebase. </p><p>And he told me, quietly, that for the first time in his career, he feels like he is falling behind.</p><p>Not because he got worse. Because the ground moved under him.</p><p>He had watched a developer half his experience use AI to ship in an afternoon what would have taken him a careful week. </p><p>And the part that stung was not the speed. It was the quiet thought underneath it: that his fifteen years of hard-won skill had somehow started to feel heavy. Like he was lugging a toolbox to a fight that had moved to a different street.</p><p>If any part of that lands for you, stay with me. </p><p>Because I think the story he was telling himself is wrong, and I want to show you why, because it changes everything about what you should do next.</p><div><hr></div><h2><strong>Most of us are still working like it is 2018</strong></h2><p>Same architecture habits. Same workflow. Same mental model we have had for years. And honestly, for a long time, that was completely fine.</p><p>It is not fine anymore. AI quietly rewrote the rules of what it means to be a productive .NET developer, and the people who adapted are pulling away from the people who did not. Not because they found the cleverest prompt. Because they changed how they work, at the root.</p><p>Here is the part that should give you hope instead of dread: the gap is not talent, and it is not experience. </p><p>It is workflow. </p><p>And workflow is learnable. </p><p>The developer pulling ahead of you is not smarter than you. He just rewired one habit. You can too.</p><div><hr></div><p>Before I go any further, let me put the offer up front, because some of you already feel this in your gut and just want the door. </p><p>I run a four-week live cohort, the <strong><a href="https://sbdy.io/NV6dh6K">Summer Cohort of the Blazor AI Accelerator</a></strong>, where a small group of working .NET developers rewires exactly this habit together, with me. </p><p>Early-bird pricing ends July 1. If that's what you want, <strong><a href="https://sbdy.io/NV6dh6K">grab your seat here</a></strong>. </p><p>If you want the why first, keep reading.</p><div id="vimeo-1185911144" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1185911144&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1185911144?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><div><hr></div><h2><strong>The trap almost everyone falls into first</strong></h2><p>When you feel that ground move, the instinct is to reach for the obvious fix. A prompt-engineering tutorial. </p><p>A &#8220;top ten AI tools&#8221; video. </p><p>A weekend of watching demos at 1.5x speed.</p><p>So you learn a lot about AI. And then Monday comes, and you sit down, and you work exactly the way you did in 2018, with a few more browser tabs bookmarked that you will never reopen. </p><p>Nothing actually changed, because watching someone else do it is not the same as it becoming yours.</p><p>I know this because I did it too. </p><p>My own breakthrough was not a better prompt. It was a completely different relationship with the tool, and I only got there by building real things with it, badly at first, until it clicked.</p><div><hr></div><h2><strong>The shift: stop being a passenger</strong></h2><p>The developers thriving with AI right now are not the ones typing magic incantations. They are the ones who stay in charge.</p><p>They set their projects up so the AI builds their way instead of inventing its own. </p><p>They know what to keep and what to throw away. </p><p>They treat the AI like a sharp junior partner, not a vending machine you bang on and hope. The result is that AI makes them dramatically faster without quietly turning their codebase into a mess they cannot explain three weeks later.</p><p>And here is the reframe for that developer with fifteen years behind him, and maybe for you. </p><p>Your experience is not heavy. It is the exact thing that lets you steer the AI and catch it the moment it hands you something that looks right and is quietly wrong. </p><p>The junior shipping fast cannot do that yet. You can. That is not obsolescence. That is leverage, if you learn to use it.</p><p>But it is a skill. It does not arrive from one tutorial. It comes from doing it, on real projects, with people who push you, until it is yours.</p><div><hr></div><h2><strong>So I built the room where you actually build it</strong></h2><p>That is exactly why I am running the <strong><a href="https://sbdy.io/NV6dh6K">Summer Cohort of the Blazor AI Accelerator</a></strong>.</p><p>Four weeks. Every Wednesday, starting July 15. Ninety minutes a session, live, with me and a small group of working developers. </p><p>No slides. No theory dump. We build, we get stuck, and we work through it together, the way the best conversations between developers actually go. </p><p>Week one we get your tools and project foundation right. Then we build real features with AI, the kind you will recognize from your day job. By the end you walk away with a repeatable way of working that you trust, not a one-off demo you forget by Friday.</p><p>The whole point is that you do not leave with notes. </p><p>You leave with a new default.</p><div><hr></div><h2><strong>Do not take my word for it</strong></h2><p>Here is what two people from the first cohort told me, unprompted.</p><blockquote><p><em>&#8220;I have saved months of effort learning on my own. Working with developers who are also learning and utilizing what they learn in real time and in real world situations has been exactly what I needed to get from A to Z quickly.&#8221; (Tim, business owner)</em></p><p><em>&#8220;I knew how to use Copilot in Visual Studio, but I did not know how to use it efficiently. Confused about skills, agents, copilot-instructions.md files? Hash it all out in this AI Accelerator.&#8221; (Jeff, senior software engineer)</em></p></blockquote><div id="vimeo-1186020489" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1186020489&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1186020489?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p>Notice that neither of them talks about prompts. They talk about how they work now. That is the thing that actually transfers to Monday morning.</p><div><hr></div><h2><strong>What you actually get</strong></h2><p>Both plans include the same core, and it is more than four weeks. You get the <strong>four live sessions</strong>, a <strong>full year of the All Access Pass</strong> with every course and workshop I have made, all the <strong>recordings from the first cohort</strong>, and an <strong>Accelerator-only Discord</strong> where the conversation keeps going. </p><p>So you are not buying a month. </p><p>You are buying a year of getting better, with a live month to kick it off.</p><ul><li><p><strong>Core</strong> is everything above. Early bird $599, normally $799.</p></li><li><p><strong>Pro</strong> adds <strong>two 45-minute one-on-one sessions with me</strong>, and it is capped at 5 seats. Early bird $999, normally $1,199.</p></li></ul><p>Early bird saves you $200 on either plan, and it ends July 1.</p><p><strong><a href="https://sbdy.io/NV6dh6K">See the full plan and grab your seat</a></strong></p><div><hr></div><h2><strong>The honest part</strong></h2><p>I am not going to promise you magic or that you will never struggle again. </p><p>You will struggle. But the struggle, with people beside you who are figuring out the same thing in real time, is the entire point. </p><p>That is where the skill actually forms.</p><p>What I can promise is this. A year from now, the developers who adapted will be glad they started somewhere. </p><p>I would love for that somewhere to be this room, and for the version of you a year out to look back at this email as the moment your experience became an advantage again instead of a weight.</p><p>Take care,<br>Patrick</p><p><strong>P.S.</strong> The 5 Pro seats are the one thing I cannot make more of, because the one-on-one time comes straight out of my own calendar. If that is the one you want, do not wait for July 1. The seats can go before the deadline does.</p>]]></content:encoded></item><item><title><![CDATA[I told an AI I’d see it in 7 hours. It finished in 2.]]></title><description><![CDATA[The &#8220;night shift&#8221; actually works now. The surprise was what it tells us.]]></description><link>https://dotnetwebacademy.substack.com/p/the-ai-night-shift-finally-works</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/the-ai-night-shift-finally-works</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 17 Jun 2026 16:01:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VQkZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!VQkZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VQkZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&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="/__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!VQkZ!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfad0723-76ce-438e-9666-ef5483a9bd63_1280x720.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 saw an article about the night shift with AI a few weeks ago, and I could not make it work.</p><p>That idea stayed in my head.</p><p>Not because it was flashy. Because it felt close. It felt like the kind of thing that should work for .NET developers building real products, real features, and real systems that never seem to have enough time in the day.</p><p>Now I think it can work. Not as magic. Not as autopilot. But as a real workflow.</p><p>And the piece that changes everything is the combination of <strong>Claude</strong>, <strong>Fable 5</strong>, maybe <strong>Opus 4.8</strong>, and the <strong>/loop</strong> command.</p><p>That last part is the one that makes me stop and look twice.</p><div><hr></div><p>By the way, if you&#8217;re trying to figure out how to actually use AI in your .NET and Blazor work, I made you a <strong><a href="https://sbdy.io/cAfJmsi">free Blazor AI Jumpstart Course</a></strong>. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/cAfJmsi" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hlR0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg" width="622" height="347.16279069767444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:622,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Course branding&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/cAfJmsi&quot;,&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="Course branding" title="Course branding" srcset="/__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!hlR0!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21c11492-d398-42f3-a517-dc257490ce43_1376x768.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 I started, I wasted a ton of time. </p><p>Visual Studio, then VS Code, then Copilot, then Claude, learning the hard way what actually works. </p><p>The Jumpstart is the shortcut past all those mistakes, straight to the workflow I use now. </p><p>It&#8217;s free.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/cAfJmsi&quot;,&quot;text&quot;:&quot;Get the Blazor AI Jumpstart&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/cAfJmsi"><span>Get the Blazor AI Jumpstart</span></a></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!0L4h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png 424w, /__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png 848w, /__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!0L4h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png" width="1456" height="407" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:407,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1609235,&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://dotnetwebacademy.substack.com/i/201712471?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png 424w, /__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png 848w, /__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0L4h!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c947d22-a1b4-4aa8-983c-d2d41ac5c605_2979x833.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 aria-hidden="true" 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><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 screenshot says a lot. It shows the difference between random prompting and a real overnight loop. It shows how a single prompt can turn into a focused execution plan. How AI stops being a chat tool and starts acting more like a tireless junior engineer with a very specific assignment.</p><p>That is the shift.</p><div><hr></div><h2>What the night shift really means</h2><p>When people talk about AI doing work overnight, I think they sometimes imagine a fully autonomous agent building an app while they sleep.</p><p>That is not how I think about it.</p><p>I think about it more like a night shift in a real company.</p><p>You do not hand over your whole business and hope for the best. You leave behind clear instructions. You define the boundaries. You tell the next person what matters, what not to touch, and what success looks like.</p><p>That is what good AI prompting feels like to me now.</p><p>Not &#8220;build something cool.&#8221;</p><p>More like: </p><blockquote><p>&#8220;Here is the problem. Here are the rules. Here is the architecture. Here is the safe scope. Go work on this until morning and come back with something useful.&#8221;</p></blockquote><p>The screenshot prompt does exactly that.</p><p>It asks for performance profiling. It asks for page-level bottleneck discovery. It asks for improvements in performance and UX. It even asks for shells and skeletons on every data-heavy page. That is not vague. That is a <strong>real backlog item with real shape</strong>.</p><p>And that matters.</p><p>AI works much better when the task is narrow, concrete, and connected to visible user pain.</p><div><hr></div><h2>Why this time feels different</h2><p>A few weeks ago, I tried to imagine this same workflow and it felt too loose.</p><p>The agent would drift. The scope would expand. The changes would get noisy. I would spend more time reviewing than I saved by delegating.</p><p>That is the trap with early AI coding workflows.</p><p>You think the model is the problem, but often <strong>the real problem is the loop</strong>.</p><p>Now we have better models. We have better context handling. We have better commands. And we have better ways to break work into chunks that make sense for an AI system.</p><p>That is why Claude plus Fable 5 plus Opus 4.8 feels promising to me.</p><p>Claude gives me the strong reasoning and the long, structured output I want.</p><p>Fable 5 gives the workflow a shape I can trust. (I think sooner or later we will get Fable 5 back&#8230;)</p><p>Opus 4.8 may be the model I reach for when I want deeper analysis or better planning, but also provides impressive results with said workflow.</p><p>And <code>/loop</code> is the part that turns one prompt into a repeated cycle.</p><p>That cycle matters more than people think.</p><p>Because one AI response is a suggestion. A loop is a system.</p><div class="pullquote"><p>One AI response is a suggestion. A loop is a system.</p></div><p>That is the real shift here.</p><div><hr></div><h2>What I would actually ask AI to do overnight</h2><p>The screenshot gave me a good mental model for the kind of work I would trust to an overnight loop.</p><p>I would not start with my hardest domain logic first.</p><p>I would start with work that is obvious, measurable, and safe to review.</p><p>For example:</p><ul><li><p>Find slow pages in the app.</p></li><li><p>Add profiling around requests, handlers, and SQL timing.</p></li><li><p>Identify the worst bottlenecks.</p></li><li><p>Implement shells and skeletons for data-heavy screens.</p></li><li><p>Improve the first load experience on critical pages.</p></li><li><p>Write down what changed and why.</p></li></ul><p>That is excellent overnight work.</p><p>Why?</p><p>Because the AI can make progress even while I sleep, and in the morning I can inspect the result with a human brain and a cup of coffee.</p><p>I do not need it to be perfect.</p><p>I need it to move the app forward in a way that is easy to validate.</p><p>That is a big deal in .NET work, especially in Blazor apps where rendering, loading state, and user experience all get tangled together very fast.</p><p>A good AI night shift does not replace architecture. It respects it.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><div><hr></div><h2>How I would structure the loop</h2><p>If I were setting this up in a real Blazor app, I would keep the instructions simple and sharp.</p><p>I would want the model to work inside a clear slice of the system.</p><p>I would also want it to keep producing useful status, not just code.</p><p>My mental checklist would look something like this:</p><ol><li><p>Pick one area of the app.</p></li><li><p>Define the goal in one sentence.</p></li><li><p>List the files or layers it can touch.</p></li><li><p>Tell it what good looks like.</p></li><li><p>Ask it to work in small steps.</p></li><li><p>Make it report progress after each loop.</p></li><li><p>Stop when the work is done or the context gets weak.</p></li></ol><p>That is important.</p><p>Most AI failures happen when the system keeps going after it should have stopped.</p><p>The work gets vague. The context gets dirty. The changes become harder to trust.</p><p>The loop has to be disciplined.</p><p>That is true for humans too.</p><p>Night shifts only work when the handoff is good.</p><div><hr></div><h2>The best kind of overnight work is boring</h2><p>This might be the most underrated part of the idea.</p><div class="pullquote"><p>The best overnight AI work is not sexy.</p></div><p>It is boring in the best way.</p><p>It is the kind of work a good senior developer would delegate if they had more time and more patience.</p><p>It is profiling. It is loading states. It is repeated cleanup. It is finding slow paths. It is adding visibility. It is turning vague performance complaints into actual numbers.</p><p>That kind of work is perfect for a loop.</p><p>Because once the AI has a structure, it can repeat the process across multiple parts of the app.</p><p>It can inspect a page. Add timing. Find a delay. Suggest a fix. Implement a shell. Move to the next page.</p><p>That is useful.</p><p>And it lines up well with modern .NET architecture, where the app often has clear boundaries between UI, application logic, and infrastructure.</p><p>If the AI can stay inside those boundaries, the results are much easier to trust.</p><p>That is where I see real value.</p><div><hr></div><h2>Why shells and skeletons matter more than people think</h2><p>The prompt in the screenshot mentions shells and skeletons, and I think that part is very smart.</p><p>It is easy to focus only on raw speed.</p><p>But users do not experience your code. They experience the page.</p><p>If a page takes time, the right loading state can make that delay feel much smaller.</p><p>That is especially true in web apps with pages that load data, analytics, schedules, or reports.</p><p>A blank screen feels broken.</p><p>A skeleton says, &#8220;I am working on it.&#8221;</p><p>That one small change can make the app feel much faster, even when the backend work has not changed much yet.</p><p>So if the AI is already hunting slow pages, it should also be improving the perception of speed.</p><p>That is a great use of overnight work.</p><p>Not just fix the bottleneck. Fix the experience around the bottleneck.</p><div><hr></div><h2>What I learned from trying this before</h2><p>I think a lot of us are in the same place with AI coding.</p><p>We tried it early. We got some good results. We also got a lot of noise.</p><p>Then we backed off a little.</p><p>Not because the idea was bad. Because the workflow was not ready.</p><p>That is where I was with the night shift idea.</p><p>I liked the concept. I just could not make it hold together.</p><p>Now I think the missing piece was not ambition.</p><p>It was <em>control</em>.</p><p>Control over scope. Control over iteration. Control over the model&#8217;s attention.</p><p>Claude and Opus can reason well, but they still need structure.</p><p>That is why I keep coming back to the loop.</p><p>The loop makes the work persistent.</p><p>It keeps the AI from treating every prompt like a brand-new puzzle with no memory of the last step.</p><p>It creates momentum.</p><div><hr></div><h2>How I would use this in a real .NET shop</h2><p>If I were rolling this into a real team workflow, I would start with one practical rule.</p><p>Do not give the AI the whole app.</p><p>Give it one feature, one page, or one problem area.</p><p>Then let it work like this:</p><ul><li><p>Measure what is slow.</p></li><li><p>Explain the likely cause.</p></li><li><p>Propose a fix.</p></li><li><p>Implement the fix.</p></li><li><p>Add a better loading state if needed.</p></li><li><p>Report the result.</p></li></ul><p>That is a workflow I can trust.</p><p>It fits well with how I like to build software anyway.</p><p>Small slices. Clear intent. Fast feedback.</p><p>And if the AI can do that while I am offline, that is a real productivity win.</p><p>Not fake productivity.</p><p>Actual output.</p><div><hr></div><h2>My honest take</h2><p>I do not think the night shift with AI is hype anymore.</p><p>I think it is becoming real.</p><p>Not because the models are perfect. They are not.</p><p>Not because the tools are magical. They are not.</p><p>But because the workflow is finally getting close to something practical.</p><p>Claude is strong enough to reason through a serious task.</p><p>Fable 5 and the loop idea give the work structure.</p><p>Opus 4.8 may help when the task needs deeper thought.</p><p>And the screenshot prompt shows the right kind of problem: useful, bounded, and worth doing overnight.</p><p>That is where AI starts to feel less like a toy and more like a teammate.</p><p>Not a teammate I hand the keys to.</p><p>A teammate I trust with the night shift.</p><p>That is a much better fit for modern .NET development.</p><p>And honestly, that feels like the direction we should have been heading all along.</p><div><hr></div><h2>What I would do next</h2><p>If you want to try this, start with one page in your Blazor app that feels slow or messy.</p><p>Write one tight prompt. Keep the scope small. Ask for profiling first, then fixes, then loading-state improvements.</p><p>Let the loop run long enough to produce something real, then review it in the morning with fresh eyes.</p><p>That is the experiment I would run.</p><p>Not because it is fancy.</p><p>Because it is useful.</p><p>And useful is the whole point.</p><p>If you want the shortcut for getting started with this kind of workflow in .NET and Blazor, grab my <strong><a href="https://sbdy.io/cAfJmsi">free Blazor AI Jumpstart Course</a></strong>. </p><p>It will save you a lot of the trial and error I went through, and it gives you the foundation I wish I had when I started.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/cAfJmsi&quot;,&quot;text&quot;:&quot;Get the free Blazor AI Jumpstart&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/cAfJmsi"><span>Get the free Blazor AI Jumpstart</span></a></p><p>Then take that first overnight loop and make it work on something small.</p><p>That is how this gets real.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and building real things with AI every week.</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 architecture I reach for in every .NET project now (and why AI changed my mind)]]></title><description><![CDATA[Most developers still pick their architecture like it's 2018. The rules quietly changed.]]></description><link>https://dotnetwebacademy.substack.com/p/the-architecture-i-reach-for-in-every</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/the-architecture-i-reach-for-in-every</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 10 Jun 2026 16:01:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qkKG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.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="/__u/substackcdn.com/image/fetch/$s_!qkKG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qkKG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:923551,&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://dotnetwebacademy.substack.com/i/201280421?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qkKG!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e98bcb-2e90-4fb3-95b4-08b7049a2697_1280x720.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 aria-hidden="true" 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><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 almost every .NET project I start now, I reach for the same architecture.</p><p>Not clean architecture.</p><p>Not the classic three-layer controller, service, repository stack that pretty much every tutorial taught us a decade ago, me included&#8230;</p><p>I reach for <strong>vertical slice architectur</strong>e.</p><p>And I want to walk you through exactly what it is, why it became my default, and why I think it has quietly become the single best way to structure an application now that we are all building software alongside AI.</p><p>That last part is the one I really want you to sit with. Because most developers are still choosing their architecture the way they did in 2018, and the rules have changed.</p><div><hr></div><p>If you would rather watch this whole approach get built and shipped instead of just reading about it, this is the exact architecture we used in the <strong><a href="https://sbdy.io/hjwGM0D">Blazor AI Workshop</a></strong>. </p><div id="vimeo-1190059022" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1190059022&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1190059022?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p>The full three-hour recording is <strong>available here</strong>, and there is a discount waiting for you with the code <strong>SUBSTACK</strong>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/hjwGM0D&quot;,&quot;text&quot;:&quot;Get the Blazor AI Workshop&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/hjwGM0D"><span>Get the Blazor AI Workshop</span></a></p><p>Now, let me back up and explain what we are actually talking about.</p><div><hr></div><h2><strong>Organize by feature, not by layer</strong></h2><p>Here is the simplest way to put it.</p><p>Most architectures organize your code by technical layer. You have seen it. You have probably written it.</p><p>You open a project, and there is a folder called controllers, another called services, one for repositories, maybe one for models or DTOs. Every file in your application gets sorted into one of those buckets based on what kind of thing it is.</p><p>Vertical slice architecture flips that ninety degrees.</p><p>Instead of organizing by what kind of thing a file is, you organize by what feature it belongs to. So instead of a controllers folder and a services folder, you have a folder called CreateOrder.</p><p>And inside that one folder lives everything that feature needs. The endpoint, the validation, the business logic, the database call, the response it sends back.</p><p>One feature, one place. Everything it touches sitting right next to each other.</p><p>Here is the analogy I keep coming back to. Imagine a kitchen.</p><p>The layered approach is a kitchen organized by type of object. Every knife in one drawer across the room, every pan stacked in another corner, every spice on a shelf by the door. Technically very tidy. But to cook one single dish, you are running back and forth across the entire kitchen.</p><p>Vertical slices are a kitchen organized by meal. Everything you need to make the pasta is in one station. The whole recipe within arm&#8217;s reach. You cook the dish without touching anything that belongs to a different dish.</p><p>That is the whole idea. Organized by feature, not by layer.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>The hidden tax of organizing by layer</strong></h2><p>Let me describe a feeling you already know.</p><p>You are working in a nicely layered codebase, and you get a simple request. Add a phone number to the customer profile. Sounds like five minutes of work.</p><p>So you open the controller and add the field. Then the service to handle it. Then the repository. Then the DTO. Then the validator, which lives somewhere else entirely. Then the mapping configuration.</p><p>And by the time you are done, you have touched seven files in six different folders for one tiny change, and you are praying you did not miss one.</p><p>That is the hidden tax of organizing by layer. A single feature is smeared across your entire codebase. The code that changes together does not live together.</p><p>Engineers call the opposite of this <em>high cohesion</em>. Layered architecture is famous for having <em>low cohesion</em>. Things that belong together are scattered.</p><p>With vertical slices, that same change happens in one folder. You open the slice, you see the whole story of the feature top to bottom, you make your change, you are done.</p><p>And if you want to delete a feature entirely, you delete the folder. </p><p>Gone. </p><p>No archaeology, no hunting for the three orphaned service methods nobody else is using.</p><p>Here is the part people underestimate. This makes <em>onboarding </em>dramatically easier.</p><p>A new developer does not have to understand your entire architecture to be productive. </p><p>They open one slice, and that slice teaches them everything they need to ship that feature. The blast radius of understanding is small.</p><p>That alone would be enough to make the case. </p><p>But now I want to talk about the thing that turned vertical slices from a good idea into the obvious default for me.</p><div id="youtube2-L0NndcoCqEk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;L0NndcoCqEk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/L0NndcoCqEk?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Why AI changed the calculation</strong></h2><p>We are now writing a huge amount of code with AI. Assistants, agents, autocomplete, the whole spectrum.</p><p>And it turns out AI deeply cares about how your code is organized, even though almost nobody is talking about it.</p><p>Here is why. An AI model can only reason well about the code it can actually see. </p><p>Whatever fits in the context, whatever you hand it, whatever it can find by searching your files. That is its whole world for the task.</p><p>Now think about what happens in a layered codebase.</p><p>You ask the AI to change how orders get created. To do that correctly, it has to find the controller, trace the call into the service, then into the repository, then over to the validator, then check the mapping.</p><p>The relevant logic is spread across six files, and the AI has to go fishing for all of them and hold them together at once. Every hop is a chance for it to miss a file, misunderstand a connection, or confidently edit the wrong thing.</p><p>More indirection means more places to get lost.</p><p>Now, picture the same task in a vertical slice.</p><p>Everything about creating an order is in one folder, often basically one file. You hand the AI that slice, and it sees the entire feature at once. The input, the rules, the data access, the output.</p><p>No fishing, no tracing calls across the project. The full picture in one piece.</p><p>There is a term I love for this, borrowed from the HTMX crowd. <em>Locality of behavior</em>. </p><p>The behavior of a feature should be obvious from looking at one place, not assembled from clues scattered everywhere.</p><p>Humans have always benefited from this. AI benefits from it enormously, because it does not have your years of intuition about where things probably live. It can only work with what is in front of it.</p><p>And this matters even more with agents. The AI that goes off and makes changes more autonomously.</p><p>In a layered system, one small change can ripple across the whole project. And an agent rippling changes across your whole project is exactly the nightmare scenario.</p><p>In a sliced system, the blast radius is contained to one folder. </p><p>The agent works inside that slice, and the rest of your app is structurally protected from it. Smaller self-contained units, predictable edits, far less risk.</p><p>And when the AI builds something new, it just creates a new slice. It does not have to thread a new feature through five existing layers and risk breaking all of them.</p><p>So here is my claim.</p><p>Vertical slice architecture is <strong>the most AI-friendly way to structure a .NET application</strong>, because it maximizes locality of behavior and minimizes blast radius. </p><p>Those are the two things that determine whether AI helps you or quietly wrecks your codebase.</p><div><hr></div><h2><strong>Where it is not a silver bullet</strong></h2><p>I do not want to sell you a magic answer, so let me be fair about the tradeoffs.</p><p>The first thing people worry about is duplication. If every feature is its own little island, will you copy and paste the same code everywhere?</p><p>The answer is that you have to be a bit disciplined. Shared logic still deserves a real home.</p><p>The skill is telling the difference between two slices that happen to look similar right now and code that is truly the same concept. Do not force two features to share code just because they rhyme today. But do not let genuinely shared logic get copy-pasted into twelve folders either.</p><p>That judgment is the actual craft.</p><p>Second, if you are working on a massive enterprise system with heavy cross-cutting concerns, you may need more structure than a pure slice approach gives you out of the box.</p><p>Vertical slices scale well, but you can layer some shared infrastructure underneath them. It is not all or nothing.</p><p>So I am not telling you to stop thinking. </p><p>I am telling you that for the vast majority of projects, and especially the ones you are building with AI in the loop, this is the default that gets out of your way and keeps both you and the model productive.</p><div><hr></div><h2><strong>See it built end-to-end</strong></h2><p>If this clicked for you and you want to see it in action, not just read about it, that is exactly what we did in the <strong><a href="https://sbdy.io/hjwGM0D">Blazor AI Workshop</a></strong>.</p><p>We built a real application using vertical slices with AI as the coding partner the whole way through, and we shipped it to Azure live. You see slices, and AI working together end to end, instead of in the abstract.</p><p>The full three-hour recording is available here:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/hjwGM0D&quot;,&quot;text&quot;:&quot;Get the Blazor AI Workshop&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/hjwGM0D"><span>Get the Blazor AI Workshop</span></a></p><p>Use code <strong>SUBSTACK</strong> for an exclusive discount.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and building real things with AI every week.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[A developer told me he writes code from his phone in the grocery store. He was not joking.]]></title><description><![CDATA[Inside an honest conversation about AI, where it shines, and where it still fakes it.]]></description><link>https://dotnetwebacademy.substack.com/p/im-finally-done-with-manual-programming</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/im-finally-done-with-manual-programming</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Tue, 09 Jun 2026 16:01:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-COF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!-COF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!-COF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:470390,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dotnetwebacademy.substack.com/i/201061481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!-COF!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3decf5c-2abe-4263-aeeb-19358f99880c_1376x768.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Last week I asked a room of .NET developers a simple question. </p><blockquote><p>Does anyone still write code by hand anymore?</p></blockquote><p>The answers were honest, a little uncomfortable, and more interesting than any benchmark chart.</p><p>This was one of the live sessions I run twice a month inside the <strong><a href="https://sbdy.io/k7Jxa3a">.NET Web Academy</a></strong>.</p><p>No slides, no agenda. Just working developers talking about what is actually happening in their day-to-day. </p><p>People building industrial systems in Sweden, migrating decades-old ERP systems in Italy, shipping iPhone apps, and analyzing financial data. </p><p>Different problems, different stacks, one shared and slightly disorienting realization.</p><p>The way we work has changed, and it changed fast.</p><div><hr></div><h2><strong>&#8220;I live in the terminal now. Four terminals at once.&#8221;</strong></h2><p>I will be honest about my own state, because I was honest with the group. </p><p>Since Opus 4.8 landed, I have barely looked up a line of code. I do not mean that as a brag. </p><p>I mean it as something closer to a confession. I described living in four terminals at the same time, context switching between five different applications, prompting one while another builds.</p><p>One developer, Jeff, put words to the part that is genuinely useful. </p><p>You can walk away. You can start a task, set it running, and go read your kids a bedtime story or stand in line at the grocery store and write the next prompt from your phone while you wait.</p><p>That is the part that still feels strange to say out loud. The most-used app on my phone right now is not a social network. </p><p>It is Claude. </p><p>Instead of doom scrolling, I am building things from my pocket. </p><p>Earlier that day, I had it take one of my long-form videos, transcribe it, find the best clips, reframe them vertically, bake in highlighted subtitles, and prepare them as YouTube Shorts. </p><p>From my phone. </p><p>While I was away from my machine.</p><p>Is that healthy? Probably not. </p><p>Jeff said it plainly, and he was right. The whole promise was supposed to be that we sleep more, not less. </p><p>I am not there yet. </p><p>But the capability is real in a way that it simply was not a few months ago.</p><div><hr></div><h2><strong>Where the skeptics were right</strong></h2><p>Here is what I appreciate most about these sessions. </p><p>Nobody in the room is a hype machine. The pushback is real, and it is the most valuable part.</p><p>Jeff is building a financial analysis app. The kind of thing that decides whether to buy, hold, or sell a stock. And he said something that has stuck with me since. </p><p>The results look correct. They look great. </p><p>Clean analysis, credit risk, year-over-year numbers, a confident recommendation. </p><p>But they <em>might </em>be wrong. </p><p>The data was scraped from the web, and it could be last quarter&#8217;s report, or a bond rating for a different company that happened to share a page.</p><p>His point was not that AI is bad. </p><p>His point was sharper than that. </p><p>Anybody can build an app now. </p><p>But &#8220;it runs&#8221; is not the same as &#8220;it is <em>correct</em>.&#8221; </p><p>If your iPhone app works, great, the definition of done is that it works. </p><p>But if your app fakes being right when it is actually wrong, that is a real problem, and no amount of looping over it fixes a flawed foundation.</p><p>Per, who builds industrial systems where a mistake costs real money, made the quieter version of the same point. You have to be able to quantify what better and worse actually mean before you can ask AI to optimize toward them. </p><p>Asking AI to analyze a stock is, in his words, a bit like asking it who will win the Stanley Cup. It will give you a confident answer. It is still a probability, and the best goalie might get injured tomorrow.</p><p>This is the part that does not make it into the breathless takes. </p><p>AI is astonishing at the problems where the answer already exists somewhere, and you can recognize a good result when you see it. </p><p>It is far shakier where correctness is genuinely hard to define. </p><p>Knowing the difference is the job now.</p><div><hr></div><h2><strong>The skill did not disappear. It moved.</strong></h2><p>There is a fear underneath all of this, especially for newer developers, and we talked about it directly. </p><p>We have a 22-year-old junior on my team, and he asked the honest question. </p><blockquote><p>If I do not really write the code anymore, what does that mean for me?</p></blockquote><p>I have been writing code for about 30 years, since I got my first machine as a kid and poked at QuickBasic and Turbo Pascal. </p><p>I love writing code. </p><p>So I understand the grief in that question. But here is what I told him, and what I believe.</p><p><em>The art was never really in typing the syntax. </em></p><p>The art is in <em>deciding </em>what to build, <em>choosing </em>the architecture, <em>knowing </em>which tradeoffs matter, and <em>recognizing </em>when something is off. </p><p>Arnold, who built and shipped an iPhone app, said the thing every experienced consultant eventually learns. </p><p>Clients tell you what they want. </p><p>Your job is to understand what they actually need, which is usually something they cannot articulate. </p><p>That skill has not been automated. If anything, it matters more now.</p><p>Jeff said it best. In the last four months, he has broadened his architecture skills and incorporated patterns he would never have had the time to learn before. </p><p>Does he understand them as deeply as he would have with, in his words, bloody fingertips from debugging them by hand? </p><p>No. </p><p>But he is using them, and shipping with them, and he thinks that tradeoff is worth it. </p><p>The artistry, he said, is at the higher level now. Not in checking whether something was null for the hundredth time.</p><div><hr></div><h2><strong>The honest, practical takeaways</strong></h2><p>A few concrete things came out of the conversation that are worth passing along.</p><p>The newer models genuinely changed the experience, not just the benchmarks. I used to hit a build error two or three times a day and had to feed it back. </p><p>Since 4.8, I struggle to remember the last one, across five projects running at once. </p><p>Others in the room who were still on older models through their work tools described it as living a couple of decades in the past by comparison. </p><p>The gap between what you can use at home and what your company allows is becoming a real source of friction.</p><p>The tool wrapper matters as much as the model. </p><p>We got into why the same underlying model can give better results in one tool than another. </p><p>The answer is the shell around it, the system prompt, the way the tool feeds context and handles permissions. It is not only about which model number you are on.</p><p>MCP servers finally clicked for me, and it was Jeff who explained it. </p><p>You put an MCP server on top of an existing API so that AI agents can call it easily, because agents have a hard time calling a raw API directly, but a much easier time using the tools an MCP exposes. </p><p>My own use case made it concrete. I am building my own community platform to replace an expensive tool we were unhappy with, and I want my wife to manage it, creating spaces and assigning roles, by talking to Claude through an MCP server I built for the app. </p><p>That is the moment MCP stopped being an abstract acronym for me and became a thing I actually want to build.</p><div><hr></div><h2><strong>Why I am sharing all of this</strong></h2><p>These conversations are the most valuable thing I do, and they are members-only for a reason. </p><p>They are not lectures. </p><p>They are a room of working developers being honest with each other about what is exciting, what is overhyped, and what is genuinely hard. </p><p>The skeptics make the optimists sharper. </p><p>The optimists pull the skeptics forward. Nobody is selling anything.</p><p>If you want to be in the room for the next one, that is what the <strong>All Access Pass</strong> is for. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/k7Jxa3a" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JfVu!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif" width="500" height="281.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:640,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/k7Jxa3a&quot;,&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=".NET Web Academy Office Hours preview" title=".NET Web Academy Office Hours preview" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Twice a month, live, plus every course I build and the recordings of every past session. </p><p>We go deep on exactly this kind of thing, with real developers working on real problems.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/k7Jxa3a&quot;,&quot;text&quot;:&quot;Join the All Access Pass&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/k7Jxa3a"><span>Join the All Access Pass</span></a></p><p>Use the code <strong>SUBSTACK</strong> for an exclusive discount.</p><div><hr></div><p>And if there is one thing to take away without joining anything, it is this. </p><p>The developers who are thriving right now are not the ones who prompt the fastest. </p><p>They are the ones who still understand the foundations well enough to know when the confident answer in front of them is actually wrong. </p><p>That skill is not going anywhere. </p><p>If anything, it just became the whole job.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and AI development every week.</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 built my portfolio page. I still had to know what I was doing.]]></title><description><![CDATA[Why the developers who win with AI are the ones who can read what it writes.]]></description><link>https://dotnetwebacademy.substack.com/p/i-let-claude-build-my-portfolio-page</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/i-let-claude-build-my-portfolio-page</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Sun, 07 Jun 2026 16:02:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!h_kS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.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="/__u/substackcdn.com/image/fetch/$s_!h_kS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!h_kS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:887207,&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://dotnetwebacademy.substack.com/i/200749157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png 424w, /__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png 848w, /__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.png 1272w, /__u/substackcdn.com/image/fetch/$s_!h_kS!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41daabe5-f483-4d2b-862d-f411ea8ebe59_1280x720.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 aria-hidden="true" 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><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>Knowing how to prompt is not enough anymore. </p><p>If you want to land clients or your next role, you need real projects you can point to, things you built that you can show and explain. </p><p>And one of the simplest, highest-leverage things you can build is a portfolio page. </p><p>You could build it entirely by hand, the way we always have. Or you could let AI do most of the heavy lifting, and get to the same result in a fraction of the time, as long as you still look under the hood.</p><p>That phrase, &#8220;as long as you still look under the hood,&#8221; is the whole point of this article. So, before we go further, one related thing worth mentioning.</p><div><hr></div><p>If you want to see this same approach applied to a full real-world application rather than a portfolio page, the <strong><a href="https://sbdy.io/jPXvb4P">Blazor AI Workshop</a></strong> recording covers exactly that. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/jPXvb4P" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!BKkV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg" width="474" height="266.625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:474,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Course branding&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/jPXvb4P&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Course branding" title="Course branding" srcset="/__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!BKkV!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37e76031-71ec-4716-b5a2-dd21b73f4727_1920x1080.jpeg 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 aria-hidden="true" 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><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>Three hours, starting from an empty folder, building a complete Blazor app with a database and AI features, and deploying it live to Azure. </p><p>It is the deeper version of everything I am about to walk through.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/jPXvb4P&quot;,&quot;text&quot;:&quot;Get the Blazor AI Workshop&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/jPXvb4P"><span>Get the Blazor AI Workshop</span></a></p><div><hr></div><h2><strong>The one rule</strong></h2><p>Everything on that page should be something you can explain.</p><p>This sounds obvious until you actually start letting AI build things for you. </p><p>Because the temptation is real. </p><p>You prompt, the code appears, it compiles, it looks good, and you move on. Multiply that across a whole project, and you end up with something that works but that you do not understand. </p><p>And the moment someone asks you a real question about it, you are exposed.</p><p>A portfolio page is the perfect example because the stakes are so clear. The page is not just the artifact. It is proof that you can build and reason about real software. </p><p>If a client asks how you structured it, or an interviewer asks why you chose server-side rendering over WebAssembly, &#8220;the AI did that part&#8221; is not an answer that gets you hired. </p><p>The portfolio stops being proof the moment you cannot explain it.</p><p>So I treat AI like a capable junior developer I trust to do the work, but <strong>whose work I still review</strong>. </p><p>I decide the architecture. </p><p>I decide the approach. </p><p>I read what comes back. </p><p>The AI types faster than I do and knows more APIs than I will ever memorize, but the decisions stay mine.</p><div><hr></div><h2><strong>Deciding before prompting</strong></h2><p>Before I wrote a single prompt, I made a handful of decisions I could defend.</p><p>Static server-side rendering everywhere. A portfolio page needs to load fast and respond instantly. It does not need interactive components re-rendering on every action. </p><p>So SSR is the right call, and I can explain exactly why. </p><p>Knowing the Blazor render modes, and knowing that you set them per component rather than globally unless you choose to, is the kind of &#8220;under the hood&#8221; knowledge that separates someone using AI well from someone using it blindly.</p><p>A single scrolling page with anchor navigation. Rather than separate routes for each section, I wanted one page where the navbar scrolls you smoothly to anchors. That is a design and UX decision, and I made it deliberately rather than letting the AI guess.</p><p>No vertical slice architecture. For a bigger or mid-size application, I would reach for VSA. For a portfolio page, that would be over-engineering. Knowing when not to apply an architecture pattern is itself a senior decision, and one worth being able to explain. Reaching for the most sophisticated pattern on every project is a junior move. Matching the structure to the actual problem is what experience looks like.</p><p>None of these decisions were made by the AI. </p><p>They were made by me, and then communicated to the AI. That order matters. You decide, then you delegate. Not the other way around.</p><div><hr></div><h2><strong>Briefing the AI like a teammate</strong></h2><p>With the decisions made, I started the actual build. </p><p>I created the project myself first using the .NET CLI and the standard Blazor web app template, the same thing you would do in Visual Studio. I added a gitignore, committed, and pushed to GitHub. Small steps, but each one something I understand and control.</p><p>Then I talked to Claude the way I would brief a developer joining my team. </p><p>I want a portfolio page for me as a .NET and Blazor developer. Use static server-side rendering everywhere for performance. Do not use the default design, think of something better. Put the navigation on top, not in a sidebar. Make it one scrolling page where the menu navigates to anchors. </p><p>Then I listed the sections I knew I wanted: a hero, an about section, projects, my LinkedIn, a contact option, and told it to suggest anything else that made sense for a portfolio. For now, surprise me, and ask if you need more information.</p><p>That last part matters. </p><p>I left room for the AI to be useful beyond pure dictation, but within boundaries I set. </p><p>It came back with smart, clarifying questions. </p><p>Which visual vibe? </p><p>How should it handle content I would fill in later? </p><p>How should the contact form behave? </p><p>Good questions, the kind a thoughtful teammate would ask, and I answered each one with a decision I could justify.</p><div><hr></div><h2><strong>What Claude actually built</strong></h2><p>It planned first. </p><p>A concept for the page, a visual direction, a set of sections. </p><p>Then it worked through the build, creating files, writing the components, generating realistic placeholder content with markers so the page looked finished and I could swap in real text later. </p><p>Modern models like Opus 4.8 tend to create their own to-do lists and work through them methodically, and you can even ask for that plan as a markdown file so you can follow along and steer.</p><div id="youtube2-efZvEsTAP_Q" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;efZvEsTAP_Q&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/efZvEsTAP_Q?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>A few minutes later, I had a real page. </p><p>Sticky navbar, hero, about, tech stack, projects, an experience timeline, a contact section, smooth scrolling, and a mobile version. </p><p>For a few minutes of work, the amount of finished structure was genuinely impressive.</p><p>But, and this is the important part, it was not done. </p><p>The mobile menu did not work yet. Some sections had the telltale signs of AI-generated design, the little chips and arrows that have become a visual cliche. </p><p>The content was all placeholder. This is exactly the eighty percent that AI gets you quickly, and exactly why the remaining twenty percent still needs you.</p><div><hr></div><h2><strong>Getting real data in, and hitting a wall</strong></h2><p>Placeholder content makes a page look finished, but a portfolio needs to be real. So I asked Claude to pull my actual information from my GitHub and LinkedIn profiles and update the page, especially the experience timeline.</p><p>GitHub worked. LinkedIn blocked the fetch.</p><p>I want to dwell on this because it is the most honest moment in the whole build. </p><p>The AI tried to web fetch my LinkedIn profile, and LinkedIn refused. </p><p>If you did not understand what was happening, <strong>you would be stuck</strong>. </p><p>But because I know how this works, the path forward was obvious.</p><p>Copy and paste the content directly. Hand it a screenshot and let it read that. Or route through a proxy with the right tokens if you want to automate it. </p><p>The AI did not remove the need to understand the problem. <strong>It removed the typing once the problem was understood</strong>.</p><p>This is the pattern over and over. </p><p>AI accelerates the parts you already understand. <strong>It does not replace the understanding</strong>. </p><p>When something breaks, and something always breaks, you are the one who has to know what to do next.</p><div><hr></div><h2><strong>The design trick most people miss</strong></h2><p>The first design was good but generic. That AI look. If you want a portfolio that stands out, generic is the enemy.</p><p>So instead of describing a new design in words and hoping the AI interpreted me correctly, I showed it one. </p><p>I went to Dribbble, found a portfolio design I liked, grabbed a screenshot, and asked Claude to overhaul the page to match the attached image.</p><p>It did not reproduce it pixel for pixel. Claude reads images well but is not an image-perfect copier. What it did was understand the direction. A new color palette pulled from the screenshot, different typography, restyled components, a different feel for the links and sections. From generic to intentional in a single prompt.</p><p>That is the move worth remembering. </p><p>Do not describe a design and pray. </p><p>Show the AI a reference and let it match the direction, then steer from there. </p><p>It is the difference between explaining a destination over the phone and just sharing your screen.</p><div><hr></div><h2><strong>Where this leaves you, and the one thing to set up first</strong></h2><p>When Claude stopped typing, the heavy lifting was done, but the page was not finished. </p><p>The portrait was still a placeholder. The timeline dates needed correcting. The mobile menu needed a fix. Testimonials were sample text. </p><p>That final stretch, the polishing and correcting and judgment calls about what good actually looks like, is the part that is yours. </p><p>It is also the part that makes the page worth putting your name on.</p><p>That is the honest picture of AI-assisted development in 2026. It is not &#8220;AI builds your portfolio while you sleep.&#8221; </p><p>It is </p><blockquote><p>&#8220;AI gets you eighty percent of the way in a fraction of the time, and your judgment turns that into something real.&#8221; </p></blockquote><p>The developers who win with this are not the best prompters. They are the ones who can read what comes back, recognize when it is wrong, and steer it to something they understand completely.</p><p>There is one thing I would set up before any of this, though, if you are doing it on a real project rather than a quick portfolio. A copilot instructions file, or an AGENTS.md file. </p><p>It encodes your conventions, your architecture, your rules, so the AI follows your standards instead of inventing its own every session. It is the single biggest upgrade to working with AI, and it is the foundation everything else builds on.</p><p>And if you want to see this entire approach applied to a full production application, with a real database, authentication, AI features, and a live Azure deployment, that is what the <strong><a href="https://sbdy.io/jPXvb4P">Blazor AI Workshop</a></strong> walks through from start to finish. Same philosophy as this portfolio build, scaled up to a real app you would actually ship.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/jPXvb4P&quot;,&quot;text&quot;:&quot;Get the Blazor AI Workshop&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/jPXvb4P"><span>Get the Blazor AI Workshop</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">To receive new posts and support my work, consider becoming a free subscriber. Thanks!</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[Goodhart's Law Comes for AI Adoption]]></title><description><![CDATA[When a developer metric becomes a target, it stops being useful - and starts being gamed]]></description><link>https://dotnetwebacademy.substack.com/p/your-company-is-watching-your-ai</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/your-company-is-watching-your-ai</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 03 Jun 2026 16:01:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_bP3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!_bP3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_bP3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1235093,&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://dotnetwebacademy.substack.com/i/197500921?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_bP3!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faafee794-0d58-46dd-be45-fe98f1ce9c21_1920x1080.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 aria-hidden="true" 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><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 was a period - not that long ago - when getting GitHub Copilot approved at work felt like a genuine win.</p><p>Legal had concerns about training data. Security had questions about what the model might suggest. Management was still figuring out where AI fit into the workflow. </p><p>And developers were watching all of this from the sidelines, using Copilot on personal projects, waiting.</p><p>Then the approval came through. </p><p>And something genuinely good happened, almost immediately.</p><p>Developers started talking to each other about it. </p><p>Not just what they were using it for - but how much. </p><p>Token counts. Weekly usage. Who was prompting the most. </p><p>It became a kind of informal leaderboard, and it was actually fun. Not competitive in a toxic way - more like the excitement of early adopters comparing notes. </p><p>Someone would share a prompt that worked surprisingly well. </p><p>Someone else would share a failure that was entertainingly bad. Teams started building shared intuitions about what the tool was good at.</p><p>That version of AI adoption - organic, curious, social - is the version that actually works.</p><p>And then, for a lot of teams, things changed.</p><div><hr></div><h2><strong>The Shift</strong></h2><p>At some point, leadership started asking a different question. Not &#8220;should we allow this?&#8221; but &#8220;are people actually using this?&#8221;</p><p>Fair enough. Companies invest in licenses. They invest in training. They want to know if that investment is doing anything.</p><p>So usage tracking came in. </p><p>Token counts per developer. </p><p>AI activity over time. </p><p>Trend lines. </p><p>And in some organizations, more than just the volume - the actual content of prompts started being logged, visible to managers or reviewed in aggregate.</p><p>The intent is understandable. Identify who&#8217;s adopted the tools well, who might need support, understand how the investment is being used.</p><p>The problem is what happens to human behavior the moment people know they&#8217;re being measured on something.</p><div><hr></div><h2><strong>Goodhart&#8217;s Law, Applied</strong></h2><p>There is a principle in economics - you may have encountered it - called Goodhart&#8217;s Law. </p><p>The short version: when a measure becomes a target, it ceases to be a good measure.</p><p>The longer version: once you start evaluating people on a metric, they start <em>optimizing for the metric</em> rather than the underlying thing the metric was supposed to capture.</p><p>AI token usage is an almost perfect case study in this.</p><p>When token usage was a voluntary, informal signal of curiosity and engagement, it genuinely reflected those things. Developers who were excited about the tool used it more. The number meant something.</p><p>The moment it becomes a formal metric - something visible to management, something with implicit expectations attached - it stops meaning the same thing. </p><p>Now it&#8217;s also a number that someone might game, consciously or not, when their genuine work doesn&#8217;t produce it.</p><p>And here is the critical thing: a lot of legitimate, valuable developer work does not naturally produce AI token usage.</p><p>A developer spending Monday in architecture discussions is doing real engineering. </p><p>A tech lead reviewing five pull requests in a day is doing real engineering. </p><p>A senior developer writing an architectural decision record, running a retrospective, mentoring a junior, planning the next sprint - all of this is real work. </p><p>None of it requires opening Copilot.</p><p>But the metric doesn&#8217;t know that. The metric sees a blank day.</p><div><hr></div><h2><strong>What Developers Actually Do</strong></h2><p>So what happens when a developer has a legitimately non-AI day but feels the pressure to show activity?</p><p>They fire off a prompt. </p><p>Not because they have a real question. Because they need to look active.</p><p>And certain prompts become the default. The ones that look substantive, sound responsible, and generate impressive-looking output:</p><ul><li><p>&#8220;Do a deep analysis of this codebase and identify security vulnerabilities.&#8221;</p></li><li><p>&#8220;How would you improve the overall architecture of this project?&#8221;</p></li><li><p>&#8220;Are there any performance bottlenecks I should be aware of?&#8221;</p></li><li><p>&#8220;Write unit tests for this module.&#8221;</p></li><li><p>&#8220;Review these files and suggest refactoring improvements.&#8221;</p></li></ul><p>None of these are bad prompts in isolation.</p><p>The problem is when they&#8217;re generated not because the developer needs the answer, but because the developer needs the metric.</p><p>By the end of the month, some teams have run the same security vulnerability scan on the same codebase a dozen times. </p><p>The AI finds the same things each time - some already known, some not applicable. </p><p>The output gets skimmed or ignored. The tokens are spent. The dashboard looks healthy.</p><p>This is AI theater. </p><p>It looks like adoption from the outside. </p><p>It isn&#8217;t.</p><div><hr></div><h2><strong>The Developers Who Suffer Most</strong></h2><p>Here is the irony that I find most striking about this dynamic.</p><p>The developers who suffer most under AI usage monitoring are often the best ones.</p><p>A strong senior developer tends to be working on things that don&#8217;t reduce neatly to &#8220;ask the AI a question&#8221;. </p><p>System design. </p><p>Code review. </p><p>Stakeholder communication. </p><p>Mentoring. </p><p>Technical debt triage. </p><p>Strategic planning. </p><p>These are the activities that require the most experience and judgment - and they&#8217;re precisely the activities that have the lowest AI token footprint.</p><p>Meanwhile, someone spending the day using Copilot to generate boilerplate or running the same architectural review prompt they ran last week will show high engagement in the dashboard.</p><p>The metric is, in effect, penalizing judgment and rewarding activity. </p><p>That&#8217;s backwards.</p><p>And experienced developers will notice this. </p><p>They&#8217;ll feel the discomfort of being implicitly asked to justify their work in terms of AI usage. </p><p>Some will adapt by gaming the metric. </p><p>Others will become quietly resentful. </p><p>Neither outcome is good.</p><div><hr></div><p><em>If this is a problem you&#8217;re seeing play out on your team - or if you&#8217;re a tech lead trying to figure out how to think about AI adoption in a way that actually works - this is exactly the kind of thing we work through in the live sessions at the <strong><a href="https://sbdy.io/4PQSCP3">.NET Web Academy</a></strong>. </em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/4PQSCP3" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JfVu!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif" width="550" height="309.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:640,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;title&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/4PQSCP3&quot;,&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=".NET Web Academy Office Hours preview" title=".NET Web Academy Office Hours preview" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Real questions, real scenarios, no abstract frameworks. </em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/4PQSCP3&quot;,&quot;text&quot;:&quot;Join here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/4PQSCP3"><span>Join here</span></a></p><div><hr></div><h2><strong>What to Measure Instead</strong></h2><p>The good news is that the underlying question - &#8220;is AI helping our team&#8221;? - is a reasonable thing to want to know.</p><p>The problem is the proxy, not the question.</p><p>Some approaches that actually capture something meaningful:</p><h3><strong>Ask developers directly.</strong> </h3><p>At sprint retrospectives, in one-on-ones, in team discussions - ask where AI helped and where it didn&#8217;t. </p><p>This gives you qualitative signal that no dashboard can replace. </p><p>Developers who genuinely find the tools useful will have stories. </p><p>Developers who are struggling will have specific friction points you can address.</p><h3><strong>Look at outcomes over time.</strong> </h3><p>Are teams shipping faster? </p><p>Are bug rates changing? </p><p>Are developers reporting higher confidence in their output? </p><p>These are slow signals and they&#8217;re hard to attribute cleanly to any single tool, but they&#8217;re the real thing you care about. </p><p>Token counts are not.</p><h3><strong>Track adoption at the team level, over longer windows.</strong> </h3><p>If you aggregate AI usage across a team over a quarter, you get a much more meaningful signal than tracking individuals per day. </p><p>Planning weeks will pull the number down. Feature sprints will push it up. That&#8217;s fine - that&#8217;s what real work looks like.</p><h3><strong>Create social conditions for sharing.</strong> </h3><p>The organic token competition happened because developers were talking to each other. </p><p>Lunch-and-learns, Slack threads, demo sessions where someone shows a prompt workflow that saved them two hours - these create the conditions for genuine adoption spreading. You can encourage this without measuring it.</p><p>The developers who were most excited about GitHub Copilot in the early days weren&#8217;t excited because someone tracked their usage. </p><p>They were excited because the tool was genuinely useful and they had people to share that excitement with.</p><p>Surveillance doesn&#8217;t create that. </p><p>It replaces it with performance.</p><div><hr></div><h2><strong>Where This Ends Up</strong></h2><p>If you&#8217;re a developer reading this and recognizing your own situation - the quiet guilt of a low-prompt day, the reflexive security scan just to have something in the log - know that the frustration you feel is pointing at something real. </p><p>You&#8217;re being asked to optimize a number instead of doing your best work. </p><p>That&#8217;s a legitimate problem.</p><p>And if you&#8217;re on the leadership side thinking about AI adoption metrics, I&#8217;d offer this reframe: the question isn&#8217;t &#8220;how much are they using it&#8221;? It&#8217;s &#8220;what are they building with it&#8221;? </p><p>The first question has a number. </p><p>The second question has an answer.</p><p>The answer is the one worth having.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and AI development every week.</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[Going Back to the Office Is the Loneliest Thing I've Done as a Developer]]></title><description><![CDATA[Five years of 100% remote work proved the arguments for office mandates are wrong. Here's what the reality actually looks like.]]></description><link>https://dotnetwebacademy.substack.com/p/going-back-to-the-office-is-the-loneliest</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/going-back-to-the-office-is-the-loneliest</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 27 May 2026 16:01:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K2jE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!K2jE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!K2jE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1247775,&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://dotnetwebacademy.substack.com/i/197490992?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!K2jE!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d37e657-df5f-453f-8ed0-7216c7ad45b5_1920x1080.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 aria-hidden="true" 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><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 five years, I worked 100% remotely. </p><p>My employer was over 600 kilometres away. </p><p>We had never even talked seriously about me being in the office - because it didn&#8217;t matter. </p><p>The work was great. The results were great. Deadlines were met. Products shipped. Colleagues were reachable. Everything worked, beautifully, for five years straight.</p><p>Then, for family reasons, we moved. To our old hometown. Closer to my employer. And the moment the physical distance closed, something changed.</p><p>Now I have to come in three times a week.</p><p>I want to tell you what that actually looks like. </p><p>Not the version where the open-plan office buzzes with energy and spontaneous whiteboard sessions and serendipitous hallway conversations. </p><p>The <em>real</em> version.</p><div><hr></div><h2><strong>The Room</strong></h2><p>The office uses a hot-desk system. </p><p>You book your seat in an app before you come in. When you arrive, you sit at whichever desk you booked. Nobody has a permanent spot. Nobody has their own setup. You get a docking station, two monitors, and a chair.</p><p>Most days, I end up in a room with three desks. </p><p><em>Alone</em>.</p><p>Not alone because I&#8217;m unsociable. Alone because nobody else booked that day. </p><p>Because not everyone comes in on the same day. Because the whole point of a flexible desk system is that people have the freedom to choose, and when people choose, they don&#8217;t all land on the same three days.</p><p>So I sit there, in a room with two empty desks, in a building I drove to, and I do the same work I would have done at home.</p><p>The room itself is clean. </p><p>It&#8217;s functional. </p><p>It has everything a room needs to technically qualify as a workspace. </p><p>It has one plant - undeniably in need of water - and a view of another office building.</p><p>There are no posters on the wall. No whiteboards with anything interesting on them. Nothing that would make you think this is a place where creative, engaged people spend their days. Because it isn&#8217;t. It&#8217;s a booking slot.</p><p>There&#8217;s a second room. </p><p>A social room. </p><p>A sofa. A television - large enough to be used for meetings, not interesting enough to actually make you want to spend time there. No foosball table. No games console.</p><p>Nothing you&#8217;d want to do with a colleague when you have twenty minutes and you want to actually enjoy each other&#8217;s company.</p><p>It&#8217;s a room that communicates, clearly and without ambiguity: we thought about you having fun here, and then we decided against it.</p><div><hr></div><h2><strong>The Irony</strong></h2><p>Here&#8217;s the part that gets me every single time.</p><p>In the office, when I need to talk to a colleague, I open Microsoft Teams and call them. </p><p>Because they&#8217;re working from home. Or they&#8217;re in a different room in the office, on a call themselves. Or they&#8217;re somewhere else entirely. </p><p>The point is: they&#8217;re not next to me. They&#8217;re never just next to me.</p><p>I drove in. I booked a desk. I sat down. And I called someone on Teams.</p><p>Exactly as I would have done from my home office.</p><p>This is the full journey: leave the house earlier, sit in traffic, find parking, walk to the office, boot up a machine that isn&#8217;t mine, and then do the same thing I would have done without any of that.</p><p>And when I&#8217;m in the office, I also have to track my time. </p><p>Not working time. </p><p>The time I spend in the office. Because I&#8217;m not working there - I&#8217;m just <em>there</em>. </p><p>So there&#8217;s a system for logging office presence separately from any record of actual work done. </p><p>This, in a single detail, tells you everything you need to know about the purpose of the policy.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/p/going-back-to-the-office-is-the-loneliest?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Sounds familiar? Share it with other devs. &#10084;&#65039;</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/p/going-back-to-the-office-is-the-loneliest?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/p/going-back-to-the-office-is-the-loneliest?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p></div><div><hr></div><h2><strong>What Home Actually Looks Like</strong></h2><p>My home office is a room that is mine. </p><p>It has my machine - the one I built, configured, and optimised myself. </p><p>It has my monitor, my keyboard, my headphones. </p><p>It has things on the desk and walls that I look at and smile.</p><p>When I sit down to work at home, I put on the music I want to hear. I open the projects I need. I go deep. Real deep focus - the kind that takes 20 minutes to build and an open-plan office booking system to destroy.</p><p>When I&#8217;m hungry, I walk to my kitchen and make something. </p><p>An actual meal. </p><p>Not a sad desk lunch. </p><p>I can cook. I have a coffee machine I care about. I can step away from the screen for 10 minutes and come back genuinely refreshed.</p><p>And when I want to talk to my wife, I walk down the hall and do that. A 3-minute conversation with someone who matters to me, in the middle of a workday, without having to book anything or perform for anyone.</p><p>None of this is luxury. </p><p>None of this is unusual. </p><p>This is what a functional adult working environment looks like when the employer doesn&#8217;t insist on controlling the physical location.</p><div><hr></div><h2><strong>The Arguments That Don&#8217;t Hold Up</strong></h2><p>The stated reasons for return-to-office policies are almost always the same: you do better work in person, and you socialise more.</p><p>I worked remotely for five years. </p><p>The results were excellent. </p><p>I know this because I was never told otherwise, never put on any kind of performance plan, and continued to be trusted with significant work throughout.</p><p>If remote work produced bad results, someone would have noticed in five years. </p><p>They didn&#8217;t.</p><p>The socialisation argument collapses even faster. </p><p>If your goal is genuine social connection between colleagues - the kind that builds relationships and makes work more human - three days a week in a hot-desk room with people who booked different days is not the answer. </p><p>You want socialisation? </p><p>Bring everyone in on one day. Have lunch together. Have coffee together. Let people actually talk without it being incidental.</p><p>But here&#8217;s what you have to accept if you do that: that day will not be a productive workday. </p><p>Not in the focused, deep-work sense. </p><p>There will be meetings and conversations and catch-ups and lunch and coffee and all the things that make a day with colleagues worthwhile and memorable. </p><p>And that&#8217;s fine. </p><p>That&#8217;s the trade. </p><p>One day of genuine human connection in exchange for a day of focused output.</p><p>What you cannot have is three days of presence plus the expectation of focused output. Those two things are not compatible in a lifeless room with empty desks and a plant that&#8217;s crying for help.</p><p>And if you actually want to go further - if you want the kind of team bonding that people remember - you organise something real. </p><p>Laser tag. A dinner out. Something that isn&#8217;t a booked desk in a sterile room. </p><p>We tried. </p><p>We wanted to do exactly that. </p><p>There was no budget for it. </p><p>If it was going to happen at all, it would have to be in the evenings, on our own time.</p><p>So the company that mandates three days a week in the office for the sake of socialisation won&#8217;t fund a single team event. The socialisation argument isn&#8217;t a goal. </p><p>It&#8217;s a justification.</p><div><hr></div><h2><strong>Want To Talk About It?</strong></h2><p>If this resonates with you, these conversations happen regularly inside the <strong><a href="https://sbdy.io/8VihS6Z">.NET Web Academy</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/8VihS6Z" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JfVu!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif" width="550" height="309.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:640,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;title&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/8VihS6Z&quot;,&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=".NET Web Academy Office Hours preview" title=".NET Web Academy Office Hours preview" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Twice a month, I run a live session - no prepared slides, no agenda. Just developers talking honestly about what&#8217;s working, what isn&#8217;t, and what we&#8217;re all figuring out in real time.</p><p>If you want to join future sessions and get access to everything else - the courses, the Discord community, the recorded sessions, all of it - the <strong><a href="https://sbdy.io/8VihS6Z">All Access Pass</a></strong> is the way in:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/8VihS6Z&quot;,&quot;text&quot;:&quot;Join the Discussion&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/8VihS6Z"><span>Join the Discussion</span></a></p><div><hr></div><h2><strong>What This Is Really About</strong></h2><p>I don&#8217;t think this is about productivity. I don&#8217;t think it&#8217;s about socialisation.</p><p>I think it&#8217;s about <em>control</em>. </p><p>The feeling - for some managers, for some executives, for some institutional cultures - that if they can&#8217;t see you, they can&#8217;t be sure you&#8217;re working. That presence equals effort. That visibility equals value.</p><p>The time-tracking system for office attendance is the tell. </p><p>You&#8217;re not tracking whether I shipped a feature. </p><p>You&#8217;re tracking whether I was in the building. </p><p>These are different measurements of different things, and choosing to measure the second one instead of the first one is a choice.</p><p>Five years of remote work proved that output can be measured without proximity. I was there for the proof. I was the proof.</p><p>Going back to the office didn&#8217;t change what I do or how well I do it. </p><p>It added 90 minutes of commuting. </p><p>It replaced my environment - one that energises me - with one that drains me. </p><p>It put me in a room alone, calling colleagues on Teams, tracking my presence, sitting next to a plant that deserves better.</p><p>If you&#8217;re a developer who has been told to come back in, and you feel like something is off about the reasoning - you&#8217;re right. The reasoning is off. The results were fine before. They&#8217;ll be fine again when we stop pretending that location is a proxy for performance.</p><div><hr></div><h2><strong>What I&#8217;d Actually Accept</strong></h2><p>One day a week. </p><p>Come in, see people, have lunch together, have real conversations, go home.</p><p>I would do that happily. I&#8217;d look forward to it. I&#8217;d leave the house with energy.</p><p>Three days a week in an empty room with a hot desk and a Teams call waiting on my screen? </p><p>That&#8217;s not a workplace. </p><p>That&#8217;s a commute with a monitor at the end of it.</p><div><hr></div><p><em>If this resonated - if you&#8217;re living some version of this - I&#8217;d like to hear it. What does your office mandate look like? What&#8217;s the thing that bothers you most about it? Leave a comment. This is the kind of thing worth talking about.</em></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and AI development every week.</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[I built a Blazor app with AI in front of 40 developers. Here is what they noticed.]]></title><description><![CDATA[The moments, the chat quotes, and the workflow that made it work.]]></description><link>https://dotnetwebacademy.substack.com/p/what-40-developers-said-when-claude</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/what-40-developers-said-when-claude</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Mon, 25 May 2026 16:02:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nSo8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!nSo8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nSo8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1126116,&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://dotnetwebacademy.substack.com/i/198957916?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nSo8!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ea603da-9b27-41dd-a956-7dd9c73fa010_1920x1080.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 aria-hidden="true" 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><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>A few weeks ago, I wrote about why the AGENTS.md file changes everything about AI-assisted .NET development.</p><p>Last Wednesday, I got to watch 40 developers see it work for the first time. Live.</p><p>Here is what they noticed.</p><div><hr></div><p>We were in the middle of the <strong><a href="https://sbdy.io/RkKhseb">live Blazor AI workshop</a></strong>. </p><p>We had just finished implementing the first feature without an AGENTS.md file. Just a raw prompt to Claude: implement the shopping list entity and wire up EF Core.</p><p>It worked. It compiled. It ran.</p><p>But Claude made decisions I would not have made. The folder structure was generic. The architecture was its own, not mine. The naming felt slightly off.</p><p>I said to the room: </p><blockquote><p>&#8220;This is what most developers do when they start using AI. They just prompt and accept whatever comes back.&#8221;</p></blockquote><p>Then I created the AGENTS.md file with Claude. </p><ul><li><p>I described the conventions. </p></li><li><p>Vertical slice architecture. </p></li><li><p>Custom mediator. </p></li><li><p>Feature folder structure. </p></li><li><p>No paid packages. </p></li><li><p>Files for everything.</p></li></ul><p>We saved it. Started a new context. And prompted Claude again. </p><p>Same project. Same task. But this time with the AGENTS.md file in the project root.</p><p>The difference was immediate.</p><p>The folder structure matched what I would have written by hand. The naming followed our conventions. The handler signature was exactly what I wanted. Even the way Claude split files matched the rules in the AGENTS.md.</p><p>Per typed in the chat: &#8220;Yes.&#8221;</p><p>Just that. One word. From a developer who builds industrial systems for sawmills in Sweden, where a mistake costs ten thousand euros an hour. Someone who is genuinely skeptical of AI for anything critical.</p><p>&#8220;Yes.&#8221;</p><p>That was the moment.</p><div><hr></div><h2>Why this lands harder when you see it live</h2><p>You can read about the AGENTS.md workflow. </p><p>You can try it yourself. </p><p>But there is something different about <strong>watching it work in real time</strong>, with a real developer making the decisions, and seeing the AI follow conventions you can verify with your own eyes.</p><p>That is what the workshop ended up being about, even though I did not plan it that way.</p><p>Edgardo had to leave early. He dropped this in the chat before disconnecting:</p><blockquote><p>&#8220;Hey Patrick. I&#8217;ve got to run. Thanks so much &#8212; expectations exceeded.&#8221;</p></blockquote><p>That sentence stayed with me. </p><p>Because expectations are exactly what these sessions challenge. </p><p>You show up thinking you will see another AI tutorial. </p><p>You leave thinking differently about how to actually use these tools in your real work.</p><div><hr></div><h2>The full session, on-demand</h2><p>If you missed the live workshop, the full three-hour <strong><a href="https://sbdy.io/RkKhseb">recording is now available</a></strong>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/RkKhseb&quot;,&quot;text&quot;:&quot;Get the recording here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/RkKhseb"><span>Get the recording here</span></a></p><div id="vimeo-1190059022" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1190059022&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1190059022?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p>Seven chapters. </p><p>From an empty folder to a deployed Blazor Server app on Azure. </p><p>Real .NET 10. </p><p>Real SQL Server. </p><p>Real GitHub Actions deployment. </p><p>Real multi-user sharing. </p><p>Real OpenAI integration.</p><p>Use code <strong>WORKSHOP49</strong> for a launch discount until Wednesday.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/RkKhseb&quot;,&quot;text&quot;:&quot;Grab the discount&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/RkKhseb"><span>Grab the discount</span></a></p><div><hr></div><h2>What else stood out</h2><p>The AGENTS.md moment was the obvious one. But other moments hit just as hard.</p><p>When Claude restyled the entire app from a Dribbble screenshot in a single prompt, Morgan wrote: </p><blockquote><p>&#8220;Wow! Updating the entire site design is impressive.&#8221;</p></blockquote><p>He continued: </p><blockquote><p>&#8220;Design is my Achilles heel. If this works, I&#8217;m more than sold!&#8221;</p></blockquote><p>When the multi-user sharing feature worked on the first try, Morny shared a list with me, tony@stark.com, to test it. </p><p>It worked. </p><p>He confirmed it in the chat.</p><p>When the OpenAI recipe feature generated ingredients for spaghetti carbonara, Roberto &#8212; actually Italian &#8212; pushed back live: </p><blockquote><p>&#8220;Garlic? Pancetta? You need guanciale and pecorino romano.&#8221;</p></blockquote><p>That is the chat from this workshop. </p><p>Real developers, real reactions, real corrections from someone who knows better than the AI.</p><p>This is what the <strong><a href="https://sbdy.io/5cC6TMB">.NET Web Academy live sessions</a></strong> feel like. Not lectures. Not tutorials. Real conversations between developers building something together.</p><div id="vimeo-1194469711" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1194469711&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1194469711?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><div><hr></div><h2>What I learned watching 40 developers see this for the first time</h2><p>Three things.</p><h3>One. </h3><p>The AGENTS.md workflow is not obvious until you see it work. </p><p>Once you do, you cannot go back. You start thinking about how to encode your team&#8217;s conventions into a file the AI can read. </p><p>The discipline of writing it down also makes the project better.</p><h3>Two. </h3><p>The architecture vote in the chat &#8212; vertical slice or services and repositories &#8212; was almost exactly split. </p><p>There is no consensus among working .NET developers about the right pattern. </p><p>There is only the right pattern for your project, your team, your stack. </p><p>And the AGENTS.md file is what makes either pattern stick.</p><h3>Three. </h3><p>Live sessions hit different. </p><p>Recordings are great. The workshop recording is genuinely useful. </p><p>But there is a quality to the live conversation that the recording cannot fully capture &#8212; Per&#8217;s &#8220;Yes,&#8221; Edgardo&#8217;s &#8220;expectations exceeded,&#8221; Roberto correcting the AI on Italian cooking. </p><p>Those moments happened because real people were in the room together.</p><div><hr></div><h2>Want to be in the room next time?</h2><p>The <strong><a href="https://sbdy.io/5cC6TMB">.NET Web Academy All Access Pass</a></strong> includes every future workshop, twice monthly live sessions, every course, all source code on GitHub, and the private Discord community.</p><p>If you want to be in the room for the next one &#8212; and you want to keep going deeper on AI-assisted .NET development &#8212; that is the way in.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/5cC6TMB&quot;,&quot;text&quot;:&quot;Join the All Access Pass&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/5cC6TMB"><span>Join the All Access Pass</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and AI development every week.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[He Built a .NET MAUI App on His iPhone Without Opening Visual Studio Once]]></title><description><![CDATA[What our latest live session revealed about where AI-assisted development actually stands]]></description><link>https://dotnetwebacademy.substack.com/p/he-built-a-net-maui-app-on-his-iphone</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/he-built-a-net-maui-app-on-his-iphone</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 20 May 2026 16:02:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TS_H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!TS_H!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!TS_H!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1209940,&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://dotnetwebacademy.substack.com/i/196598033?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TS_H!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ba8a4f4-36de-43ee-b9d9-945908acb5a7_1920x1080.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 aria-hidden="true" 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><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>Last week, someone in our <strong><a href="https://sbdy.io/OG9nDZg">live session inside the .NET Web Academy</a></strong> said something that made me stop mid-sentence.</p><p>Arnold, one of our members, described how he&#8217;d spent a few hours experimenting with Claude Code in the terminal. </p><p>No Visual Studio open. </p><p>No IDE at all. </p><p>He described a .NET MAUI app, gave Claude the instructions, and just... let it run.</p><p>It compiled. It ran. And then - and this is the part that got me - Claude walked him through provisioning the app to his iPhone through his Apple Developer account. </p><p>Step by step. Correcting errors. Adjusting parameters. Pushing through the parts where Arnold said he would normally have quit after an hour.</p><p>His words: </p><blockquote><p><em>&#8220;Holy shit, that was so good.&#8221;</em></p></blockquote><p>Yeah. Same, Arnold. Same.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!2Brx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 424w, /__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 848w, /__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!2Brx!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif" width="458" height="284" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:284,&quot;width&quot;:458,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 424w, /__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 848w, /__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!2Brx!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f18eed-0639-4dbb-aacc-7636cc2eb9c3_458x284.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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><hr></div><h2>This Wasn&#8217;t a Demo. This Was a Tuesday.</h2><p>What made this moment land differently than your typical &#8220;AI is amazing&#8221; story is the context.</p><p>This wasn&#8217;t a controlled demo from a YouTube channel. </p><p>This was a group of working developers - from Sweden, the US, Italy, Austria - sitting together on a Tuesday evening, talking honestly about what&#8217;s actually working and what isn&#8217;t.</p><p>And the conversation was genuinely mixed.</p><p>Per, who builds industrial systems for sawmills in northern Sweden - we&#8217;re talking real-time log analysis at one to three logs per second - was skeptical. </p><p>He trusts AI for generating classes from JSON, writing documentation, and helping debug compile errors. But the core logic? He still writes that himself. When you make a mistake in his world, it costs between 10 and 100,000 euros an hour. So yeah, he&#8217;s careful.</p><p>Paul put it plainly early on: </p><blockquote><p><em>&#8220;In the hands of an experienced developer, any AI tool is an accelerator. In the hands of a rookie, it&#8217;s just dangerous.&#8221;</em></p></blockquote><p>That line sat with me for a while.</p><div><hr></div><h2><strong>A quick note</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/CO2Wf3A" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Ppy5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png" width="502" height="282.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:2383865,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://sbdy.io/CO2Wf3A&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dotnetwebacademy.substack.com/i/180014228?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.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 aria-hidden="true" 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><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 style="text-align: center;">If you want to learn how to build complete .NET AI-powered apps step by step, including Blazor, EF Core, Vertical Slice Architecture, Copilot workflows, and OpenAI integrations, I have just the right course for you:</p><p style="text-align: center;">&#128073; <strong><a href="https://sbdy.io/CO2Wf3A">.NET Web Development with AI &amp; Copilot</a></strong></p><p style="text-align: center;">Use code <strong>SUBSTACK</strong> at checkout for an exclusive discount!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/CO2Wf3A&quot;,&quot;text&quot;:&quot;&#128073; Get it here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/CO2Wf3A"><span>&#128073; Get it here</span></a></p><div><hr></div><h2>The Thing Nobody Talks About: Experience Still Matters</h2><p>We spend a lot of time in these conversations talking about what AI <em>can</em> do. </p><p>We don&#8217;t spend enough time talking about <em>why it works better for some people than others</em>.</p><p>Here&#8217;s what I actually think is happening.</p><p>When Arnold described a .NET MAUI app to Claude, and it delivered something real, he wasn&#8217;t just typing natural language and hoping. </p><p>He knew what he wanted. He read the code. He pushed back - &#8220;why are you doing it this way? Can we do it like this instead?&#8221; - and Claude adjusted.</p><p>That&#8217;s not <strong>vibe coding</strong>. That&#8217;s a developer using a capable collaborator, while staying in charge of the decisions.</p><p>When Mark - also in our session - tried Grok for Blazor and it didn&#8217;t recognize a Razor file, that&#8217;s a different problem. The tool wasn&#8217;t ready for that task. But knowing <em>that</em>, knowing which tool fits which job, knowing how to read what comes back - that still requires experience.</p><p>Jeff summed it up well when he described his own workflow: he doesn&#8217;t read every line the AI generates anymore. But he runs manual tests for every feature generated by the AI itself. He knows where the gaps might be. He catches bugs later and fixes them in context. That&#8217;s a judgment call. It requires knowing what &#8220;good enough for now&#8221; means in a given situation.</p><p>These aren&#8217;t beginner skills. </p><p>They&#8217;re developer skills, applied to a new kind of tool.</p><div><hr></div><h2>The MD File Is the New Architecture Conversation</h2><p>The part of our session that honestly excited me most wasn&#8217;t the iPhone story. It was the conversation about Markdown files.</p><p>Arnold has what he calls a DevBible - an MD file with all his standards, naming conventions, and how he does things. He feeds that, plus a project spec file, into Claude at the start of every session. Claude follows his rules. His architecture. His way.</p><p>Jeff does something very similar. MD files for project status, for tasks, and for decisions he&#8217;s made along the way. When the context window gets too big and he opens a new thread, he hands Claude the Markdown file and says: continue from here. No re-explaining. No drift.</p><p>I&#8217;ve been doing this too. For bigger rewrites, I generate a phased plan as a Markdown file - phases, tasks, checkboxes. Claude and I work through it together. When Claude needs more information, it asks. When I want to go in a different direction, I change the file. The plan is the source of truth.</p><p>What I love about this is what it forces you to do <em>before</em> you prompt: actually think the project through. Write it down. Agree on conventions. That discipline makes the AI work better - but it also just makes the project better.</p><p>Arnold put it well: </p><blockquote><p><em>&#8220;Before you even start prompting, you just write this sucker out.&#8221;</em></p></blockquote><p>This is what mature AI-assisted development looks like. It&#8217;s not less technical than before. In some ways, it&#8217;s more technical. It&#8217;s just technical in different places.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and AI development every week.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>The GitHub Copilot Situation</h2><p>Quick practical note from our session: GitHub Copilot Pro upgrades are currently paused. If you&#8217;re on the free tier and want to upgrade, you can&#8217;t, at least not right now.</p><p>This came up because a few people were asking what to try next. My honest recommendation is Claude with the Pro subscription. For Blazor and .NET specifically, it&#8217;s the most capable option I&#8217;ve used. Grok doesn&#8217;t know what a Razor file is. That&#8217;s a 2025 problem we shouldn&#8217;t still be having.</p><p>I&#8217;m currently paying for the Max plan - the $180/month tier - and yes, that&#8217;s a lot. </p><p>But I&#8217;m also running multiple projects, using Claude Code, running automation workflows on my machine. For someone just starting, the basic Pro plan at around $18/month is a very reasonable place to begin.</p><div><hr></div><h2>What This All Means for You</h2><p>Here&#8217;s where I landed after this session.</p><p>The developers who are thriving with AI right now share a few things:</p><p>They stayed in charge of architecture. They encode their decisions - in AGENTS.md, in AI Skills, in a DevBible - and let the AI implement them. The judgment is theirs. The execution is shared.</p><p>They verify the output. Not every single line every single time, but they understand what&#8217;s being generated. They know when something looks off. They push back.</p><p>They use AI for the stuff that used to eat their time - boilerplate, scaffolding, class generation, tests, documentation - and reclaim that time for the things that actually require a developer: understanding what the customer needs, designing the system, making the calls that matter.</p><p>And they&#8217;ve accepted that this is part of the job now. </p><p>Per staying skeptical of AI for core logic isn&#8217;t wrong - it&#8217;s the right call <em>for his context</em>. But even he uses it for documentation and debugging. </p><p>Roberto uses it daily for code that&#8217;s clear enough to specify. </p><p>Jeff uses it to manage a complex solo project he genuinely doesn&#8217;t think he could have built otherwise.</p><p>There&#8217;s room for different workflows here. But there&#8217;s less and less room for opting out entirely.</p><div><hr></div><h2>Want to Go Deeper?</h2><p>If this resonated with you, these conversations happen regularly inside the .NET Web Academy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/OG9nDZg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JfVu!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif" width="550" height="309.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:640,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;title&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/OG9nDZg&quot;,&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=".NET Web Academy Office Hours preview" title=".NET Web Academy Office Hours preview" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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>Twice a month, I run a live session - no prepared slides, no agenda. Just developers talking honestly about what&#8217;s working, what isn&#8217;t, and what we&#8217;re all figuring out in real time. The session I described in this article is one of them.</p><p>If you want to join future sessions and get access to everything else - the courses, the Discord community, the recorded sessions, all of it - the <strong><a href="https://sbdy.io/OG9nDZg">All Access Pass</a></strong> is the way in:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/OG9nDZg&quot;,&quot;text&quot;:&quot;Grab the All Access Pass&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/OG9nDZg"><span>Grab the All Access Pass</span></a></p><div><hr></div><p>Thanks for reading.</p><p>And if you&#8217;re ever in a session and you&#8217;ve built something that made you say &#8220;holy shit, that was so good&#8221; - please share it. Those are the moments worth talking about.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to get new articles about .NET, Blazor, and AI development every week.</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 empty folder to deployed Blazor app in two hours. Join us Wednesday.]]></title><description><![CDATA[.NET 10, Blazor Server, EF Core, SQL Server, GitHub Actions. Real app. Real deployment. Live.]]></description><link>https://dotnetwebacademy.substack.com/p/a-member-asked-me-to-build-a-shopping</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/a-member-asked-me-to-build-a-shopping</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Mon, 18 May 2026 16:00:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zByf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!zByf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!zByf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b9da588-4210-460a-838c-eb904faad922_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1115136,&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://dotnetwebacademy.substack.com/i/198168704?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!zByf!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b9da588-4210-460a-838c-eb904faad922_1920x1080.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 aria-hidden="true" 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><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>A few days ago I asked one of our <strong><a href="https://sbdy.io/Y05UzBR">All Access Pass</a></strong> members what he wanted to see built live during my <strong><a href="https://sbdy.io/Y05UzBR">upcoming live workshop</a></strong>.</p><p>He did not hesitate.</p><p>A shopping list app.</p><p>Then I stopped myself. Because here is the thing: I have built a shopping list app before. Years ago, for myself. Just a simple web app I used privately. Nothing fancy. But I actually used it.</p><p>And I remembered exactly why I built it. Because every shopping list solution I tried was either too complex, tied to a specific ecosystem, or required my wife to download yet another app.</p><p>So I built my own. As developers do.</p><p>When this member suggested the same thing, I knew immediately he was right. </p><p>Not because it is a simple project - it is not, once you start thinking about it properly - but because it is the kind of app that solves a real problem that real people actually have.</p><p>In his reply, he wanted items organized by category. He wanted AI to suggest things he might have forgotten. And then he said the thing every developer says when they build a shopping list app:</p><p>&#8220;And it would be great if I could share it with my wife.&#8221;</p><p>I smiled. Because I have been there.</p><p>And then I had to tell him the truth: we have two hours.</p><div><hr></div><h2><strong>We are building it this Wednesday. Join us live:</strong></h2><p>The <strong><a href="https://sbdy.io/Y05UzBR">Blazor AI Workshop</a></strong> is this <strong>Wednesday, May 20th</strong>. We start with an empty folder and finish with a real deployed Blazor app on Azure. All Access Pass members are already in for free.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/Y05UzBR" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!f01I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg" width="533" height="300.1432624113475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:397,&quot;width&quot;:705,&quot;resizeWidth&quot;:533,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/Y05UzBR&quot;,&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="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/Y05UzBR&quot;,&quot;text&quot;:&quot;Reserve your seat here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/Y05UzBR"><span>Reserve your seat here</span></a></p><p>&#128197; Wednesday, May 20th</p><p> &#128336; Berlin 9:15 PM / London 8:15 PM / New York 3:15 PM / Los Angeles 12:15 PM</p><p>Now, back to the feature list problem.</p><div><hr></div><h2><strong>The hardest skill in software development</strong></h2><p>Deciding what not to build is harder than building.</p><p>Categories sound simple. </p><p>They are not. </p><p>Now every item has a foreign key. Your UI needs a category selector. You need a way to manage categories. You need to decide what happens when you delete a category that contains items. Suddenly, you have three extra screens and a migration headache.</p><p>Sharing with your wife sounds simple. </p><p>It is not. </p><p>Now you need user accounts. </p><p>Authentication. </p><p>Authorization. </p><p>A way to invite someone. </p><p>A way to handle the case where she edits the list at the same time you do. </p><p>Conflict resolution. Suddenly, you have built half of a SaaS product.</p><p>AI suggestions sound simple. </p><p>They are not. </p><p>Now you need a prompt that understands context. You need to handle the case where the AI suggests something you already have. You need to decide when to show suggestions and when to stay out of the way.</p><p>Every one of those features is the right feature for the right project. None of them fit in two hours alongside a real Azure deployment.</p><p>So here is what we are actually <strong><a href="https://sbdy.io/Y05UzBR">building on Wednesday</a></strong>.</p><div><hr></div><h2><strong>The stack</strong></h2><p>.NET 10. </p><p>Blazor Server. </p><p>EF Core with SQL Server. </p><p>Azure deployment via GitHub Actions.</p><p>GitHub Copilot or Claude as our coding partners.</p><p>No shortcuts on the stack. </p><p>This is production-grade technology you would actually use in a real project.</p><div><hr></div><h2><strong>What we are shipping</strong></h2><p>A real Blazor Server app. Clean component structure. No shortcuts.</p><p>A data layer with EF Core and SQL Server. Items stored properly. Not a static list.</p><p>One AI feature done well. Natural language input. You type &#8220;add milk, eggs, and bread&#8221;, and Claude or GPT parses it into three separate items. Simple to describe. Genuinely useful. A real example of AI integration that is not just autocomplete.</p><p>A GitHub Actions pipeline for deployment. Not a manual click-through-the-portal deployment. A proper CI/CD pipeline that deploys to Azure automatically.</p><p>And then we open the deployed app in the browser with a real URL before we close the Zoom call.</p><p>And yes, we do all of that with the help of AI like GitHub Copilot or Claude.</p><p>That is the scope. It fits in two hours. And it is more than most developers ship in a weekend of solo work.</p><p>The sharing feature? That is a great idea for a future workshop. Or something you build yourself after Wednesday, using the foundation we create together.</p><div><hr></div><h2><strong>Why I am excited about this specific app</strong></h2><p>I have built versions of this before. </p><p>I know where the interesting decisions are. I know which Blazor Server patterns make sense here and which ones are overkill. I know exactly where Claude and GitHub Copilot shine in this kind of project and where you need to stay in charge of the architecture.</p><p>That knowledge is what makes a live workshop different from a tutorial. </p><p>You are not just watching me follow a script. You are watching someone who has thought about this problem before make real decisions in real time.</p><p>When something breaks - and something always breaks - you see how I actually debug. Not the clean version. The real version.</p><div><hr></div><h2><strong>What you walk away with</strong></h2><p>A <strong>deployed Blazor Server app on Azure</strong> with a real URL you can share right after the session.</p><p>The <strong>complete source code on GitHub</strong>. .NET 10, Blazor Server, EF Core, SQL Server, GitHub Actions pipeline - all ready to clone and use as a starting point for your own projects.</p><p>The <strong>full recording with lifetime access</strong>, so you can revisit any part of the build or code along at your own pace.</p><p>A <strong>clear mental model</strong> for how to use GitHub Copilot and Claude as actual coding partners in a real .NET 10 Blazor project. Not just autocomplete. Real AI-assisted development where you stay in charge of the decisions.</p><div><hr></div><h2><strong>The member who suggested this will probably be in the room</strong></h2><p>There is something I genuinely like about that.</p><p>Someone had an idea. Mentioned it. And now we are building it live, together, in front of everyone. We cut his feature list in half, and he is okay with that because the core of what he wanted is still there. </p><p>A real app. </p><p>Deployed. </p><p>Working. </p><p>Something he can actually use.</p><p>That is what the <strong>.NET Web Academy</strong> is supposed to feel like.</p><div><hr></div><h2><strong>Join us this Wednesday</strong></h2><p><strong><a href="https://sbdy.io/Y05UzBR">All Access Pass</a></strong> members are in for free.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/Y05UzBR" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!f01I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg" width="533" height="300.1432624113475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:397,&quot;width&quot;:705,&quot;resizeWidth&quot;:533,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/Y05UzBR&quot;,&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="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/Y05UzBR&quot;,&quot;text&quot;:&quot;Reserve your seat&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/Y05UzBR"><span>Reserve your seat</span></a></p><p><strong>&#128197; Wednesday, May 20th</strong> </p><p>&#128336; Berlin 9:15 PM / London 8:15 PM / New York 3:15 PM / Los Angeles 12:15 PM</p><p>Already a member? <strong><a href="https://learn.dotnetwebacademy.com/courses/blazor-ai-workshop/lectures/65670968">Find your Zoom link here</a></strong>.</p><p>The source code and full recording come with every ticket. So even if you cannot make it live on Wednesday, you still get everything.</p><p>Hope to see you there.</p>]]></content:encoded></item><item><title><![CDATA[The AGENTS.md File Changes Everything]]></title><description><![CDATA[A practical look at AI-assisted .NET development. From empty folder to running Blazor app, without vibe coding.]]></description><link>https://dotnetwebacademy.substack.com/p/from-empty-folder-to-running-blazor</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/from-empty-folder-to-running-blazor</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 13 May 2026 16:03:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!B26O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!B26O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!B26O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1216705,&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://dotnetwebacademy.substack.com/i/197274935?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!B26O!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F239d99b1-4069-4ff9-adae-68b8bc32c011_1920x1080.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 aria-hidden="true" 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><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>Recently I sat down with a completely empty folder, a terminal, and a simple idea: a little app for rating books.</p><p>No starter template. No pre-built architecture. No existing codebase to fall back on. Just that blank slate feeling every developer knows, where the first decision is somehow always the hardest one.</p><blockquote><p>Where do you even start?</p></blockquote><p>I have been building .NET applications for a long time. </p><p>And for most of that time, the answer to that question was the same: crack your knuckles, set up your folder structure, create your base entities, write your first service, and slowly, carefully, build your way up from the ground floor.</p><p>It works. It has always worked. But it is slow. </p><p>And honestly, a lot of it is repetitive work that does not really require your best thinking.</p><p>So this time I tried something different. </p><p>I kept the thinking for myself, the architectural decisions, the conventions, the overall structure, and handed the repetitive implementation work to AI.</p><p>What happened next genuinely surprised me. </p><p>Not because the AI was magic. </p><p>It was not. </p><p>There were errors. There were decisions I would have made differently. But in about thirty minutes, I had a running Blazor Server app with real architecture, real features, and a codebase I actually understood and owned.</p><p>Here is exactly how I did it.</p><div><hr></div><h2><strong>Where we start</strong></h2><p>No templates. No starter kit. Just a fresh folder called <code>BookRatings</code> and a terminal.</p><p>The first step is as simple as it gets:</p><pre><code><code>dotnet new blazor</code></code></pre><p>That gives us a Blazor Server app with all the default scaffolding. Components, pages, the basic layout. Nothing special yet. But from here things get interesting, because before we write a single line of application code, we need to make a decision that most developers skip entirely.</p><p>What architecture are we actually using?</p><div><hr></div><h2><strong>Deciding on architecture before writing code</strong></h2><p>This is where AI-assisted development differs from vibe coding. You don&#8217;t just start prompting. You think first.</p><p>For this project we go with vertical slice architecture. The idea is simple: instead of organizing code by technical layer (controllers, services, repositories), you organize by feature. Every use case gets its own folder, its own command or query, its own handler, its own response objects. Everything that belongs to a feature lives together.</p><p>It scales well. It keeps things focused. And it maps very naturally to how AI generates code, one feature at a time.</p><p>But here is the thing. If you just start prompting Claude or Copilot without telling them about your architectural decisions, they will make their own. And you might not like what you get.</p><p>So we define things upfront.</p><div><hr></div><h2><strong>Let&#8217;s build this together</strong></h2><p>Would you like to build an app like that together with me? That is exactly what we are going to do in the upcoming <strong><a href="https://sbdy.io/qj5fbPw">live Blazor AI workshop</a></strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/qj5fbPw" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!f01I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg" width="533" height="300.1432624113475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:397,&quot;width&quot;:705,&quot;resizeWidth&quot;:533,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/qj5fbPw&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Two hours, hands-on, building together from an empty folder to a real deployment. If you are serious about making AI-assisted development part of your workflow, this is the most practical way to get there.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/qj5fbPw&quot;,&quot;text&quot;:&quot;Learn Blazor + AI here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/qj5fbPw"><span>Learn Blazor + AI here</span></a></p><div><hr></div><h2><strong>The AGENTS.md file: your AI&#8217;s instruction manual</strong></h2><p>The AGENTS.md file is a markdown file that lives in your project root. </p><p>Both Claude and GitHub Copilot can read it, and it acts as a persistent set of instructions for how code in this project should be written.</p><p>You can prompt Claude to generate it for you:</p><blockquote><p><em>&#8220;Please create an agents.md file with general instructions on how to implement features. Use vertical slice architecture with feature folders. I want a folder for every entity and then for every use case. Inside the use case folder I want commands, queries, and the corresponding handlers, response objects and so on. Use individual files for everything. Also use dependency injection with interfaces and best practices in general.&#8221;</em></p></blockquote><p>What comes back is a solid starting point. Folder structure conventions, naming rules, how to handle results instead of throwing exceptions, where Blazor components live relative to their feature slice, and more.</p><p>This file now travels with your codebase. Every time you or your AI touches this project, the conventions are right there.</p><div><hr></div><h2><strong>Going further with AI skills</strong></h2><p>Once you have the AGENTS.md file, you can go one step further: AI skills.</p><p>Skills are small, focused markdown files that live in a <code>.claude/skills</code> folder. Each skill has a name, a description that acts as the trigger, and a checklist of steps. </p><p>The idea is that instead of cramming everything into one big instructions file, which gets read in full every time you prompt and costs you tokens, you split things up into on-demand instructions.</p><p>For this project we create two skills.</p><p>One for creating a vertical slice, covering the backend side. Command, query, handler, response, all of it.</p><p>One for creating the corresponding Blazor Server UI. The page, the component, the wiring.</p><p>Now when you want to add a new feature, you can simply say &#8220;create a vertical slice for X&#8221; and Claude will pick up the right skill, follow the checklist, and generate code that matches your conventions.</p><p>This is the setup work that pays off every single time you add a feature. Invest fifteen minutes here, save hours later.</p><div><hr></div><h2><strong>Scaffolding the first feature</strong></h2><p>With the AGENTS.md and skills in place, open a fresh context window and give Claude its first real task:</p><blockquote><p><em>&#8220;Create a vertical slice for reading a list of books. Also create a simple book entity with ratings included. Use EF Core with an in-memory database and seed some books.&#8221;</em></p></blockquote><p>Watch what happens. Claude reads the AGENTS.md file, picks up the vertical slice skill, and starts scaffolding. It creates:</p><ul><li><p>A <code>Book</code> domain entity with a <code>Rating</code> relationship</p></li><li><p>A <code>ListBooks</code> query and handler</p></li><li><p>A response DTO and a <code>BookListItem</code> DTO</p></li><li><p>A Blazor page that renders the list</p></li><li><p>A <code>DbContext</code> with EF Core in-memory configured</p></li><li><p>A seed method with a handful of sample books</p></li></ul><p>Is every decision perfect?</p><p>No. </p><p>In this case Claude generates a repository layer that is not really necessary here since the handler could talk to the DbContext directly. But that is a conversation for your AGENTS.md file (or the skill). Define your preferences once, and the AI will follow them.</p><p>The point is: in a few minutes, we have a running list of books rendered in a Blazor page. </p><p>From scratch.</p><div><hr></div><h2><strong>Adding the create and rate features</strong></h2><p>From here we keep going in the same rhythm. One prompt per feature, one vertical slice at a time.</p><blockquote><p><em>&#8220;Implement the create book feature.&#8221;</em></p></blockquote><p>Done. A form, a command, a handler, a redirect back to the list.</p><blockquote><p><em>&#8220;Now also enable adding ratings to books.&#8221;</em></p></blockquote><p>Done. A rate button, a simple form, a command, a handler that adds the rating to the book.</p><p>Each time Claude follows the conventions we defined. Each time the output lands in the right folder, with the right structure, with the right naming.</p><p>This is what it looks like when AI is working with your architecture instead of inventing its own.</p><div><hr></div><h2><strong>When things go wrong</strong></h2><p>Here is where things get honest.</p><p>When we try to submit a rating, we get an unhandled exception:</p><blockquote><p><em>&#8220;Attempt to update or delete an entity that does not exist in the store.&#8221;</em></p></blockquote><p>A year ago this would have sent most developers straight to Stack Overflow. Now we paste the error into Claude and ask what is going on.</p><p>The explanation is actually quite good. In Blazor Server, the DbContext is scoped to the WebSocket circuit, not to individual requests. When you create a book in one operation and then try to add a rating in another, they share the same long-lived DbContext instance. The change tracker carries state between operations, and the in-memory provider gets confused.</p><p>The fix is to use <code>IDbContextFactory</code> instead of injecting the DbContext directly, creating a fresh context per operation rather than sharing one across the circuit.</p><p>Claude implements the fix. We run the app again. It works.</p><p>This is a real lesson worth internalizing. </p><p>AI-assisted development does not mean error-free development. </p><p>It means you have a very capable debugging partner available at all times. But you still need to understand what is happening. You still need to read the output, review the changes, and know enough to catch the things Claude gets wrong.</p><p>That is the line between skilled AI-assisted development and just hoping for the best.</p><div><hr></div><h2><strong>What we ended up with</strong></h2><p>Starting from nothing, in roughly thirty minutes, we have:</p><ul><li><p>A Blazor Server app with vertical slice architecture</p></li><li><p>A book entity with ratings</p></li><li><p>EF Core with an in-memory database and seed data</p></li><li><p>A list view, a create form, and a rating form</p></li><li><p>A working AGENTS.md file and two reusable AI skills</p></li><li><p>A git history with meaningful commits along the way</p></li></ul><p>Is it production-ready? </p><p>Not quite. </p><p>There are things to clean up: the repository layer, the placement of Blazor pages, a few conventions that could be tightened up in the AGENTS.md file. </p><p>But as a foundation it is solid. And more importantly, it is yours. You understand every part of it because you designed the architecture. AI just helped you build it.</p><div><hr></div><h2><strong>Want to go further?</strong></h2><p>If you want to take this from a local in-memory app all the way to a deployed application on Azure, that is exactly what we cover in the<a href="https://sbdy.io/qj5fbPw"> </a><strong><a href="https://sbdy.io/qj5fbPw">live Blazor AI workshop</a></strong>. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/qj5fbPw" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!f01I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg" width="533" height="300.1432624113475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:397,&quot;width&quot;:705,&quot;resizeWidth&quot;:533,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/qj5fbPw&quot;,&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="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!f01I!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb34661e7-bd6f-4e6e-9c02-469728ef0e67_705x397.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Two hours, hands-on, building together from an empty folder to a real deployment. If you are serious about making AI-assisted development part of your workflow, this is the most practical way to get there.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/qj5fbPw&quot;,&quot;text&quot;:&quot;Join the Blazor AI Workshop here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/qj5fbPw"><span>Join the Blazor AI Workshop here</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and AI development every week.</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[I Published a Short One Year Ago Saying AI Coding Wasn't the Future. I Was Wrong.]]></title><description><![CDATA[Why AI-assisted development is now the professional standard - and what separates it from the "vibe coding" I actually criticized]]></description><link>https://dotnetwebacademy.substack.com/p/i-published-a-short-one-year-ago</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/i-published-a-short-one-year-ago</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Wed, 06 May 2026 16:03:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!alwD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!alwD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!alwD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1343602,&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://dotnetwebacademy.substack.com/i/196526704?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!alwD!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43074658-c4e8-4d53-82c8-88b1b066f61e_1920x1080.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 aria-hidden="true" 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><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>About a year ago, I published a <strong><a href="https://youtube.com/shorts/Mz9zjycwVog">YouTube Short</a></strong>. I said I didn&#8217;t think &#8220;vibe coding&#8221; was the future. I described it as prompting an AI, copying the output, and repeating until something works. I said I didn&#8217;t think it was the right approach.</p><p>I want to revisit that.</p><p>Not because I was entirely wrong. </p><p>I wasn&#8217;t. </p><p>Mindless copy-paste is still bad engineering. But I was wrong about the bigger picture - and I think a lot of developers still are. </p><p>So let&#8217;s walk through what changed, what the distinction actually is, and why it matters for your career right now.</p><div><hr></div><h2><strong>A quick note</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/Il8jIaw" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Ppy5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png" width="502" height="282.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:2383865,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://sbdy.io/Il8jIaw&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dotnetwebacademy.substack.com/i/180014228?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ppy5!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c3f9d8-0718-45ea-bc86-37dde9b6f3a9_1920x1080.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 aria-hidden="true" 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><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 style="text-align: center;">If you want to learn how to build complete .NET AI-powered apps step by step, including Blazor, EF Core, Vertical Slice Architecture, Copilot workflows, and OpenAI integrations, I have just the right course for you:</p><p style="text-align: center;">&#128073; <strong><a href="https://sbdy.io/OM1GT9K">.NET Web Development with AI &amp; Copilot</a></strong></p><p style="text-align: center;">Use code <strong>SUBSTACK</strong> at checkout for an exclusive discount!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/OM1GT9K&quot;,&quot;text&quot;:&quot;&#128073; Get it here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/OM1GT9K"><span>&#128073; Get it here</span></a></p><div><hr></div><h2><strong>What I Actually Got Right</strong></h2><p>The specific workflow I was criticizing - prompt AI, copy output, paste it, run it, repeat until it compiles, ship it without really understanding what&#8217;s in there - that workflow is still a problem. Not primarily because AI is involved, but because not understanding your own code is always a problem.</p><p>If you can&#8217;t read the code the AI generated, you can&#8217;t:</p><ul><li><p>Debug it when it breaks (and it will)</p></li><li><p>Review a colleague&#8217;s PR that changes it</p></li><li><p>Extend it six months from now without introducing bugs</p></li><li><p>Recognize when the AI made a subtle architectural mistake that will cost you three weeks in six months</p></li></ul><p>That criticism holds. The term &#8220;vibe coding&#8221; always pointed at the <em>mindlessness</em>, not the AI. And that part hasn&#8217;t changed.</p><div><hr></div><h2><strong>What I Got Wrong</strong></h2><p>I implied the answer was to be skeptical of AI coding tools altogether. That&#8217;s where I was wrong.</p><p>Here&#8217;s what changed in 12 months:</p><h3><strong>The tools crossed a threshold</strong></h3><p>GitHub Copilot went from inline autocomplete to a full agent that reads your codebase, understands your architecture, and executes multi-step tasks. </p><p>Claude went from a capable chatbot to an agentic coding environment. The quality of output for routine tasks - boilerplate, scaffolding, tests, refactoring - is now correct on the first attempt often enough that it fundamentally changes how you should think about your time.</p><h3><strong>The gap between users and non-users became undeniable</strong></h3><p>A year ago, using AI tools was a competitive advantage. </p><p>In 2026, not using them is a competitive <em>disadvantage</em>. </p><p>Teams with AI-first workflows are shipping faster with the same headcount. The developers who invested in learning these tools early are the ones setting the pace now.</p><h3><strong>The ecosystem matured</strong></h3><p>Custom instructions, AI Skills, MCP servers - you can now <em>teach</em> AI your patterns once and have it apply them correctly, indefinitely. It&#8217;s no longer about prompting a generic model and hoping for the best. It&#8217;s about a collaborator that knows your codebase.</p><p>The tools from the beginning of 2025 and the tools of May 2026 are not the same category of product.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you want more like this, subscribe for free. I write about .NET, Blazor, and AI development every week.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2><strong>The Distinction That Actually Matters</strong></h2><p>I still wouldn&#8217;t call good AI-assisted development &#8220;vibe coding.&#8221;</p><p>The difference isn&#8217;t whether AI is involved. It&#8217;s whether the developer is engaged or checked out.</p><p>Skilled AI use means:</p><h3><strong>You still own the architecture</strong></h3><p>The AI generates code to your specifications. You decide the patterns, the folder structure, the trade-offs. </p><p>Then you encode those decisions - in AGENTS.md, in AI Skills, in a custom system prompt - and the AI implements them consistently. The judgment is yours. The execution is shared.</p><h3><strong>You verify everything</strong></h3><p>You read what the AI generates. You wouldn&#8217;t merge a PR from a junior developer without reading it. Treat AI output the same way. </p><p>Read it. </p><p>Understand it. </p><p>Push back when something looks off.</p><h3><strong>You use AI for tests, not instead of tests</strong></h3><p>One of the biggest gains from AI tools is generating test cases - including edge cases you&#8217;d miss in a manual pass. </p><p>But you still decide what coverage means and whether the tests are meaningful.</p><h3><strong>You stay current</strong></h3><p>These tools evolve faster than almost anything else in software right now. </p><p>A workflow that was optimal six months ago may already be obsolete. </p><p>Staying close to the tooling is part of the job now.</p><div><hr></div><h2><strong>Why You Can&#8217;t Opt Out Anymore</strong></h2><p>Let me be direct: a year ago, using these tools gave you an edge. Today, not using them is a liability.</p><p>Two equally skilled developers are both applying for the same role or competing on the same team. One has mastered Copilot and Claude. One hasn&#8217;t. </p><p>The productivity difference is real and measurable - not 10%, but in some cases 2x or more for the kinds of tasks that consume most of a developer&#8217;s day: scaffolding, boilerplate, test generation, refactoring, documentation.</p><p>This isn&#8217;t about AI replacing developers. It&#8217;s about the bar shifting.</p><p>The barrier to entry for junior-level tasks is collapsing - AI can generate basic CRUD endpoints, write unit tests for simple functions, stub out boilerplate faster and more reliably than most people. </p><p>That means the value a developer brings now has to be above that threshold: architecture decisions, code review judgment, debugging complex systems, domain knowledge, knowing what to build and why.</p><p>Developers who use AI as a force multiplier for that higher-order work are the ones who will thrive. </p><p>Developers who either vibe code without understanding what they&#8217;re shipping or refuse to use these tools at all are the ones who will struggle.</p><div><hr></div><p>By the way, I built a free <strong><a href="https://sbdy.io/9aLJ2uK">Blazor AI Starter Kit</a></strong> for you. A clean Blazor project with AI integration already set up, including AI instructions, Skills, and the right architecture.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/9aLJ2uK&quot;,&quot;text&quot;:&quot;Get the free Starter Kit&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://sbdy.io/9aLJ2uK"><span>Get the free Starter Kit</span></a></p><div><hr></div><h2><strong>What This Looks Like in Practice</strong></h2><p>In my own workflow - building .NET and Blazor applications - here&#8217;s what AI-assisted development actually looks like day to day:</p><ul><li><p>I define the architecture. CQRS, vertical slices, the patterns we use for validation and error handling. I encode those decisions in <code>AGENTS.md</code> and in dedicated AI Skills.</p></li><li><p>I give Copilot a task: &#8220;Add a CQRS slice for DeleteVideoGame.&#8221; It reads the project structure, finds the existing pattern in my <code>Features/</code> folder or the matching Skill, and generates the command, handler, and endpoint matching my actual conventions.</p></li><li><p>I read what it generates. Every file. I push back if something doesn&#8217;t fit.</p></li><li><p>I run the tests. Always. Often I&#8217;ll prompt Claude to generate edge-case tests I wouldn&#8217;t have thought of - and then I read those too.</p></li></ul><p>That&#8217;s not vibe coding. That&#8217;s engineering with a capable collaborator.</p><div><hr></div><h2><strong>A Year Later</strong></h2><p>One year ago, I was skeptical of a new term and a new workflow. I was right that the mindless version of it is bad. I was wrong to be skeptical of AI-assisted development as a category.</p><p>The developers who figured that out early - who invested the time to learn these tools, to set them up properly, to understand how to get consistent and reliable output - they&#8217;re the ones leading the way right now.</p><p>If you haven&#8217;t made that investment yet: it&#8217;s not too late, but the window is narrowing. Start with your most repetitive task. </p><p>Spend 20 minutes setting up a proper instruction file or a reusable AI Skill. See what it actually feels like to use these tools <em>well</em>. </p><p>That&#8217;s where the compounding starts.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to get new articles about .NET, Blazor, and AI development every week.</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[Should You Soft Delete? Use These 4 Questions to Decide in 10 Minutes]]></title><description><![CDATA[Forget the debate - here's the only framework you need for the soft delete vs. hard delete decision]]></description><link>https://dotnetwebacademy.substack.com/p/the-delete-button-that-started-a</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/the-delete-button-that-started-a</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Tue, 28 Apr 2026 16:01:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wy0W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!wy0W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!wy0W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1251025,&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://dotnetwebacademy.substack.com/i/194291733?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wy0W!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f1e1fb7-8460-47a0-8ac3-79f91dda5f7a_1920x1080.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 aria-hidden="true" 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><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>It started, as all great engineering disasters do, with something completely reasonable.</p><p>We were building a feature. The feature needed a delete button. The delete button needed a backend endpoint. I had the endpoint half-written when a colleague leaned over from his desk and said four words that would define the rest of my week:</p><p>&#8220;Shouldn&#8217;t we soft delete?&#8221;</p><p>I looked up. He looked sincere. The question was fair.</p><p>And thus began what I now refer to internally as <em>The Great Soft Delete Debate of Sprint 14</em> - a conflict that consumed five meetings, one whiteboard, roughly eleven Slack threads, and a significant portion of my will to live.</p><p>This is that story.</p><div><hr></div><h2><strong>Day One: The Innocent Question</strong></h2><p>Tuesday, 10 AM. We had a scheduled 15-minute architecture sync. The agenda was light: confirm the delete endpoint, agree on a response format, done.</p><p>Alex - the dev who had asked the question - made his case calmly and professionally. We should add a <code>DeletedAt</code> timestamp to the table. Soft delete means we don&#8217;t actually remove the row; we just mark it as deleted. And while we&#8217;re there, we should probably add <code>CreatedAt</code> too. Good practice. Standard stuff.</p><p>He wasn&#8217;t wrong.</p><p>Sarah pushed back. &#8220;Do we actually need that? Who&#8217;s ever going to un-delete one of these records?&#8221; Alex said it was best practice. Sarah said it was scope creep. I said maybe we should think about it.</p><p>The meeting ended without a decision, which meant we would need another meeting.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dotnetwebacademy.substack.com/subscribe"><span>Subscribe now</span></a></p><div><hr></div><h2><strong>Day Two: The Whiteboard Era</strong></h2><p>Wednesday. We booked a room with a whiteboard. This felt like progress.</p><p>By the end of the session, we had a very thorough pros/cons list that I am going to reproduce here in its entirety because I think it captures the energy of the moment:</p><p><strong>Pros of soft delete:</strong></p><ul><li><p>Can recover records if needed</p></li><li><p>Audit trail built-in</p></li><li><p>&#8220;Best practice&#8221; (source: Alex)</p></li></ul><p><strong>Cons of soft delete:</strong></p><ul><li><p>Every query needs <code>WHERE DeletedAt IS NULL</code></p></li><li><p>Breaks unique indexes</p></li><li><p>Global query filter needed in EF Core - easy to forget</p></li><li><p>Cascades become complicated</p></li><li><p>GDPR complicates things (you may need to hard delete anyway)</p></li><li><p>Need to test both delete paths</p></li><li><p>&#8220;We&#8217;ve never actually needed this&#8221; (source: Sarah, three times)</p></li></ul><p><strong>Pros of hard delete:</strong></p><ul><li><p>Simple</p></li><li><p>Explicit</p></li><li><p>Every query just works</p></li></ul><p><strong>Cons of hard delete:</strong></p><ul><li><p>Can&#8217;t recover records</p></li><li><p>No audit trail</p></li><li><p>&#8220;Not best practice&#8221; (source: Alex, same tone as before)</p></li></ul><p>The meeting ended without a decision. We agreed to &#8220;sleep on it.&#8221;</p><div><hr></div><h2><strong>Day Three: The GDPR Twist</strong></h2><p>Thursday brought a new combatant: Marcus from the compliance team, who had somehow heard about the debate and arrived with a printed document.</p><p>&#8220;If this table contains personal data,&#8221; he said, placing the document on the table with the gravity of someone delivering a verdict, &#8220;GDPR requires actual deletion upon request. So your soft delete still needs a hard delete path.&#8221;</p><p>Silence.</p><p>Alex said: &#8220;That&#8217;s fine, we&#8217;d have a purge job.&#8221;</p><p>Sarah said: &#8220;So now we have two delete paths, a purge job, a <code>DeletedAt</code> column, AND a <code>CreatedAt</code> column.&#8221;</p><p>Marcus said: &#8220;And you might need a <code>DeletedBy</code> field.&#8221;</p><p>I stared at the ceiling.</p><p>The meeting ended without a decision.</p><div><hr></div><h2><strong>Relatable?</strong></h2><p>If this debate is relatable and you care about making better architectural decisions and shipping cleaner .NET solutions, the .NET Web Academy membership is built for you.</p><p>Live office hours. Real projects. Practical discussion.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://sbdy.io/N6SGShL" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JfVu!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif" width="550" height="309.375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:640,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;title&quot;:&quot;.NET Web Academy Office Hours preview&quot;,&quot;type&quot;:null,&quot;href&quot;:&quot;https://sbdy.io/N6SGShL&quot;,&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=".NET Web Academy Office Hours preview" title=".NET Web Academy Office Hours preview" srcset="/__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 424w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 848w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1272w, /__u/substackcdn.com/image/fetch/$s_!JfVu!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc45421d0-cc2a-4dab-a6db-d67fc9d43965_640x360.gif 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" 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><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 class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/N6SGShL&quot;,&quot;text&quot;:&quot;Join the .NET Web Academy&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/N6SGShL"><span>Join the .NET Web Academy</span></a></p><div><hr></div><h2><strong>Day Four: The Hypothetical User</strong></h2><p>Friday. I was now writing <code>WHERE DeletedAt IS NULL</code> in my sleep.</p><p>We convened again, this time with a product manager. The question on the table: has any real user, in any real scenario, ever needed to recover a deleted record from this particular table?</p><p>The product manager thought about it. She checked her notes. She opened Slack and scrolled for a while.</p><p>&#8220;I can&#8217;t think of a specific instance,&#8221; she said finally. &#8220;But they <em>might</em> want to someday.&#8221;</p><p>Alex said that was exactly his point.</p><p>Sarah said that was exactly her point.</p><p>I said that if we didn&#8217;t ship this feature by end of sprint, we were going to have a very uncomfortable retrospective.</p><p>The meeting ended without a decision.</p><div><hr></div><h2><strong>Day Five: The Resolution (Sort Of)</strong></h2><p>Monday. The delete button had now been in &#8220;in progress&#8221; on the sprint board for seven working days. The senior engineer - who had been on leave the entire previous week and was experiencing all of this for the first time - looked at the board, looked at us, and asked a single question:</p><p>&#8220;Is this going to an archive feature, or is it actually gone when it&#8217;s deleted?&#8221;</p><p>We said we didn&#8217;t know. That was the whole debate.</p><p>He shrugged. &#8220;Users expect deleted things to disappear. Hard delete. If we need soft delete later, we add it. Ship the button.&#8221;</p><p>And that was it. The meeting lasted four minutes.</p><div><hr></div><h2><strong>What We Should Have Done on Day One</strong></h2><p>Looking back, here&#8217;s the thing: Alex wasn&#8217;t wrong. Soft delete is a legitimate pattern. It&#8217;s genuinely useful for audit trails, recovery workflows, and systems where deletions have downstream consequences. For the right use case, it&#8217;s the right call.</p><p>But for a delete button in our specific feature, with our specific requirements - there was no evidence we needed it. And in the absence of evidence, we should have defaulted to the simpler thing.</p><p>Here&#8217;s the decision framework we now use on our team before the debate even starts:</p><p><strong>1. Does a real user, in a real workflow, ever need to undo this deletion?</strong> Not a hypothetical user in a theoretical future - an actual person, in a scenario you can describe. If yes, soft delete makes sense. If you can&#8217;t name the scenario, proceed to step 2.</p><p><strong>2. Do you need a formal audit trail?</strong> If you need to know who deleted what and when for legal or compliance reasons, consider a dedicated audit log table rather than <code>DeletedAt</code> columns on every entity. It&#8217;s more flexible and doesn&#8217;t contaminate every query in the system.</p><p><strong>3. Are there regulatory obligations?</strong> GDPR, HIPAA, financial compliance - know your obligations. Soft delete and compliance requirements sometimes conflict directly, so understand this before you commit.</p><p><strong>4. What&#8217;s the cost of being wrong?</strong> If you hard delete now and later find out you needed soft delete, how hard is it to add? Usually: a migration, some query updates, maybe an EF Core global filter. Annoying, but not catastrophic. When the cost of changing course is low, lean toward the simpler option now.</p><p>Default: <strong>hard delete.</strong> Not because it&#8217;s always right - but because it&#8217;s simpler, it&#8217;s explicit, and you can always add soft delete when you have real requirements instead of hypothetical ones.</p><div><hr></div><h2><strong>The Broader Lesson</strong></h2><p>The soft delete debate is a specific instance of a general pattern: teams that are smart, diligent, and thoughtful can spend enormous energy on decisions that don&#8217;t actually require enormous energy.</p><p>The delete button wasn&#8217;t a hard decision. The architectural pattern wasn&#8217;t deeply controversial. The data didn&#8217;t have any unusual requirements. And yet we spent a week on it - not because we were bad engineers, but because we didn&#8217;t put a time box on the decision.</p><p>The rule I now apply: if the decision is reversible and the stakes are low, you get ten minutes. Put both options on the board, ask if anyone has a blocking concern based on actual requirements (not hypothetical ones), and pick the simpler one. Write it down. Move on.</p><p>Save the long debates for the decisions that actually deserve them: the ones that are hard to reverse, high stakes, or genuinely ambiguous in ways that require deeper analysis.</p><p>A delete button is not one of those things.</p><div><hr></div><h2><strong>Conclusion</strong></h2><p>The feature shipped on Monday afternoon. Users can now delete things. The data is actually deleted. Nobody has complained. Nobody has asked to un-delete anything.</p><p>The <code>DeletedAt</code> column remains hypothetical.</p><p>Alex has since proposed soft delete on two other features. Both times, we went through the four questions above. Once the answer was yes - we needed recovery - and we implemented soft delete properly, with full awareness of the tradeoffs. The other time, the answer was no, and we shipped a hard delete in about twenty minutes.</p><p>The framework works. The delete button is fine.</p><p>But I still hear &#8220;shouldn&#8217;t we soft delete?&#8221; in my dreams sometimes.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dotnetwebacademy.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">.NET Web Academy 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[Tutorial limbo is real. Here is how we fixed it.]]></title><description><![CDATA[The story of cohort 1, what developers actually built, and what comes next]]></description><link>https://dotnetwebacademy.substack.com/p/what-happened-when-i-stopped-following</link><guid isPermaLink="false">https://dotnetwebacademy.substack.com/p/what-happened-when-i-stopped-following</guid><dc:creator><![CDATA[Patrick God]]></dc:creator><pubDate>Mon, 27 Apr 2026 16:02:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Gjga!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.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="/__u/substackcdn.com/image/fetch/$s_!Gjga!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_webp, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Gjga!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1257561,&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://dotnetwebacademy.substack.com/i/195333999?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_424, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_848, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_1272, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Gjga!, /__u/dotnetwebacademy.substack.com/w_1456, /__u/dotnetwebacademy.substack.com/c_limit, /__u/dotnetwebacademy.substack.com/f_auto, /__u/dotnetwebacademy.substack.com/q_auto:good, /__u/dotnetwebacademy.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14f6f544-6954-49c9-af5a-61eef4e47da6_1920x1080.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 aria-hidden="true" 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><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>TLDR</strong></h2><p>Cohort 2 of the <strong><a href="https://sbdy.io/Qgg82Nc">Blazor AI Accelerator</a></strong> starts May 13. Small group. Real projects. Real AI. Real Azure deployments.</p><p>Early bird seats are available for a limited time.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/Qgg82Nc&quot;,&quot;text&quot;:&quot;Claim your spot here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/Qgg82Nc"><span>Claim your spot here</span></a></p><div><hr></div><h4>When I launched the Blazor AI Accelerator in March, I had a plan.</h4><p>By week 3, it was gone.</p><p>Not because things went wrong.</p><p>Because something better happened.</p><div><hr></div><h2><strong>The real struggle is not finishing</strong></h2><p>Most developers do not struggle because they lack knowledge.</p><p>They struggle because they never start.</p><p>Or they start and never finish.</p><p>You spin up a Blazor project. You follow a few tutorials. It works. Until it does not.</p><p>Your architecture feels messy. Deployment fails again. And even with GitHub Copilot or Claude, you are still not sure if your approach is actually right.</p><p>That is what I call tutorial limbo.</p><p>And it happens to thousands of developers.</p><div><hr></div><h2><strong>What I thought would happen</strong></h2><p>I designed a structured 8-week program.</p><p>Week by week. Topic by topic. Clean architecture, identity, Azure deployment, AI integration.</p><p>I had a plan for every session.</p><p>By week 3, nobody wanted the plan anymore.</p><div><hr></div><h2><strong>What actually happened</strong></h2><p>The 8 developers in the room were all dealing with real problems.</p><p>Not toy projects.</p><p>Actual production challenges they were paid to solve.</p><p>Most of them were migrating legacy desktop apps and fat clients to the web with Blazor. Others were building new apps from scratch using GitHub Copilot and Claude as actual coding partners.</p><p>So instead of following the plan, we followed the work.</p><p>Someone would share a tricky architecture decision. Another would pull up their screen and show how they tackled something similar. We debated live. Real code, real decisions, real projects.</p><p>It turned into a mastermind.</p><p>And honestly? <strong>It was the best thing I have ever run.</strong></p><div><hr></div><h2><strong>Here is what cohort 1 developers built</strong></h2><p>Tim migrated the entire printing job system of a legacy ERP to a cloud API. Then his purchasing team saw the Blazor front end and told him they wanted to drag documents from email directly into the app. He showed them live. It worked perfectly. Now he is rebuilding the whole thing in Blazor.</p><p>His words: </p><blockquote><p>&#8220;I moved the whole printing jobs from my legacy desktop app to the API and it works. It is moving so fast. I think I am just going to stop doing it in the desktop and purely do it on a Blazor front end.&#8221;</p></blockquote><p>Aaron built a tablet app for his field team. Using AI to generate UI components in real time. Live in session 7, he told the AI to change a component and it just knew what to do.</p><p>Jeff came in as an experienced developer who could have built his financial portfolio app alone. He joined anyway. His reason: </p><blockquote><p>&#8220;I tried talking to my five or ten reliable developer friends about AI. One guy said he would look at it over Christmas break. Never did. To stay on the cutting edge of stuff like GitHub Copilot, the ability to communicate with Patrick and the other developers is important.&#8221;</p></blockquote><p>His before and after: </p><div class="pullquote"><p>&#8220;Before the cohort, I was on my own with AI development. Now I have a cohort of AI masterminds.&#8221;</p></div><div><hr></div><h2><strong>What I learned from running cohort 1</strong></h2><p>You do not need a curriculum. You need a destination and accountability.</p><p>The destination is simple: by week 8, you have shipped a real Blazor app with AI and Azure.</p><p>The accountability is the group. Ten developers who see your progress every week. That alone is worth the price of admission.</p><p>Jeff said it best: </p><blockquote><p>&#8220;Perhaps the number one benefit is simply that you will actually carve out time to show up for a 90 minute session each week. We often do not take the time to learn. Here, you will.&#8221;</p></blockquote><p>That is exactly it.</p><p>The cohort does not just teach you. It makes you show up.</p><p>And showing up is what separates developers who ship from developers who stay stuck.</p><div><hr></div><h2><strong>Cohort 2 starts May 13</strong></h2><p>Same format. Max 10 developers. 8 weeks. One shipped app by the end.</p><p>Every Wednesday at 9:15 pm Berlin / 8:15 pm London / 3:15 pm New York / 12:15 pm Los Angeles.</p><p>No slides. No rigid curriculum. Real code, real decisions, real projects.</p><p>What you get:</p><ul><li><p>8 live weekly group sessions</p></li><li><p>Lifetime All Access Pass to every .NET Web Academy course</p></li><li><p>All cohort 1 session recordings</p></li><li><p>Private Discord for replays and resources</p></li><li><p>Mastermind format with max 10 developers</p></li></ul><p>Early bird spots are limited. Details and pricing here:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/Qgg82Nc&quot;,&quot;text&quot;:&quot;Check availability and claim your spot&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/Qgg82Nc"><span>Check availability and claim your spot</span></a></p><div><hr></div><h3><strong>This is for you if:</strong></h3><p>You are a .NET developer working on a Blazor project right now. You are migrating a legacy desktop app to the web. You want to integrate AI into your stack and do not know where to start. You learn better by doing than by watching.</p><h3><strong>This is not for you if:</strong></h3><p>You are a complete beginner to .NET. You are looking for a structured video course. You are not ready to commit to showing up every week.</p><div><hr></div><h2><strong>One last thing</strong></h2><p>The cohort transformed because the developers in it were serious.</p><p>They showed up every week. They shared real problems. They pushed each other forward.</p><p>If that sounds like you, I would love to have you in cohort 2.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://sbdy.io/Qgg82Nc&quot;,&quot;text&quot;:&quot;Claim your spot here&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://sbdy.io/Qgg82Nc"><span>Claim your spot here</span></a></p><p>Spots are limited. Starts May 13.</p><p>Take care,</p><p>Patrick</p>]]></content:encoded></item></channel></rss>