<?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[Mark’s Wiki]]></title><description><![CDATA[Exploiting the intersection of Civic Tech and AI. ]]></description><link>https://www.marks.wiki</link><image><url>https://substackcdn.com/image/fetch/$s_!SkTc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3b086f-6f54-465a-a3ad-11cb2cc4c2db_1280x1280.png</url><title>Mark’s Wiki</title><link>https://www.marks.wiki</link></image><generator>Substack</generator><lastBuildDate>Tue, 28 Apr 2026 12:12:23 GMT</lastBuildDate><atom:link href="https://www.marks.wiki/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Mark Davis]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[markdav@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[markdav@substack.com]]></itunes:email><itunes:name><![CDATA[Mark Davis]]></itunes:name></itunes:owner><itunes:author><![CDATA[Mark Davis]]></itunes:author><googleplay:owner><![CDATA[markdav@substack.com]]></googleplay:owner><googleplay:email><![CDATA[markdav@substack.com]]></googleplay:email><googleplay:author><![CDATA[Mark Davis]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Vibing for Viability: MVPs in These Agentic Times]]></title><description><![CDATA[I was inspired to build Wikidown on our last trip to the beach.]]></description><link>https://www.marks.wiki/p/vibing-for-viability-mvps-in-these</link><guid isPermaLink="false">https://www.marks.wiki/p/vibing-for-viability-mvps-in-these</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Thu, 23 Apr 2026 00:31:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5bF1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5bF1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5bF1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!5bF1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!5bF1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!5bF1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5bF1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7072931,&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://www.marks.wiki/i/195186308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5bF1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 424w, https://substackcdn.com/image/fetch/$s_!5bF1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 848w, https://substackcdn.com/image/fetch/$s_!5bF1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 1272w, https://substackcdn.com/image/fetch/$s_!5bF1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb91435ae-3d3c-4bd0-a975-014919a9446c_2752x1536.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Sometimes you just want to update the docs. You spot a typo in a readme, or a feature behavior changes, and you want to fix it without ceremony. You don&#8217;t want to clone the repository, spin up a local environment, or think that hard.  I was on a trip to the beach with only my tablet, so i thought I&#8217;d build a tool between hikes.</p><p>We have great tools for personal knowledge bases. Notion is excellent for team wikis. Obsidian is perfect for your private vault. But project documentation belongs in the repository, right next to the code it describes. Less is more, just give me quick access.</p><p>That is the problem Wikidown solves. It is a markdown wiki that lives in the /docs folder of your repository. But more importantly, it is a product of how software gets built right now.</p><h2>The Outer Loop</h2><p>We are in the agentic engineering era, and the workflow has changed. There is an outer loop and an inner loop.</p><p>The outer loop is for viability. You have an idea. You sit down with an AI agent and you vibe code. You work through concepts without digging into the syntax. You describe the shape of the thing, the agent writes the boilerplate, and you steer. You can get to a working Minimum Viable Product in a weekend.</p><p>That is exactly how Wikidown was built. The entire core logic, the CLI, the MCP server, and the Blazor editor were scaffolded in a vibing phase. The agent did the typing. I did the thinking.</p><p>When the MVP is complete, you pass it off to the inner loop. That is where the developer gets hands-on, refactoring, fixing the edge cases, and hardening the deployment topology. This post is the handoff moment. The vibing phase is done. Here is what came out of it: <a href="https://wikidown.org/">Wikidown.org</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hEZG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hEZG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 424w, https://substackcdn.com/image/fetch/$s_!hEZG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 848w, https://substackcdn.com/image/fetch/$s_!hEZG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 1272w, https://substackcdn.com/image/fetch/$s_!hEZG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hEZG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png" width="1456" height="962" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:962,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:681161,&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://www.marks.wiki/i/195186308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hEZG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 424w, https://substackcdn.com/image/fetch/$s_!hEZG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 848w, https://substackcdn.com/image/fetch/$s_!hEZG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 1272w, https://substackcdn.com/image/fetch/$s_!hEZG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48cdb785-cf3e-4c09-8cfe-cbc05725800e_2360x1560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The Spec is the Guardrail</h2><p>Wikidown is not just a web editor. It is a set of guardrails that make your documentation equally useful to humans and AI.</p><p>Without those guardrails, a /docs folder is just a pile of markdown files. An AI agent might read them, but it will not know how they relate to each other. It will break your links when it renames a file. It will ignore your ordering rules.</p><p>Wikidown fixes this by enforcing a strict, simple format specification. Page files use hyphenated titles on disk, like Release-Notes.md. Subpages live in a folder with the exact same base name next to the parent page. Ordering is controlled by a plain text .order file in each folder, listing one page base-name per line. And internal links use the title path, like /Getting-Started/Format, ignoring the hyphens and file extensions entirely. The <a href="https://github.com/markdav-is/Wikidown/blob/main/docs/Getting-Started/Format.md">full spec</a> is in the Wikidown docs.</p><p>This format happens to be 100% compatible with Azure DevOps Wiki, which is a nice bonus if you are already in that ecosystem. But the real value is that the spec gives the AI agent a mental model of your documentation.</p><h2>Deterministic Docs from Non-Deterministic Models</h2><p>Large Language Models are inherently non-deterministic. If you tell an agent to &#8220;update the docs,&#8221; it might rename a file, it might create a new folder, or it might just rewrite the README. You cannot build a reliable documentation system on vibes alone.</p><p>To enforce the spec, Wikidown ships a core library, a CLI, and a Model Context Protocol (MCP) server. These tools act as the deterministic bridge between the LLM and your file system.</p><p><code>dotnet tool install -g Wikidown.Mcp</code></p><p><code># wire into .mcp.json or .vscode/mcp.json</code></p><p>The MCP server exposes nine specific tools to the agent: read, write, list, move, delete, reorder, search, walk, and new. When you wire the Wikidown MCP server into Claude Code or Copilot, you are giving the agent a constrained API for the wiki.</p><p>If the agent wants to rename a page, it cannot just move the markdown file. It has to call the wiki_move tool, which deterministically renames the file, moves the subpage folder, and updates the parent .order file. The agent provides the intent; the MCP server enforces the rules. You get deterministic documentation behavior from a non-deterministic model, and you do not have to babysit it.</p><h2>The Editor and the Login</h2><p>For the humans, there is a Blazor WebAssembly Progressive Web App. You go to the site, connect your repository, and get a side-by-side markdown editor with live preview.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mT5Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mT5Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 424w, https://substackcdn.com/image/fetch/$s_!mT5Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 848w, https://substackcdn.com/image/fetch/$s_!mT5Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 1272w, https://substackcdn.com/image/fetch/$s_!mT5Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mT5Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png" width="1456" height="647" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48700d66-bc81-4659-830b-84652be83592_2725x1211.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:647,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146146,&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://www.marks.wiki/i/195186308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mT5Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 424w, https://substackcdn.com/image/fetch/$s_!mT5Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 848w, https://substackcdn.com/image/fetch/$s_!mT5Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 1272w, https://substackcdn.com/image/fetch/$s_!mT5Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48700d66-bc81-4659-830b-84652be83592_2725x1211.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Visit the <a href="https://wikidown.app/connect">Wikidown.app Connect</a> page. Sign in with GitHub, pick a repo, and go.</p><p>So the flow is simple: login with GitHub, pick a repo, do a quick edit. The OAuth proxy is a small Azure Functions app that handles the token exchange. The tokens stay in your browser&#8217;s localStorage. The backend never stores them, and it never sees your repository contents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!biOe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!biOe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 424w, https://substackcdn.com/image/fetch/$s_!biOe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 848w, https://substackcdn.com/image/fetch/$s_!biOe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 1272w, https://substackcdn.com/image/fetch/$s_!biOe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!biOe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png" width="1456" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:314263,&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://www.marks.wiki/i/195186308?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!biOe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 424w, https://substackcdn.com/image/fetch/$s_!biOe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 848w, https://substackcdn.com/image/fetch/$s_!biOe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 1272w, https://substackcdn.com/image/fetch/$s_!biOe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30daa2b1-23ae-4819-9852-f10eba1d3f95_2702x1555.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Wikidown editor connected to the markdav-is/wikidown repo. Markdown on the left, live preview on the right.</figcaption></figure></div><h2>Handoff</h2><p>The wiki eats its own dogfood. The Wikidown repository&#8217;s own /docs folder is a Wikidown wiki, edited through the CLI and the MCP server. That is the only honest way to know if the thing works.</p><p>The outer loop is done. The MVP is viable. Now we see how it holds up in the inner loop.  If you want to submit issues, the repo is open-source.</p>]]></content:encoded></item><item><title><![CDATA[Two Agents, One Afternoon]]></title><description><![CDATA[A short session with Claude Code and Github Copilot on the same project.]]></description><link>https://www.marks.wiki/p/two-agents-one-afternoon</link><guid isPermaLink="false">https://www.marks.wiki/p/two-agents-one-afternoon</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Sat, 14 Mar 2026 23:58:48 GMT</pubDate><enclosure url="https://api.substack.com/feed/podcast/190979367/6fb266baca4d478ec39b534635a40263.mp3" length="0" type="audio/mpeg"/><content:encoded><![CDATA[<p>The Ten Trees project is an Oqtane Blazor application I have been building for a tree mentorship program. It is a good test case for working with AI agents because it has real requirements, a real customer, and real BDD feature files that need to stay in sync with what the customer actually said in their last meeting.</p><p>This is a short video about a session where I had two agents running at the same time on different tasks in the same repo. Nothing exotic. Just a useful pattern worth showing.</p><h2>The Setup</h2><p>A new Oqtane release came out with page directive support. If you build Oqtane modules, you know the manual step this replaces: after scaffolding a module, you go into the admin panel and add a page for it by hand. Now you can put a directive in the module&#8217;s Index component and Oqtane creates the page automatically on startup.</p><p>That is the kind of feature that shows up under &#8216;Other&#8217; in a changelog and saves you ten minutes every time you start a new module for the rest of your life.</p><p>I wanted to get that directive into all five module index files in the Ten Trees repo. So I gave that task to Claude Code, pointed it at the repo, and let it go.</p><h2>Meanwhile</h2><p>We had just done a March check-in call with the Ten Trees customer. The zoom summary and full transcript were already sitting in the specs folder. While Claude Code was working on the directive task, I opened GitHub Copilot in agent mode and asked it to read the transcript, compare it against the existing BDD feature files, and flag anything that needed updating.</p><p>It did a proper gap analysis. Cohort management, tree mentors, educator roles, platform admin versus program admin. Most of what the customer said was already covered in the feature files. One scenario needed a minor update. The agent touched the project plan as well, which I did not ask for but was not wrong.</p><p>One file changed. I committed it and pushed to main.</p><h2>Skills</h2><p>Claude Code picked up the Oqtane module development skill from the repo automatically. That skill file lives at .claude/skills/kanban/SKILL.md and tells the agent what Oqtane module files look like, where things go, and to go pull the latest Oqtane source as a reference without tracking it.</p><p>That last part matters. The agent cloned the Oqtane framework repo to use as a reference, found the page directive pattern in the new release, and applied it consistently across all five modules. That is the kind of context that used to live in your head or in a README file nobody read before starting a new task.</p><p>I keep a few skills available at github.com/markdav-is/marks-skills. The accessibility and validation skill for Blazor and Bootstrap is useful. There is also a Kanban skill that manages a task list in the file system directly, which sounds odd but turns out to be faster for agent-heavy work than hitting an MCP server on every operation.</p><h2>The Pull Request</h2><p>Claude Code opened a PR when it was done. The change was four attribute lines across five files. For something this small I skipped the review step and merged it directly.</p><p>For a more substantial change the right move is to have the second agent review the first agent&#8217;s pull request. One checks the other&#8217;s work. That is a workflow worth building into the habit even when it feels like overkill, because the times it catches something are the times you are glad you did it.</p><h2>What This Is</h2><p>This is not a story about replacing developers or burning through tokens on autopilot. Both agents were working inside tools I was already using, on tasks I already knew how to do. The agents handled the execution so I could be thinking about something else while the work was getting done.</p><p>When I launched the app after the merge, the pages showed up at the top of the screen. One for each module. That is a small thing. The Ten Trees customer can now add a village named Sherwood and a contact named Mark without me having to configure a nav menu by hand. Small things add up.</p><p>Catch you next time.</p>]]></content:encoded></item><item><title><![CDATA[KanBanLess: The Kanban Board That Lives in Your File System]]></title><description><![CDATA[Less is more. A project management tool that knows its place.]]></description><link>https://www.marks.wiki/p/kanbanless-the-kanban-board-that</link><guid isPermaLink="false">https://www.marks.wiki/p/kanbanless-the-kanban-board-that</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Mon, 09 Mar 2026 05:14:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Zd7t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zd7t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zd7t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Zd7t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Zd7t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Zd7t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zd7t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2853616,&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://www.marks.wiki/i/190355077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zd7t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Zd7t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Zd7t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Zd7t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab55b866-4145-4a31-83c6-c895692c8481_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The Tool You Already Have Is Probably The Wrong One</h2><p>You&#8217;re a solo dev, or maybe a team of three. You ship code. And at some point someone suggested putting the work in Jira, or Linear, or Trello, or Notion, and now you have a second job: maintaining your project management system. The board has columns no one touches. The tickets have fields no one fills in. The integrations require credentials no one can find.</p><p>Meanwhile, your AI coding agent has no idea any of this exists. It can read your code, your tests, your commit history. It cannot read your Jira backlog. The thing that knows the most about your codebase has no idea what you&#8217;re trying to build next.</p><p>That&#8217;s not a workflow. That&#8217;s two workflows that don&#8217;t talk to each other.</p><h2>A Kanban Board Is Just Four Folders</h2><p>Here&#8217;s the whole idea: a Kanban board is a directory. Columns are subdirectories. Tasks are markdown files. You move a task by moving a file.</p><p>That&#8217;s it. No database. No server. No login screen. No pricing tier that unlocks the feature you actually need.</p><h2>How It Works</h2><p>The structure is deliberately boring:</p><p><code>my-project<br>  kanban<br>    backlog<br>      add-export-feature.md<br>    todo<br>      fix-auth-bug.md<br>    doing<br>      update-readme.md<br>    done<br>      initial-setup.md</code></p><p>Each task file is a markdown document with a little YAML frontmatter at the top:</p><p><code>---<br>id: fix-auth-bug<br>title: Fix auth token expiry bug<br>created: 2025-03-01<br>priority: high<br>---<br>## Notes<br>Token refresh fails silently after 24h.<br>## Checklist<br>- [ ] Reproduce the bug<br>- [ ] Trace token refresh path<br>- [ ] Write a failing test<br>- [ ] Ship the fix</code></p><h2>The Agent Angle</h2><p>This is where things get interesting. Your AI agent already knows how to read files, write files, and move files around. It does this all day for your source code. KanBanLess just extends that to your task board.</p><p>Drop a SKILL.md file into .claude/skills/kanban/ or .github/skills/kanban/ and your agent now has the full API: how to read the board, how to create a task, how to move one, how to mark checklist items done. No MCP server. No plugin marketplace. No API key to rotate. Just a text file describing a convention.</p><p>The agent that just fixed your bug can, in the same session, move that task to done. The thing managing your code can manage your board. They&#8217;re the same file system.</p><h2>Git Is Your History</h2><p>Commit your .kanban/ directory alongside your code. Now task movement shows up in your diffs. A PR description can reference a task file directly. You can see exactly when something moved from doing to done, and what commit caused it. Your project history and your task history are the same history.</p><p>No integrations. No webhooks. No &#8220;connect your GitHub to your project management tool&#8221; dance.</p><h2>There&#8217;s a CLI Too</h2><p>For people who prefer typing to folder-browsing, there&#8217;s a cross-platform .NET global tool:</p><p><code>dotnet tool install -g KanBanLess<br>kanban add &#8220;Ship the thing&#8221;<br>kanban move fix-auth-bug doing<br>kanban list todo</code></p><p>If you&#8217;re not in a .NET environment, the bash fallback is four functions and a mv command. The whole thing fits in your .bashrc.</p><h2>What&#8217;s Coming</h2><p>A desktop client is in the works. Drag-and-drop columns, offline-first, reading the exact same files on disk. No sync conflicts because there&#8217;s no server to sync with. The file system is the database, and it&#8217;s already on your machine.</p><p>The desktop client is optional. The system works without it. That&#8217;s sort of the whole point.</p><h2>Try It</h2><p>The repo is at <a href="https://github.com/markdav-is/KanBanLess">github.com/markdav-is/KanBanLess</a>. Drop the skill file into your next project, point your agent at it, and see what happens when your board lives where your code lives.</p><p>The tools that don&#8217;t get in the way are the ones you keep using. Most project management software forgets that. KanBanLess is trying to remember it.</p><p><em>Less is more.</em></p>]]></content:encoded></item><item><title><![CDATA[A dotnet Template for Oqtane Modules]]></title><description><![CDATA[Make new Modules from the CLI without using the GUI admin tools.]]></description><link>https://www.marks.wiki/p/a-dotnet-template-for-oqtane-modules</link><guid isPermaLink="false">https://www.marks.wiki/p/a-dotnet-template-for-oqtane-modules</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Thu, 05 Mar 2026 02:54:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wQSd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wQSd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wQSd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!wQSd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!wQSd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!wQSd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wQSd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2796844,&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://www.marks.wiki/i/189943598?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wQSd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!wQSd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!wQSd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!wQSd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31938764-7b43-4e50-9692-69a8ade69a06_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you&#8217;ve built more than one Oqtane module, you know the drill. You fire up the web admin, walk through the module creation wizard, wait for the scaffolding to land in your solution, then spend the next twenty minutes cleaning up files and wiring things together the way you actually want them.</p><p>The wizard is fine, but if you&#8217;re doing this repeatedly, or on a machine without a running Oqtane instance handy, here&#8217;s a scriptable template.</p><h2>Before You Start: Official Application Template</h2><p>This is a module item template, not an Application template. If you are starting from scratch, you need an Application first. Oqtane shipped an official application template with the 6.2 release last year that sets up a proper Oqtane Application solution structure, complete with correct project references, and a working debug configuration. Get that stood up before you reach for the module template.</p><p>Official application template: <a href="https://www.oqtane.org/blog/!/128/oqtane-6-2-1-released">Oqtane 6.2.1 Released</a></p><p>Once your application solution exists, come back here.</p><h2>What It Does</h2><p>MarkDav.Oqtane.Module.Template is a <code>dotnet new</code> item template. Install it once, then scaffold a complete Oqtane module from the command line.</p><p><code>dotnet new install MarkDav.Oqtane.Module.Template</code></p><p><code>dotnet new oqtane-module -n MyModule --namespace MyCompany.MyModule</code></p><p>That produces the full stack: Client Blazor components, Services, an ASP.NET Core controller, EF Core DbContext with migrations, repository, shared entity model and interface, and more. Fifteen-plus files, ready to go, without clicking through anything.</p><h2>A Couple of Things Worth Noting</h2><p>The template tries to auto-detect your root namespace from the nearest .csproj file via MSBuild binding. If you&#8217;re running the command from inside a project directory, you can usually skip the --namespace flag entirely. If running from the solution folder, you need to set the --namespace flag manually.</p><p>There&#8217;s also no IServerStartup class generated. Oqtane auto-registers services that implement its service marker interfaces, so you don&#8217;t need one. This trips up a lot of newcomers because older examples and tutorials generate that class by default and then people spend time debugging registration problems that shouldn&#8217;t exist.</p><h2>Remix to your own flavor</h2><p>This template follows the official Oqtane module template. My goal was to make module creation scriptable. The positive upshot is that you can fork this repo and template your custom module choices.</p><h2>Links</h2><p>NuGet: <a href="https://www.nuget.org/packages/MarkDav.Oqtane.Module.Template">MarkDav.Oqtane.Module.Template</a></p><p>GitHub: <a href="https://github.com/markdav-is/Oqtane.Module">markdav-is/Oqtane.Module</a></p><p>Oqtane Framework: <a href="https://github.com/oqtane/oqtane.framework">oqtane/oqtane.framework</a></p>]]></content:encoded></item><item><title><![CDATA[Skiller: Teaching Your AI Agent to Remember]]></title><description><![CDATA[An open-source meta-skill that gives coding agents persistent memory]]></description><link>https://www.marks.wiki/p/skiller-teaching-your-ai-agent-to</link><guid isPermaLink="false">https://www.marks.wiki/p/skiller-teaching-your-ai-agent-to</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Sat, 21 Feb 2026 06:04:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Hn-t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>TL;DR</p><p>The repo is at <a href="http://github.com/markdav-is/Skiller">github.com/markdav-is/Skiller</a>. MIT licensed. The install takes about thirty seconds. If your agent has ever forgotten something you wish it hadn&#8217;t, give it a look.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hn-t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hn-t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hn-t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hn-t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hn-t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hn-t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2800464,&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://www.marks.wiki/i/188688540?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hn-t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hn-t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hn-t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hn-t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5be6727e-1347-4bcc-8dc1-e42f5f0b3c63_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><p>Today&#8217;s AI coding agents&#8217; biggest drawback isn&#8217;t hallucinations or cost, but their lack of memory between sessions. Every developer faces this: you spend ages debugging, your AI figures out the fix, and life moves on. Weeks later, the same issue returns&#8212;yet the agent starts fresh, oblivious to past solutions.</p><p>This results in wasted effort, with valuable discoveries lost once a session ends. Team knowledge is scattered in heads, Slack threads, or cryptic code comments. Until AI agents gain persistent memory, maintain a shared troubleshooting log or update documentation to capture and reuse insights for future problems.</p><p>I built Skiller to fix this.</p><h2>What Skiller Does</h2><p>Skiller is an open-source tool that gives AI coding agents persistent memory by capturing significant discoveries&#8212;like debugging breakthroughs or complex fixes&#8212;during coding sessions. It stores these insights as structured markdown &#8220;skills,&#8221; which agents automatically load in similar situations, ensuring solutions are reused efficiently. Skiller requires minimal setup: just add it to your repository alongside agents like GitHub Copilot or Cursor.</p><p>By recording valuable knowledge directly from developer actions, Skiller replaces outdated wikis or runbooks, making information instantly accessible when relevant. For example, it documents tricky dependency resolutions so future developers receive immediate, step-by-step guidance, preventing repeated mistakes.</p><p>Skiller leverages modern AI agents&#8217; native skills systems, supporting progressive loading. As a &#8220;meta-skill,&#8221; it observes your workflow, extracts non-trivial solutions into skill files, and enables teams and projects to benefit from prior experience, promoting actionable and timely knowledge sharing.</p><h2>The Quality Problem</h2><p>Auto-generated documentation often leads to overloaded knowledge bases, filled with low-value entries that make it hard to find useful information. For instance, generic advice like &#8220;Restart the server if it crashes&#8221; adds clutter, while specific guidance such as &#8220;If service X fails with error Y, apply patch Z and restart only the affected module&#8221; is genuinely helpful.</p><p>Skiller combats this by evaluating every skill entry for reusability, specificity, and effectiveness before it&#8217;s saved. Only high-quality, actionable solutions are kept, ensuring the library remains practical and up-to-date.</p><p>The description field is optimized for semantic matching, allowing the system to understand user intent and surface relevant skills quickly. This focus ensures teams receive precise, actionable guidance when they need it most, rather than sifting through irrelevant content.</p><h2>How It Actually Works</h2><p>Skiller uses the Agent Skills standard. Skills live in a .github/skills/ directory in your repo. Each skill is a markdown file with YAML frontmatter describing what it does and when it applies. The agent reads these descriptions at startup and loads the full content when the situation matches.</p><p>The install is three curl commands. No dependencies, no build step, no npm install, no Docker container, no twelve-step onboarding ritual. Just markdown files dropped into your repo.</p><div class="pullquote"><p>Special Note to Claude users<br><a href="https://github.com/markdav-is/Skiller/blob/main/CLAUDE.md">Check the Claude Code specific readme</a></p></div><p><strong>macOS / Linux:</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;369000d4-ae3d-4ed0-8c0d-e4ce49806db5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">mkdir -p .github/skills/skiller .github/agents .github/prompts
curl -sL https://raw.githubusercontent.com/markdav-is/Skiller/main/SKILL.md \
-o .github/skills/skiller/SKILL.md
curl -sL https://raw.githubusercontent.com/markdav-is/Skiller/main/.github/agents/skiller.agent.md \
-o .github/agents/skiller.agent.md
curl -sL https://raw.githubusercontent.com/markdav-is/Skiller/main/.github/prompts/skiller.prompt.md \
-o .github/prompts/skiller.prompt.md</code></pre></div><p><strong>Windows (PowerShell):</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;29b97257-85fd-4cf2-9247-086756e5ce4e&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">New-Item -ItemType Directory -Force -Path .github\skills\skiller, .github\agents, .github\prompts
Invoke-WebRequest https://raw.githubusercontent.com/markdav-is/Skiller/main/SKILL.md `
-OutFile .github\skills\skiller\SKILL.md
Invoke-WebRequest https://raw.githubusercontent.com/markdav-is/Skiller/main/.github/agents/skiller.agent.md `
-OutFile .github\agents\skiller.agent.md
Invoke-WebRequest https://raw.githubusercontent.com/markdav-is/Skiller/main/.github/prompts/skiller.prompt.md `
-OutFile .github\prompts\skiller.prompt.md</code></pre></div><p>It works with GitHub Copilot in both VS Code and Visual Studio, Cursor, and any other agent that supports the .github/skills/ convention. Drop it in, start working. The skills accumulate over time.</p><h2>Standing on Shoulders</h2><p>Skiller originated as a fork of Claudeception, a project for Claude Code addressing similar challenges. To broaden its impact, I rebuilt Skiller for use with multiple AI agents, leveraging proven concepts like skill libraries. Research&#8212;including Voyager, CASCADE&#8217;s meta-skills, and Reflexion&#8212;shows that agents benefit from frameworks enabling learning and self-reflection. Skiller adapts these academic advances for practical use in software teams, turning theory into productivity.</p><p>One standout feature is Skiller&#8217;s recursive approach: agents continually build new skills from past experiences. As your team solves problems, Skiller captures valuable solutions as reusable skills, expanding the library over time. This process ensures agents become more effective with each task, streamlining future work and deployments.</p><h2>Who This Is For</h2><p>Skiller helps solo developers and teams avoid repeating past solutions by using AI-powered agents to record and share fixes for common problems. On teams, unique expertise is automatically distributed so everyone benefits from collective knowledge. For small civic organizations, Skiller ensures vital information isn&#8217;t lost when people leave, making onboarding faster and preserving operational know-how.</p><p>I&#8217;ve seen many government offices and nonprofits lose key processes when staff turn over. With Skiller, critical steps&#8212;like troubleshooting old payroll systems or handling quirks in reporting&#8212;are saved for new hires. While it can&#8217;t capture everything, Skiller makes retaining essential operational knowledge easier, helping small organizations remain resilient and efficient.</p><div><hr></div><p>The repo is at g<a href="http://ithub.com/markdav-is/Skiller">ithub.com/markdav-is/Skiller</a>. MIT licensed. The install takes about thirty seconds. If your agent has ever forgotten something you wish it hadn&#8217;t, give it a look.</p><p><em>The future of AI-assisted development is not agents that know everything. It is agents that remember what matters.</em></p>]]></content:encoded></item><item><title><![CDATA[From Conversations to Features: Using AI to Write Better Specs]]></title><description><![CDATA[A workflow for turning what people say into what gets built]]></description><link>https://www.marks.wiki/p/from-conversations-to-features-using</link><guid isPermaLink="false">https://www.marks.wiki/p/from-conversations-to-features-using</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Tue, 17 Feb 2026 17:54:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ThqA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ThqA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ThqA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ThqA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ThqA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ThqA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ThqA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2288422,&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://www.marks.wiki/i/188289578?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ThqA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ThqA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ThqA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ThqA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7768b93-3f01-47c3-b7f5-20948c218f3a_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My last post covered Bedlam from the developer&#8217;s side. This one&#8217;s for the PMs.</p><p><a href="https://www.marks.wiki/p/i-is-for-interview">ICECAP</a>: Interview, Codify, Extract, Compose, Assemble, Prove. Six steps, but PMs really own three of them. Interview starts it. Codify turns the conversation into specs. Prove closes the loop with a demo. The middle three, Extract through Assemble, are where developers and the AI do their work. You&#8217;ll see cards moving on the board. You don&#8217;t need to be in the kitchen for that part.</p><h2>Interview</h2><p>You know how to do this. Sit down with the stakeholder, have a conversation about what they need. In civic tech this is usually someone who&#8217;s been doing their job for twenty years and knows exactly what they want but has never had to say it in terms a computer understands. Fine. You&#8217;re not asking them to write requirements. You&#8217;re having a conversation.</p><p>Record it. Transcribe it. That transcript is more valuable than any traditional requirements doc because it has the customer&#8217;s actual words. Not what someone interpreted. Not what survived committee review. The real thing.</p><h2>Codify</h2><p>Take the transcript, feed it to an LLM, get Gherkin feature files back. Plain English, Given-When-Then format. This is where most people get it wrong, because left alone an LLM will generate everything it can think of. API endpoints. Database schemas. Non-functional requirements about response times. Stuff that&#8217;s technically correct but useless for what we need.</p><p>What we need is features we can explain back to the customer during Prove. Mrs. Rodriguez from Planning does not care about your REST endpoints.</p><p>So you constrain the prompt. Tell it: &#8220;Generate only functional behavioral specifications. Do not generate API endpoints, database schemas, performance benchmarks, or system architecture. Keep scenarios focused on user-visible behavior that can be demonstrated to the stakeholder.&#8221; You can also feed it the names and roles of the interviewees, reference existing features for context, and tell it what module this belongs to. More context in, better specs out.</p><p>The AI drafts. You review. Can you show this to the person you interviewed and have them follow it? If not, adjust and regenerate. This is iterative, not one-shot. Think of it like scoping a work order. You wouldn&#8217;t tell a contractor &#8220;build me a house.&#8221; You&#8217;d say what&#8217;s in scope and what&#8217;s not. Same deal. The AI will absolutely tile your bathroom ceiling if you don&#8217;t tell it that&#8217;s not part of the job.</p><h2>Tracking the Work</h2><p>Features map to kanban cards. Complex features with multiple scenarios become epics; individual behaviors become tasks. Same board you&#8217;ve always used, just fed by a better source. The difference is what&#8217;s on the cards. Instead of &#8220;as a user I want to upload files,&#8221; you get specific testable behaviors with acceptance criteria baked in. Given-When-Then IS the acceptance criteria. No ambiguity about what &#8220;done&#8221; means.</p><h2>Extract, Compose, Assemble</h2><p>Covered this in the Bedlam post. Short version: the AI extracts testable elements from the features, composes code and test bindings, assembles everything into a deployable package. Cards move across the board. Pipeline enforces coverage. Because your features are written in the customer&#8217;s language, the developers have clear direction instead of guessing what &#8220;intuitive interface&#8221; means.</p><h2>Prove</h2><p>This is the step most agile teams skip. You demo the working software to the person you interviewed. Not to a proxy. To the actual human who told you what they needed.</p><p>&#8220;Remember when you said contractors need to upload photos with GPS data? Here it is. Upload a photo, inspector gets notified. Forty-eight hours without a review, system flags it.&#8221; You&#8217;re reading the feature file back to them and they&#8217;re watching it work. The features are the demo script.</p><p>This is exactly why you told the AI to skip the API specs during Codify. Nobody from Public Works wants to watch you POST to /api/v2/permits/inspections/photos. You&#8217;d lose the room in seconds.</p><h2>Why This Matters</h2><p>Small civic orgs can&#8217;t afford eighteen months of requirements, development, and testing. By then the regs changed, the grant expired, or the department head retired. ICECAP compresses the timeline because the AI handles the grunt work. The time you used to spend writing specs now goes into the parts where human judgment matters: good interviews, thoughtful review, and proving it works to real people. Those are your three stops. Interview, Codify, Prove. The rest is machinery.</p><p>* * *</p><p><em>Interview people. Let AI draft the specs but keep them in the customer&#8217;s language. Track work on the board. Let the devs cook. Then prove it works. The AI doesn&#8217;t replace the PM. It replaces the busywork that kept you from doing the job that actually matters.</em></p>]]></content:encoded></item><item><title><![CDATA[BDD lightweight Feature Highlighter extension]]></title><description><![CDATA[Sometimes You Just Need the Highlighter]]></description><link>https://www.marks.wiki/p/bdd-lightweight-feature-highlighter</link><guid isPermaLink="false">https://www.marks.wiki/p/bdd-lightweight-feature-highlighter</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Fri, 30 Jan 2026 20:17:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7Ff-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>The extension: </em><a href="https://marketplace.visualstudio.com/items?itemName=MarkDavis.FeatureHighlighter">Feature Highlighter on VS Marketplace</a></p><p><em>The repo: </em><a href="https://github.com/markdav-is/Feature-Highlighter">GitHub - Feature-Highlighter</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7Ff-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7Ff-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7Ff-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7Ff-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7Ff-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7Ff-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3116810,&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://www.marks.wiki/i/186327190?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7Ff-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!7Ff-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!7Ff-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!7Ff-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F959dd0e9-312a-410a-b22c-16bbc06236e2_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve ridden the SpecFlow rollercoaster that lead to Reqnroll. Before that it was Cucumber. The BDD dream was always the same: write human-readable specs, generate tests, keep everyone on the same page. The reality was also always the same: developers hate writing Gherkin, and eventually the feature files become artifacts that nobody maintains.</p><p>But here&#8217;s the thing. In 2026, those feature files have become valuable again, just not for the reason we originally wrote them.</p><h2>The GenAI Context Problem</h2><p>I&#8217;ve written about my ICECAP workflow before. Interview stakeholders, transcribe, generate Gherkin features, generate code and tests in parallel. The feature files are the backbone of the whole operation. They&#8217;re the contract. The checklist. The pause point where you can verify the LLM understood what you need.</p><p>The features live in a Specs project alongside the code. They&#8217;re versioned. They&#8217;re human-readable. And critically, they give the LLM context about what the software is supposed to do.</p><p>When you&#8217;re working with Claude or any other LLM on a codebase, those Gherkin files are gold. They explain intent in plain English. They describe expected behaviors. They&#8217;re basically a requirements document that doesn&#8217;t lie, because it&#8217;s been verified against the actual code through tests.</p><p>Or at least, that&#8217;s the theory.</p><h2>The Two-Sided Problem</h2><p>I&#8217;m a longtime Reqnroll fan (n&#233;e SpecFlow). The extension does exactly what BDD extensions should do: syntax highlighting, step definition navigation, automatic binding generation. All the automation you need to practice BDD without wanting to throw your keyboard through a window.</p><p>But my new team hasn&#8217;t embraced BDD. We&#8217;re not running automated tests. That&#8217;s their prerogative. Different teams, different tools, different comfort levels.</p><p>This creates a problem on both ends. When I have Reqnroll installed, it&#8217;s doing its job: generating backing code for automated tests. Step definition skeletons. Test scaffolding. All the machinery of BDD automation. But we&#8217;re not using that machinery. So I&#8217;ve got generated code cluttering my PRs, noise everywhere. The extension is working exactly as designed, for a workflow we&#8217;re not following.</p><p>Meanwhile, my teammates who don&#8217;t have any extension installed? They open a feature file and see a wall of plain text. No color. No structure. The Given/When/Then keywords don&#8217;t stand out. The scenarios blur together. Reading unformatted Gherkin is like reading poetry as a paragraph. You lose the rhythm that makes it useful.</p><p>I still want the feature files. They&#8217;re too valuable as context documents for GenAI workflows. But I need a middle path.</p><h2>The Goldilocks Problem</h2><p>So I needed something in between. Not the full SpecFlow/Reqnroll extension with all its code generation. But not plain text files either, because reading unformatted Gherkin is like reading poetry as a wall of prose. You lose the structure.</p><p>The syntax highlighting matters. When you&#8217;re scanning a feature file, you need to see the Given/When/Then structure at a glance. You need the scenarios to stand out. You need to parse intent quickly. That&#8217;s true for humans reviewing the specs, and it&#8217;s true when you&#8217;re deciding which files to include in LLM context.</p><p>What I wanted was just the highlighter. No generation. No bindings. No build integration. Just pretty colors on .feature files so my team can read them without squinting.</p><h2>Vibes and Attribution</h2><p>So I did what any reasonable developer does in 2026: I vibe-coded it.</p><p>The Reqnroll extension is open source, which meant I could look at exactly how they do their syntax highlighting. Solid work. Well-structured. The kind of code that makes you appreciate that someone else solved this problem thoroughly.</p><p>I extracted the highlighting logic, wrapped it in a minimal VS extension, and published it. The whole thing took an afternoon. Most of that was fighting with the VSIX packaging, because of course it was.</p><p>The attribution matters. This isn&#8217;t my clever invention. This is standing on the shoulders of the Reqnroll team and extracting just the piece I needed. The extension readme says so explicitly. If you want the full BDD experience with test generation and binding navigation, go install Reqnroll. If you just want to read your feature files without a wall of monochrome text, this is the lighter option.</p><h2>The Actual Extension</h2><p>It&#8217;s called Feature Highlighter. You can find it on the Visual Studio Marketplace and the source is on GitHub. It does exactly one thing: syntax highlighting for .feature files.</p><p>I uninstall Reqnroll, install this instead, and the code generation stops. My teammates install it, and suddenly the feature files are readable. Everyone sees the same colored Gherkin. Nobody gets unwanted build artifacts.</p><h2>The Broader Point</h2><p>This is what strategic doing looks like in practice. I&#8217;m not trying to sell my team on adopting BDD and convince them of the value of feature files. My need was: readable feature files without extra generated code boating my PRs. My solution was: extract just the highlighting.</p><p>Sometimes the best engineering decision is the one that removes friction without requiring everyone else to change. The feature files stay in the repo. The LLM context stays intact. The team doesn&#8217;t have to learn new tooling. Everyone gets what they need.</p><p>That&#8217;s not revolutionary. That&#8217;s just pragmatism. But pragmatism is underrated, especially when you&#8217;re trying to ship software for civic organizations that can&#8217;t afford six months of tooling debates.</p><p>* * *</p><p><em>The extension: </em><a href="https://marketplace.visualstudio.com/items?itemName=MarkDavis.FeatureHighlighter">Feature Highlighter on VS Marketplace</a></p><p><em>The repo: </em><a href="https://github.com/markdav-is/Feature-Highlighter">GitHub - Feature-Highlighter</a></p><p><em>The Reqnroll project (for the full BDD experience): </em><a href="https://reqnroll.net">reqnroll.net</a></p>]]></content:encoded></item><item><title><![CDATA[Plan Mode Without the Terminal]]></title><description><![CDATA[How to Get Claude Code's Best Feature Using GitHub Copilot in Visual Studio]]></description><link>https://www.marks.wiki/p/plan-mode-without-the-terminal</link><guid isPermaLink="false">https://www.marks.wiki/p/plan-mode-without-the-terminal</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Fri, 09 Jan 2026 18:21:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U0Ah!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U0Ah!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U0Ah!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!U0Ah!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!U0Ah!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!U0Ah!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U0Ah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1919010,&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://www.marks.wiki/i/184047957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!U0Ah!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!U0Ah!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!U0Ah!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!U0Ah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F604e1efe-990e-4bce-b2ec-b7569e685533_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve been around long enough to remember when Visual SourceSafe was state of the art. We&#8217;ve seen a lot of silver bullets come and go. UML diagrams that nobody maintained. Agile standups that turned into status meetings. DevOps pipelines that needed their own pipelines. Now we have AI coding assistants, and this time something actually works.</p><p>Claude Code has this plan mode feature that&#8217;s genuinely clever. It analyzes your codebase, creates an implementation plan, then waits for you to approve each step before executing. It&#8217;s a surgical checklist for code. Gawande would approve.</p><p>But maybe you&#8217;re in Visual Studio working on county systems that need to stay in the Microsoft ecosystem. Maybe your IT department hasn&#8217;t blessed another command line tool. Maybe you just want to use GitHub Copilot because it&#8217;s already there. Good news: you can get the same benefits. It takes a little discipline, but it works.</p><h2>Why You Need a Plan</h2><p>The default Copilot experience is conversational. You ask a question, it gives you code, you paste it in. This works fine for small things. But try adding a feature to an Oqtane module or refactoring a Blazor component hierarchy and watch it fall apart.</p><p>The problem isn&#8217;t the AI. The problem is you&#8217;re making it up as you go. The AI suggests something, you follow it, then three files later you realize you should have started somewhere else. You&#8217;re flying by eyesight in fog.</p><p>That Model 299 bomber was too complex to fly from memory, so they invented the checklist. Your codebase is the same way. You need pause points. You need a plan you can verify before you start.</p><h2>How Plan Mode Works</h2><p>Claude Code&#8217;s plan mode is simple: you describe what you want, it analyzes your workspace, generates a numbered list of steps, and stops. It waits. You can ask questions, request changes, approve it. Only then does it execute, one step at a time.</p><p>The forcing function is the point. You can&#8217;t skip the planning step. It&#8217;s like Strategic Doing, you have to say what you&#8217;re doing before you act. The action goes faster because the plan is clear.</p><h2>The Visual Studio Version</h2><p>Here&#8217;s the workflow. It gets you most of the way there.</p><h3><strong>Start with @workspace</strong></h3><p>Open the Copilot chat window. Type @workspace to let it see your whole solution. This matters. Without workspace context, Copilot is guessing.</p><p><em>@workspace Analyze the PermitModule. I need to add photo upload for contractors during site inspections.</em></p><h3><strong>Ask for a plan first</strong></h3><p>Don&#8217;t let it jump to code. Make it write the plan. Here&#8217;s your template:</p><p><em>@workspace Create a numbered plan with: (1) Files to modify, (2) Changes per file, (3) Dependencies between steps. Wait for my approval.</em></p><p>You&#8217;ll get something like this:</p><p><em>1. Create IPhotoService interface</em></p><p><em>2. Implement PhotoService with file storage</em></p><p><em>3. Add PhotoUploadComponent.razor with GPS metadata</em></p><p><em>4. Update PermitController endpoint</em></p><p><em>5. Add database migration for PermitPhoto table</em></p><h3><strong>Review and fix the plan</strong></h3><p>This is your pause point. Read it. Does it make sense? Did it miss anything? Push back if you need to:</p><p><em>We use local file storage, not Azure. Also add notification to inspectors when photos upload. Revise the plan.</em></p><p>Copilot will update it. Keep going until you&#8217;re satisfied.</p><h3><strong>Execute one step at a time</strong></h3><p>Don&#8217;t say &#8220;do the plan.&#8221; Say &#8220;implement step 1.&#8221; Review the code. Commit. Then &#8220;implement step 2.&#8221; Keep the chat window open. That&#8217;s your state.</p><p><em>Implement step 1</em></p><p>Copilot generates the interface. You look at it. If it&#8217;s good, commit and keep going. If not, iterate. &#8220;Add GPS coordinate properties to UploadPhotoRequest.&#8221;</p><h3><strong>Use the shortcut commands</strong></h3><p>After a step, use /fix for compiler errors or /tests to generate unit tests. These are fast and don&#8217;t mess up your main plan.</p><h2>What&#8217;s Different</h2><p>The big difference: Copilot won&#8217;t execute anything without you. This is actually good. You&#8217;re the forcing function. Every step needs your go ahead. It&#8217;s more manual but safer. The AI never runs wild in your codebase.</p><p>The chat window is your plan document. Keep it open and you have the full context and sequence. Close it and you lose that state. So leave it open. Treat it like an open file.</p><p>Claude Code can execute steps after you approve the plan. With Copilot you drive every single action. More work, more control.</p><h2>When to Use This</h2><p>Use it when things get complex. Adding a feature that touches multiple files. Refactoring a Blazor component tree. Migrating data structures. Integrating a new service.</p><p>Skip it for simple stuff. Fixing a typo. Adding one property to a class. Basic search and replace tasks.</p><p>The forcing function matters when the task is complex enough that thinking through the steps first actually helps. If you already know what to do, just do it.</p><h2>How This Fits Into Bedlam and ICECAP</h2><p>If you know about the Bedlam workflow (BDD + LLM = controlled chaos), this is the same idea. We believe in forcing AI into proven structures. This Copilot workflow is the manual version.</p><p>Bedlam generates Gherkin features from transcripts, then generates code and tests in parallel. Everything flows from the features file. The LLM can&#8217;t wander because the BDD structure constrains it.</p><p>This Copilot workflow is smaller scale but same philosophy. You constrain the AI by making it produce a plan first. The plan becomes your checklist. You execute one item at a time. The AI fills in the blanks but the structure holds.</p><p>Not full Bedlam automation. You still manually approve each step. But same principles. Checklists work. Pause points work. Constraints make AI useful instead of chaotic.</p><h2>Tips That Actually Help</h2><p><strong>Be specific up front.</strong> Don&#8217;t say &#8220;add photo uploads.&#8221; Say &#8220;add photo uploads for contractors during permit inspections, GPS metadata in database, file storage in /App_Data/PermitPhotos.&#8221;</p><p><strong>Reference the plan by number.</strong> When you say &#8220;implement step 3&#8221; Copilot knows what you mean. It just made that plan. If you say &#8220;add the photo component&#8221; it might forget the GPS part you talked about.</p><p><strong>Commit between steps.</strong> Git is your safety net. If step 4 goes wrong you revert to step 3 without losing steps 1-3.</p><p><strong>Break big plans into chunks.</strong> Got a 12 step plan? Maybe do steps 1-4 then reassess. Plans change as you learn. Don&#8217;t commit to all 12 before you know if 1-4 work.</p><p><strong>Keep the chat open.</strong> The Copilot chat is your working memory. Need to walk away? Leave it open. When you come back you&#8217;ll remember where you were.</p><h2>The Real Point</h2><p>The value isn&#8217;t that Copilot writes better code. It&#8217;s that you have a better plan before you start. You thought through the dependencies. You know which files change. You spotted the risky parts.</p><p>That&#8217;s what checklists do. They make you pause and think instead of just reacting. The Model 299 bomber didn&#8217;t need fancy autopilot. It needed pilots who remembered to unlock the elevator controls before takeoff. The checklist made sure they did.</p><p>Your Blazor app doesn&#8217;t need sentient AI. It needs you to think through the implementation before you start. This workflow makes you do that. The AI makes it faster once you have a plan.</p><h2>Where This Goes</h2><p>This manual workflow is a bridge. Eventually we want the full Bedlam pipeline. Transcripts to features to parallel generation of tests and code. All living in the repo together. Enforced by CI/CD.</p><p>We&#8217;re not there yet. That&#8217;s fine. We&#8217;re learning what works. Building the habits. Getting comfortable with LLMs as tools that need structure, not magic wands.</p><p>Small civic organizations can&#8217;t afford six month development cycles. They need working software in weeks. This workflow collapses that timeline. Interview the stakeholders. Generate the plan. Execute the plan. Deploy.</p><p>The economics work. Our competitors will figure this out. We should figure it out first.</p><h2>Try It</h2><p>You don&#8217;t need Claude Code to get the benefits. You need discipline. Force the AI to make a plan. Review it. Execute step by step. Commit between steps. Keep your chat open.</p><p>The AI fills in implementation details fast. But the forcing function, the checklist, the pause points, that&#8217;s what makes it actually helpful instead of just fast and wrong.</p><p>Gawande was right about checklists. Strategic Doing is right about pause points. Bedlam is right about constraining LLMs. This is the manual version. The principles hold. Give it a shot.</p>]]></content:encoded></item><item><title><![CDATA["Bedlam" Technique for using LLMs with BDD]]></title><description><![CDATA[BDD + LLM = Bedlam]]></description><link>https://www.marks.wiki/p/bedlam-technique-for-using-llms-with</link><guid isPermaLink="false">https://www.marks.wiki/p/bedlam-technique-for-using-llms-with</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Wed, 07 Jan 2026 00:53:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sUcb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Bedlam</strong> (noun): Chaos, uproar, confusion.</p><p>In our context: <strong>BDD + LLM</strong> = Bedlam. The controlled chaos of coding with an LLM, but within the rigid constraints of Behavior-Driven Development.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sUcb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sUcb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sUcb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sUcb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sUcb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sUcb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1981621,&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://www.marks.wiki/i/183710920?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sUcb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sUcb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sUcb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sUcb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb69a8f7-0ea4-4061-be8b-520459769c51_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>BDD has been around for a while, first in Java with Cucumber, and then C# using SpecFlow (now Reqnroll). I&#8217;ve forced it on my teams with various degrees of success over the years. The difference this time is that AI genuinely speeds things up. We get the specs without having to write them, and that&#8217;s easier for devs to accept. If we want to avoid vibe-coding and be more controlled with out AI efforts, then having specs as context is the way.</p><h1>Constraints and Context</h1><p>You can&#8217;t trust LLMs to run wild. Just like airplanes are too complex for any one pilot to maintenance from memory alone, they need checklists. Modern software features are too complex for any one developer to hold in their head, or for an LLM to wing it without structure.</p><p>Saying &#8220;don&#8217;t use AI&#8221; is no more an answer than telling people not to fly complex aircraft. The solution lies in using checklists: lists of features and the behaviors associated with them. By employing these lists, we guide the LLM to accomplish specific tasks effectively.</p><p>BDD gave us that structure decades ago. Gherkin features are human-readable contracts. They&#8217;re testable. They&#8217;re versioned. They live with the code in the repo. But just like test, they are onerous to create and maintain. The LLM makes it feasible to write them without developers revolting.</p><h1>How It Actually Works</h1><p>This is the first two steps in the ICECAP process. I&#8217;ll post more about that process as we go.</p><p>Interview the stakeholders (that&#8217;s the &#8220;I&#8221; in ICECAP), transcribe the audio, generate Gherkin features and behaviors from the transcript.</p><p>After the Interview, we codify the specs (that&#8217;s the &#8220;C&#8221; in ICECAP) as follows:</p><p>Old Human Tasks: Take notes in the meeting, mentally extract features, dream up individual behaviors for each feature. Spend the rest of the day typing.</p><p>New Human Tasks: Record the meeting, generate a transcription as VTT file (adds timestamps). Note: this is different from an AI generated meeting summary.</p><p>LLM Prompt: &#8220;Generate BDD features and behaviors from this meeting transcript. Include the timestamps in the comments for each.&#8221;</p><p>The timestamp is an added bonus if you ever want to review what was actually said. LLMs make lots of mistakes, and point back to the ground-truth is always smart.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F8UL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F8UL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 424w, https://substackcdn.com/image/fetch/$s_!F8UL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 848w, https://substackcdn.com/image/fetch/$s_!F8UL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 1272w, https://substackcdn.com/image/fetch/$s_!F8UL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F8UL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png" width="1354" height="1556" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1556,&quot;width&quot;:1354,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F8UL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 424w, https://substackcdn.com/image/fetch/$s_!F8UL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 848w, https://substackcdn.com/image/fetch/$s_!F8UL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 1272w, https://substackcdn.com/image/fetch/$s_!F8UL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5cbf1c0-71c0-478b-af68-e8f44f406529_1354x1556.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Nothing revolutionary. Nothing you couldn&#8217;t do manually. But here&#8217;s what changes: we actually do it. The LLM removes the friction that made developers skip the BDD part.</p><h1>A Real Example</h1><p>County needs contractors to upload site photos during permit inspections. Photos need GPS metadata. Inspectors approve or reject within 48 hours. Standard government work.</p><p>The interview generates this kind of transcript:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1zaO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1zaO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 424w, https://substackcdn.com/image/fetch/$s_!1zaO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 848w, https://substackcdn.com/image/fetch/$s_!1zaO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 1272w, https://substackcdn.com/image/fetch/$s_!1zaO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1zaO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png" width="1355" height="1408" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1408,&quot;width&quot;:1355,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1zaO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 424w, https://substackcdn.com/image/fetch/$s_!1zaO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 848w, https://substackcdn.com/image/fetch/$s_!1zaO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 1272w, https://substackcdn.com/image/fetch/$s_!1zaO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03b24d4b-aaea-4268-94fb-a2ed45bf01c3_1355x1408.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Feed that to an LLM, get Gherkin features that live in the repo alongside the code. Push this up to your repo.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Mmmn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mmmn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 424w, https://substackcdn.com/image/fetch/$s_!Mmmn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 848w, https://substackcdn.com/image/fetch/$s_!Mmmn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 1272w, https://substackcdn.com/image/fetch/$s_!Mmmn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mmmn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png" width="1048" height="1053" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1053,&quot;width&quot;:1048,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:245969,&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://www.marks.wiki/i/183710920?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Mmmn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 424w, https://substackcdn.com/image/fetch/$s_!Mmmn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 848w, https://substackcdn.com/image/fetch/$s_!Mmmn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 1272w, https://substackcdn.com/image/fetch/$s_!Mmmn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6da4fd2-15a6-4c6a-9aad-4ab31851d369_1048x1053.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Why This Actually Works</h1><p>Traditional BDD failed because nobody wanted to write Gherkin. It was tedious busywork that got skipped. The code and tests drifted from the specs. The specs collected dust.</p><p>LLMs make Gherkin free. More than free&#8212;they make it the most reliable artifact because everything else generates from it. The features stay in sync because they&#8217;re the source.</p><p>The constraint is the value. By forcing the LLM into BDD structure, we get testable requirements, living documentation. The LLM can&#8217;t wander off into creative nonsense because it&#8217;s boxed in by a proven methodology.</p><h1>The Learning Loop</h1><p>Strategic doing taught us that action plans aren&#8217;t enough; you need a learning loop. This workflow builds that in. Every meeting is a hypothesis about what the system should do. The features document what we learned.</p><h1>The Bigger Picture</h1><p>We didn&#8217;t generate any code here, but we&#8217;ll do so next time. I&#8217;ll make a video using this method and move forward with code generation. Having specs and code in the same repo lets you track changes together in one PR, showing the reasons for updates.</p>]]></content:encoded></item><item><title><![CDATA[Eugene Tech Scene 2025]]></title><description><![CDATA[Went a little crazy with the QR Codes]]></description><link>https://www.marks.wiki/p/eugene-tech-scene-2025</link><guid isPermaLink="false">https://www.marks.wiki/p/eugene-tech-scene-2025</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Thu, 23 Oct 2025 17:41:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!IDZn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IDZn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IDZn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 424w, https://substackcdn.com/image/fetch/$s_!IDZn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 848w, https://substackcdn.com/image/fetch/$s_!IDZn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!IDZn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IDZn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5251279,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IDZn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 424w, https://substackcdn.com/image/fetch/$s_!IDZn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 848w, https://substackcdn.com/image/fetch/$s_!IDZn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!IDZn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a142bde-1aef-4a49-a053-408c660d2544_2372x1336.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZNAY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZNAY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 424w, https://substackcdn.com/image/fetch/$s_!ZNAY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 848w, https://substackcdn.com/image/fetch/$s_!ZNAY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!ZNAY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZNAY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1690539,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZNAY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 424w, https://substackcdn.com/image/fetch/$s_!ZNAY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 848w, https://substackcdn.com/image/fetch/$s_!ZNAY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!ZNAY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7f4b448-75bd-4349-8736-7e98f1913204_2367x1328.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kRgF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kRgF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 424w, https://substackcdn.com/image/fetch/$s_!kRgF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 848w, https://substackcdn.com/image/fetch/$s_!kRgF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!kRgF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kRgF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1697474,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kRgF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 424w, https://substackcdn.com/image/fetch/$s_!kRgF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 848w, https://substackcdn.com/image/fetch/$s_!kRgF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 1272w, https://substackcdn.com/image/fetch/$s_!kRgF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655dd3a1-2f1e-41fb-8b9a-8e10ef46b7c1_2368x1328.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3h4u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3h4u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 424w, https://substackcdn.com/image/fetch/$s_!3h4u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 848w, https://substackcdn.com/image/fetch/$s_!3h4u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!3h4u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3h4u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png" width="1456" height="823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:823,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1359696,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3h4u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 424w, https://substackcdn.com/image/fetch/$s_!3h4u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 848w, https://substackcdn.com/image/fetch/$s_!3h4u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!3h4u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F206d8394-d226-4f2c-91f0-bffdf6e981a9_2364x1336.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KULw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KULw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 424w, https://substackcdn.com/image/fetch/$s_!KULw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 848w, https://substackcdn.com/image/fetch/$s_!KULw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 1272w, https://substackcdn.com/image/fetch/$s_!KULw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KULw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1264354,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KULw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 424w, https://substackcdn.com/image/fetch/$s_!KULw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 848w, https://substackcdn.com/image/fetch/$s_!KULw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 1272w, https://substackcdn.com/image/fetch/$s_!KULw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F672ef2b3-9232-4cc6-ae2d-bcc06cebbf5b_2370x1329.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zn_b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zn_b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 424w, https://substackcdn.com/image/fetch/$s_!Zn_b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 848w, https://substackcdn.com/image/fetch/$s_!Zn_b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 1272w, https://substackcdn.com/image/fetch/$s_!Zn_b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zn_b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1611416,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zn_b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 424w, https://substackcdn.com/image/fetch/$s_!Zn_b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 848w, https://substackcdn.com/image/fetch/$s_!Zn_b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 1272w, https://substackcdn.com/image/fetch/$s_!Zn_b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70331815-326c-4334-ae72-32d07f0f0724_2368x1334.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v5Tl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v5Tl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 424w, https://substackcdn.com/image/fetch/$s_!v5Tl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 848w, https://substackcdn.com/image/fetch/$s_!v5Tl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 1272w, https://substackcdn.com/image/fetch/$s_!v5Tl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v5Tl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1697774,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!v5Tl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 424w, https://substackcdn.com/image/fetch/$s_!v5Tl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 848w, https://substackcdn.com/image/fetch/$s_!v5Tl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 1272w, https://substackcdn.com/image/fetch/$s_!v5Tl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b110e9b-f8f3-452c-9082-8ed016ba8576_2373x1331.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QWL7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QWL7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 424w, https://substackcdn.com/image/fetch/$s_!QWL7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 848w, https://substackcdn.com/image/fetch/$s_!QWL7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!QWL7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QWL7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png" width="1456" height="821" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:821,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2278602,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QWL7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 424w, https://substackcdn.com/image/fetch/$s_!QWL7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 848w, https://substackcdn.com/image/fetch/$s_!QWL7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 1272w, https://substackcdn.com/image/fetch/$s_!QWL7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa402da05-4094-402c-b3ad-da70262bb6c7_2370x1336.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!et5t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!et5t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 424w, https://substackcdn.com/image/fetch/$s_!et5t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 848w, https://substackcdn.com/image/fetch/$s_!et5t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 1272w, https://substackcdn.com/image/fetch/$s_!et5t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!et5t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2187647,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!et5t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 424w, https://substackcdn.com/image/fetch/$s_!et5t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 848w, https://substackcdn.com/image/fetch/$s_!et5t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 1272w, https://substackcdn.com/image/fetch/$s_!et5t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4021102a-670a-4139-ac79-d46b80826c49_2368x1331.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lYAE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lYAE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 424w, https://substackcdn.com/image/fetch/$s_!lYAE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 848w, https://substackcdn.com/image/fetch/$s_!lYAE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 1272w, https://substackcdn.com/image/fetch/$s_!lYAE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lYAE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2722497,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lYAE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 424w, https://substackcdn.com/image/fetch/$s_!lYAE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 848w, https://substackcdn.com/image/fetch/$s_!lYAE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 1272w, https://substackcdn.com/image/fetch/$s_!lYAE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc7a1e85-f97c-4329-9040-7b5dea569b02_2369x1330.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MGXL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MGXL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 424w, https://substackcdn.com/image/fetch/$s_!MGXL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 848w, https://substackcdn.com/image/fetch/$s_!MGXL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 1272w, https://substackcdn.com/image/fetch/$s_!MGXL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MGXL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png" width="1456" height="822" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:822,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5630434,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MGXL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 424w, https://substackcdn.com/image/fetch/$s_!MGXL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 848w, https://substackcdn.com/image/fetch/$s_!MGXL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 1272w, https://substackcdn.com/image/fetch/$s_!MGXL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa61f8b30-9274-41f4-91f4-d0de952ef3b1_2367x1337.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Westish ATP - A Shop]]></title><description><![CDATA[Art Tech Play]]></description><link>https://www.marks.wiki/p/westish-atp-a-shop</link><guid isPermaLink="false">https://www.marks.wiki/p/westish-atp-a-shop</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Sat, 30 Aug 2025 17:26:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BrHN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I spent the last few weeks consolidating all my pre-covid projects (that have been in storage) into a new shop out on the west end of Eugene.  I don't have a grand mission for the shop. Unlike my previous spaces, this is not a coworking space or shared tool shop. It's private and closed most of the time.  I'm reconnecting with the folks I've worked with in the past to see what projects resonate today.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BrHN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BrHN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 424w, https://substackcdn.com/image/fetch/$s_!BrHN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 848w, https://substackcdn.com/image/fetch/$s_!BrHN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 1272w, https://substackcdn.com/image/fetch/$s_!BrHN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BrHN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157623,&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://www.marks.wiki/i/172351919?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BrHN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 424w, https://substackcdn.com/image/fetch/$s_!BrHN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 848w, https://substackcdn.com/image/fetch/$s_!BrHN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 1272w, https://substackcdn.com/image/fetch/$s_!BrHN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1459a5f3-c889-416d-b165-9a8836881100_2400x2400.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Activating public space with interactive art is one of my favorite endeavors. As I'm winding down my working career, I'm hoping to lean more into the art and less of the tech. I'm generally losing interest in gadgets and platforms as AI enshitifies everything it touches. Art and personal connections is the antidote to an increasingly uninteresting tech landscape. </p><p>The shop will be open for special events.  The first is a swap-meet of interesting things co-hosted with <a href="https://eugenemakerspace.com/upcoming-events/">Eugene Maker Space</a> coinciding with the <a href="https://www.instagram.com/warehousedistrictarthop/">Warehouse District Art Hop</a> first Saturday in September. This will be a good chance to recycle some gear into the community prior to sending it to Bring or the dump. </p><p></p>]]></content:encoded></item><item><title><![CDATA[Leapfrogging to the future: WebForms to Blazor]]></title><description><![CDATA[Modernizing Legacy Applications with Blazor]]></description><link>https://www.marks.wiki/p/leapfrogging-to-the-future-webforms</link><guid isPermaLink="false">https://www.marks.wiki/p/leapfrogging-to-the-future-webforms</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Tue, 18 Feb 2025 21:13:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1y9D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1y9D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1y9D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1y9D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1y9D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1y9D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1y9D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:267020,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1y9D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1y9D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1y9D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1y9D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c7c5f6-b23b-4142-8f57-14b647e73902_1792x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For many dotnet greybreards, WebForms was an interesting workhorse, transforming the way we build web applications using an event-driven model. It was a bridging technology for folks who knew WinForms but were new to the web. However, as technology evolves, so do the tools at our disposal and encountering legacy WebForm apps can be jarring. Enter Blazor, the modern successor to WebForms, promising an even more powerful and flexible way to develop web applications. This blog post delves into how Blazor is a natural progression from WebForms, drawing on the similarities in their control lifecycles, comparing the Blazor component model to WebForms UserControls, and exploring why Blazor is the ideal choice for modernizing legacy WebForms applications.</p><h2>The Evolution of WebForms to Blazor</h2><p>WebForms, introduced as part of the .NET 1.0 framework the same time as C#. It&#8217;s intent was to revolutionized web development with its abstraction over the stateless nature of web applications. It provided a rich set of server controls and an event-driven programming model that mimicked the desktop development experience. However, as the web matured, the need for more interactive and dynamic web applications grew, highlighting some of WebForms' limitations, such as view state management and page lifecycle complexities.</p><p>For this comparison, we will not be discussing Asp.Net MVC. Although it is still very popular, it is not a page-based technology. We will also exclude Razor Pages from this discussion, acknowledging that Blazor utilizes Razor templating. The "B" in Blazor stands for Browser based Razor. Instead, our focus will directly be on Blazor.</p><p>Blazor, part of the modern .NET ecosystem, addresses these limitations by leveraging C# to run .NET code anywhere in the stack, from server-side or directly in the browser. This modern framework offers a component-based architecture that fosters a more modular and maintainable codebase while providing the interactivity and performance demanded by today's applications.</p><h2>Similarities in Control Lifecycles</h2><p>One of the lucky similarities between WebForms and Blazor is their control lifecycles. In WebForms, the Page Life Cycle encompasses several stages, including initialization, load, postback handling, rendering, and unloading. Each control on the page participates in this lifecycle, processing events at specific stages.</p><p>Blazor's component lifecycle mirrors this structure with its own set of lifecycle methods, such as:</p><ul><li><p>OnInitialized - Similar to the Init() stage in WebForms, this method runs when the component is first initialized.</p></li><li><p>OnParametersSet - This method is invoked whenever the component&#8217;s parameters are set or changed, akin to handling postback data in WebForms or making changes in PreRender()</p></li><li><p>OnAfterRender - This method is called after the component has rendered, comparable to the Render() stage in WebForms but slightly later in the cycle.</p></li><li><p>Dispose - Analogous to the UnLoad() stage, this method is used to release resources when the component is no longer needed.</p></li></ul><h1>Blazor Components vs. WebForms UserControls</h1><p>WebForms UserControls allowed developers to encapsulate reusable pieces of UI and functionality, promoting code reuse and separation of concerns. UserControls interact with the rest of the application through properties and events.</p><p>Blazor elevates this concept with its component model. Blazor components, like UserControls, encapsulate UI and logic into reusable units. However, Blazor components offer enhanced flexibility and interactivity:</p><ul><li><p>Parameters - Blazor components use parameters to pass data and configure behavior. These parameters are specified using the [Parameter] attribute and can handle complex types, ensuring seamless data flow between parent and child components.</p></li><li><p>Event Handling - Blazor components can define methods to handle events, much like WebForms UserControls. However, Blazor's event handling is more powerful, supporting asynchronous methods and enabling more responsive applications.</p></li><li><p>Two-way Binding - Blazor supports two-way data binding, allowing changes in the UI to be reflected in the component's state and vice versa. This feature simplifies the development of interactive and dynamic applications.</p></li></ul><h1>Modernizing Legacy WebForms Applications with Blazor</h1><p>For those looking to modernize legacy WebForms applications, Blazor presents a compelling choice. The transition to Blazor offers several benefits:</p><ul><li><p>Lift-and-shift Migration - Blazor's component-based architecture and lifecycle methods provide a familiar development experience for WebForms developers, easing the learning curve.</p></li><li><p>Variable Interactivity - Blazor's ability to run .NET code in the browser through WebAssembly on real-time on the server thru sockets enables the creation of highly interactive and performant web applications. Blazor also supports fully static server-side rendering.</p></li><li><p>Unified Development - With Blazor, developers can use C# for both client-side and server-side logic, reducing the need to switch between languages and streamlining the development process.</p></li><li><p>Future-Proofing - Adopting Blazor ensures that applications are built on modern, supported technology, making them more maintainable and scalable in the long run.</p></li></ul><p>In conclusion, when dealing with legacy WebForms applications, rather than maintaining them unchanged or migrating to an entirely different platform, Blazor is your best option. Blazor represents the future of web development within the .NET ecosystem. Its parallels in lifecycle management, advanced component model, and suitability for modernizing legacy applications make it an ideal successor. Embrace the transition to Blazor to unlock numerous possibilities for your web applications.</p>]]></content:encoded></item><item><title><![CDATA[A StarBubble is forming!?]]></title><description><![CDATA[Getting ready for Global Game Jam]]></description><link>https://www.marks.wiki/p/a-starbubble-is-forming</link><guid isPermaLink="false">https://www.marks.wiki/p/a-starbubble-is-forming</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Wed, 22 Jan 2025 00:32:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2fx_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2fx_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2fx_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2fx_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2fx_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2fx_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2fx_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:164272,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2fx_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2fx_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2fx_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2fx_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45bbd38c-5e79-4a0e-9528-a777a04cdd27_1024x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In my youth, my preferred table-top game was a hex-based tactical space battle game. While it may not sound very exciting, it involved flying a ship around in space and engaging in battles. The main games were Star Fleet Battles and StarFire. This was before the widespread popularity of table-top gaming, when options included Monopoly, Stratego, and Sorry for family play, and Avalon-Hill bookcase games for more complex simulations like re-enacting WWII. There were no intermediate games such as Catan, Ticket-to-Ride or Wingspan.</p><p>Today, there is a significant increase in the variety of table-top games available. Occasionally, I reflect on those space battle games and wonder why more of them have not been adapted into PC games or online. Recently, I decided to explore how challenging it would be to create a hex-grid using CSS. Modern CSS proved effective, and with the help of a blog post about hex-math, I was able to develop something quickly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1axY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1axY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 424w, https://substackcdn.com/image/fetch/$s_!1axY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 848w, https://substackcdn.com/image/fetch/$s_!1axY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 1272w, https://substackcdn.com/image/fetch/$s_!1axY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1axY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png" width="983" height="815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/001918de-d07d-4856-847c-54887dfa36ce_983x815.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:983,&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;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1axY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 424w, https://substackcdn.com/image/fetch/$s_!1axY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 848w, https://substackcdn.com/image/fetch/$s_!1axY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 1272w, https://substackcdn.com/image/fetch/$s_!1axY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F001918de-d07d-4856-847c-54887dfa36ce_983x815.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In anticipation of the upcoming Global Game Jam event, I began considering the development of a project that would pay homage to classic games. Utilizing web technologies that I am proficient in could make for an engaging endeavor. My daily work involves programming, primarily creating content for the eLearning industry. With the rising popularity of &#8220;Gamification&#8221; in learning environments, I have developed several interactive modules that incorporate storytelling and animation elements more akin to game design than traditional eLearning courses. This appears to be an opportune moment to merge these skill sets and develop a game.</p><p>Yesterday, the theme for Global Game Jam was revealed. Although I doubted that &#8220;tactical space battle&#8221; would be selected, I was optimistic about finding a theme that could be adapted to my interests. The announced theme was &#8220;Bubble.&#8221; Initially, this did not seem particularly promising; however, I hoped that additional &#8220;diversifiers&#8221; might provide more direction. Unfortunately, this was not the case. Still, there were aspects related to open collaboration, which is something I value, so there remains potential.</p><p>Today, I finalized the name for the Jam edition of the game: &#8220;StarBubble.&#8221; While it may sound whimsical, it also holds potential. I set up an Oqtane site on one of the CodeChops web servers and initiated an open-source repository on GitHub. I installed modules for a blog and a wiki, as well as demonstration modules for Lottie Animations, Ink script execution, Hex-Grid implementation, and a sample control panel. Although substantive work on the game cannot commence until the team assembles on Friday, I am currently preparing the necessary tools for future development.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6Ug_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Ug_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 424w, https://substackcdn.com/image/fetch/$s_!6Ug_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 848w, https://substackcdn.com/image/fetch/$s_!6Ug_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 1272w, https://substackcdn.com/image/fetch/$s_!6Ug_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Ug_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png" width="1456" height="989" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:989,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6Ug_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 424w, https://substackcdn.com/image/fetch/$s_!6Ug_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 848w, https://substackcdn.com/image/fetch/$s_!6Ug_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 1272w, https://substackcdn.com/image/fetch/$s_!6Ug_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc9ec780-747e-4ac5-a386-712c06e9014c_1721x1169.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ll be making more blog posts and such about the game on the game site itself as part of the Jam.  That link should be http://starbubble.xyz when the jam starts.</p>]]></content:encoded></item><item><title><![CDATA[The Wreath of Kahn]]></title><description><![CDATA[His cheer is the superior way!]]></description><link>https://www.marks.wiki/p/wreath-of-kahn</link><guid isPermaLink="false">https://www.marks.wiki/p/wreath-of-kahn</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Thu, 05 Dec 2024 23:23:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fbd90a4e-33dd-40da-b1f7-6f0b010c4b80_1080x1079.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SWP8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SWP8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!SWP8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!SWP8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!SWP8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SWP8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76f3a34d-e937-4a54-98ac-eaa7690e72ea_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;:854213,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SWP8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!SWP8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!SWP8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!SWP8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f3a34d-e937-4a54-98ac-eaa7690e72ea_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 role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In a galaxy far removed from Earth, where the stars shone brilliantly and the nebulae painted the skies in hues unseen by human eyes, there was a space-faring genius named Khan Noonien Singh. Renowned for his unmatched intellect and unyielding determination, Khan was a figure of awe and fear. But on one frosty night, as the cosmic winds whispered through the void, Khan embarked on an unexpected journey&#8212;one that would forever intertwine his legacy with the spirit of Christmas.</p><p>From his ship, the stolen USS Reliant, Khan observed the myriad worlds celebrating the season with joy and unity. He saw the twinkling lights, the heartfelt exchanges, and the laughter that echoed through the corridors of every starship and colony. A thought, sparked by the memories of his own humanity, took root in his mind. What if, just for one night, he could use his unparalleled genius to spread Christmas cheer across the universe?</p><p>With a resolute nod, Khan set his plans into motion. Utilizing his advanced knowledge of engineering and spatial mechanics, he began refitting the USS Reliant. He transformed the powerful starship into a marvel of holiday magic. The once-intimidating vessel now gleamed with shimmering alloys and glowing runes, capable of traversing light-years in the blink of an eye.</p><p>He recruited a loyal team of followers, each inspired by his vision of a universe united in joy and kindness. These followers, with their diverse talents and unwavering dedication, were tasked with crafting gifts tailored to the unique desires of each species. From the crystalline structures of the Altarians to the bioluminescent flora of the Zogathians, no detail was overlooked.</p><p>On the eve of Christmas, Khan donned a regal crimson cloak, lined with stardust, that fluttered like angelic wings. As the USS Reliant lifted off, guided by his impeccable navigation systems, he marveled at the beauty of the cosmos. One by one, he visited the far-flung worlds, his followers dispersing gifts with precision and grace.</p><p>To the children of distant stars, he brought toys that sparked imagination and wonder. To the warriors of the Andromedan Nebula, he offered peace tokens that glowed with the promise of harmony. However, when he arrived at Earth, Khan was met with resistance. Despite his efforts, the people of Earth did not embrace his gifts and joyous vision. For this world, Khan had a special gift: the Genesis Project. This powerful technology could reorganize a planet's entire biosphere, transforming it into a paradise of Christmas cheer.</p><p>As the Genesis Project was deployed, Earth began to transform. The skies were filled with auroras of vibrant colors, snowflakes that twinkled like stars gently fell, and evergreen trees sprang up, adorned with ornaments of light. The once-resistant inhabitants reorganized into a new joyful matrix. The spirit of Christmas transformed them, fostering unity and kindness.</p><p>As the night drew to a close, Khan paused over the transformed Earth, its landscapes bathed in the soft glow of dawn. A sense of fulfillment warmed his heart, a rare respite from his usual iron will. In that moment, he realized that the true essence of Christmas wasn&#8217;t just in the gifts or the decorations, but in the connections forged and the joy shared.</p><p>Thus, Khan Noonien Singh, the once-feared genius, became a legend of Christmas. His tale of intellect turned to compassion spread across the stars, reminding all that even the most formidable beings could find redemption and joy in the simple act of giving.</p><p>And so, every year, as the galaxy celebrates Christmas, they do so with the knowledge that somewhere, among the stars, Khan watches over them, a guardian of cheer, a herald of hope and imposer of joy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3zcM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3zcM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 424w, https://substackcdn.com/image/fetch/$s_!3zcM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 848w, https://substackcdn.com/image/fetch/$s_!3zcM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!3zcM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3zcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png" width="1080" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:997914,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3zcM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 424w, https://substackcdn.com/image/fetch/$s_!3zcM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 848w, https://substackcdn.com/image/fetch/$s_!3zcM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!3zcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaeb3729-65a9-40f3-b8c0-3d87dc4a3809_1080x1079.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="pullquote"><p> (99% generated with AI on a silly afternoon)</p></div>]]></content:encoded></item><item><title><![CDATA[I is for Interview]]></title><description><![CDATA[Stakeholder interviews are the first step in the ICECAP process]]></description><link>https://www.marks.wiki/p/i-is-for-interview</link><guid isPermaLink="false">https://www.marks.wiki/p/i-is-for-interview</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Fri, 15 Nov 2024 20:48:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AMFg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AMFg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AMFg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AMFg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AMFg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AMFg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AMFg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:258471,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AMFg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AMFg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AMFg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AMFg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13bca969-9039-4239-8031-b6bbbda1284e_1792x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>"Starting is half finished," as the saying goes. However, beginning a project correctly is crucial for its success, and BDD is no exception. Here is a guide for conducting a Stakeholder Interview as part of <a href="https://www.marks.wiki/p/begin-the-discipline">The Discipline&#8217;s</a> ICECAP process.</p><p>The goal of interviewing stakeholders is to understand the problem from their perspective and inform the next steps in the process: Codifying the Specs. This workflow relies significantly on modern business tools, many of which are based on AI.</p><h2>Start with the end in mind</h2><p>"Thank you for meeting with me. Today, we will discuss the primary scenarios we aim to address through this project. I will be recording the meeting to review it in detail later and develop a comprehensive plan. If you consent to having this meeting recorded and summarized, we can proceed. [start AI summary and recording tools].</p><p>Hello, my name is Mark, and I am a Project Manager on The Project. Could you please provide your name and explain your job function in the context of The Project? [wait for response]</p><p>Thank you. Considering The Problem, what is the most common or significant work scenario you would like to address by creating The Project?"</p><p>This should initiate a productive conversation about the importance of The Problem and how The Project can resolve it, while simultaneously generating a detailed AI summary of the discussion as well as a comprehensive video record.</p><h2>Feed the Machine</h2><p>After your interview, copy the AI meeting summary into a new research document. Use a tool to transcribe the meeting; Slack offers free transcription when you upload a video. Add this transcription to the same document as the summary. Ensure the document is accessible to your AI tool. For instance, I upload mine to Office using Copilot. ChatGPT and other AI tools allow document uploading for paid tiers. The key feature of these tools is their ability to analyze documents.</p><h3>Personal Connection</h3><p>Stakeholder interviews are equally focused on building rapport and gathering requirements. Aim to maintain a conversational tone rather than an interrogative one. Your objective is to gain a deeper understanding of the stakeholder's perspective. Utilizing AI tools for later analysis allows you to be present during the meeting, rather than concentrating on taking notes. Recording the conversation enables you to include useful phrases that will be identified by AI subsequently. For instance, if the stakeholder mentions that something is important, you can reaffirm this by saying, &#8220;As a [role], you need to [perform an action] to [accomplish a goal].&#8221; Such comments can be verified by the stakeholder and assist in generating precise specifications for the next step of the ICECAP process: Codifying the Specs.</p><p> </p><p></p>]]></content:encoded></item><item><title><![CDATA[Custom Nostr verification using github pages]]></title><description><![CDATA[owning your own verification on the cheap.]]></description><link>https://www.marks.wiki/p/custom-nostr-verification-using-github</link><guid isPermaLink="false">https://www.marks.wiki/p/custom-nostr-verification-using-github</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Thu, 14 Nov 2024 02:02:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fd474e3a-418e-48c6-83fc-7862562f8546_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qvWq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qvWq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qvWq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qvWq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qvWq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qvWq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:185302,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qvWq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qvWq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qvWq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qvWq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee60d580-167e-4348-bc2f-202d41b03a3d_1024x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Recently, I discovered Nostr while experimenting with the OpenVibe app, which enables participation in Threads, Bluesky, and Mastodon. After integrating these three platforms, I noticed Nostr as an additional option. While I am not yet familiar with it, this discovery led me to explore further during my time at DotNet Conf.</p><p>My recent interest in RSS stems from its potential as a tool for publishing calendar events and comments for a meetup platform I am conceptualizing. Nostr appears to be the real-time chat equivalent of RSS, offering additional features. As an open platform, utilizing Nostr will require some technical expertise.</p><h2>Verification</h2><p>Nostr is an open platform, so it can be challenging to distinguish between bots and people. With no central authority to create a user, any user name can be made. To verify yourself (and obtain a checkmark next to your name), you need to be verified. There are many documents online that point to various crypto wallets and services capable of publishing your verified key. The crypto community is not interesting to me so I&#8217;m going to be independent.</p><p>For creating a mark@nostr.marks.wiki Nostr address, two things are needed: control over the DNS and a web server. GitHub Pages will be used for the web server.</p><p>When a user is created for the first time using any Nostr client, public and private keys are generated. It is important to write these down as they will be needed.</p><h2>Create the repo and pages</h2><p>Create a public repo for your site, turn on github pages, and add a /.well-known/nostr.json file.  Sorry, but I&#8217;m not going to explain that parts, ask Copilot. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tUmh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tUmh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 424w, https://substackcdn.com/image/fetch/$s_!tUmh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 848w, https://substackcdn.com/image/fetch/$s_!tUmh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 1272w, https://substackcdn.com/image/fetch/$s_!tUmh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tUmh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png" width="815" height="379" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:379,&quot;width&quot;:815,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25940,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tUmh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 424w, https://substackcdn.com/image/fetch/$s_!tUmh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 848w, https://substackcdn.com/image/fetch/$s_!tUmh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 1272w, https://substackcdn.com/image/fetch/$s_!tUmh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc81849d8-0710-43e9-b9cc-db5524da63d1_815x379.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can check the <a href="https://nostr.how/en/guides/get-verified">PIP </a>for the proper format.  That string of numbers is the hex equivalent of my public key.  Not sure why you need the hex version of the key. If you need to convert you key to hex, use this: https://damus.io/key/</p><p>This file should qualify for the certification procedure, but github pages will not automatically publish this file for you.  You need to tell it include this by adding a _config.yml file like so:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aRBi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRBi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 424w, https://substackcdn.com/image/fetch/$s_!aRBi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 848w, https://substackcdn.com/image/fetch/$s_!aRBi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 1272w, https://substackcdn.com/image/fetch/$s_!aRBi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRBi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png" width="464" height="300" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:464,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16875,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aRBi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 424w, https://substackcdn.com/image/fetch/$s_!aRBi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 848w, https://substackcdn.com/image/fetch/$s_!aRBi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 1272w, https://substackcdn.com/image/fetch/$s_!aRBi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F784ae472-8e56-431f-ba80-5cdc164a4b0e_464x300.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now we have the code in place, next is publishing it on the web.</p><h2>Domain wrangling</h2><p>Proving that you own your domains means having access to your DNS.  Github will want to verify your domain ownership and github pages will want to see some proof as well for your site.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mEE1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mEE1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 424w, https://substackcdn.com/image/fetch/$s_!mEE1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 848w, https://substackcdn.com/image/fetch/$s_!mEE1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 1272w, https://substackcdn.com/image/fetch/$s_!mEE1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mEE1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png" width="781" height="465" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f18b4ced-c82b-4c30-b233-205081fad162_781x465.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:465,&quot;width&quot;:781,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48656,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mEE1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 424w, https://substackcdn.com/image/fetch/$s_!mEE1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 848w, https://substackcdn.com/image/fetch/$s_!mEE1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 1272w, https://substackcdn.com/image/fetch/$s_!mEE1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff18b4ced-c82b-4c30-b233-205081fad162_781x465.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Deep in your github settings is a way to add a domain.  When you do, it gives you some instructions for creating a TXT record.  Follow those at your DNS host.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xY1h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xY1h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 424w, https://substackcdn.com/image/fetch/$s_!xY1h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 848w, https://substackcdn.com/image/fetch/$s_!xY1h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 1272w, https://substackcdn.com/image/fetch/$s_!xY1h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xY1h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png" width="904" height="273" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:273,&quot;width&quot;:904,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:23735,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xY1h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 424w, https://substackcdn.com/image/fetch/$s_!xY1h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 848w, https://substackcdn.com/image/fetch/$s_!xY1h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 1272w, https://substackcdn.com/image/fetch/$s_!xY1h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa25e4c5e-9d78-48eb-ad36-0624028d6278_904x273.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once this is set up, your repository also needs information about the specific domain that will host your website. Here is where I added the `nostr` subdomain to my page.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gcEr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gcEr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 424w, https://substackcdn.com/image/fetch/$s_!gcEr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 848w, https://substackcdn.com/image/fetch/$s_!gcEr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 1272w, https://substackcdn.com/image/fetch/$s_!gcEr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gcEr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png" width="531" height="172" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:172,&quot;width&quot;:531,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13128,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gcEr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 424w, https://substackcdn.com/image/fetch/$s_!gcEr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 848w, https://substackcdn.com/image/fetch/$s_!gcEr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 1272w, https://substackcdn.com/image/fetch/$s_!gcEr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2b93cb0-201f-4c72-bef8-3c0836cd71b3_531x172.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This part was a little tricky, but by digging in the docs I found the instructions that require this subdomain to point to your personal github URL.  [username].github.io.  </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SChm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SChm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 424w, https://substackcdn.com/image/fetch/$s_!SChm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 848w, https://substackcdn.com/image/fetch/$s_!SChm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 1272w, https://substackcdn.com/image/fetch/$s_!SChm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SChm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png" width="896" height="349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:349,&quot;width&quot;:896,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30116,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SChm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 424w, https://substackcdn.com/image/fetch/$s_!SChm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 848w, https://substackcdn.com/image/fetch/$s_!SChm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 1272w, https://substackcdn.com/image/fetch/$s_!SChm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c5528d9-334b-49d9-bc30-40ca4b566d60_896x349.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now, with all this in place, I should be able to test it by navigating to nostr.marks.wiki/.well-known/nostr.json</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yv3B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yv3B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 424w, https://substackcdn.com/image/fetch/$s_!Yv3B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 848w, https://substackcdn.com/image/fetch/$s_!Yv3B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 1272w, https://substackcdn.com/image/fetch/$s_!Yv3B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yv3B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png" width="814" height="149" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:149,&quot;width&quot;:814,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12619,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Yv3B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 424w, https://substackcdn.com/image/fetch/$s_!Yv3B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 848w, https://substackcdn.com/image/fetch/$s_!Yv3B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 1272w, https://substackcdn.com/image/fetch/$s_!Yv3B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d37f58-93aa-45a2-a064-ea70b4ad2521_814x149.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And with that tested I should be able to get verified by using mark@nostr.marks.wiki using any OpenVibe Client.</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Interactive Storytelling with Oqtane	]]></title><description><![CDATA[Last month I spoke at the Trail Blazor conference about build dynamic learning experiences.]]></description><link>https://www.marks.wiki/p/interactive-storytelling-with-oqtane</link><guid isPermaLink="false">https://www.marks.wiki/p/interactive-storytelling-with-oqtane</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Tue, 12 Nov 2024 20:07:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SkTc!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d3b086f-6f54-465a-a3ad-11cb2cc4c2db_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last month I spoke at the Trail Blazor conference about build dynamic learning experiences.</p><p><a href="https://youtu.be/bc7_zPEule8?si=dCNg4raGQlkoxqzv">https://youtu.be/bc7_zPEule8?si=dCNg4raGQlkoxqzv</a></p><p>Oqtane is built on Blazor that is part of <a href="http://Asp.Net">Asp.Net</a> so that's C# and dotnet core.  The TLDR; on intra-module communication in Oqtane is publishing and subscribing to events using INotifyPropertyChanged. </p><p>  </p>]]></content:encoded></item><item><title><![CDATA[SigZag: An alternative to Meetup]]></title><description><![CDATA[Special Interest Groups need a pay-what-you-can option for meetings]]></description><link>https://www.marks.wiki/p/sigzag-an-alternative-to-meetup</link><guid isPermaLink="false">https://www.marks.wiki/p/sigzag-an-alternative-to-meetup</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Fri, 08 Nov 2024 19:20:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/157f51a1-1de7-41dd-a047-e28db752f4f4_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As an early adopter of Meetup.com, I&#8217;ve started several local meetups and helped others do the same. My groups were Special Interest Groups with no budget and one or two leaders. I used to pay for the site out of pocket because the cost was reasonable. However, this year the price increased by 366.6%, which feels unreasonable.</p><h2>Crowded house?</h2><p>As a computer programmer, I often think "How hard could it be?" when I see a simple service failing. In-person meeting apps aren't great as a business model due to competition from platforms like Facebook. However, they can serve as a sustainable public benefit. My target market is small groups that have a core membership and want to organize meetings without relying on Facebook's free services.</p><h2>Hosted &amp; self-hosted options</h2><p>A self-hosting option will be available for those who want complete control over their data. Additionally, a hosted option will be provided at SigZag dot com for users who prefer simplicity.</p><h2>Revenue Model</h2><p>This project is being developed for both personal and wider use, but it will not be actively supported. The goal is to maintain focus on my current job without distraction. A revenue model will be needed to cover inexpensive hosting, customer support, and minor enhancements. As the target market consists of small groups, a pay-what-you-can model is considered suitable, allowing groups to contribute periodically to cover service costs. Support at this level will be "best effort". For those requiring more reliable guarantees and who have the budget, a paid option will be established in the future. Prioritizing current steps is essential.</p><h2>Features</h2><p>This project will serve as a blog for Behavior Driven Discipline and involve client interviews. As the first client, I believe we need the following:</p><ul><li><p>User accounts: Sign-in required for posting; public can view events without credentials.</p></li><li><p>Calendar of events: Any user can post events with ICal links for personal calendars.</p></li><li><p>Social media sharing: Integration with social media APIs; others use perma-links.</p></li><li><p>Groups: Create groups with unique URLs. Group creator is admin; membership levels include Followers, Members, Core, Admin. Meetings can be created at any level.</p></li><li><p>Moderation: Adhere to a code of conduct; use AI moderation if affordable, otherwise report-and-correct method.</p></li><li><p>Technical details: API protected by auth, RSS feeds for groups and calendar views to allow integration with other systems.</p></li></ul><p>A self-interview will be conducted in a future blog post as the initial step in creating this app publicly. This may take the form of a podcast.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Quotes from Earthseed: Books of the Living]]></title><description><![CDATA[Quotes from Octavia Butler's Parable of the Sower]]></description><link>https://www.marks.wiki/p/quotes-from-earthseed-books-of-the</link><guid isPermaLink="false">https://www.marks.wiki/p/quotes-from-earthseed-books-of-the</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Fri, 08 Nov 2024 00:37:45 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b9dd1f71-eb6d-4da3-bfd3-92fae14b43f0_1080x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h5>Here are the Earthseed quotes from "Parable of the Sower" by Octavia Butler</h5><p>"Prodigy is, at its essence, adaptability and persistent, positive obsession. Without persistence, what remains is an enthusiasm of the moment. Without adaptability, what remains may be channeled into destructive fanaticism. Without positive obsession, there is nothing at all."</p><p>"All that you touch You Change. All that you Change Changes you. The only lasting truth Is Change. God Is Change."</p><p>"A gift of God May sear unready fingers."</p><p>"We do not worship God. We perceive and attend God. We learn from God. With forethought and work, We shape God. In the end, we yield to God. We adapt and endure, For we are Earthseed, And God is Change."</p><p>"Intelligence is ongoing, individual adaptability. Adaptations that an intelligent species may make in a single generation, other species make over many generations of selective breeding and selective dying. Yet intelligence is demanding. If it is misdirected by accident or by intent, it can foster its own orgies of breeding and dying."</p><p>"A victim of God may, Through learning adaption, Become a partner of God. A victim of God may, Through forethought and planning, Become a shaper of God. Or a victim of God may, Through shortsightedness and fear, Remain God's victim, God's plaything, God's prey."</p><p>"Belief Initiates and guides action-Or it does nothing."</p><p>&#8220;Drowning people Sometimes die fighting their rescuers.&#8221;</p><p>&#8220;We are all Godseed, but no more or less so than any other aspect of the universe, Godseed is all there is-- all that Changes. Earthseed is all that spreads Earthlife to new earths. The universe is Godseed. Only we are Earthseed. And the Destiny of Earthseed is to take root among the stars.&#8221;</p><p>&#8220;To get along with God, Consider the consequences of your behavior.&#8221;<br><br>"Civilization is to groups what intelligence is to individuals. It is a means of combining the intelligence of many to achieve ongoing group adaptation. Civilization, like intelligence may serve well, serve adequately, or fail to serve its adaptive function. When civilization fails to serve, it must disintegrate unless it is acted upon by unifying internal or external forces.&#8221;</p><p>&#8220;When apparent stability disintegrates, As it must, God is Change. People tend to give in To fear and depression, To need and greed. When no influence is strong enough To unify people They divide. They struggle, One against one, Group against group, For survival, position, power. They remember old hates and generate new ones, They create chaos and nurture it. They kill and kill and kill, Until they are exhausted and destroyed, Until they are conquered by outside forces, Or until one of them becomes A leader Most will follow, Or a tyrant Most fear.&#8221;</p><p>&#8220;Any Change may bear seeds of benefit. Seek them out. Any Change may bear seeds of harm. Beware. God is infinitely malleable. God is Change.&#8221;</p><p>"We are Earthseed The life that perceives itself Changing."</p><p>&#8220;There is no end To what a living world Will demand of you.&#8221;</p><p>"In order to rise From its own ashes A phoenix First Must Burn."</p><p>"Any Change may bear seeds of benefit. Seek them out. Any Change may bear seeds of harm. Beware. God is infinitely malleable. God is Change."</p><p>&#8220;Kindness eases Change.&#8221;</p><p>&#8220;Earthseed Cast on new ground Must first perceive That it knows nothing.&#8221;</p><p>"We are Earthseed. We are flesh-self-aware, questing, problem-solving flesh. We are that aspect of Earthlife best able to shape God knowingly. We are Earthlife maturing, Earthlife preparing to fall away from the parent world. We are Earthlife preparing to take root in new ground, Earthlife fulfilling its purpose, its promise, its Destiny."</p><p>"Embrace diversity. Unite-Or be divided, robbed, ruled, killed By those who see you as prey. Embrace diversity Or be destroyed."</p><p>&#8220;Once or twice each week A Gathering of Earthseed is a good and necessary thing. It vents emotion, then quiets the mind. It focuses attention, strengthens purpose, and unifies people.&#8221;</p><p>"The ground beneath your feet moves, Changes. The galaxies move through space. The stars ignite, burn, age, cool, Evolving. God is Change. God prevails."</p><p>"God is neither good nor evil, neither loving nor hating. God is Power. God is Change. We must find the rest of what we need within ourselves, in one another, in our Destiny."</p><p>&#8220;The Self must create Its own reasons for being. To shape God, Shape Self.&#8221;</p><p>&#8220;As wind, As water, As fire, As life, God Is both creative and destructive, Demanding and yielding, Sculptor and clay. God is Infinite Potential: God is Change.&#8221;</p><p>&#8220;Your teachers Are all around you. All that you perceive, All that you experience, All that is given to you or taken from you, All that you love or hate, need or fear Will teach you&#209; If you will learn. God is your first and your last teacher. God is your harshest teacher: subtle, demanding. Learn or die.&#8221;</p><p>&#8220;Respect God. Shape God. Pray working.&#8221;</p><p>&#8220;Create no images of God. Accept the images that God has provided. They are everywhere, in everything. God is Change. Seed to tree, tree to forest; Rain to river, river to sea; Grubs to bees, bees to swarm. From one, many; from many, one; Forever uniting, growing, dissolving, forever Changing. The universe is God's self-portrait.&#8221;</p>]]></content:encoded></item><item><title><![CDATA[Begin The Discipline]]></title><description><![CDATA[BDD Behavior Driven Discipline]]></description><link>https://www.marks.wiki/p/begin-the-discipline</link><guid isPermaLink="false">https://www.marks.wiki/p/begin-the-discipline</guid><dc:creator><![CDATA[Mark Davis]]></dc:creator><pubDate>Wed, 30 Oct 2024 18:01:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9bb4ec9f-c9fb-416d-9cc6-a84f47483978_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the past few years, I've been using Behavior Driven Development (BDD) to build apps. We also incorporate it into our design process, referring to it as Behavior Driven Design. Today, I'll overview our approach using the modular app platform Oqtane on ASP.Net Blazor, and introduce a new concept: Behavior Driven Discipline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kK4J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kK4J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 424w, https://substackcdn.com/image/fetch/$s_!kK4J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 848w, https://substackcdn.com/image/fetch/$s_!kK4J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 1272w, https://substackcdn.com/image/fetch/$s_!kK4J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kK4J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png" width="224" height="297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1188,&quot;width&quot;:896,&quot;resizeWidth&quot;:224,&quot;bytes&quot;:125644,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kK4J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 424w, https://substackcdn.com/image/fetch/$s_!kK4J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 848w, https://substackcdn.com/image/fetch/$s_!kK4J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 1272w, https://substackcdn.com/image/fetch/$s_!kK4J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84c14136-b5a5-467e-b8d9-436f55de8005_896x1188.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Last night, while gaming with friends, I sketched our project process to share with my development team as the 2025 playbook. This organic method is adaptable to any web project and uses Oqtane for examples, though it can apply to other modular frameworks. The six-step process forms the acronym ICECAP.</p><p>By &#8220;discipline,&#8221; I mean following these steps exactly, even without immediate benefits. Over multiple projects, this process will become indispensable.</p><blockquote><p>Discipline: The art of sticking to your goals even when it&#8217;s tough. It&#8217;s about having control over your actions, maintaining focus, and being committed to your plan. Sounds simple, yet incredibly challenging.</p></blockquote><h2>The six step checklist for the Discipline</h2><p>I&#8217;m big on checklists.  If you have not read &#8220;The checklist Manifesto&#8221; DM me and I&#8217;ll send you a copy.  It&#8217;s not even about software engineering. It&#8217;s about doctors and pilots and how to make less mistakes.  Even when you are at the pinnacle of your skills.</p><ul><li><p>Interview Stakeholders</p></li><li><p>Codify the Specs</p></li><li><p>Extract the Modules</p></li><li><p>Compose the Pages</p></li><li><p>Assemble the Code</p></li><li><p>Prove the Work</p></li></ul><p>ICECAP is our iterative software delivery method with effective feedback loops. I'll explore each topic in future posts, but here&#8217;s an overview.</p><h3>Interview Stakeholders</h3><p>Effective stakeholder meetings require clear communication. Share the agenda beforehand and state the meeting&#8217;s purpose. Record meetings and use AI tools for summaries and transcriptions. Start with, &#8220;We&#8217;re discussing practical solutions to our problem by examining current processes and envisioning future improvements.&#8221; Facilitate the discussion, listen actively, gather all perspectives, and ask clarifying questions. Follow up as needed to gain a comprehensive understanding of the issue from all angles.</p><h3>Codify the Specs</h3><p>The output from interview transcriptions and meeting summaries can serve as valuable input for drafting specifications. AI chatbots are effective at writing classic BDD specs. Collaborate to list all the scenarios discussed in the meeting using standard agile use case language: "As a [user role], I need to [perform an action], so I can [accomplish a goal]."</p><blockquote><p>As a BDD project lead, I need to convert the stakeholder interview assets, so I can completely codify the specifications in a way that&#8217;s understandable by the app builders and the stakeholders</p></blockquote><p>After recording the scenarios, detail each with a series of BDD behaviors using the Gerkin format: "Given..., When..., Then..." These should contain enough detail to facilitate app building.</p><blockquote><p>Given a set of BDD scenarios, When I follow the BDD process, Then I&#8217;ll produce detailed behaviors that builders can use to make and test modules.</p></blockquote><p>This process provides a deeper understanding of how the app will function with explicitly testable details. Numerous BDD resources are available online to guide through this process. Examples will be provided in the specific post.</p><p>Codifying the specifications allows for the creation of feedback loops with stakeholders. At this point, schedule a meeting to review the specifications with stakeholders and create the first asset for validation.</p><h3>Extract the Modules</h3><p>Given a set of behaviors, there is a method for translating these into functional units known as modules, specifically Oqtane Modules. An Oqtane module represents a segment of functionality within an application that can be deployed independently. The architecture of a module is divided into two main components: client and server.</p><p>On the client side, the module encompasses UI elements, client state management, and services provided by Oqtane, as well as routing, dependency injection (DI), and other single-page application (SPA) features from Blazor. On the server side, it includes an API layer similar to ASP.Net MVC, data repositories, and models shared between the client and server.</p><p>The relationship between behavior specifications and coding elements can be determined through a process of noun/verb extraction. Nouns identify a module, while verbs denote the actions associated with that module. Oqtane modules focus on a data model and provide various components to perform different actions. Multiple actions and components can be incorporated into a single module to meet the specific requirements of a scenario.</p><h3>Compose the Pages</h3><p>Oqtane is an example of a composable UI framework, among many others. If you haven't read Atomic Design, you should. Without delving deeply into atomic design theory, it progresses from single controls to grouping them into reusable components, then to modules. With a set of modules, we can create pages with various modules to help users achieve different goals. This goal-oriented approach to UI flow aligns with BDD. Instead of building an app for users to navigate and edit things, we&#8217;ll build pages and workflows that match user tasks directly. Revisiting behaviors, composing pages from modules, and facilitating goal-seeking efficiently is the aim. Different paths may exist for users with various capabilities. Page composition studies and applies this skill.</p><h3>Assemble the Code</h3><p>This covers coding and its related aspects. As a professional developer, you are expected to follow patterns and write testable, maintainable code. While I may share Oqtane and Blazor tips, detailed coding guidance won't be provided.</p><h3>Prove the Work</h3><p>This step occurs at the end of most other steps, culminating in a final proof. The work is verified by demonstrating every scenario and behavior in the production app through demo meetings and a sign-off process. Additional feedback points include:</p><ul><li><p>After codifying the specs, meet with stakeholders to review each scenario. Limit the meeting to a few scenarios and thoroughly discuss behaviors. Ensure no behaviors are missed and consider the process on both sides of the scenario. Understanding the broader workflow can reveal opportunities for integration and automation.</p></li><li><p>Before finalizing and coding, review the draft pages and modules with stakeholders to gather feedback and avoid costly mistakes.</p></li><li><p>Code assembly involves mini-proofs like PRs and automated tests. This final proof complements them.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YxZT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YxZT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 424w, https://substackcdn.com/image/fetch/$s_!YxZT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 848w, https://substackcdn.com/image/fetch/$s_!YxZT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 1272w, https://substackcdn.com/image/fetch/$s_!YxZT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YxZT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png" width="890" height="594" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:594,&quot;width&quot;:890,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60727,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YxZT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 424w, https://substackcdn.com/image/fetch/$s_!YxZT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 848w, https://substackcdn.com/image/fetch/$s_!YxZT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 1272w, https://substackcdn.com/image/fetch/$s_!YxZT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24cbdc6a-a2c4-4689-a552-04a9d831e761_890x594.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The month of November will be dedicated to discussing this topic in detail. It will benefit my team to document it. Drawing from decades of agile projects, I aim to establish an optimal level of process to facilitate continuous app delivery. This process is applied across 3-4 simultaneous projects. By maintaining a consistent tech stack with Oqtane and Blazor, and adhering to this BDD discipline, we can operate efficiently while minimizing the risk of burnout.</p><h3></h3><p></p>]]></content:encoded></item></channel></rss>