<?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[The Playbook with Brandon Wu: The Tinkerer]]></title><description><![CDATA[Adventures in building digital products with a focus on consumer, social, gaming, and AI]]></description><link>https://thebrandonwu.substack.com/s/the-tinkerer</link><image><url>https://substackcdn.com/image/fetch/$s_!oAvZ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b75e75d-f157-4b65-9efc-6d78fb7f76d1_1024x1024.png</url><title>The Playbook with Brandon Wu: The Tinkerer</title><link>https://thebrandonwu.substack.com/s/the-tinkerer</link></image><generator>Substack</generator><lastBuildDate>Wed, 08 Apr 2026 20:04:30 GMT</lastBuildDate><atom:link href="https://thebrandonwu.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Brandon Wu]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pepwuper@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pepwuper@substack.com]]></itunes:email><itunes:name><![CDATA[Brandon Wu]]></itunes:name></itunes:owner><itunes:author><![CDATA[Brandon Wu]]></itunes:author><googleplay:owner><![CDATA[pepwuper@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pepwuper@substack.com]]></googleplay:email><googleplay:author><![CDATA[Brandon Wu]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Running Claude Code Without Guardrails — While Keeping It Safe]]></title><description><![CDATA[Using a devcontainer to give Claude the freedom to actually get things done]]></description><link>https://thebrandonwu.substack.com/p/setting-up-dev-environment-for-claude</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/setting-up-dev-environment-for-claude</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Tue, 07 Apr 2026 16:22:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KFwO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.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_!KFwO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KFwO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 424w, https://substackcdn.com/image/fetch/$s_!KFwO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 848w, https://substackcdn.com/image/fetch/$s_!KFwO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 1272w, https://substackcdn.com/image/fetch/$s_!KFwO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KFwO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png" width="910" height="544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:544,&quot;width&quot;:910,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90067,&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://thebrandonwu.substack.com/i/193475865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.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_!KFwO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 424w, https://substackcdn.com/image/fetch/$s_!KFwO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 848w, https://substackcdn.com/image/fetch/$s_!KFwO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 1272w, https://substackcdn.com/image/fetch/$s_!KFwO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6a1e68b-ca10-4a19-87ab-dd82a6bd5159_910x544.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="pullquote"><p><em>I've been experimenting with agentic development since 2024 and I'm starting to document what I've learned, particularly around building BattleTabs. This is part of an ongoing series about building BattleTabs with Claude Code. <a href="https://thebrandonwu.substack.com/">Subscribe</a> to receive future posts in your inbox. </em></p></div><p>When I first started using Claude Code for <a href="https://battletabs.com/">BattleTabs</a>, I was running it directly on my machine. It worked, but every session started with the same friction &#8212; making sure the right Node version was active, that Docker was running, that the database was up. And every time Claude needed to run a command, I&#8217;d get a permission prompt. Install a dependency? Approve. Run the test suite? Approve. Generate Prisma types? Approve. It adds up fast.</p><p>So I moved everything into a <a href="https://code.claude.com/docs/en/devcontainer">devcontainer</a> &#8212; think of it like running a separate virtual PC inside your computer, isolated from the rest of your machine, pre-loaded with exactly the tools the project needs. And because the container is isolated, I can let Claude <a href="https://code.claude.com/docs/en/permission-modes#skip-all-checks-with-bypasspermissions-mode">run freely </a>inside it. No permission prompts. It can install packages, run builds, execute tests, reset the database &#8212; whatever it needs to do &#8212; and there&#8217;s zero risk to my host machine. The container is the sandbox.</p><p>Instead of babysitting every command, I give Claude a task and walk away. It figures out what to run, runs it, hits an error, fixes it, tries again &#8212; all without stopping to ask me. That autonomy is what makes the agent workflow actually work.</p><p>To make this seamless, I wrote a launcher script &#8212; <code>./dev</code>. It checks that Docker and the databases are running, builds the container image if the Dockerfile changed, and launches Claude Code with <code>--dangerously-skip-permissions</code> inside it. One command to go from &#8220;I want to start working&#8221; to &#8220;Claude is ready.&#8221;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thebrandonwu.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The container persists between sessions. Run <code>./dev</code> once, and it creates the container with the repo mounted, environment variables set, ports forwarded. Run <code>./dev</code> again in another terminal, and it <code>exec</code>s into the same running container &#8212; instant startup. I can have four Claude instances running in parallel, all sharing the same container, the same node_modules, the same database.</p><pre><code><code>./dev              # Start Claude Code (creates or reuses container)
./dev              # Second instance &#8212; execs into same container, instant
./dev rm           # Fresh start when needed
./dev status       # How many instances are running?</code></code></pre><p>The Dockerfile itself installs Claude Code directly into the image, so there&#8217;s no &#8220;install Claude&#8221; step at startup. It also includes Chromium and a virtual display server for automated browser testing &#8212; I can have Claude take screenshots of the running game inside the container without a GPU or a real display. But I&#8217;ll cover that workflow in a later post.</p><p>This also means I don&#8217;t have to repeat setup when I spin up parallel agents. Every agent inherits the same ready-to-go environment. No redundant installs, no version mismatches. One container definition, consistent every time. </p><p>The next unlock was combining this with git worktrees (think of each worktree as a separate copy of the project folder, like duplicating your Unity project to try something experimental.)</p><p>BattleTabs is a monorepo (a single massive codebase containing all related apps), and I often want Claude working on multiple things at once &#8212; say, a backend fix and an unrelated UI change. Git worktrees let me have multiple checkouts of the same repo inside the same container. Each worktree is an independent working copy with its own branch, so I can have separate Claude sessions running in parallel without them stepping on each other&#8217;s changes.</p><pre><code><code>/workspaces/battletabs              # main checkout
/workspaces/battletabs-feature-a    # worktree for feature A
/workspaces/battletabs-feature-b    # worktree for feature B</code></code></pre><p>Each session gets its own space to work in. They can build and test independently. This becomes really important when I start using agent teams.</p><p>One more thing I didn&#8217;t think about initially: how do you share files with Claude when it&#8217;s running inside a container? You can&#8217;t just copy-paste a screenshot into a terminal in a devcontainer. Opening VS Code attached to the container and navigating to the right directory works, but it&#8217;s slow and clunky.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iDgE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iDgE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png 424w, https://substackcdn.com/image/fetch/$s_!iDgE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png 848w, https://substackcdn.com/image/fetch/$s_!iDgE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png 1272w, https://substackcdn.com/image/fetch/$s_!iDgE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iDgE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png" width="940" height="575" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:575,&quot;width&quot;:940,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84265,&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://thebrandonwu.substack.com/i/193475865?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.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_!iDgE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png 424w, https://substackcdn.com/image/fetch/$s_!iDgE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png 848w, https://substackcdn.com/image/fetch/$s_!iDgE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.png 1272w, https://substackcdn.com/image/fetch/$s_!iDgE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc34993eb-5832-4b50-b790-a24b487f5bb3_940x575.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 trick I landed on is dead simple: run <code>npx serve</code> on a folder on your host machine &#8212; say, your Downloads folder &#8212; and it starts a local file server. From inside the container, Claude can access those files at <code>http://host.docker.internal:3001/</code>. I drop a screenshot into that folder, give Claude the URL, and it can see exactly what I see. No more trying to describe &#8220;the button is slightly off to the left&#8221; &#8212; I just show it.</p><pre><code><code># On your host machine
npx serve ~/Downloads -p 3001

# Claude (inside the container) can now fetch:
# http://host.docker.internal:3001/screenshot.png</code></code></pre><p>One gotcha: Claude can&#8217;t always read from <code>host.docker.internal</code> URLs directly &#8212; sometimes its built-in web tools don&#8217;t resolve the hostname. But <code>curl</code> inside the container always works, so if Claude needs to grab a file, it can just <code>curl</code> it to disk and read it from there. Minor thing, but worth knowing so you don&#8217;t waste time debugging it.</p><p>BattleTabs runs on a fixed local port inside the container, so I can access the full game in my browser while Claude is making changes. Hot reload means I see changes almost instantly. This tight loop &#8212; Claude codes, I test, I screenshot what I see, Claude fetches it and adjusts &#8212; is really the core of how I work now.</p><p>Getting the devcontainer right took some effort upfront, but it's now an essential part of how I start every new project.</p>]]></content:encoded></item><item><title><![CDATA[Headless Game Development with Claude Code and Godot]]></title><description><![CDATA[How well do Claude Code and Godot work together for game development?]]></description><link>https://thebrandonwu.substack.com/p/building-a-visual-novel-with-claude</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/building-a-visual-novel-with-claude</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Fri, 23 Jan 2026 15:08:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sJDR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.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_!sJDR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sJDR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 424w, https://substackcdn.com/image/fetch/$s_!sJDR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 848w, https://substackcdn.com/image/fetch/$s_!sJDR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!sJDR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sJDR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg" width="1269" height="712" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:712,&quot;width&quot;:1269,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:248495,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://thebrandonwu.substack.com/i/185538637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sJDR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 424w, https://substackcdn.com/image/fetch/$s_!sJDR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 848w, https://substackcdn.com/image/fetch/$s_!sJDR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!sJDR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd740232-f36c-4cd1-acc8-c97778a7cc75_1269x712.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is a learning project. I wanted to answer: <em>How well do Claude Code and Godot work together for game development?</em></p><p>The experiment: Build a visual novel using Claude Code as the primary development interface &#8212; an autonomous collaborator that could analyze problems, build solutions, and create its own tools.</p><p>What I learned:</p><ol><li><p><strong>Headless-first tools enable AI autonomy</strong> &#8212; Godot&#8217;s CLI, GitHub Actions, and Docker made it possible for Claude to run the full development cycle without GUI intervention.</p></li><li><p><strong>Claude Code builds tools for itself</strong> &#8212; Claude didn&#8217;t just write game code. It built development tools (visual editors, image processors) that it then used to work more effectively.</p></li><li><p><strong>Personas as agents</strong> &#8212; A PM agent and target player persona helped Claude make autonomous decisions and evaluate its own work.</p></li></ol><p>You can find the game here: <a href="https://gblab.itch.io/tidewater-cove">https://gblab.itch.io/tidewater-cove</a></p><p><em>Note on AI Art<strong>:</strong> AI-generated content in games is controversial, and concerns about impact on artists are valid. This is a learning project focused on workflow and tooling. The AI-generated assets are placeholders to test the pipeline.</em></p><h2>The Stack</h2><p>A quick overview of how the project is set up:</p><ul><li><p><strong>Godot 4.3 (headless)</strong> &#8212; Game engine with full CLI support&#8212;build, import, export without GUI</p></li><li><p><strong>Docker devcontainer</strong> &#8212; Reproducible environment with Godot, Python, Claude Code pre-installed</p></li><li><p><strong>Claude Code CLI</strong> &#8212; AI assistant with filesystem access, running inside the container</p></li><li><p><strong>GitHub CLI</strong> &#8212; Allows Claude to keep track of issues, create PRs and releases</p></li><li><p><strong>GitHub Actions</strong> &#8212; CI/CD pipeline: push to main &#8594; build &#8594; deploy to itch.io</p></li><li><p><strong>Python tools</strong> &#8212; Custom scripts for art generation, story editing, deployment</p></li></ul><p>The key property: <strong>everything runs from the command line</strong>. No clicking, no GUI automation. Claude can execute the full workflow autonomously.</p><pre><code><code># The entire development cycle, scriptable
godot --headless --import              # Import assets
godot --headless --export-release ...  # Build for any platform
python3 tools/generate_character_sheet.py ...  # Generate art
gh pr create ...                       # Open pull request
</code></code></pre><h2>The Devcontainer Setup</h2><p>A Docker devcontainer makes this workflow possible. It provides a consistent, secure environment where Claude Code can operate with full autonomy.</p><p><strong>What&#8217;s in the container: </strong>Godot 4.3 headless binary + export templates for all platforms, Python with image processing libraries (PIL), Claude Code CLI, Git and GitHub CLI</p><p><strong>Why this matters:</strong></p><ol><li><p><strong>Skip-permissions mode</strong> &#8212; Claude Code can run with <code>--dangerously-skip-permissions</code> inside the container. This means Claude can read files, write code, run builds, and execute scripts without asking permission for each action. The container itself is the security boundary.</p></li><li><p><strong>Full autonomy</strong> &#8212; With skip-permissions enabled, Claude can execute multi-step workflows uninterrupted: generate art &#8594; import assets &#8594; build game &#8594; run tests.</p></li></ol><h2>Key Insight #1: Headless-First Tools Enable AI Autonomy</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JNtR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JNtR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png 424w, https://substackcdn.com/image/fetch/$s_!JNtR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png 848w, https://substackcdn.com/image/fetch/$s_!JNtR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png 1272w, https://substackcdn.com/image/fetch/$s_!JNtR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JNtR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png" width="724" height="301.33516483516485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:606,&quot;width&quot;:1456,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:248812,&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://thebrandonwu.substack.com/i/185538637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.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_!JNtR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png 424w, https://substackcdn.com/image/fetch/$s_!JNtR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png 848w, https://substackcdn.com/image/fetch/$s_!JNtR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.png 1272w, https://substackcdn.com/image/fetch/$s_!JNtR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6299af8f-4af3-434c-aef5-8d7da4a374cf_2020x841.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">(game development in the command line - six terminal sessions)</figcaption></figure></div><p>If Claude can&#8217;t run it from the command line, Claude can&#8217;t use it autonomously.</p><p><strong>Why Godot works well:</strong></p><p>Godot&#8217;s workflow is scriptable from the CLI:</p><pre><code><code>godot --headless --import                          # Import all assets
godot                                              # Run the game</code></code></pre><p>This means Claude can:</p><ul><li><p>Generate art &#8594; import it &#8594; verify it appears correctly</p></li><li><p>Make code changes &#8594; build &#8594; catch errors</p></li><li><p>Run the full pipeline without human intervention</p></li></ul><p>Other engines like Unity support headless builds, but require additional setup&#8212;command-line flags not exposed in the editor, virtual framebuffers on Linux, and workarounds for systems without graphics capabilities. Godot was designed CLI-first, which makes it simpler to automate.</p><p>I plan on doing a few more experiments with Godot &#8212; <strong>I think this aspect of Godot might just make it one of the strongest contenders if you are working with Claude Code for game development.</strong></p><h2>Key Insight #2: Claude Code Builds Tools for Itself</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xvOy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xvOy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png 424w, https://substackcdn.com/image/fetch/$s_!xvOy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png 848w, https://substackcdn.com/image/fetch/$s_!xvOy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png 1272w, https://substackcdn.com/image/fetch/$s_!xvOy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xvOy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png" width="1456" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:334849,&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://thebrandonwu.substack.com/i/185538637?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.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_!xvOy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png 424w, https://substackcdn.com/image/fetch/$s_!xvOy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png 848w, https://substackcdn.com/image/fetch/$s_!xvOy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.png 1272w, https://substackcdn.com/image/fetch/$s_!xvOy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3f66ca-e20c-46dd-a709-dc71cb6de4b2_2215x1323.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">(visual node narrative editor)</figcaption></figure></div><p>Claude didn&#8217;t just write game code&#8212;it built development tools that it then used to work more effectively.</p><p><strong>Tools Claude created:</strong></p><ul><li><p><strong>Visual Node Editor</strong> &#8212; Interactive HTML editor for story structure. Claude generates this to visualize branching narratives, then references it when making story changes.</p></li><li><p><strong>Character Sheet Generator</strong> &#8212; Generates expression grids, auto-crops to sprites. Claude runs this to create consistent character art, then imports the results.</p></li><li><p><strong>Screenshot Compositor</strong> &#8212; Composites game assets into promotional images. Claude creates marketing materials without launching the game.</p></li></ul><p><strong>The feedback loop:</strong> I describe a problem &#8594; Claude builds a tool to solve it &#8594; Claude uses that tool &#8594; Claude improves the tool when issues arise.</p><p>Example conversation:</p><blockquote><p><strong>Me:</strong> &#8220;It&#8217;s hard to see the story structure.&#8221;<br><strong>Claude:</strong> <em>builds visual node editor with drag-and-drop, undo/redo, auto-layout</em><br><strong>Me:</strong> &#8220;Can you add the ability to see which nodes have choices?&#8221;<br><strong>Claude:</strong> <em>updates the tool, regenerates the visualization</em></p></blockquote><p>Claude isn&#8217;t just a code generator. It&#8217;s a toolsmith that uses its own tools.</p><p>Custom tools &#8212; instead of researching which tool to buy or download, a custom one can be built for the specific need. This may impact the plugin ecosystem, particularly as tools increasingly need to be AI-accessible.</p><h2>Key Insight #3: Personas as Agents</h2><p>Beyond documentation, I created explicit personas that Claude could adopt or consult.</p><p><strong>Morgan (PM Agent):</strong></p><p>A product manager persona with explicit decision authority:</p><pre><code><code>## PM Agent: Morgan

**Autonomous Authority:**
- Order and prioritize tasks
- Implement features within established guidelines
- Fix bugs without asking
- Make creative decisions that follow the art/story bibles

**Escalate to User:**
- Spending money (AI API costs)
- Major story changes
- Significant scope changes

**Never ask:** "Should I continue?" "What's next?" "Is this okay?"
</code></code></pre><p>This eliminated the friction of Claude asking permission for every small decision. Morgan checks the backlog, picks the next task, and executes.</p><p><strong>Elena (Target Player Persona):</strong></p><p>A detailed persona representing the target audience&#8212;a 29-year-old who reads cozy mysteries but has never played a visual novel. When testing, Claude can adopt Elena&#8217;s perspective:</p><blockquote><p>&#8220;Play through Chapter 1 as Elena and provide feedback.&#8221;</p></blockquote><p>Claude then evaluates pacing, identifies confusing moments, and flags anything that would alienate a visual novel newcomer. This provided useful feedback before involving real playtesters.</p><p><strong>Domain Documentation as Experts:</strong></p><p>The art bible, dialogue guide, and story bible serve as domain expertise. Claude consults these when making creative decisions&#8212;checking if a color palette matches the art bible, or if dialogue sounds right for a character&#8217;s voice.</p><h2>What I Learned</h2><p>The most surprising part was watching Claude build tools for itself. The visual node editor, the image processor&#8212;these emerged from conversations about problems, and then became part of Claude&#8217;s own toolkit.</p><p>The PM and player personas helped more than expected. Instead of asking &#8220;should I continue?&#8221;, Claude checks Morgan&#8217;s backlog. Instead of guessing what players want, Claude consults Elena&#8217;s preferences. Explicit decision authority reduced friction significantly.</p><p>I was also pleasantly surprised by how well Claude Code and Godot work together. I didn&#8217;t launch the editor once after initial setup. Godot&#8217;s CLI-first design made full autonomy possible. If you&#8217;re exploring AI-assisted game development, the combination is worth trying.</p>]]></content:encoded></item><item><title><![CDATA[MCPs Aren't for Everything: Social Media Tasks from MCP to Direct SDK Integration]]></title><description><![CDATA[Direct SDK Integration in VSCode with AI Agent Outperformed Claude + Bluesky MCP]]></description><link>https://thebrandonwu.substack.com/p/mcps-arent-for-everything-social</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/mcps-arent-for-everything-social</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Thu, 10 Apr 2025 11:05:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aEau!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>MCP (model context protocol) is great, but not for every task. <br><br>I added a Bluesky MCP to Claude to help me review the accounts I've been following. Seeing it in action is amazing at first, but quickly I ran into issues where the model does not finish the job, or simply fails to execute on specific asks. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aEau!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aEau!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png 424w, https://substackcdn.com/image/fetch/$s_!aEau!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png 848w, https://substackcdn.com/image/fetch/$s_!aEau!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png 1272w, https://substackcdn.com/image/fetch/$s_!aEau!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aEau!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png" width="1456" height="1208" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1208,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:712168,&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://pepwuper.substack.com/i/161007120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.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_!aEau!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png 424w, https://substackcdn.com/image/fetch/$s_!aEau!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png 848w, https://substackcdn.com/image/fetch/$s_!aEau!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.png 1272w, https://substackcdn.com/image/fetch/$s_!aEau!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea18c127-71f2-411d-89a5-556628a91f38_1788x1483.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><br><br>Since I had built a social media (bluesky) AI assistant before, I know that this could work much better with a hybrid approach inside an IDE. So I moved the task to Visual Studio Code + CLINE. I started a new project, added the Bluesky SDK to the folder, and used the chat interface (and the same model - Claude 3.7 Sonnet) to complete the tasks. <br><br>The difference is, instead of asking the agent to use the MCP itself, I asked it to write code using the SDK directly. <br><br>Because the execution is entirely done in code, it removes the uncertainty and any errors that pops up can be properly addressed. Also, since the code is saved onto the project, they can be picked up and reused with confidence. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AHV9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AHV9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AHV9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AHV9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AHV9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AHV9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg" width="1456" height="925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:925,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:431973,&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;:false,&quot;internalRedirect&quot;:&quot;https://pepwuper.substack.com/i/161007120?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AHV9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AHV9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AHV9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AHV9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99646987-8faa-49b2-b037-dc616f8fe761_2000x1270.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>And it is no more complex than using Claude directly. I am still chatting with the model directly. (note I do have <a href="https://docs.cline.bot/improving-your-prompting-skills/cline-memory-bank">memory bank</a> set up for CLINE)<br><br>With agents, the IDE is quickly becoming my everything-app, not just my coding environment.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Dice Battle Game Prototype with LÖVE ]]></title><description><![CDATA[Creating a Dice Battle Game Prototype (open-source) with L&#214;VE and Windsurf (AI Agentic IDE)]]></description><link>https://thebrandonwu.substack.com/p/dice-battle-game-prototype-with-love</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/dice-battle-game-prototype-with-love</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Wed, 26 Feb 2025 14:28:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BfwJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.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://github.com/theBrandonWu/love-dice-game" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BfwJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 424w, https://substackcdn.com/image/fetch/$s_!BfwJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 848w, https://substackcdn.com/image/fetch/$s_!BfwJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 1272w, https://substackcdn.com/image/fetch/$s_!BfwJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BfwJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png" width="1136" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44860266-3353-4bbe-a830-513dcef3733a_1136x908.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1136,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://github.com/theBrandonWu/love-dice-game&quot;,&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_!BfwJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 424w, https://substackcdn.com/image/fetch/$s_!BfwJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 848w, https://substackcdn.com/image/fetch/$s_!BfwJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 1272w, https://substackcdn.com/image/fetch/$s_!BfwJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44860266-3353-4bbe-a830-513dcef3733a_1136x908.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">(source on github: <a href="https://github.com/theBrandonWu/love-dice-game">https://github.com/theBrandonWu/love-dice-game</a>)</figcaption></figure></div><p>Two weeks ago, I was reading up on <a href="https://www.love2d.org/">L&#214;VE</a>, a lightweight 2D game framework that's come back to the spotlight thanks to it being used to build recent indie successes like <a href="https://www.playbalatro.com/">Balatro</a>, <a href="https://arco.game/">Arco</a>, and <a href="https://store.steampowered.com/app/858710/Gravity_Circuit/">Gravity Circuit</a>, and <a href="https://store.steampowered.com/app/2373630/Moonring/">Moonring</a>. It being the valentine's day week, I thought it'd be fun to make a quick prototype with the L&#214;VE framework to test out how good an agentic coding IDE can be at building games.</p><p>As with my <a href="https://thewholefounder.substack.com/p/idea-to-market-in-a-week-creating">last project</a>, I used <a href="https://codeium.com/refer?referral_code=409274cc8b">Windsurf IDE</a> (models: Claude 3.5 Sonnet + Cascade Base). The game design is fairly simple. Two players battle each other on a hexagon grid. Each turn, a player rolls 3 dice, and move the 3 dice into Movement, Attack, and Defend slots. The core decision for the player is deciding how to allocate the numbers they get from the dice rolls. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5qwP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5qwP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5qwP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5qwP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5qwP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5qwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg" width="1456" height="967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:967,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:242234,&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;:false,&quot;internalRedirect&quot;:&quot;https://thewholefounder.substack.com/i/157963700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5qwP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5qwP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5qwP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5qwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6bdc3c63-2213-4dc3-a5af-e71a234298c0_1568x1041.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>After getting a basic scene running with a dice rolling mechanism. I used this initial prompt to start with the basic game design:</p><pre><code>...I now want this to be a 2 player game. Here's how it should work:  
  
- players are placed on a 6x6 hexagon grid board  
- the player can use the dice roll for movement, attack, or defence  
- there are 3 types of hexagon tiles. a normal tile that doesn't do anythin. an attack tile that doubles an attack if the player is standing on it. a defence tile that reduces an attack by half if the player is standing on it.  
- there are about the same number of the different types of tiles on the board  
- players start with 21 hit points  
- on each turn, the player rolls 3 dies  
- after they roll the dies, they can drag and drop each die into the movement, attack, and defend slots  
- they can move the number of tiles equal to the number on the dice in the movement slot  
- if they are next to the opponent after the move, they can attack the amount and apply the amount of damage to the opponent equal to the number of dice in the attack slot  
- if they are attacked by the opponent in the opponent's next turn, the damage they take is reduced by the number in the defense slot  
- not the attack and defense numbers are impacted by the tiles they stand on</code></pre><p>I like using bullet lists in my prompts. It helps me organise my thinking, and anecdotally it's been more effective working with language models.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_OEP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_OEP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_OEP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_OEP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_OEP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_OEP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg" width="1456" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:309868,&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;:false,&quot;internalRedirect&quot;:&quot;https://thewholefounder.substack.com/i/157963700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_OEP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_OEP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_OEP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_OEP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadaad454-82d6-47fd-9ff5-7180d8d020c7_2289x1041.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>As before, I ask the agent to keep a running changelog for both me to remember what's been worked on, and for the agent to remember what's been done.</p><p>I set up a .windsurfrules file to guide the AI agent with rules and links to documentations.</p><pre><code># Windsurf Rules for Love Dice Game

### Code Style
- Make sure to remove any unnecessary extra `end` statement to avoid Syntax error: '&lt;eof&gt;' expected near 'end'
- Make sure to have enough `end` statement to avoid Error: Syntax error: 'end' expected near '&lt;eof&gt;'
- Make sure your code satisfy all requirements and only the requirements provided
- Review your code and ask yourself these questions:
   - Is this code efficient? 
   - Can you make it shorter? 
   - Are you able to make it more maintainable? 
   - Do we need all of the functions you have outlined?

### Memory Management
1. All memories must be saved in the /memory-bank/ folder
2. Use markdown format for all memory files
3. Update existing memory files when their content changes
4. Create new memory files for new categories of information
5. Memory files should follow the naming convention: descriptive_name.md
6. Each memory file should have:
   - Clear title and sections
   - Dated entries where relevant
   - Links to related memories if applicable

### Changelog Management
- Each release must have a new line after it
- Include release version and date for each entry
- Follow format: ## [VERSION] - YYYY-MM-DD

### Documentation Links
- Love2D documentation: https://www.love2d.org/wiki/Main_Page
- LUA: https://www.lua.org/manual/5.4/manual.html</code></pre><p>I noticed it kept making the same syntax mistakes, perhaps due to lack of training on love2d projects or the lua language, so I added a few rules at the top of this file. Unfortunately it still keep making the same syntax mistakes more often than I'd like. It's usually a pretty quick fix once I point that out but annoying nonetheless.</p><p>I also started <strong>generating memory files (in markdown format) and saving them in a /memory-bank/ folder.</strong> I work on two different devices. The internal memories are not part of the repository, so to continue working on the project on a difference device, I needed the memories to be essentially exported and synchronised as part of the repository. This might reduce the need to keep a changelog - but for the time being I am doing both to have more context for the AI to understand the project.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-kZb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-kZb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 424w, https://substackcdn.com/image/fetch/$s_!-kZb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 848w, https://substackcdn.com/image/fetch/$s_!-kZb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 1272w, https://substackcdn.com/image/fetch/$s_!-kZb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-kZb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png" width="990" height="561" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:561,&quot;width&quot;:990,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:168096,&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://thewholefounder.substack.com/i/157963700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.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_!-kZb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 424w, https://substackcdn.com/image/fetch/$s_!-kZb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 848w, https://substackcdn.com/image/fetch/$s_!-kZb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 1272w, https://substackcdn.com/image/fetch/$s_!-kZb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd75b8318-13d9-4c08-b144-d18fd7aabf06_990x561.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I wanted this project to be small with a very narrow scope. My initial plan was to wrap it up in 2 days. It ended up taking more than double the amount of the time. Getting the core system up and working was fairly quick, but making the UI and control exactly how I designed took a lot longer. One key difference between this project and my <a href="https://thewholefounder.substack.com/p/idea-to-market-in-a-week-creating">browser extension project</a> was the time it takes to test the app. The game has various states that a player can be in, and it takes time to get to those states once a game has started for me to test any changes. I should have written programmatic testing along the way. But even with that, sometimes you have to manually use the product to decide if certain UX works.</p><p>As with the last project, UI/UX work took up the majority of time. Windsurf IDE/Claude3.5 struggled with UI tweaks in the L&#214;VE framework quite a number of times and I had to find solutions myself before asking it to implement in multiple occasions.</p><p>And I definitely spent way too much time testing out different dice rolling mechanics and animations. At one point, trying to get them represented in 3D in a 2D framework! To be fair, the AI agent did a decent job calculating the necessary math to create 3D dice but had trouble managing the position/scale/rotation dots on the different faces in 3D.</p><p>Once I have the prototype working as intended, I playtested it and realised there's a dominant strategy for this 1v1 game where you are almost always better off using. If you are making a game, make sure you playtest early and playtest often. My player brain always outsmarts my designer brain! </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://bsky.app/profile/brandonwu.co/post/3lhyd46dm7k2a" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rwA0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 424w, https://substackcdn.com/image/fetch/$s_!rwA0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 848w, https://substackcdn.com/image/fetch/$s_!rwA0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 1272w, https://substackcdn.com/image/fetch/$s_!rwA0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rwA0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png" width="594" height="617" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db85747e-baff-4559-af19-b443af098aa7_594x617.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:617,&quot;width&quot;:594,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111382,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://bsky.app/profile/brandonwu.co/post/3lhyd46dm7k2a&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://thewholefounder.substack.com/i/157963700?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.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_!rwA0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 424w, https://substackcdn.com/image/fetch/$s_!rwA0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 848w, https://substackcdn.com/image/fetch/$s_!rwA0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 1272w, https://substackcdn.com/image/fetch/$s_!rwA0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb85747e-baff-4559-af19-b443af098aa7_594x617.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I ended up adding a secondary objective into the game where players can pickup health potion to gives players another thing to consider when making decisions. This also added additional time to the project.</p><p>Two of my biggest takeaways are:</p><ol><li><p><strong>Focus on the core</strong> &#8212; this is the advice I tell people whenever they start a new project. Focus on what matters. But it's easier to give advice than to follow them. I spent way too much time on dice animations when I was working on this when in the end a simple visual effect was all I needed</p></li><li><p><strong>Refactor early and often, especially when working with AI</strong> &#8212; because the project was meant to be small and quick, I didn't spend any time structuring the code or refactoring it. By the time I realised there are too many sub-systems and states to all be in one file, it had become too large of a file for AI agents to easily refactor. A few attempts yielded disappointing results when I ask the agent to refactor the code.</p></li></ol><p>Again, you can find the files and the executables here:</p><ul><li><p>Github Repo: <a href="https://github.com/theBrandonWu/love-dice-game">https://github.com/theBrandonWu/love-dice-game</a></p></li><li><p>Itch.io (download): <a href="https://thebrandonwu.itch.io/die-die-dice">https://thebrandonwu.itch.io/die-die-dice</a></p></li></ul><p>On the gameplay side, I think there's something interesting here where there's an element of luck and a strategic element, which makes for a fun and interesting multiplayer setup. It's a game design I'd like to keep working on, but most likely going to a framework or game engine I am more familiar with.</p>]]></content:encoded></item><item><title><![CDATA[Idea to Market in a Week — Creating a Browser Extension with Windsurf AI Coding Agent]]></title><description><![CDATA[Shipping at the speed of thought]]></description><link>https://thebrandonwu.substack.com/p/idea-to-market-in-a-week-creating</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/idea-to-market-in-a-week-creating</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Sat, 08 Feb 2025 14:25:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I am using a number of "agentic IDEs" &#8212; coding tools that integrate with AI agents to generate code and execute commands to help with the development process. From Windsurf, CLINE, Cursor, to Replit, these tools have brought back joy to making digital products where I can come up with an idea, create a working prototype quickly, and iterate fast to get a product released.</p><h2>Idea - Gaming Deals in a New Tab</h2><p>I had an idea to create a browser extension that shows the latest gaming giveaways, discounts from major stores (Steam, itch.io, Epic Games Store, GOG, Humble Store), and gaming news from notable gaming websites. Inspired by OperaGX's original GX Corner (before they added too many sections that cluttered the UI), I wanted this to be in the new tab, giving users a quick glance at newly available free games and great gaming deals.</p><p><strong>You can check it out here: <a href="https://chromewebstore.google.com/detail/pixeldrop-gaming-hub-new/mhgcpflckofkapfpmhhkoeepocijdbgm">PixelDrop</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://chromewebstore.google.com/detail/pixeldrop-gaming-hub-new/mhgcpflckofkapfpmhhkoeepocijdbgm" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QSY8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png 424w, https://substackcdn.com/image/fetch/$s_!QSY8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png 848w, https://substackcdn.com/image/fetch/$s_!QSY8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png 1272w, https://substackcdn.com/image/fetch/$s_!QSY8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QSY8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png" width="1024" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:294689,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://chromewebstore.google.com/detail/pixeldrop-gaming-hub-new/mhgcpflckofkapfpmhhkoeepocijdbgm&quot;,&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_!QSY8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png 424w, https://substackcdn.com/image/fetch/$s_!QSY8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png 848w, https://substackcdn.com/image/fetch/$s_!QSY8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.png 1272w, https://substackcdn.com/image/fetch/$s_!QSY8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad8fef47-d80f-4a7c-b07a-f8d5c3d4ad9b_1024x854.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>Why</h2><p>There are a few reasons why I wanted to do this idea:</p><ol><li><p>I like browsing gaming deals and claiming free games, especially from Epic Games or Steam. Epic is consistently making great games free to claim for a short period of time, and Steam constantly has sales on. But I often forget to check these platforms.</p></li><li><p>I like to read industry news, but have not found RSS readers or following social accounts of gaming news sources to be a great experience.. I like the "Recommended stories" section in Firefox's new tab, which shows me interesting stories whenever I open up a new tab - it's an invitation to read without commitment or interruption</p></li><li><p>I also want this to become a space where gamers can discover new games that they might like. While the majority of gaming attention is on Fornite, Roblox, Minecraft, and massive F2P games like Marvel Rivals and CoD, a gaming hub where people can discover new games can help diversify what people play &#8212; having discounts is a great way to get attention.</p></li><li><p>If this becomes useful to enough people, I want to introduce a submission and voting mechanism for people to add games and vote on the deals.</p></li><li><p>And add a section for people to discover upcoming new indie titles</p></li></ol><h2>Choosing the Right AI Tools</h2><p>I decided to use <a href="https://codeium.com/refer?referral_code=409274cc8b">Windsurf</a> for this project. I&#8217;ve been using it for the past couple of months, and the results have been solid, especially when paired with Claude 3.5 Sonnet. I also have a set of custom instructions from previous projects that make the process smoother.</p><h2>Planning with AI</h2><p>Before diving into implementation, I needed a reasoning model (something like ChatGPT-o1 or DeepSeek-R1) to think through the requirements and generate an architecture, file structure, tech stack, and general setup. Windsurf doesn&#8217;t yet have a "plan" and "act" mode&#8212;where one model handles planning while another handles execution&#8212;so I did this manually. I used ChatGPT's o1 model as my "architect." With just one simple prompt, I generated a structured project plan:</p><blockquote><p>"I'd like to create a new tab browser extension for Chrome. The extension will show gaming deals at the top section and gaming news in the second section. Create an architecture and plan for this project. Include technology frameworks to use and break down the folder and file structures that I can pass onto a junior developer to implement."</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_Tps!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_Tps!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png 424w, https://substackcdn.com/image/fetch/$s_!_Tps!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png 848w, https://substackcdn.com/image/fetch/$s_!_Tps!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png 1272w, https://substackcdn.com/image/fetch/$s_!_Tps!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_Tps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png" width="1456" height="1437" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1437,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:376745,&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_!_Tps!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png 424w, https://substackcdn.com/image/fetch/$s_!_Tps!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png 848w, https://substackcdn.com/image/fetch/$s_!_Tps!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.png 1272w, https://substackcdn.com/image/fetch/$s_!_Tps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaf172f7-0000-4f83-9b8d-07273aa0f9b1_1547x1527.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>With the project plan ready, I passed it on to Windsurf for implementation. The plan was detailed and specific, and Windsurf quickly set up the development environment, created the files as outlined, and even recommended APIs to use for the deals. (I ended up using different data sources, but this was still very cool.)</p><h2>Overcoming Development Challenges</h2><p>One issue I ran into was with <strong>Manifest v3</strong>, where the tool assumed I had icon images in place. It was an easy fix, but dealing with Manifest v3 was a constant source of frustration throughout the process. Having built <a href="https://chromewebstore.google.com/detail/battletabs/mjcklhnhfiepmofggcoegkmkokbljmjd">browser extensions</a> before, I knew that wrestling with Manifest files is just part of the journey.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w_bM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w_bM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png 424w, https://substackcdn.com/image/fetch/$s_!w_bM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png 848w, https://substackcdn.com/image/fetch/$s_!w_bM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png 1272w, https://substackcdn.com/image/fetch/$s_!w_bM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w_bM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png" width="1456" height="925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:925,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:696432,&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_!w_bM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png 424w, https://substackcdn.com/image/fetch/$s_!w_bM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png 848w, https://substackcdn.com/image/fetch/$s_!w_bM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.png 1272w, https://substackcdn.com/image/fetch/$s_!w_bM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe585251b-6bae-4ebc-bfd8-3c31f6f0fa8d_2404x1527.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>Despite these small roadblocks, within a few steps, I had a working prototype. It had the three sections (giveaways, deals, and news) and was pulling in real-time data. However, just like every project I&#8217;ve worked on, even with AI, the last 20% of refinement, polishing, and tweaking still takes 80% of the total development time.</p><p>At least for now, humans are still needed to decide what <em>feels</em> right. As a product person, I appreciate this <strong>human-in-the-loop</strong> process where I can experiment with different UI/UX ideas, have AI implement them within minutes, and then review and make final design decisions. <em>Taste</em> is something AI hasn&#8217;t fully mastered yet, and I believe this will continue to be a key differentiator for software.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r0HF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r0HF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png 424w, https://substackcdn.com/image/fetch/$s_!r0HF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png 848w, https://substackcdn.com/image/fetch/$s_!r0HF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png 1272w, https://substackcdn.com/image/fetch/$s_!r0HF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r0HF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png" width="1024" height="854" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:854,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:756355,&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_!r0HF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png 424w, https://substackcdn.com/image/fetch/$s_!r0HF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png 848w, https://substackcdn.com/image/fetch/$s_!r0HF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.png 1272w, https://substackcdn.com/image/fetch/$s_!r0HF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cf5d8e2-f0ac-455f-b2f0-5557cf8eaffd_1024x854.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>Publishing on the Chrome Web Store</h2><p>Once the product was ready, it was time to publish it on the Chrome Web Store. The process of creating screenshots and graphic assets for the store is still manual. I&#8217;m sure AI tools exist for this, but I haven&#8217;t explored them yet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KjHO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KjHO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png 424w, https://substackcdn.com/image/fetch/$s_!KjHO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png 848w, https://substackcdn.com/image/fetch/$s_!KjHO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png 1272w, https://substackcdn.com/image/fetch/$s_!KjHO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KjHO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png" width="1024" height="624" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:624,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:527081,&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_!KjHO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png 424w, https://substackcdn.com/image/fetch/$s_!KjHO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png 848w, https://substackcdn.com/image/fetch/$s_!KjHO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.png 1272w, https://substackcdn.com/image/fetch/$s_!KjHO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feff8d79a-222a-45c0-a48c-af6f4e13870d_1024x624.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>As part of the submission process, Chrome Web Store requires developers to explain why certain permissions (cookies, storage, etc.) are needed. Since Windsurf knew the code, I asked it to fill this out for me. It provided solid answers, but it was also overly zealous&#8212;justifying permissions I didn&#8217;t actually need. This led to my extension being rejected on the first attempt.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8-Go!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8-Go!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 424w, https://substackcdn.com/image/fetch/$s_!8-Go!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 848w, https://substackcdn.com/image/fetch/$s_!8-Go!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 1272w, https://substackcdn.com/image/fetch/$s_!8-Go!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8-Go!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png" width="1336" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93602872-c243-4633-8a41-306b1694cffa_1336x928.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1336,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:216475,&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_!8-Go!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 424w, https://substackcdn.com/image/fetch/$s_!8-Go!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 848w, https://substackcdn.com/image/fetch/$s_!8-Go!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 1272w, https://substackcdn.com/image/fetch/$s_!8-Go!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93602872-c243-4633-8a41-306b1694cffa_1336x928.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>You can check out the release here: <a href="https://chromewebstore.google.com/detail/pixeldrop-gaming-hub-new/mhgcpflckofkapfpmhhkoeepocijdbgm">PixelDrop</a></strong></p><h2>Key Takeaways</h2><ul><li><p><strong>Agentic IDEs can dramatically accelerate development</strong> &#8211; Going from idea to working product in a few days, even without deep familiarity with the underlying tech stack, is now possible.</p></li><li><p><strong>Using AI models for planning and execution is a game-changer</strong> &#8211; A reasoning model as an architect and an AI capable of tool calling for coding makes rapid prototyping seamless. I had a functional MVP within 30 minutes.</p></li><li><p><strong>Human taste and iteration still matter</strong> &#8211; AI can generate code and implement features, but defining <em>how</em> a product should feel and work still requires human judgment.</p><ul><li><p>Notably, this is also one of the most time-consuming parts of development.</p></li></ul></li><li><p><strong>Bringing a product to market still involves manual work</strong> &#8211; Publishing on the Chrome Web Store required filling out forms, setting up accounts, and verifying company details&#8212;things future AI &#8220;operator&#8221; tools might help with.</p></li><li><p><strong>Image generation tools are powerful, but gaps remain</strong> &#8211; While there are great AI tools for App Store and Google Play mockups, I couldn&#8217;t find one tailored for Chrome Web Store asset creation. Maybe that&#8217;s my next project?</p></li><li><p><strong>Expect hidden time costs</strong> &#8211; The <em>actual build time</em> is often only half the effort. Refinements, debugging, and market-readiness tasks (screenshots, descriptions, approvals) take at least as long as the core development. If estimating a project timeline, <strong>double your initial build estimate</strong> to be realistic.</p></li></ul><p>This experience reinforced that while AI is a powerful tool, <strong>human creativity, taste, and decision-making are still critical for crafting great products.</strong> And for now, the AI + human hybrid workflow remains the best approach to shipping high-quality software fast.</p>]]></content:encoded></item><item><title><![CDATA[Building a Social Media AI Agent with Smolagents]]></title><description><![CDATA[A light-weight library to build AI agents &#8212; great starting point to build and work with agents]]></description><link>https://thebrandonwu.substack.com/p/building-a-social-media-ai-agent</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/building-a-social-media-ai-agent</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Wed, 29 Jan 2025 17:19:45 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5b030ba9-100f-4adb-88c4-2eba322a82fb_1024x577.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://github.com/huggingface/smolagents">Smolagents</a> is a library for building AI agents from Hugging Face. Compared to other AI agent frameworks, it's lightweight, and allows agents to write actions in code.</p><p>I like the simplicity of the library - perfect for getting started creating agents (AIs that can take actions). Documentation is easy to understand and comes with plenty of bite-sized examples. I also like how it integrates with Hugging Face, meaning you can have your agents use publicly available Spaces as tools from the hugely popular platform.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thebrandonwu.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Whole Founder! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>To test this out, I built a social media agent that</p><ol><li><p>comes up with an image prompt with a pre-defined theme (in this case, I wanted pictures of dogs on the beach)</p></li><li><p>uses a text-to-image tool to generate an image</p></li><li><p>comes up with a caption for social media posting</p></li><li><p>uses a custom tool to post to Bluesky</p></li></ol><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;f8bcdd59-6ad7-41fd-a876-979f8967704d&quot;,&quot;duration&quot;:null}"></div><p>Here is my setup:</p><ul><li><p>AI Model: a locally hosted <a href="https://ollama.com/hhao/qwen2.5-coder-tools">Qwen2.5</a>(I am using the 14b coder tool model), using Ollama (<a href="https://thewholefounder.substack.com/p/build-with-local-llm-ai-models-setting">quick how-to guide</a>)</p></li><li><p>Tools:</p><ul><li><p>An image Generation Tool from Hugging Face Spaces: <a href="https://huggingface.co/black-forest-labs/FLUX.1-schnell">https://huggingface.co/black-forest-labs/FLUX.1-schnell</a></p></li><li><p>a custom tool the AI agent can use to post to Bluesky</p></li></ul></li></ul><h3>Code</h3><p>Here&#8217;s the code for creating the agent. As you can see, it is very straightforward and easy to understand.</p><pre><code># define the LLM model used for the agent
model = OpenAIServerModel(
    model_id="hhao/qwen2.5-coder-tools:14b",
    api_base="http://localhost:11434/v1",
    api_key="ollama",
)

# text to image tool directly from Hugging Face
image_generation_tool = Tool.from_space(
    "black-forest-labs/FLUX.1-schnell",
    name="image_generator",
    description="Generate an image from a prompt"
)

# tool to post to Bluesky
bluesky_image_poster_tool = BlueSkyImagePoster()

# creating the agent
agent = CodeAgent(
    tools=[image_generation_tool, bluesky_image_poster_tool], 
    model=model, 
    add_base_tools=True
)

# running the agent
result = agent.run(
    """
    Could you generate an image of a sunny beach with dogs in it? Include between 1 to 5 dogs. Feel free to include scenaries or landscapes or other objects/animals or people. use detailed and specific prompt for the FLUX model. Use industry best practices for the prompt. High-end photography, award-winning photos, still life photography, and/or cinematic photography. choose between different photography styles, lighting, weather, seasons, and time of the day in the images. 
    
    Once the image is generated, generate a fun, engaging social media caption for this dog beach image and post it to Bluesky.
    
    Consider the following guidelines:
    - Use emotive and playful language
    - Include relevant hashtags, always include #dogsonthebeach #petlife #dogsofbluesky
    - Keep it concise (under 280 characters)
    - Capture the joy and energy of dogs on a beach
    """
)</code></pre><h3>Notes and Learnings</h3><ul><li><p>For the AI model, use one that can read/write code. This gives me the best result, which makes sense as I am using code agents from the library (<code>CodeAgent</code> class) which need to write actions in code.</p><ul><li><p>Note that Smolagents also supports the standard way of writing actions in JSON with the <code>ToolCallingAgent</code> class.</p></li></ul></li><li><p>Agents CAN fail to execute the task sometimes. Unlike programming directly, which gives you predictable and deterministic outcome, working with agents can be unpredictable. How the agent decides to use the tools will vary, and the LLM model used for the agent will have an impact.</p></li><li><p>On the official documentation, to use model on Ollama you'd go through LiteLLM. Alternatively you can use the OpenAIServerModel class as below:</p></li></ul><pre><code>from smolagents import OpenAIServerModel

model = OpenAIServerModel(
&#9;model_id="hhao/qwen2.5-coder-tools:14b",
&#9;api_base="http://localhost:11434/v1",
&#9;api_key="ollama",
)</code></pre><ul><li><p>When creating a tool, note that "output_type" supports most built-in types but not all of them. It didn't support <code>dict</code> which was what I was originally using</p></li><li><p>I published my Bluesky posting tool to a Hugging Face space. Although in the documentation it should be pretty straightforward, I did struggle for a couple of hours to make it work - there are validation checks that the tool need to pass (rightfully so) and other restrictions and I had to make changes to the tool. I have published the tool to <a href="https://huggingface.co/spaces/thebrandonwu/bluesky-poster">https://huggingface.co/spaces/thebrandonwu/bluesky-poster</a> but will need to clean it up before making it public for others to use. (also waiting for <a href="https://github.com/huggingface/smolagents/issues/427">this issue</a> to get resolved)</p></li></ul><h3>Thoughts</h3><p>Smolagents impressed me with its balance of simplicity and flexibility, making it an excellent choice for building AI agents, especially for beginners or iterative projects. Below are some specific insights from my experience:</p><p>I was able to build an agent and a custom tool with smolagents relatively quickly with my intermediary level of Python knowledge. It is certainly a library I'd continue to build with for the easy of use, and therefore the frequency I can iterate my project with it. I think it is a brilliant tool for anyone, especially those just starting to build with AI agents, to start building with.</p><p>Although it isn't necessary to have an agentic setup for this particular use-case &#8212; you could have easily generate an image prompt by, feed it into an image model, then generate a caption and post to a social platform via its SDK, using an agent is a fundamentally different setup and approach.</p><p>You write the tools an agent can decide to use in order to accomplish a task. The agent has, well, agency to decide how the task is accomplished. The ability to <strong>make decisions</strong> is a valuable difference. For instance, when generating and posting images, the agent can autonomously select the most relevant tools and handled the sequence of operations, reducing the need for direct intervention. This decision-making capability allowed it to adapt dynamically and perform tasks more efficiently, mimicking a human's ability to reason and prioritize. You could add more tools to its arsenal for it to do more down the line. If I were to continue working on this particular agent, I might add memory to it so that it remembers what had been posted before, visual recognition models for it to analyse image outputs before deciding to post, or have it generate content based on the performances of the posts.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thebrandonwu.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Whole Founder! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Build with Local LLM AI Models - Setting Up]]></title><description><![CDATA[I have been prototyping a number of LLM-powered AI digital products in the past couple of weeks to further understand how to work with and integrate AI models into my own projects and ideas, including running AI models locally, using AI to organise and make connections between my personal notes, creating a desktop app that reads my emails and draft replies in batch, AI as a dungeon master in a rogue-lite game, and using AI to continuously create new landing pages for A/B testing for my GMAT book.]]></description><link>https://thebrandonwu.substack.com/p/build-with-local-llm-ai-models-setting</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/build-with-local-llm-ai-models-setting</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Sat, 04 Jan 2025 18:02:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CcrD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have been prototyping a number of LLM-powered AI digital products in the past couple of weeks to further understand how to work with and integrate AI models into my own projects and ideas, including running AI models locally, using AI to organise and make connections between my personal notes, creating a desktop app that reads my emails and draft replies in batch, AI as a dungeon master in a rogue-lite game, and using AI to continuously create new landing pages for A/B testing for my GMAT book. I&#8217;ll write about each in separate blog posts. But first, let&#8217;s get some AI running on my device that I can use to test my projects.</p><h2>Running LLM Models Locally</h2><p>I want to try running LLM models on my local machine. I have a Mac Studio (Apple M2 Max, 32GB RAM). It&#8217;s not the most powerful machine you can build to run AI models, but I wanted to know how capable a typical computer you might find on your desk can be. I have found these local models to be sufficiently capable in most instances for the typical writing related tasks, idea generation, and analysis.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thebrandonwu.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Whole Founder! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Setting Up</h3><p>The easiest way I found is to simply use <a href="https://ollama.com/">Ollama</a>, which is a desktop platform that allows you to run and interact with AI models locally on your device.</p><p>Once installed, you run commands through its terminal interface to install models and manage them. (Use Terminal app on the Mac, and Command Prompt or PowerShell on Windows). You can simply type in &#8220;ollama run [model name]&#8221; to run the model. Here&#8217;s <a href="https://github.com/ollama/ollama?tab=readme-ov-file#cli-reference">the list of commands</a>.</p><p>You can find the list of models available on their <a href="https://ollama.com/search">Models</a> page, which also has commands you can copy and paste into the terminal to run them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CcrD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CcrD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png 424w, https://substackcdn.com/image/fetch/$s_!CcrD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png 848w, https://substackcdn.com/image/fetch/$s_!CcrD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png 1272w, https://substackcdn.com/image/fetch/$s_!CcrD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CcrD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png" width="952" height="896" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:896,&quot;width&quot;:952,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!CcrD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png 424w, https://substackcdn.com/image/fetch/$s_!CcrD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png 848w, https://substackcdn.com/image/fetch/$s_!CcrD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.png 1272w, https://substackcdn.com/image/fetch/$s_!CcrD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e84123-326f-4a93-ac5d-f905f25717b0_952x896.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>After experimenting with a few different models with different parameters/sizes, I am now running</p><ul><li><p><a href="https://ollama.com/library/llama3.2">llama3.2:latest (3b)</a> for general purpose use</p></li><li><p><a href="https://ollama.com/hhao/qwen2.5-coder-tools:14b">hhao/qwen2.5-coder-tools:14b</a> for coding agents. (and experimenting with the larger <a href="https://ollama.com/hhao/qwen2.5-coder-tools:14b">32b model</a>)</p></li></ul><p>Larger models I&#8217;ve tried have been too slow to be very useful. For example, I got a Llama3.3 model (<a href="https://ollama.com/library/llama3.3:70b-instruct-q2_K">70b-instruct-q2_K</a>) to work on my device but it was painfully slow. Note I have not done any optimisations with them so you might be able to find larger models that work on a computer with a similar spec.</p><p>Once you have model ready to go, you can chat with it in the terminal, or use a desktop app that talks to your local model if you prefer a more typical chat interface. <a href="https://github.com/AugustDev/enchanted">Enchanted</a> is the one I use on MacOS, and I will next try <a href="https://github.com/open-webui/open-webui">Open WebUI</a> for its extensibility. Here&#8217;s <a href="https://github.com/ollama/ollama?tab=readme-ov-file#web--desktop">a list of apps</a> that you can use with Ollama.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bwL9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bwL9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png 424w, https://substackcdn.com/image/fetch/$s_!bwL9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png 848w, https://substackcdn.com/image/fetch/$s_!bwL9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png 1272w, https://substackcdn.com/image/fetch/$s_!bwL9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bwL9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png" width="1241" height="938" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/922fba03-2515-484d-b729-ee79312f2904_1241x938.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:938,&quot;width&quot;:1241,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!bwL9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png 424w, https://substackcdn.com/image/fetch/$s_!bwL9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png 848w, https://substackcdn.com/image/fetch/$s_!bwL9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.png 1272w, https://substackcdn.com/image/fetch/$s_!bwL9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F922fba03-2515-484d-b729-ee79312f2904_1241x938.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>What&#8217;s even more important perhaps is that these models are now available in a whole suite of apps and tools running on your desktop. Let&#8217;s start with a personal notes assistant tool as an example. I&#8217;ll write about using Local LLM AI Models with Personal Notes with Obsidian and Smart Connections in another post. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://thebrandonwu.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading The Whole Founder! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[What Crypto Brings to the Table for Games (part 2)]]></title><description><![CDATA[Collectibles, Value, and Game Design]]></description><link>https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-2</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-2</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Wed, 10 Nov 2021 14:43:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JzVS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.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_!JzVS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JzVS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png 424w, https://substackcdn.com/image/fetch/$s_!JzVS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png 848w, https://substackcdn.com/image/fetch/$s_!JzVS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!JzVS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JzVS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:386849,&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_!JzVS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png 424w, https://substackcdn.com/image/fetch/$s_!JzVS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png 848w, https://substackcdn.com/image/fetch/$s_!JzVS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!JzVS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31bd5954-430c-44ee-8447-5803a859cc2c_3000x1500.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>Part 2: Micro &#8212; Collectibles, Value, and Game Design</h2><p>(also on <a href="https://mirror.xyz/0xd9bDc2a7458Bc5A7cfb1aA6f5c85C55554B55F1C/Z8QsqPAUf7JDjuEBuymPehNp9F35RMBenvrCWsJ63FY">mirror.xyz</a>)</p><p>Now that we've explored <a href="https://futureoffun.substack.com/p/what-crypto-brings-to-the-table-for-games-part-1">crypto gaming on a macro level to the ecosystem around our games</a>, let's take a closer look at how crypto assets differ from non-crypto assets in games, where their value comes from, and how that might change the way we design them.</p><h2>Collectibles</h2><p>Collectibles is an exciting new dimension enabled by way of NFTs.</p><p>Collectibles have existed in games before, but it is an entirely different beast when the underlying assets are tokenised. With higher utility and optionality, they are inherently more valuable than off-chain collectibles.</p><p>Ex. One would pay less for a bar of gold that cannot be used as a collateral for a loan than a bar of gold that can.</p><p>NFTs are unique, so even when their representations in games are identical, they can be valued differently. With the same item, people place higher values on NFTs with an earlier serial / mint ID. This is similar to collectible toys where even with the same toy, the ones with lower serial numbers (produced earlier) are valued higher than the ones with a higher number.</p><p>Additionally, provenance can also become a factor in the value of collectibles. An NFT that was previously held by Snoop Dog will have a higher value than other ones from the same collection.</p><p>The in-game assets we create for games are no longer considered to have infinite supply. I believe this is one reason why we are seeing crypto assets with very high prices. In-game assets have gone from having infinite supply to having scarcity.</p><p>Therefore when we think about tokenising assets in games, we should consider designing them as collectibles. I am of the opinion that not all traditional &#8220;unlock-able&#8221; items should be tokenised.</p><h3>Balancing NFT items in games</h3><p>Thinking in ways of collectibles helped us answer a question related to game design for crypto games: what happens when we make an in-game item less powerful for balancing reasons? Ex. If we nerf a card in a collectible card game, will its value drop - angering people who own the card?</p><p>When a physical Pokemon card is nerfed and banned from competitive play, its value actually increases. Even though you can only use it in casual play, players value it more because it will no longer be reproduced - increasing its scarcity.</p><p>I also found an example of this in the crypto game <em>Splinterlands</em> - you can <a href="https://gangbusters.notion.site/Case-Study-Retired-NFT-Assets-e5cfd99f2ef544da976f7fa83501f571">find my notes here</a>. If anyone has more examples of this please let me know!)</p><p>When items can be collectibles, their value is no longer only from their utilities in games. This is a new frontier of player psychology for games.</p><h3>Value of In-game Items</h3><p>The value of an asset comes from Utility and Collectibility.</p><p>A retired Pokemon card is low in Utility but now high in Collectibility (you can no longer buy it from source).</p><ul><li><p>For someone who plays the game (Player), this asset has no (Utility) value as you can&#8217;t play with it as you used to.</p></li><li><p>For someone who collects Pokemon cards (Collector), this asset now has a high value - other collectors can no longer buy it directly, only a limited number of them exist, and an even smaller number of them are available for secondary sale.</p></li></ul><p>Crypto enables us to explore serving the second group of people (Collectors). The motivations for Collectors are very different from those of Players. Collectors of physical toys don&#8217;t take the toys out of the box. The utility value of these toys to them is 0 and they value toys purely based on their Collectibility value. I think this is relatively new to games - and it introduces a new persona for whom we&#8217;ll have to design for.</p><h2>Play-to-Earn and Where the Money Comes From</h2><p><em><a href="https://www.protocol.com/fintech/axie-infinity-crypto-gaming">Play-to-Earn</a></em><a href="https://www.protocol.com/fintech/axie-infinity-crypto-gaming"> (P2E)</a> is a phenomenon hugely amplified by crypto. I believe a sustainable game economy will require a healthy in-flow of money from players who are paying for the experience itself* - a balance between <em>Play-to-Earn</em> participants and the traditional, <em>Pay-for-Fun</em> players.</p><p><em>Play-to-Earn</em> players participate in the ecosystem through value-adding activities (ex. grinding for rare items), while <em>Pay-for-Fun</em> players spend money to enhance their experience in the game, purchasing better equipment, levelling up cards, or simply having one more go.</p><p>We can even think of ourselves (game developers) as Play-to-Earn participants in the ecosystem. We play the game of <em>game development</em> (which is incredibly fun if you ask me), and we earn a living out of it.</p><p>It&#8217;s incredibly intriguing to think about what types of systems we can build to create a healthy P2E economy &#8212; where does value come from, who is adding value, and how are they rewarded for it?</p><ul><li><p>there are other sustainable modals where the cash inflow isn't from <em>Pay-for-Fun</em> players, particularly if the games have staking/rewards systems, eSports components, or sponsors/advertisers - the cash into the economy can be from any of the new categories of participants.</p></li></ul><h2>Game Design</h2><p>A crypto game designer needs to not only consider retention of and monetisation from players, but also juggle all the demands and motivations from all parties involved, maintaining a sustainable economy, and fostering a thriving community.</p><p>Additionally, when releasing new games (creating new economies), the impact of transitioning players/participants in and out of different games ecosystems needs to be carefully considered as well.</p><p>Game design is evolving from an understanding of psychology to now including a lot more social science - game theory, economics, organisational behaviour, political science...etc. It wouldn't surprise me if this becomes its own field of study with unique thought leaders and experts, with some of the learnings applicable to other, IRL social issues.</p><p>This will be a HARD and highly sought after position.</p><h3>Speculation</h3><p>Speculation is a concern for us. We are careful about how it could impact game design, the larger community, and long-term sustainability, especially considering players with less capital and free players who are contributing to the community in other ways.</p><p>The games and the community have to come first. Play-to-earn requires a sense of play (otherwise it&#8217;d just be work-to-earn). Both the community and the collectible aspects of crypto have the potential to change the fundamentals of games.</p><p>When we can monetise effectively from community engagement and collectibles (monetising the fandom), then games can potentially be designed with a strong focus on maximising fun, and away from F2P Skinner box mechanics and design.</p><p>On the other hand, speculation is also an opportunity. There's a lot to consider here - regulation, audience, social responsibility, but speculation is a strong motivation, arguably one that has contributed hugely to the advancement of web3 technology, that we should not ignore or overlook how it can be leveraged.</p><h3>Considerations</h3><p>Crypto gaming is still a relatively new field. Some of the things we are still exploring:</p><ul><li><p>How much of the game should be on-chain?</p></li><li><p>What relationships should be built between developer and players, and among different groups of participants, across multiple games?</p></li><li><p>Are oligarchs a problem? If so, how do we prevent it?</p></li><li><p>How much control can we give to the community while protecting the community from exploitation?</p></li></ul><p>No doubt there are a lot more questions to be answered.</p><h2>Conclusion</h2><p>Mobile and social games brought a huge number of people into gaming. I believe crypto gaming can do the same, bringing different categories of participants who might not consider themselves gamers to engage with our games.</p><p>It&#8217;s also a HUGE design challenge - all these different categories of people now need to be designed for. Managing their different motivations, designing emotions for these new participants, while juggling the economics of everything involved is no easy feat.</p><p>I am excited about what&#8217;s coming to this new frontier. We have a few projects in the works that incorporate some of these ideas, and I am excited to share more with you soon.</p><h2>Resources</h2><ul><li><p><a href="https://future.a16z.com/nft-canon/">a16z NFT Canon</a></p></li><li><p><a href="https://mobiledevmemo.com/ultima-online-nfts-and-player-run-economies/">NFTs, Ultima Online, and player-run game economies</a></p></li></ul><h2>Thanks</h2><p>Special thanks to these wonderful people who&#8217;d given me great feedback on the draft (in no particular order): Laura Pepper, Tom Kail, Mike Cann, Robin Ji, Kabir Hemrajani, George Sequeira, Sam Barberie, Charlie Graham, Evgeny Pasenyants, Jon Walch, <a href="https://www.snkrhud.com/">Brandon Martinez</a>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-2?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-2?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[What Crypto Brings to the Table for Games (part 1)]]></title><description><![CDATA[New Participants, Permission-less Opportunities, and Communities]]></description><link>https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-1</link><guid isPermaLink="false">https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-1</guid><dc:creator><![CDATA[Brandon Wu]]></dc:creator><pubDate>Wed, 10 Nov 2021 14:43:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3oMy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.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_!3oMy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3oMy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png 424w, https://substackcdn.com/image/fetch/$s_!3oMy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png 848w, https://substackcdn.com/image/fetch/$s_!3oMy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!3oMy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3oMy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:443741,&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_!3oMy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png 424w, https://substackcdn.com/image/fetch/$s_!3oMy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png 848w, https://substackcdn.com/image/fetch/$s_!3oMy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.png 1272w, https://substackcdn.com/image/fetch/$s_!3oMy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fc1e955-bce6-4873-8924-238d877e7bea_3000x1500.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>Part 1: Macro &#8212; New Participants, Permission-less Opportunities, and Communities</h2><p><em>(also on <a href="https://mirror.xyz/0xd9bDc2a7458Bc5A7cfb1aA6f5c85C55554B55F1C/co2w4tEnKh2KCj8USZw5r-8QRCzvzxzbE0N_eBp28Ds">mirror.xyz</a>)</em></p><p>In the past few months, I&#8217;ve spoken to people up and down the ecosystem of crypto gaming - from game directors, designers, investors, blockchain operators, to platform builders, to understand what it is, and what the future holds.</p><p>I&#8217;ve had questions about crypto currencies in the past. Adding gaming and a huge hype cycle to the mix, it was tricky to sort out the signals from the noise. I hope this article helps clarify and strengthen our understanding of crypto gaming. It's also the beginning of a conversation and I welcome your comments and thoughts (find me <a href="https://twitter.com/thebrandonwu">@theBrandonWu</a>)</p><p>I've split this into two parts. In part 1, let's look at crypto's impact on the macro level around the games we build. In part 2, we'll take a closer look at crypto assets themselves on a micro level.</p><p>Firstly: I am assuming you have a basic understanding of NFTs and the concept of digital scarcity, and have had some exposure to blockchain gaming.</p><h2>New Categories of Participants around Games</h2><p>Let's start with the thing that I am most excited about - the ability to bring in new categories of participants to the ecosystems in and around games, each with new value-adding activities.</p><p>Games have long had two main categories of participants - players and developers. Developers create a fun experience for players to purchase and enjoy.</p><p>Now with tokens and new ownership models, there can be collectors, community organisers, landlords, traders, promoters, creators&#8230;etc. New categories of participants can get involved and participate in the economics around the games efficiently.</p><p>You can be a landlord who rent out the property you've beautifully created in game, a trader who analyses the market of in-game items to find arbitrage opportunities, or a collector who enjoys the thrill of hunting for valuable assets and completing sets of collections. You can also be a marketer who takes on tasks set out by the community to earn tokens. (More on this in the community section below)</p><p>Just as eSports introduced spectators and sponsors to competitive gaming (many of whom don't play the games themselves), crypto is allowing more people to engage and participate in the activities around games without necessarily being a player.</p><p>This opens up new opportunities for shared interactive experiences.</p><p>It&#8217;s <em>the meta meta game</em>. I believe it will make gaming an even bigger market than we know it today, blurring the line between games and our digital lives.</p><h3>Products for New Participants</h3><p>All of these new categories of participants need to be considered and designed for if we are to maximise the value of blockchain for games. I believe the most successful crypto games will be ones that figure out how best to design around all the different incentives and motivations in the ecosystem around the games.</p><p>We will also see different products being built (by the developers or the communities) for different categories of participants, all integrated to the same game world. They will have different interfaces and interactions to suit the needs of each category of participants.</p><p>The interface for in-game asset day-traders will have more charts and fewer particle effects. The interface for landlords will look more like Shopify&#8217;s dashboard and less like SimCity.</p><p>The products can be a collection of desktop apps, browser extensions, Discord/Twitch add-ons&#8230;etc. Different apps connecting to the same game world.</p><p>These client side interfaces all interact with the same game, but they offer different utilities, and provide different values from the game itself.</p><h2>Permission-less Opportunities</h2><p>The new categories of participants are possible because of the new, crypto-enabled, ownership model of digital assets.</p><p>When assets are owned by players, they are no longer locked inside individual games. Anyone can build on top of them, and opportunities outside of the games themselves start to emerge. You can use high-value in-game NFTs as <a href="https://www.theblockcrypto.com/post/123165/someone-took-out-a-1-4-million-loan-with-an-nft-as-collateral">collaterals for loans</a>, or <a href="https://neftify.com/">rent out items</a> you own to other players.</p><p>Bundling is one of my favourite permission-less opportunities. When in-game items are NFTs owned by players, they can bundle up items from different games and sell them as a single package, without having to get every single developer behind all of the games to work together to create the bundling.</p><p>Without NFTs, all it takes is a single developer disallowing the bundle to break the whole package; the permission-less nature of NFTs make this a feasible idea. With NFTs, you will be able to bundle up assets from a thousand different games, and list the bundle up for sale within a few clicks without months of negotiation.</p><div><hr></div><p><strong>Side-note on Bundling</strong></p><p>Bundling is a powerful tool to create win-wins for both buyers and sellers. Quick Example:</p><ul><li><p>A market has one Seller who has 2 apples and 2 oranges to sell, and two potential Buyers.</p></li><li><p>Buyer A is willing to pay $5 for 1 apple and $1 for 1 orange</p></li><li><p>Buyer B is willing to pay $1 for 1 apple and $5 for 1 orange</p></li></ul><p>No Bundling:</p><ul><li><p>Selling apples at $5 and oranges at $5 =&gt; Seller gets $10</p></li><li><p>Buyer A buys 1 apple at $5 and 0 orange, Buyer B buys 0 apple and 1 orange at $5</p></li></ul><p>With Bundling:</p><ul><li><p>Selling bundles of 1 apple and 1 orange at $6 per bundle =&gt; Seller gets $12.</p></li><li><p>The bundle is attractive to both Buyer A and Buyer B, as they are both willing to pay $6 for 1 apple + 1 orange.</p></li></ul><p>With bundling, the seller makes $2 more, and the buyers each save $4 (they would have had to spend $10 to get 1 apple + 1 orange without the bundle)</p><div><hr></div><p>With non-player participants now in the ecosystem, bundles can have more value by appealing to these new group of people. Players place little value on items from games they don't play in a bundle. On the other hand, a trader might see a bundle as an arbitrage opportunity if they consider some of the items in a bundle to be hidden gems that will go up in value. The inclusion of new participants opens the door for new value creation opportunities.</p><p>The bundling idea came when we started discussing the value of Steam cards, particularly, what do you do with all the low value cards? There is a lot of wasted value in digital assets at the moment. Bundling is a powerful tool that can better extract value from digital assets. This gets even more interesting when we started thinking about bundling with raffles.</p><p>Bundling is just one example. With crypto, the efficiency gain isn&#8217;t necessarily on performance (how fast things can be done), or scale (how big it can get), but on how fast consensus can be reached (in the bundling example above, the only consensus needed is between the buyer and the seller).</p><p>We have increased the efficiency of machines to a point where the biggest speed bumps are now us humans. With crypto, we can increase the efficiency of humans. With permission-less-ness (composability), we increase the efficiency of human collaboration.</p><h2>Community</h2><p>The community of all the aforementioned new categories of participants will be the most valuable part of a crypto gaming project.</p><p>With 13k members on our Discord server, members help us with testing, moderating, hosting events, helping new players, creating content and tools...etc. And so far we've been rewarding their effort with Discord roles and in-game badges. These are good tools but also very limiting. The more "roles" you accumulate, the less meaningful they start to become.</p><p>The idea of leveraging tokens to encourage community activities is very compelling - a great tool for incentivising content creators &amp; community volunteers (e.g.. tournament hosts). Having been a community builder in the past when I started the Seattle Unity User Group, I've seen first hand how a strong community can lead to value creation - creative collaborations, knowledge sharing, not to mention enhanced social well-being and the launching of new careers for many.</p><h3>Modding, Creators, and User Generated Content</h3><p>Crypto offers an efficient way to distribute value created by the community by way of tokens.</p><p>Crypto-enabled communities, Decentralised Autonomous Organisations (DAOs) in particular, can supercharge community and creative activities around the games. DAOs introduce a way for you to be rewarded for contributing to a project. As long as there are interests in the project, the development of a fan project can continue. There have been many times I was excited about upcoming mods (modifications to games) but disappointed when the people behind the mod decided to stop. There aren't a lot of incentives for someone else to continue the development. An efficient way to reward and attribute contribution is a huge benefit that allows us to embrace an open and transparent creative/modding scene around our games.(See <a href="https://gitcoin.co/">Gitcoin</a>)</p><p>&#8212;</p><p>More on DAOs:</p><ul><li><p>Peter Yang <a href="https://twitter.com/petergyang/status/1447605297808232448">&#8220;What is a DAO?&#8221;</a></p></li><li><p>David Phelps <a href="https://twitter.com/divine_economy/status/1453480931487006728">&#8220;13 WAYS OF LOOKING AT A DAO &#128071;&#8221;</a></p></li><li><p>Packy McCormick <a href="https://www.notboring.co/p/the-dao-of-daos">&#8220;The Dao of DAOs&#8221;</a></p></li><li><p>@Cooopahtroopa <a href="https://coopahtroopa.mirror.xyz/_EDyn4cs9tDoOxNGZLfKL7JjLo5rGkkEfRa_a-6VEWw">&#8220;DAO Landscape&#8221;</a></p></li></ul><p>&#8212;</p><p>Can this lead to games being completely open-sourced and sustained by both the communities and the developers? When I first moved to the UK 6 years ago, I was intrigued by one of its prominent business institutions, John Lewis, one of UK&#8217;s largest department stores. John Lewis embraces a structure of strong <a href="https://www.theguardian.com/business/2012/jan/16/john-lewis-model-lessons">employee ownership</a> with an aligned goal. I believe DAOs could enable us to do the same with our communities.</p><h2>Next Up</h2><p>Now that we've explored how crypto changes the ecosystems and communities around games, let's take a closer look at <a href="https://futureoffun.substack.com/p/what-crypto-brings-to-the-table-for-games-part-2">NFT assets, their value, and their impact on game design in part 2</a>. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-1?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://thebrandonwu.substack.com/p/what-crypto-brings-to-the-table-for-games-part-1?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item></channel></rss>