<?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[Bryant’s Newsletter]]></title><description><![CDATA[How our lives intersect with technology practically and philosophically]]></description><link>https://blog.bawolf.com</link><image><url>https://substackcdn.com/image/fetch/$s_!IRut!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03bbe6e4-bfef-4a05-a8b8-2b22b12697b0_1024x1024.png</url><title>Bryant’s Newsletter</title><link>https://blog.bawolf.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 01 May 2026 12:28:54 GMT</lastBuildDate><atom:link href="https://blog.bawolf.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Bryant Wolf]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[bawolf@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[bawolf@substack.com]]></itunes:email><itunes:name><![CDATA[Bryant]]></itunes:name></itunes:owner><itunes:author><![CDATA[Bryant]]></itunes:author><googleplay:owner><![CDATA[bawolf@substack.com]]></googleplay:owner><googleplay:email><![CDATA[bawolf@substack.com]]></googleplay:email><googleplay:author><![CDATA[Bryant]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Making the illustrations for "Founding is a Snowball"]]></title><description><![CDATA[A couple months ago I published a sort of &#8220;children&#8217;s book for adults&#8221; called Founding is a Snowball. While the story is cute, what made it compelling were the accompanying illustrations. People were curious how I put them together so here are some of the details together so you can try for yourself.]]></description><link>https://blog.bawolf.com/p/making-the-illustrations-for-founding</link><guid isPermaLink="false">https://blog.bawolf.com/p/making-the-illustrations-for-founding</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Tue, 21 Apr 2026 22:12:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wm8O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A couple months ago I published a sort of &#8220;children&#8217;s book for adults&#8221; called <a href="https://blog.bawolf.com/p/founding-is-a-snowball">Founding is a Snowball</a>. While the story is cute, what made it compelling were the accompanying illustrations. People were curious how I put them together so here are some of the details together so you can try for yourself.</p><h1>At a High Level</h1><ul><li><p>I made the illustrations with Nano-banana.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p></li><li><p>I had GPT-5.2 describe reference images in words to make them more editable and portable.</p></li><li><p>Overly verbose, expressive image prompts used to be required, but modern models seem to find them distracting. I had better results telling them to speak clearly and concisely, the way you would to a person.</p></li><li><p>I defaulted to generating everything at least three times to get a sense of what was a prompt problem and what was model variance.</p></li><li><p>The total cost for the post was about $12.</p></li></ul><h1>Creating the Character</h1><p>In the first round of character generations I ended up with this which I liked quite a bit. It became the canonical reference which Nano-banana dubbed <em>Hat-coat Wanderer</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wm8O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wm8O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wm8O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wm8O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wm8O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wm8O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg" width="546" height="341.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:546,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wm8O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wm8O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wm8O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wm8O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61598241-4295-4f34-9548-ae5b569902c4_1280x800.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I tend to call him <em>Snowball man</em></figcaption></figure></div><p>I got pretty high variance for images. Here are some rejected examples:</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dacd426c-b5e8-4923-9191-53d805969041_1280x800.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ff8b8a5-4635-43ff-9944-dc7b9ec57768_1280x800.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a55ee5d6-0e68-4bd3-aceb-2ff4244fdd9e_1280x800.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a86f761-bce3-401d-98ff-271a5fcaffef_1280x800.jpeg&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/889983bf-1a79-4450-b16b-65e251f6324e_1280x800.png&quot;}],&quot;caption&quot;:&quot;Some of these characters are better literal expression of the prompt but they're not as good characters&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67793a6b-d996-4268-8e85-4d57b8c59743_1456x1210.png&quot;}},&quot;isEditorNode&quot;:true}"></div><h1>Specifying Illustrations</h1><p>Next I chose the lines in the story to illustrate. I wanted to pace them evenly throughout the story, highlighting emotionally salient scenes. At first, I tried to generate each description individually but they all sounded the same. The scenes that I got from generating them all at once were much better quality. I didn&#8217;t know which would be better, so I tried both Opus 4.5 and GPT-5.2.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QnA_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QnA_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png 424w, https://substackcdn.com/image/fetch/$s_!QnA_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png 848w, https://substackcdn.com/image/fetch/$s_!QnA_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png 1272w, https://substackcdn.com/image/fetch/$s_!QnA_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QnA_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png" width="1100" height="1140" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1140,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:182699,&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://blog.bawolf.com/i/194561649?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.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_!QnA_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png 424w, https://substackcdn.com/image/fetch/$s_!QnA_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png 848w, https://substackcdn.com/image/fetch/$s_!QnA_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.png 1272w, https://substackcdn.com/image/fetch/$s_!QnA_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52dee1c5-ae93-4da0-ac42-4c1a214524c6_1100x1140.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 wasn&#8217;t able to just use either&#8217;s responses wholesale. For some scenes, I combined the best parts of both descriptions. Other times I tweaked toward something the model was able to generate better. There were also scenes where I had something in mind already and wanted to see if the model agreed.</p><h1>Generating the Illustrations</h1><p>Each generation received:</p><ul><li><p>a chunk of general style text describing the characters, world, and art style</p></li><li><p>a sample image from the references</p></li><li><p>the character turnaround for any characters in the scene</p></li><li><p>the specific scene description</p></li></ul><p>There was a surprising amount of variability in these. Here are a bunch of samples for the opening illustration. Some of that variance was failing to adhere to the prompt and other was because I under-specified what I was looking for.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f657b0c5-9fbc-405e-b083-c311ebe4dc6d_1280x832.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6fc30ba-a0f5-4e31-ac3b-2a2897bc3b2a_1280x832.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f04df122-15bb-427a-8098-d41a77f0e305_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b3c29df-7abf-4627-9482-75be16acb70a_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/108bdf03-3fa2-4c4a-a9af-aaf7d28957cd_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cf84b6c5-8480-472e-8dc0-b59ad82f84eb_1280x800.png&quot;}],&quot;caption&quot;:&quot;Illustrations for the line \&quot;You reach down, clump some between your hands, and pack it in.\&quot;&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a40f6dbd-cb2e-4db5-a98c-ff9c08c59d71_1456x964.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>Even then, I rarely one-shotted the illustration I ended up using. They usually required edits. One clear example is the background of the opening image. Once I found the pose and framing I liked, I removed the original background that I found too heavy and replaced it with something lighter.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc913d8b-8549-4d2d-ab78-823ea2a1895d_1280x800.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73217127-ace2-4357-9269-f6056ea9823d_1280x800.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3e749c7-27df-4190-9d63-dc011f4dfc7e_1280x800.jpeg&quot;}],&quot;caption&quot;:&quot;Removing and replacing the background&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1d564b1-e078-415c-95d4-0a86f1fa3118_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><h1>Places the Model Struggled</h1><p>The models have gotten so much better. Edit models have been a step-wise improvement, and Nano-banana specifically seems like the breakthrough that makes consistency possible. However there were still gaps where I was fighting a tool, rather than working with it a collaborator.</p><h2>Creating a second character</h2><p>The turnaround for the second character was a delicate dance of trying to extract the essence of the art style without grabbing too much of the specific character. I wanted someone individually recognizable, rather than the main character color swapped.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1415b952-f7ad-46a7-998d-a635d553c173_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b4697b5-6f7f-4b05-aca7-1d21c124135e_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcc9b2e3-b000-4d9b-92a9-3abf9dcfc17f_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c552369-375b-4da4-8043-631b34b4bfd1_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9650fa96-6b3a-4f41-a183-c8b7fc5288dc_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39e60e39-8254-40d1-8940-56e9432eda3d_1280x800.png&quot;}],&quot;caption&quot;:&quot;Basic character variation from LLMs and Nano Banana left something to be desired&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46b0cb33-5d3f-4865-b62e-5d6e8152fc4d_1456x964.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>I tried a few different tactics to brainstorm how some characters might differ: height, weight, skin color, hair color, different kinds of hats, jackets and other winter gear. The tactics that got the LLM  brainstorming effectively were very similar to the ones I&#8217;d built into <a href="https://blog.bawolf.com/p/imagining-abundance">Imaginator</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3yA5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3yA5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!3yA5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!3yA5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!3yA5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3yA5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png" width="605" height="378.125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:605,&quot;bytes&quot;:155776,&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://blog.bawolf.com/i/194561649?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.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_!3yA5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!3yA5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!3yA5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!3yA5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb3ca49-26db-4cce-aae2-1ff19975baa7_1280x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The final turnaround for the second character</figcaption></figure></div><h2>Placing characters relative to each other</h2><p>For the line &#8220;<em>Humbly, the best direction is often neither where you nor they are pushing, but the place it ends up rolling somewhere in between,</em>&#8221; Nano-banana really wanted to put the characters on opposite sides of the snowball, but the line calls for characters pushing at slightly different angles. Their combined vector needs to still be going somewhere for the story to make sense.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06030179-a656-4bed-8a42-6ba89039ef98_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e804e42-11e7-4eb4-b448-20c9d6368824_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3038c467-dfcd-45f8-9f76-5f1e88414a23_1280x800.png&quot;}],&quot;caption&quot;:&quot;It was hard to get them to express the right amount of conflict with each other&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/025a7877-c04a-461d-80a6-06e15c88ed9d_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>I tried a host of different ways to describe this: descriptions, angle measurements, even a diagram. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cnO5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cnO5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cnO5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cnO5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cnO5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cnO5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg" width="291" height="274.1734693877551" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1108,&quot;width&quot;:1176,&quot;resizeWidth&quot;:291,&quot;bytes&quot;:71068,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/194561649?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.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_!cnO5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cnO5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cnO5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cnO5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F635bf6f0-ae60-45cc-a7c9-5a72cf6b6f39_1176x1108.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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">This did not help the model, hopefully it wasn&#8217;t a skill issue.</figcaption></figure></div><p>Eventually, I got lucky. Even then, the snowball path never made sense. I had to edit it in afterwards.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25853b90-9445-43b2-afd1-60c9cbc1b584_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd511815-69cc-4368-999a-e320a5ba1eb7_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55ea28da-3ad2-43b2-9075-7ca94ae86012_1280x800.png&quot;}],&quot;caption&quot;:&quot;&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b356caf-0785-44a0-a563-4e049078b0e4_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><h2>Many children pushing</h2><p>It was comically hard to get a crowd pushing the ball. The model lost any pretense of where the ground was. These characters are either climbing on the ball or floating in space.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f98b29ec-db12-4d6c-8ff6-438f4593c565_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e500d65-b8b9-4c91-a3f5-1f25b2854a07_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/061f1d32-6348-489f-97f2-d6c61c59c49d_1280x800.png&quot;}],&quot;caption&quot;:&quot;These characters do not look like they're pushing a giant snowball together effectively&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3706d9c-9034-4cc3-ab2a-5a459ed96730_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>It was easy to make a crowd, but it was hard to get a quality one. Generating the crowd all at once was better than adding more children sequentially as edits. Edits led to the same character being added in multiple places, or the style or scale of the characters drifting and looking out of place.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c2d39c1-3341-4d98-a892-0295259f0636_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22471ef6-dbf1-4012-9a26-10f01b719c41_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c87d2b4a-ee38-49e4-b234-1c190e41fc81_1280x800.png&quot;}],&quot;caption&quot;:&quot;&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78e5b562-ca7e-4b52-8197-578aa4ee73ba_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>While I was finally able to get them pushing in one direction, I&#8217;m not sure how effective their strategy would actually be.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uu6N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uu6N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!uu6N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!uu6N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!uu6N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uu6N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png" width="578" height="361.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebe6586b-4789-4498-80eb-87b31195c05e_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:578,&quot;bytes&quot;:145091,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/194561649?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!uu6N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!uu6N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!uu6N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!uu6N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febe6586b-4789-4498-80eb-87b31195c05e_1280x800.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>A really big snowball</h2><p>Nano-banana consistently produced a snowball that was about twice the size of the character. I tried a handful of strategies like &#8220;<em>a massive snowball that fills most of the frame</em>&#8221; or &#8220;<em>the size of an office building</em>&#8221; and edits like &#8220;<em>Make the snowball 10 times the characters size</em>&#8221;. </p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e65b0d37-4d2a-4dc6-9a77-1523ef02cd39_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d89ec2b-0558-4ad6-bdaa-678756573c1b_1280x800.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c10e5b1b-923f-441d-a727-c7453fb4382e_1280x800.png&quot;}],&quot;caption&quot;:&quot;Trying to hyperbole my way to a larger snowball&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd3e428b-dbf4-42b9-853d-e15f50929e23_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p>In the end the bit of hyperbole that got me there was &#8220;<em>Make the character tiny so the snowball looks like a planet!</em>&#8221;</p><h1>Conclusion</h1><p>One commenter on Hacker News captured it perfectly:</p><blockquote><p>I know some people are going to be upset at model generated illustrations. But I think the alternate is probably, no illustrations. There&#8217;s a lot of unnecessary AI image slop all around and most add no value or worse makes you just avoid reading the content by their awfulness. This was done really well and I am not sure I would have read it fully without it.</p><p>-<a href="https://news.ycombinator.com/item?id=46814581#46854513">tecoholic</a></p></blockquote><p>Even as someone who grew up doodling in all of my notebooks in school, I don&#8217;t know if I would ever have crafted illustrations with enough quality to be ready to publish this. I certainly would not have hired someone. But if I keep getting better at this, maybe for a future project, I can. </p><p>I&#8217;m not sure if these illustrations will stand the test of time or if they&#8217;ll feel dated like Stable Diffusion or the animation from the original Shrek. Regardless of how timeless the work is, I&#8217;m thankful that something that came out of my head reached people in a positive way.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you like this, or the original story, subscribing is the only way to make sure you get don&#8217;t miss out later</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Nano-banana-pro didn&#8217;t give meaningfully better results and was much more expensive; Nano-banana-2 wasn&#8217;t out at the time. All of the models in this article might be out of date now. It&#8217;s amazing how fast this all moves!</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>If I were to go back and update the piece, I would spend more time on the backgrounds creating more consistency in content and style</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Founding is a Snowball]]></title><description><![CDATA[It can happen to anyone.]]></description><link>https://blog.bawolf.com/p/founding-is-a-snowball</link><guid isPermaLink="false">https://blog.bawolf.com/p/founding-is-a-snowball</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Thu, 29 Jan 2026 18:45:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XJ8t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It can happen to anyone.</p><p>The urge is pure. </p><p>You wake up to fresh snowfall. On goes your jacket and gloves and you&#8217;re out into the crisp, cool air.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XJ8t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XJ8t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XJ8t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XJ8t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XJ8t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XJ8t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:659020,&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://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.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_!XJ8t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XJ8t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XJ8t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XJ8t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8060f95-6eee-49ca-aef8-48680ff42363_1280x800.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>You reach down to clump some between your hands. The snow is sticky and soft. You reach down for more and pack it in. Soon it&#8217;s so big that you set it down to roll. How the snow from the ground sticks to it. How it grows.</p><p>Behind you there are other places with other hands rolling balls and little snow left on the ground. Ahead of you is clean and white. </p><p>It&#8217;s only when looking back that a trail appears.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T8De!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T8De!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!T8De!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!T8De!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!T8De!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T8De!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:825523,&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://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.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_!T8De!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!T8De!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!T8De!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!T8De!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b981185-414a-4924-9b5e-a54e3a3da096_1280x800.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>Sometimes you push alone. Sometimes others push with you. It can be just one person or a few. </p><p>When you all push together the ball rolls faster. It grows fast too. Wonder at how this thing that once fit in the palm of your hand that now has room for two, three, four pairs of hands.<br><br>There are moments the ball rolls so fast you fall behind. You&#8217;re no longer guiding it&#8212; You&#8217;re chasing it! There are moments when it won&#8217;t budge and you have to count to three so you can all push it in unison.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j9Rn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j9Rn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j9Rn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j9Rn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j9Rn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j9Rn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1025055,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.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_!j9Rn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j9Rn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j9Rn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j9Rn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ddcd421-19a5-4d9b-89db-62b18cb0045e_1280x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>It&#8217;s okay if the other hands push somewhere slightly off course.  You&#8217;ll stubbornly fight to redirect it to where you want it to go. Humbly, the best direction is often neither where you nor they are pushing, but the place it ends up rolling somewhere in between.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C6Pa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C6Pa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C6Pa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C6Pa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C6Pa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C6Pa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:646357,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.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_!C6Pa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C6Pa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C6Pa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C6Pa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b0920e2-e5bd-49c8-86b6-dd642512ff9a_1280x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If the other hands are pushing back directly against yours, the ball will falter. As it does, you might start to argue. In those times, hands might have to stop pushing. Sometimes they&#8217;re theirs. Sometimes they&#8217;re yours.</p><p>It&#8217;s hard to tell what part of the snowball is theirs and what part is yours. It&#8217;s senseless to try to split it up. Instead, it&#8217;s best when someone reaches toward the ground, clumps snow between their hands, and starts afresh.</p><p>There is grief in parting. But that needn&#8217;t be all you feel. Now that you&#8217;re out of each other&#8217;s way, you can wave adieu with a grin. You&#8217;ll both roll much bigger snowballs than this one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qAkn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qAkn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!qAkn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!qAkn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!qAkn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qAkn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1104073,&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://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.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_!qAkn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!qAkn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!qAkn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!qAkn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb507bc0-5d10-4fd0-8b1e-a39602354664_1280x800.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>Keep the ball moving. If it stops, you might never get it started again. Besides, there&#8217;s no more snow where you&#8217;re standing.</p><p>If you&#8217;re lucky, it continues to grow. Bigger than a car. Bigger than a house. Other people will see its glory and join their smaller snowballs into it. They see the inertia and want to be part of the fun. More hands can help when they know where it&#8217;s going. But changing course is a whole different story.</p><p>When going uphill, everyone needs to agree the hill is worth climbing. When tumbling down, they must work together to guide it swiftly past rocks and trees. There are so many of you now. All pushing together. The path behind you is long. You couldn&#8217;t see where you are now from where you started.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1AyA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1AyA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1AyA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1AyA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1AyA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1AyA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1009636,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.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_!1AyA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1AyA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1AyA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1AyA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1239fe76-f641-487e-ae1a-fb7289b0c038_1280x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>It starts to get warm. The ground ahead is full of sticks and leaves. The snow has worn away. Despite all the hands pushing, the snowball starts to shrink. You think there&#8217;s a rich field ahead, but you can&#8217;t say for sure. The ball is so big now you can&#8217;t see around it. It&#8217;s easier to see left or right, and it can be tempting to go there instead. Not everyone will stick around to find out.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PwLH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PwLH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PwLH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PwLH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PwLH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PwLH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:924637,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.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_!PwLH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PwLH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PwLH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PwLH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde8ada2d-9c57-434e-9f9e-2e8a0d29b445_1280x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You&#8217;ll have to make a call. Sometimes the right answer is to forge ahead. Try to survive until the next storm. When the fresh powder hits, scoop it up. Survive a few storms and the ball is a mountain that can weather a whole summer. Make it a few summers, and it has its own weather, keeping the warm at bay. Eventually, the tiny clump between your fingers is a moon so big other people roll their own balls across its surface.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kK6A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kK6A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kK6A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kK6A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kK6A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kK6A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/faef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1031448,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.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_!kK6A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kK6A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kK6A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kK6A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffaef8ed6-b3a6-4588-83a7-765f2701d8ec_1280x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>Other times the seasons are changing too fast and the snow is retreating everywhere you go. You can&#8217;t know for sure which situation you&#8217;re in from where you&#8217;re standing.</p><p>That&#8217;s just the mystery of it.</p><p>But every morning, there&#8217;s the window. There&#8217;s the ball. There&#8217;s your jacket on the hook.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l8FM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l8FM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l8FM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l8FM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l8FM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l8FM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:997338,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/185131970?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.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_!l8FM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l8FM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l8FM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l8FM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11043bda-9003-4d5f-97ef-64be5bcf0a0d_1280x800.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you feel the urge, listen to it.</p><p>After all, that&#8217;s what got you started in the first place.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you enjoyed this and want to keep up with more of my writing, please subscribe!</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[Fighting the Last War]]></title><description><![CDATA[By the time you understand a decade, it's already over.]]></description><link>https://blog.bawolf.com/p/fighting-the-last-war</link><guid isPermaLink="false">https://blog.bawolf.com/p/fighting-the-last-war</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Wed, 31 Dec 2025 18:02:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z2r0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>2025 was a changing-of-the-guard year for me. I&#8217;m about to turn 35. In January my first nephew stepped into my life; in November my grandfather stepped out. For most of the last decade, my life has felt relatively stable, but time itself feels like it&#8217;s accelerating. Ages 20&#8211;25 felt longer than 25&#8211;30, and 30&#8211;35 passed faster still.</p><p>Everyone knows that time speeds up as we age. We talk about it all the time, but we don&#8217;t really have cultural institutions that make this acceleration <em>felt</em> in an embodied way. There&#8217;s no ritual that prepares us for how quickly the years go by.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z2r0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z2r0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png 424w, https://substackcdn.com/image/fetch/$s_!Z2r0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png 848w, https://substackcdn.com/image/fetch/$s_!Z2r0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png 1272w, https://substackcdn.com/image/fetch/$s_!Z2r0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z2r0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png" width="1200" height="896" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:896,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1650115,&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://blog.bawolf.com/i/182918662?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.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_!Z2r0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png 424w, https://substackcdn.com/image/fetch/$s_!Z2r0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png 848w, https://substackcdn.com/image/fetch/$s_!Z2r0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.png 1272w, https://substackcdn.com/image/fetch/$s_!Z2r0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F019c1ca6-a19a-439d-b206-e1d03aa6527f_1200x896.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">How it would go trying to teach kids about what life is like as a adult.</figcaption></figure></div><p>One of my big fears is that I&#8217;m still fighting the last war, trying to win my twenties even though they&#8217;re behind me. We all know the archetype: The jock who peaked in high school and can&#8217;t let go of the dropped pass that cost them the state championship, the forty-year-old who hasn&#8217;t realized they&#8217;re the oldest one at the club. As someone who is still <a href="https://www.instagram.com/bryantflips/">spinning on my head</a> once or twice a week, this is probably an important question to ask. It feels important to challenge my body and to have a place in my life for play but maybe that&#8217;s a cope.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xK9G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xK9G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 424w, https://substackcdn.com/image/fetch/$s_!xK9G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 848w, https://substackcdn.com/image/fetch/$s_!xK9G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 1272w, https://substackcdn.com/image/fetch/$s_!xK9G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xK9G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png" width="1200" height="896" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:896,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1805472,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/182918662?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.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_!xK9G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 424w, https://substackcdn.com/image/fetch/$s_!xK9G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 848w, https://substackcdn.com/image/fetch/$s_!xK9G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 1272w, https://substackcdn.com/image/fetch/$s_!xK9G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a2bdc0f-9e5b-407b-8b0c-33ce9dcd1bab_1200x896.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Going to break as a 35 year old</figcaption></figure></div><p>I&#8217;m not busting my skills out on Friday nights trying to attract women at parties anymore. I&#8217;ve traded that for 30 seconds of fame at the couple of weddings I attend every year. When my parents were my age, they had three kids, the oldest of whom was almost twelve. There are <a href="https://www.instagram.com/bboy__nana/">ten-year-old professional bboys</a> doing skills I&#8217;ll never be able to learn to do. I could be busy taking my own kids to sports practices and living vicariously through their achievements.</p><p>I saw winning my twenties as building my potential. it was about taking risks and trying hard. Exploring possibilities and seeing what I had a knack for, trying out different identities and seeing how it felt to be in different crowds. I wanted to craft a sense that I was going places.</p><p>The rules changed in my thirties. Optionality is valuable, but it was time to start choosing. It was no longer enough to have a bright future ahead of me. I needed evidence that when faced with a fork, I chose a good path. If my twenties were about creating more branches on the tree, my thirties were about starting to prune it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Usag!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Usag!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 424w, https://substackcdn.com/image/fetch/$s_!Usag!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 848w, https://substackcdn.com/image/fetch/$s_!Usag!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 1272w, https://substackcdn.com/image/fetch/$s_!Usag!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Usag!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png" width="2400" height="1468" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1468,&quot;width&quot;:2400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6752357,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/182918662?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F933731c6-bef0-4289-9a5a-372d91dd6107_2400x1792.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_!Usag!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 424w, https://substackcdn.com/image/fetch/$s_!Usag!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 848w, https://substackcdn.com/image/fetch/$s_!Usag!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 1272w, https://substackcdn.com/image/fetch/$s_!Usag!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6023b50e-5038-4204-8d35-7ffe9d402dcc_2400x1468.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Choices we all have to make someday.</figcaption></figure></div><p>Thinking something isn&#8217;t the same as doing it. I don&#8217;t feel like I&#8217;m really nailing my thirties. Sure, my body still works and I believe I&#8217;m taking great care of it in ways that compound over time relative to my sedentary peers, but I&#8217;m the only one of my 5 college roommates who isn&#8217;t married. I got engaged this year, but more than twenty couples we want to invite to the wedding have children. I&#8217;ve achieved good financial stability but I&#8217;m not clearly on a path to make a meaningful professional contribution. In many ways, I&#8217;m still someone with great potential rather than someone walking their path.</p><p>It feels like remedial extended twenties bonus time, as if I got myself diagnosed with ADHD just to get extra time on the tests. Only here, it costs me some of my thirties to do it. Given how fast time is moving, by the time I really understand how to win my thirties, they&#8217;ll be over. Maybe the move is to start putting energy towards really nailing my forties.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I6CA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I6CA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 424w, https://substackcdn.com/image/fetch/$s_!I6CA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 848w, https://substackcdn.com/image/fetch/$s_!I6CA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!I6CA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I6CA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg" width="660" height="361" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:361,&quot;width&quot;:660,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:21489,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/182918662?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.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_!I6CA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 424w, https://substackcdn.com/image/fetch/$s_!I6CA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 848w, https://substackcdn.com/image/fetch/$s_!I6CA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!I6CA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8cd10be-0cbb-42cc-8d53-efbe8ff26007_660x361.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If this kind of thing sparked joy or curiosity in you, subscribe for future updates.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Imagining Abundance]]></title><description><![CDATA[How guided exploration can replace random generation in the era of abundant AI]]></description><link>https://blog.bawolf.com/p/imagining-abundance</link><guid isPermaLink="false">https://blog.bawolf.com/p/imagining-abundance</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Thu, 13 Mar 2025 17:34:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6_IQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6_IQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6_IQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 424w, https://substackcdn.com/image/fetch/$s_!6_IQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 848w, https://substackcdn.com/image/fetch/$s_!6_IQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 1272w, https://substackcdn.com/image/fetch/$s_!6_IQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6_IQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp" width="728" height="416" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:768,&quot;width&quot;:1344,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:84824,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/158882766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6_IQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 424w, https://substackcdn.com/image/fetch/$s_!6_IQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 848w, https://substackcdn.com/image/fetch/$s_!6_IQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 1272w, https://substackcdn.com/image/fetch/$s_!6_IQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8c0cc17-e202-4fce-b7db-ceffd4b46ed3_1344x768.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My partner left town two weeks ago, and any free time that wasn&#8217;t spent exercising or walking the dog was gobbled up. My midnight to 3 AM block stopped being for sleep and started being for projects.  I&#8217;ve been writing more code than I have in years. I&#8217;m not alone. <a href="https://www.vice.com/en/article/ok-wtf-are-wordcels-and-shape-rotators/">Shape rotators</a> everywhere are <a href="https://x.com/levelsio/status/1894429987006288259">vibing</a>.</p><h2>Becoming Even More Curious</h2><p>The perceived difficulty of creating is falling off a cliff. AI streamlines the unpleasant parts of getting started. It anticipates my needs and fills in the gaps. But more than that, it engages with me when I&#8217;m most inspired, able to reflect my enthusiasm even in the middle of the night. It has the opportunity to make us more curious, creative, and ambitious so that we can do the best work of our lives.</p><p>Not everyone agrees. In an article in the New Yorker, <a href="https://www.newyorker.com/culture/the-weekend-essay/why-ai-isnt-going-to-make-art">Ted Chiang dismissed AI art</a>, claiming that it reduces 10,000 choices into one and that AI fills in the blanks with the average decision. He called it time-saving but sterile. He&#8217;s stuck seeing things as they are, not as they could be. This confounds me, given that his own example of &#8216;<em>Director Bennett Miller generating hundreds of thousands of images to discover the meaningful 20</em>&#8217; is staring him in the face. We need more people exploring the Miller path. It&#8217;s not about how AI can turn 10,000 choices into 1, but how AI can empower us to make 100,000 choices or even a million!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!66L-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!66L-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 424w, https://substackcdn.com/image/fetch/$s_!66L-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 848w, https://substackcdn.com/image/fetch/$s_!66L-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 1272w, https://substackcdn.com/image/fetch/$s_!66L-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!66L-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png" width="863" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:863,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177678,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.bawolf.com/i/158882766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.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_!66L-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 424w, https://substackcdn.com/image/fetch/$s_!66L-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 848w, https://substackcdn.com/image/fetch/$s_!66L-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 1272w, https://substackcdn.com/image/fetch/$s_!66L-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff89072cb-d056-4410-a2c9-203aa8b9973b_863x718.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As an experiment and an example, I put together a project that I&#8217;m calling <a href="https://imaginator.bawolf.com/">Imaginator</a> to help people refine an image from a prompt, details chosen by models, and grids of images.  I hope it will deliver a magic moment of discovering meaningful aspects of your idea you didn&#8217;t know you were looking for. I hope the concept is fun, and I'm thrilled to have something concrete that embodies design principles I'm genuinely passionate about.</p><h2>Explore vs. Exploit</h2><p>Most AI image tools focus on coercing diffusion models to produce an exact output. They presuppose that we have a vision figured out and are merely executing. <a href="https://blog.bawolf.com/p/creativity">Creativity</a> doesn&#8217;t work that way. It&#8217;s full of experiments, chance, and happy accidents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2hqM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2hqM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png 424w, https://substackcdn.com/image/fetch/$s_!2hqM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png 848w, https://substackcdn.com/image/fetch/$s_!2hqM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png 1272w, https://substackcdn.com/image/fetch/$s_!2hqM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2hqM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png" width="475" height="389" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:389,&quot;width&quot;:475,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40421,&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://blog.bawolf.com/i/158882766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.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_!2hqM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png 424w, https://substackcdn.com/image/fetch/$s_!2hqM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png 848w, https://substackcdn.com/image/fetch/$s_!2hqM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.png 1272w, https://substackcdn.com/image/fetch/$s_!2hqM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3338142f-4f4b-4316-ae06-343ff2223a8f_475x389.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>Imaginator for exploring rather than exploiting. In addition to generating an image, it brainstorms categories of prompt refinements you could make, like <em>Art style</em>, <em>Pose</em>, and <em>Lighting,</em> along with specific values for each category, like <em>Black and white photo</em>, <em>Anime</em>, or <em>Oil painting</em>. You can add your own manually or ask the AI to generate more at both levels. We should never have to stare at a blank page again. Models can brainstorm sensible values that are tailored to our needs.</p><h2>Creativity is Curation</h2><p>There&#8217;s a <a href="https://news.ycombinator.com/item?id=6097663">parable from </a><em><a href="https://news.ycombinator.com/item?id=6097663">Art &amp; Fear</a></em> about a ceramics professor who grades students on the literal quantity of their artwork in pounds rather than the quality of a particular piece. The best pieces all came from the quantity group. The lesson is that great work doesn&#8217;t come from obsessing over a single piece but experiencing all the nuances of many times over.</p><p>While the parable is about practicing a craft, I think it also applies to developing taste. Quantity creates quality. Similarly, modern chess students learn by watching games and trying out different moves at pivotal moments. The critical part of learning by quantity is a tight feedback loop. I hope Imaginator gives you enough experience with each option to help you build a taste for which one you&#8217;d like.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aat8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aat8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 424w, https://substackcdn.com/image/fetch/$s_!aat8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 848w, https://substackcdn.com/image/fetch/$s_!aat8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!aat8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aat8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png" width="728" height="525.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:1051,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aat8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 424w, https://substackcdn.com/image/fetch/$s_!aat8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 848w, https://substackcdn.com/image/fetch/$s_!aat8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 1272w, https://substackcdn.com/image/fetch/$s_!aat8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfd7d03f-683a-403a-9663-78a6d059fdb7_1495x1079.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If <em><a href="https://www.youtube.com/watch?v=X9RYuvPCQUA">Everything is a Remix</a></em> and good ideas are just new combinations of existing ideas, I wondered, &#8220;How much can you learn about what you want by experiencing many combinations at once?&#8221; Instead of trying to one-shot precisely what you&#8217;re looking for, Imaginator shows the breadth of possibilities. I wanted you to explore the variations that exist within your prompt. I&#8217;m convinced there are ways to craft and design without being locked into chat. Images seem perfect because people can quickly scan them and naturally curate what they&#8217;re looking for.</p><h2>Meaningful Constraints</h2><p>The constraints of the last two years are falling away. The cost of LLM inference from Open AI has fallen by <a href="https://www.reddit.com/r/singularity/comments/1fo2nj8/dane_vahey_of_openai_says_the_cost_per_million/">99%</a>. We can generate images <a href="https://replicate.com/blog/flux-is-fast-and-open-source">as fast as we can type</a>, each costing a fraction of a penny. Soon, intelligence will be too cheap to meter. What was scarce is now abundant, and learning what to do with it takes time.</p><p>Existing AI tools return multiple images, but we can&#8217;t tell why. It&#8217;s usually something behind the scenes, like a different model, LoRA, or seed number. Regardless, the content is displayed in a grid, but their positions aren&#8217;t semantically meaningful. We can&#8217;t act on the differences between images, so we&#8217;re left pulling a slot machine and hoping for a jackpot.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6_pN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6_pN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png 424w, https://substackcdn.com/image/fetch/$s_!6_pN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png 848w, https://substackcdn.com/image/fetch/$s_!6_pN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png 1272w, https://substackcdn.com/image/fetch/$s_!6_pN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6_pN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png" width="1456" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2397554,&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://blog.bawolf.com/i/158882766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.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_!6_pN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png 424w, https://substackcdn.com/image/fetch/$s_!6_pN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png 848w, https://substackcdn.com/image/fetch/$s_!6_pN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.png 1272w, https://substackcdn.com/image/fetch/$s_!6_pN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d687f99-420e-4443-9583-afd02594fd49_2147x1085.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>We must move from the <a href="https://blog.bawolf.com/i/154523438/the-shape-of-good-tools">violin era of AI art to the guitar era</a> by creating metaphorical &#8216;fret&#8217; guardrails that keep us in lanes that produce more controlled content. When the rows and columns on a grid represent specific differences between images, each variation is a unique combination of two particular choices. Scanning in any direction varies the image based on one category while holding the other constant to help you discover what&#8217;s important to you.</p><h2>Tree of Possibilities.</h2><p>Creation can be messy. I wanted to let you select different category combinations until you&#8217;ve found  variations that are meaningful to you. This felt like what Bret Victor was talking about when he promoted showing <a href="https://youtube.com/clip/UgkxddxmFQj6iBKnE7bK_ugpCh3skLD2_Toa?feature=shared">all possible universes</a> so that you don&#8217;t need to model the whole problem in your head.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> This frees up brain power for other parts of the problem.</p><p>Details are fractal. As Ted Chiang alludes, the &#8220;big&#8221; ones aren&#8217;t necessarily more important than the &#8220;small&#8221; ones. Furthermore, once you settle on one, more new questions pop up. I wanted to model this by letting you select an image you like from the grid, which adds those two details to the prompt and generates new possibilities for further exploration. As you iron out more details, I hoped the variations would converge.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1umT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1umT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png 424w, https://substackcdn.com/image/fetch/$s_!1umT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png 848w, https://substackcdn.com/image/fetch/$s_!1umT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!1umT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1umT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png" width="1003" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1003,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:330721,&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://blog.bawolf.com/i/158882766?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.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_!1umT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png 424w, https://substackcdn.com/image/fetch/$s_!1umT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png 848w, https://substackcdn.com/image/fetch/$s_!1umT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!1umT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97d54a2f-6f92-4509-89c8-36fb18006603_1003x1024.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>Additionally, sometimes paths don&#8217;t work out, or our curiosities change. So, I wanted to ensure you could walk back up the tree and select variations representing different values to continue your exploration.</p><h2>Conclusion</h2><p>Imaginator is alpha as hell. There are no accounts or logins. Sometimes, you need to refresh for the images to load correctly. You should probably be able to edit the prompt, and there&#8217;s no way to visualize the tree or your current position. Frankly, even adding and manipulating details leaves a lot to be desired. That said, I&#8217;m impressed by how fast I got to feel this concept and see if it had legs.</p><p>This is a wild time to be alive. Things are changing fast, and I'm grateful for the opportunity to be here now building. AI has become this inspiring creative partner who's always awake, available, and eager to discuss what energizes me most. That's been incredibly motivating. In a highly meta fashion, it's helped me explore and refine my vision, and I'd love to help more people experience that magic.</p><p>I&#8217;d love to collaborate with people, too! If you&#8217;re working in this space or are curious and interested, I&#8217;d love to hear your feedback or see what you&#8217;re working on. Also, of course, if you have any magic moments with Imaginator, I&#8217;d love to hear about them too! Drop me a line at <a href="mailto:me@bawolf.com">me@bawolf.com</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.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! If you enjoyed it, subscribe to get updates on projects like this one.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>If you haven&#8217;t watched this whole talk, you absolutely should. You&#8217;ll walk away inspired.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Creativity]]></title><description><![CDATA[Tools shape how we do creative work. AI tools need good constraints, high sensitivity and an understanding of remixing to make them easier to wield in the search for great ideas.]]></description><link>https://blog.bawolf.com/p/creativity</link><guid isPermaLink="false">https://blog.bawolf.com/p/creativity</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Thu, 23 Jan 2025 19:35:16 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%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I want to empower creative people to do the best work of their lives. Whether it&#8217;s making music, writing code, or building businesses, we need more people in the arena. New tools have consistently expanded what&#8217;s possible&#8212;and who can create&#8212;and AI is no different. The tools we use shape what ideas we can imagine. AI, in particular, has the potential to expand creative possibilities in ways we haven't yet fully realized. Like a Y-Combinator,<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> creatives will build tools that make more creatives.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K90n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K90n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K90n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K90n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K90n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K90n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg" width="340" height="191.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:340,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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_!K90n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K90n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K90n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K90n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e8e1d9-5157-4914-9828-f442dc42b110_1920x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">South Park Commons visualizes its members&#8217; journeys <a href="https://blog.southparkcommons.com/what-is-negative-1-to-0/">as a squiggle</a> representing the nonlinear journey of many startup founders.</figcaption></figure></div><p>Lately, I&#8217;ve been exploring these ideas as a member of South Park Commons, a community that embraces creativity's messy, nonlinear journey. It&#8217;s a fitting place to develop and refine these ideas.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.bawolf.com/subscribe?"><span>Subscribe now</span></a></p><h1>The job of a creative</h1><p>Someone doing creative work is exploring a unique part of the territory of &#8220;all possible ideas&#8221; to uncover good ideas that are meaningful and moving. The territory of all possible ideas is incalculably large. To narrow that down, creatives craft a sense of taste to separate good from bad. Actors develop a taste for what pose to strike; videographers discover what angle to shoot; editors adjust the color profile to evoke emotional responses from their audience. Similarly, SaaS entrepreneurs learn <a href="https://www.momtestbook.com/">the right questions</a> to ask working professionals to understand if there&#8217;s a business there  before writing a bunch of code.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hRAx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hRAx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hRAx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hRAx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hRAx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hRAx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg" width="472" height="285.89714285714285" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:424,&quot;width&quot;:700,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;https://topb0ts.wpenginepowered.com/wp-content/uploads/2017/04/starcraft_fogofwar_700px.jpg&quot;,&quot;title&quot;:&quot;https://topb0ts.wpenginepowered.com/wp-content/uploads/2017/04/starcraft_fogofwar_700px.jpg&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="https://topb0ts.wpenginepowered.com/wp-content/uploads/2017/04/starcraft_fogofwar_700px.jpg" title="https://topb0ts.wpenginepowered.com/wp-content/uploads/2017/04/starcraft_fogofwar_700px.jpg" srcset="https://substackcdn.com/image/fetch/$s_!hRAx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hRAx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hRAx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hRAx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e4e4a42-f99d-4136-87c7-03d5f1cbf608_700x424.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><figcaption class="image-caption">In games like Starcraft, &#8216;fog of war&#8217; is when your vision is limited to where your characters are actively exploring</figcaption></figure></div><p>Individual creatives are at the vanguard, prospecting for new good ideas surrounded by a heavy<a href="https://en.wikipedia.org/wiki/Fog_of_war#In_video_games"> fog of war</a>. Each one contributes to our collective understanding of the explored territory and shared sense of taste.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><h1>The job of tools</h1><p>Creatives don&#8217;t start with perfect ideas. Their concepts are shaped by the tools they use, which guide the process and instill a sense of taste. For example, smartphone cameras make it easier for users to follow the rule of thirds to capture meaningful moments more evocatively. Web frameworks guide software engineers by breaking problems down into the right conceptual parts. Tools influence how we think, and better tools lead to better ideas.</p><p>When I talk about tools, I mean more than just wrenches and pens&#8212;I&#8217;m also talking about the tools that shape our society, like the alphabet<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> and capitalism. These tools can remain stable for centuries until a new idea changes our understanding of the world. Large language models and generative AI are shaping up to be excellent tools for manifesting new ideas. Far from the sci-fi predictions of cold, calculating robots, they&#8217;re densely encoded with our human sense of taste. To fully realize their potential, we&#8217;ll need to combine that with what we already know about building great tools.</p><h1>The shape of good tools</h1><p>Good tools help us have better ideas. The better our tool ideas, the better our tools will be. The better our tool-making tools, the better our tool ideas will be. It&#8217;s all helplessly meta.</p><h2>Good constraints</h2><p>Constraints limit what can be expressed through a tool. The proper constraints limit in ways that lead to good ideas. The set of all possible musical notes is much smaller than the audible frequencies. Plenty of pleasant sounds are excluded, but the trade-off is worthwhile because it makes it harder to make a mistake. Even more constraining frameworks of scales and chords make it easier still.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y48p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y48p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!y48p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!y48p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!y48p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y48p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg" width="500" height="281.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Differences between a violin and a guitar - fretboard and fingerboard&quot;,&quot;title&quot;:&quot;Differences between a violin and a guitar - fretboard and fingerboard&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Differences between a violin and a guitar - fretboard and fingerboard" title="Differences between a violin and a guitar - fretboard and fingerboard" srcset="https://substackcdn.com/image/fetch/$s_!y48p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!y48p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!y48p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!y48p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e301f35-3c21-43ae-bd48-6bfefcb1430e_1280x720.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There&#8217;s a reason more songs have been written for the guitar than the violin over the last 100 years. Violins require more training and focus because their continuous necks can play frequencies between notes. In contrast, guitar frets provide clear boundaries, helping musicians focus on other parts of the creative process. Today&#8217;s AI tools are still too nascent to effectively guide creatives toward good ideas. They look more like violins than guitars, but they are still discovering their metaphorical frets to help creatives stay within their strengths.</p><p>Bad constraints don&#8217;t limit ideas enough or in ways orthogonal to finding good ideas. The &#8216;Innovators Dilemma&#8217; describes Kodak's failure to adopt digital film because they constrained themselves to ideas that wouldn&#8217;t cannibalize their existing film products. Unfortunately for them, the transition to digital was inevitable, and startups who did not have the same constraints took the market.</p><h2>Peak under the hood</h2><p>Tools should run well in a default setting, but sometimes, creatives must challenge constraints to find an unexplored patch of new good ideas. Good tools let creatives peek under the hood and modify the internals.</p><p>Constraints are fractal, so tool makers must choose how to allow creatives to peak under deeper and deeper hoods progressively. Accounting for every constraint is impossible, but good tools prioritize well. Guitar tuning is reasonably standardized to EADGBe, but playing other tunings is more common than defining new notes. In line with those values, re-tuning a guitar is more straightforward than rearranging the frets, and changing the volume is more frequent and easier than re-tuning an electric guitar. On the other hand, if your search for good music makes you question whether strings are the best source of vibration, a guitar won&#8217;t cut it. You&#8217;ll have to try another instrument.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sq-n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sq-n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Sq-n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Sq-n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Sq-n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sq-n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg" width="382" height="254.2293956043956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:969,&quot;width&quot;:1456,&quot;resizeWidth&quot;:382,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Avenged Sevenfold Guitarist Synyster Gates' 2014 Summer Tour ...&quot;,&quot;title&quot;:&quot;Avenged Sevenfold Guitarist Synyster Gates' 2014 Summer Tour ...&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Avenged Sevenfold Guitarist Synyster Gates' 2014 Summer Tour ..." title="Avenged Sevenfold Guitarist Synyster Gates' 2014 Summer Tour ..." srcset="https://substackcdn.com/image/fetch/$s_!Sq-n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Sq-n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Sq-n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Sq-n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad5d504-97f7-4be3-b135-958e13ebe5b4_4512x3003.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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">Metal Guitarists often tune down the lowest string, called &#8220;drop D,&#8221; to make it easier to chug power chords (DADGBe) or even &#8220;drop&#8221; C (CGCFAD).</figcaption></figure></div><p>AI tools are so nascent that they&#8217;re not exposing very many knobs to creatives. Creatives might need to see the underlying prompts sent language models to discover better ones, even when you provide sensible defaults. That&#8217;s how we move from a local maxima closer to the global maxima. It&#8217;s tempting to hide these as trade secrets, but that will only limit more effective creatives.</p><h2>High sensitivity</h2><p>Good tools are highly sensitive, so creatives can wield them as an extension of themselves. As<a href="https://www.youtube.com/watch?v=PUv66718DII"> Bret Victor describes in this fantastic talk</a>, creatives model their movements in their brains. The less feedback they get, the more they have to model internally. There&#8217;s a limit to how much our brains can model. While Michael Jackson&#8217;s voice and training allowed him to<a href="https://www.nme.com/blogs/nme-blogs/the-incredible-way-michael-jackson-wrote-music-16799"> model whole songs in his head</a> and express them to studio musicians, most of us will write better songs with Garage Band.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q8_i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q8_i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Q8_i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Q8_i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Q8_i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q8_i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg" width="300" height="349.59183673469386" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:571,&quot;width&quot;:490,&quot;resizeWidth&quot;:300,&quot;bytes&quot;:65685,&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_!Q8_i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Q8_i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Q8_i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Q8_i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1519f793-a232-4c40-9f49-ace1ffe8e61e_490x571.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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">&#8220;One morning MJ came in with a new song he had written overnight. We called in a guitar player, and Michael sang every note of every chord to him&#8230; We then witnessed him giving the most heartfelt and profound vocal performance, live in the control room through an SM57,&#8221; - Rob Hoffman</figcaption></figure></div><p>Each brush stroke teaches us how to paint. It would be incredibly limiting if painters wore blindfolds until their works were entirely done. Yet, that&#8217;s how many software engineers write code and how we all took photographs before polaroids or digital film.</p><h3>Struggle</h3><p>Some argue that new tools make art 'too easy' by removing struggle, implying a lack of value. But this view is too narrow, elevating only certain kinds of familiar struggle.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!utTY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!utTY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!utTY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!utTY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!utTY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!utTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg" width="500" height="279.18956043956047" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:500,&quot;bytes&quot;:353882,&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_!utTY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!utTY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!utTY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!utTY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05fbc0ab-966a-49c8-900f-623cb2303d22_2752x1536.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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>Painters who mix their paints struggle differently than painters who use the color picker in Photoshop. In both cases, the experience is highly sensitive and deterministic. Over time, both painters will get the color they want by modeling the results in their heads and building intuition. Mixing paint takes longer and is more challenging to model, so those artists spend relatively more time on that part of the work. Photoshop artists will instead struggle differently, trying many more strokes and colors because their choice is more reversible. Better tools change what creatives struggle with but don&#8217;t eliminate the struggle altogether. Struggle is an emergent property of doing creative work.</p><p>Good struggle is playful experimentation in the unknown, while bad struggle is the hurdles to executing well-known ideas. Bad struggle comes from inefficient tools or unnecessary constraints that waste creative energy, leaving us bogged down in details instead of exploring the unknown.</p><p>AI tools often introduce slow feedback loops, where entire works are generated and must be remade with each revision. This randomness creates bad struggle by forcing creatives to rely on chance rather than building reliable strategies for consistent results. </p><blockquote><p><em>[it] feels like the computer is telling my brain This Is What You Should Have Said, rather than letting my brain come up with the words. and then it doesn't sound like me. it sounds like a weird little simulacrum of [me] - </em><a href="https://x.com/isabeljkim/status/1659998634908217344?s=20">Isabel Kim</a></p></blockquote><p>Critics like Isabel Kim argue that AI-generated text tells her what to say rather than allowing her to find her voice. This is the wrong kind of struggle.</p><p>Tools are slowly getting more sensitive to nuanced changes with less entropy, creating tighter feedback loops so artists can model less in their heads. A straightforward way to do that is literally making AI models faster. You can try out<a href="https://replicate.com/blog/flux-is-fast-and-open-source"> Flux tuned for speed</a> on replicate. It&#8217;s quick enough to generate images as you type, which gives way more information per keystroke. Masking and fine-tuning similarly allow for finer revision.<br><br>Understandably, some creatives view technology as competition. If the sense of taste they&#8217;ve built within themselves is now well encoded into a piece of software, then the struggle they earn a living with is now the bad kind. In <em><a href="https://en.wikipedia.org/wiki/Hidden_Figures">Hidden Figures</a></em>, Katherine Goble helped her team transition to NASA&#8217;s digital era, but not everyone adapts so easily. Failing to adapt can have real consequences for a creative&#8217;s livelihood. This might be so disruptive that we question<a href="https://www.forbes.com/sites/alexkonrad/2023/02/03/exclusive-openai-sam-altman-chatgpt-agi-google-search/"> economic ideas</a> like capitalism itself.</p><h2>Everything is a Remix</h2><p>"<a href="https://www.youtube.com/watch?v=X9RYuvPCQUA">Everything is a remix</a>" is a well-established idea, and I stand on the shoulders of the giants who discovered it. At their core, good ideas often come from combining old ones in new ways. This is true when VCs ask startup founders, &#8220;Why now?&#8221; directors adapt books into movies, or engineers &#8220;rewrite it in Rust.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UM3e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UM3e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!UM3e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!UM3e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!UM3e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UM3e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg" width="418" height="418" data-attrs="{&quot;src&quot;:&quot;https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:418,&quot;width&quot;:418,&quot;resizeWidth&quot;:418,&quot;bytes&quot;:371686,&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_!UM3e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!UM3e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!UM3e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!UM3e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F969c59f7-202d-4d5c-bfb8-9f806f9444d8_2048x2048.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg 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">Prompt: A mystical picture of a man standing on the shoulder of a giant. The giant is djing on a turn table while the man on his shoulder watches.</figcaption></figure></div><p>Good tools help creatives connect seemingly unrelated ideas and guide them to combinations worth pursuing. Some tools reduce the energy required to refine ideas, while others introduce well-targeted entropy to identify which ideas deserve attention.</p><p>Critics claim AI can't generate original ideas, but that's shortsighted. AI tools see the world in a different way. They uncover novel connections humans might miss and experiment on a scale far faster than we can manage. There will be more moments like Alpha Go&#8217;s &#8216;<a href="https://www.reddit.com/r/Damnthatsinteresting/comments/x14q3g/move_37_when_googles_ai_alphago_redefined/">Move 37</a>&#8217;, which changed how people thought about Go forever. </p><p>Creatives will eventually use AI-encoded taste to determine which remixes have potential. For example, a movie exec might model their audience to understand if a pitch will appeal to enough people to warrant production. TikTok succeeded by replacing user-curated networks with an algorithm, and similarly, AI will guide content producers toward commercially viable ideas or potential Academy Award winners. While human attention may always be valuable, I&#8217;m not sure there&#8217;s any part of the creative remixing process that will remain solely the domain of humans.</p><h1>Closing thoughts</h1><p>AI will evolve like past technologies&#8212;by automating aspects of the creative process and amplifying human potential. Rather than eliminating creative struggle, these new tools will refine the challenges we face, empowering creators to take on more complex projects and push further boundaries. I hope this understanding of constraints, sensitivity, struggle, and remixing clarifies the path to get there.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.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">I hope you liked this piece! If you want more thoughts like this, subscribe to my newsletter.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Yes, that Y-Combinator, too: <a href="https://www.ycombinator.com/faq.html">The Y combinator is &#8230; a program that runs programs; we're a company that helps start companies</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>This is true of mundane things, too! Someone who develops an efficient way to make cardboard boxes explores that territory so that others don&#8217;t have to. If they do a good enough job, we can stop looking in that region and spend our limited time elsewhere.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>See: <a href="https://paulgraham.com/writes.html">writing is thinking</a>.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Breaking into Vision]]></title><description><![CDATA[Fine-tuning a vision model to recognize break dance power moves]]></description><link>https://blog.bawolf.com/p/breaking-into-vision</link><guid isPermaLink="false">https://blog.bawolf.com/p/breaking-into-vision</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Tue, 17 Dec 2024 19:44:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0383dbd6-7f8e-4001-97bf-64fffe46a6f9_224x224.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been looking for a way to combine software engineering with my <a href="https://www.instagram.com/bryantflips/">break practice</a> and stumbled upon the idea of fine-tuning a vision model on power moves. Having never worked with vision, I really enjoyed it. Working with video data feels as close to working with atoms as you can with pure software.</p><p>The best parts were learning about:</p><ul><li><p>Building a good dataset. No dataset is perfect, and mine was particularly limited by what I was willing to curate manually.</p></li><li><p>Training a model. The basic terms and moving parts.</p></li><li><p>When to lean on AI tools, especially Cursor, and when to ask a real person for advice.</p></li></ul><p>If you want to skip all the details and try the model, you can do so at <a href="https://breakingvision.bawolf.com/">https://breakingvision.bawolf.com/</a>. I hosted the best version on <a href="https://replicate.com/bawolf/break-video-clip">Replicate</a> and made a small web app to help you cut and run clips against the model.</p><h1>Data</h1><p>I started with what I already had: a phone full of videos from practice. I omitted references where I fell or crashed and kept the scope small, narrowing down to three moves I had the most repetitions of. These were windmills, halos, and swipes. If you&#8217;re not familiar with power moves, that&#8217;s totally fine. Here are some examples:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wqQD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wqQD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!wqQD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!wqQD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!wqQD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wqQD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif" width="224" height="224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:224,&quot;width&quot;:224,&quot;resizeWidth&quot;:224,&quot;bytes&quot;:258293,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&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_!wqQD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!wqQD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!wqQD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!wqQD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c773730-3f16-494b-91c2-6b2d1a7fee3f_224x224.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>A <strong>windmill</strong> &#127786;&#65039; was designed to be a continuous backspin. In practice, it&#8217;s a spinning roll on your back, head, and hands.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5pKy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5pKy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!5pKy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!5pKy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!5pKy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5pKy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif" width="224" height="224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:224,&quot;width&quot;:224,&quot;resizeWidth&quot;:224,&quot;bytes&quot;:313851,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5pKy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!5pKy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!5pKy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!5pKy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0de5083b-00b0-43d1-8106-70c1f389b70f_224x224.gif 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>A <strong>halo</strong> &#128519; is an off-axis head spin on your hands and head. You&#8217;re supposed to travel around a ring (halo) on your head.&nbsp;</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MT--!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MT--!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!MT--!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!MT--!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!MT--!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MT--!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif" width="224" height="224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:224,&quot;width&quot;:224,&quot;resizeWidth&quot;:224,&quot;bytes&quot;:349594,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&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_!MT--!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!MT--!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!MT--!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!MT--!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82533adf-dda2-4d3f-91c1-8a4d7b7110a1_224x224.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A <strong>swipe</strong> &#129336; is a little more complicated but involves rotating your hands and one foot in a continuous circular cartwheel.</p><p>Without experience with labeling tools like <a href="https://www.cvat.ai/">CVAT</a> or <a href="https://labelstud.io/">Label Studio</a>, I uploaded videos to my computer and used <a href="https://mifi.no/losslesscut/">LosslessCut</a> to separate the videos and segment the individual moves into clips. The clips above are examples of what the model saw.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;46f4c27f-23fe-42a0-bee9-b1ac662910c6&quot;,&quot;duration&quot;:null}"></div><h2>Sources</h2><p>In addition to my phone clips, which I&#8217;ll call <strong>Bryant</strong>, I also made a second data source, which I&#8217;ll call <strong>YouTube</strong>.&nbsp;</p><h3>Bryant</h3><p>These are all videos taken from my phone. Most are from a single location over many practice sessions with slightly different angles. Some are repeated combos of the same move, while others are sequences of different moves. I was the subject of all of these videos.</p><h3>YouTube</h3><p>These are primarily educational tutorials from YouTube. I could reliably get many examples of a move from a single tutorial video, which made the cutting and labeling process much more manageable. A few of them are from battles or people&#8217;s training sessions.&nbsp;Unlike Bryant, these examples are primarily strings of one move but include examples from many different people and settings.</p><p>With between 300 and 400 examples of moves, both data sources are on the small side.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><h2>Datasets</h2><p>I arranged the sources into different datasets to understand how that would impact training. The goal is a model that <strong>generalizes</strong>, which means that it extrapolates to data it has never seen before. Some models appear promising but <strong>overfit,</strong> meaning they got good training scores but don&#8217;t hold up outside of what they were trained on.</p><h3>Structure</h3><p>Each dataset sorts videos into three buckets. My original data gathering was a bit unbalanced. I labeled way more clips of windmills than swipes or halos. I ended up shelving a bunch of extra clips to make sure I had an approximately equal amount of windmills, halos, and swipes:</p><ul><li><p>70% into the <strong>training</strong> set used by the model for the learning process, making predictions, and inserting entropy to determine how to change its predictions in the future.</p></li><li><p>20% into the <strong>validation</strong> set the model uses to measure snapshots of how training is going without updating the model.</p></li><li><p>10% into the <strong>test</strong> set that measures how training went after completion.</p></li></ul><p>Lastly, these clips had dimensions that were all over the place. Some were portraits, others were landscapes, and some were even squares. Clips were between 0.5 seconds and 3 seconds. I normalized them all to 224x224px squares at 30 fps, which seemed standard.</p><h3>Permutations</h3><p>Some of these are from the same combo in the original source video, which can disguise some problems down the road. If there are different windmills from the same practice session in both train and val sets, the model might cheat and learn that <em>white walls</em> or <em>a chair in the corner</em> are a sign of windmills. That wouldn&#8217;t be visible in the test scores, which would all look like they were passing.</p><p>I tried a few things to detect when that was happening. The most straightforward was training a model on Bryant and seeing if it generalized to YouTube and vice versa.</p><p>Next, I made an &#8220;adjusted&#8221; version of each dataset that tried to be a little cleverer. I sorted clips from the same source video into the same bucket. If a video had three windmills in a row, the first windmill could not be in the training set if the second windmill was in the validation or test set. This is a sample video of a chain of halos.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;b95d3cf4-4c63-408e-9e1b-2a83a315df8e&quot;,&quot;duration&quot;:null}"></div><p>I also included clips from videos with more diversity in the training set. If a video had a loop of <em>swipe, windmill, halo, swipe, windmill, halo</em>, those clips had priority over clips from a video that looped <em>halo, halo,</em> <em>halo</em>. Here&#8217;s an example of a diverse source that contains windmills, halos, and swipes.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;cdf3b156-c46a-4914-a4b9-0ea9111febee&quot;,&quot;duration&quot;:null}"></div><p>YouTube and Bryant had a <strong>random</strong> version with all the clips randomly distributed and an <strong>adjusted</strong> version with the above criteria. I also made <strong>combined random</strong> and <strong>combined</strong> <strong>adjusted </strong>datasets,<strong> </strong>which are made the same way but with both sources combined.</p><blockquote><p>As an aside, One thing I didn&#8217;t expect from using cursor was how many more one-off scripts I had it make. Most of the sorting code was written almost entirely by cursor, including the code to create charts and tests that the sorting was correct.</p></blockquote><h1>Training process</h1><p>If, like me, you have never trained a model, here&#8217;s a quick primer. Training is measured in <strong>epochs</strong> or the number of passes through each training example. The amount of examples the model looks at simultaneously is called the <strong>batch size</strong>. There is an explore/exploit trade-off when choosing a batch size.</p><blockquote><p>Smaller batches are better at exploring. They have more variance within an epoch. They&#8217;re risky because they&#8217;re more likely to move away from a promising solution even when they&#8217;re close to one. In return, they can jump out of enticing wrong solutions toward better ones. They typically train slower because they don&#8217;t fully utilize GPU parallelization and memory.</p><p>Larger batch sizes are better at exploiting. They look at more data simultaneously, creating less variation between batches within an epoch. This is more stable, making them better at refining a good solution but more likely to get stuck somewhere non-optimal. They train faster by taking advantage of GPU parallelization when available.</p></blockquote><p>Training produces <strong>weights</strong>. Think of them like constants in the model&#8217;s functions. When training from scratch, the model starts with random weights and shifts them each epoch. The amount it&#8217;s allowed to move them is called the <strong>learning rate</strong>. Typically, this starts high and shrinks at set epoch intervals. <strong>Fine-tuning</strong> a model is just doing more training but with your custom data on top of pre-existing weights called <strong>checkpoints</strong>.</p><p>Learning rate and batch size are just arbitrary values you set when you run the training process. In ML jargon, they&#8217;re called <strong>hyperparameters</strong>, which sounds more complicated and less approachable. <strong>Hyperparameter tuning</strong> is just running many trainings or fine-tunings with different values and seeing which produces the best model.</p><blockquote><p>The weights of a model are really abstract. They don&#8217;t have direct meaning that a person can interpret. There&#8217;s no weight for the direction a person faces in a particular frame or a direct sense of how fast they&#8217;re moving. As a result, learning is a complex trial and error of changing weights and seeing the effect on learning. It can be unsatisfying initially, but it&#8217;s genuinely incredible that it works.</p></blockquote><p>Training is measured in <strong>accuracy</strong>, the proportion of correct predictions over the number of total predictions, and <strong>loss</strong>, a measurement of how confident the model was in making those predictions.</p><p>At the end of every epoch, the training process calculates corrections to the weights that would have improved the model&#8217;s performance. This is called <strong>backpropagation</strong>. Individual corrections from any one epoch might only improve the model a little, but they add up over many repetitions.</p><p>After an epoch, the accuracy and loss are measured on the validation set without backpropagation to see if the model generalizes beyond the training set. Similarly, after training, the model is tested on the never-seen test set for a final measure.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.bawolf.com/subscribe?"><span>Subscribe now</span></a></p><h1>Making a Model</h1><p>It took me a while to get grounded. I started broadly, toying around with SAM2, pose libraries, and fine-tuning existing models. As a software engineer but not an experienced ML practitioner, there was a lot of clunkiness, and I ended up with many false starts.</p><p>Not all models from papers have public code, and even if they do, not all have documented processes for training and fine-tuning. Some have open weights, but others don&#8217;t. I clicked broken links that once led to checkpoints or raw datasets. Even understanding the format the model expected the dataset in could be opaque.</p><p>I have a web development background but am not an experienced Python developer. I had to do more version management finicking between Cuda, Conda, and Pip than expected. Overall, dependency management feels fractured in Python.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> I missed my `package.json` or `mix.lock` files. It was humbling.</p><p>Perplexity, ChatGPT, and Cursor were all bad at helping me choose which model to fine-tune. They were not very helpful in translating jargon or understanding how training might work from a code repo.</p><p>Eventually, I stepped back and worked with Cursor to build a <a href="https://github.com/bawolf/breaking_vision_3dcnn">simple model</a> from scratch, which got me in the right groove. Cursor suggested a 3DCNN. The 3-dimensions are length, width, and time. CNN stands for Convolutional Neural Network. Roughly, it describes the strategy of scanning through video pixels, looking for patterns with a cube of pixels at a time. Each step of the scan looks at n pixels of length, by n pixels of width by n frames. This model was only a single layer and didn&#8217;t generalize well. Still, going through the whole end-to-end process of training, measuring, and even some hyperparameter tuning really helped my understanding.</p><h3>Results</h3><p>Briefly, here&#8217;s a sense of what this model was capable of and how it&#8217;s measured. These examples are from a single trial of the Bryant-random dataset, but the results across all the datasets were similar.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!otrt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!otrt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png 424w, https://substackcdn.com/image/fetch/$s_!otrt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png 848w, https://substackcdn.com/image/fetch/$s_!otrt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png 1272w, https://substackcdn.com/image/fetch/$s_!otrt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!otrt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png" width="1200" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46386,&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_!otrt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png 424w, https://substackcdn.com/image/fetch/$s_!otrt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png 848w, https://substackcdn.com/image/fetch/$s_!otrt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.png 1272w, https://substackcdn.com/image/fetch/$s_!otrt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff12bc730-aad0-4c97-b4af-aad17c289a94_1200x500.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 becoming confident and 100% accurate in predicting training data after 8 epochs, the model was far less confident and only 70% correct in making predictions from validation data. This is a classic example of overfitting, where the model memorized the training data rather than learning patterns.</p><p>A <strong>confusion matrix</strong> shows the model&#8217;s predictions in more detail. The x-axis represents the model's prediction, and the y-axis is the actual value. [0,1,2] is a windmill, halo, and swipe. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xbYa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xbYa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 424w, https://substackcdn.com/image/fetch/$s_!xbYa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 848w, https://substackcdn.com/image/fetch/$s_!xbYa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 1272w, https://substackcdn.com/image/fetch/$s_!xbYa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xbYa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png" width="1000" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16408,&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_!xbYa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 424w, https://substackcdn.com/image/fetch/$s_!xbYa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 848w, https://substackcdn.com/image/fetch/$s_!xbYa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 1272w, https://substackcdn.com/image/fetch/$s_!xbYa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62deba32-c7ad-415a-8030-2aa7b7961a6b_1000x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If the model predicted all the values correctly, they would be in a diagonal line from top left to bottom right. Instead, the most consistent error was the model predicting that about half the swipes were aalos. I could go deeper, but this should be enough of a baseline to compare to the fine-tuning of CLIP.</p><h2>Fine-tuning CLIP</h2><p>Next, I took another swing at fine-tuning an existing vision model. There are models trained on massive datasets that understand human bodies. My videos would focus that knowledge on break moves.</p><p>Cursor was great at the low-level tactics of writing code, but human knowledge, whether from friends<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> or <a href="http://paperswithcode.com">Papers With Code</a>, was much better at recommending base models than ChatGPT, Perplexity, or Claude. Simple questions like &#8220;Does this model take as input a video made up of a single move or multiple moves and an annotation file?&#8221; or &#8220;How should this data be formatted?&#8221; were more challenging for the AI tools to answer than I expected.</p><p>I settled on using a model based on <a href="https://github.com/openai/CLIP">OpenAI&#8217;s CLIP</a>. Instead of 3DCNNs, CLIP uses transformers<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>, and instead of a single layer, CLIP uses many. CLIP was one of the fundamental breakthroughs in Dalle-2 and GPT-3. In their own words:</p><blockquote><p>CLIP (Contrastive Language-Image Pre-Training) is a neural network trained on a variety of (image, text) pairs. It can be instructed in natural language to predict the most relevant text snippet, given an image, without directly optimizing for the task, similarly to the zero-shot capabilities of GPT-2 and 3.</p></blockquote><p>CLIP can only examine individual images. To augment it to understand videos, I naively grabbed 10-15 frames from each video and averaged out the feature vectors from each frame. A <strong>feature vector</strong> represents <em>how much the model thinks the input is a windmill, a halo, or a swipe</em>.</p><p>The middle of each clip tells more about which move is being performed than the beginning or end because there are multiple ways to transition in or out of a move. Windmill to windmill looks different than windmill to swipe. Understanding this, I grabbed frames over a normal distribution, with the majority closer to the center and fewer closer to the ends. The consequence of averaging is that there&#8217;s no information about the order of frames. The hard work is abstracted away into the clip model.</p><p>You can see this model for yourself <a href="https://github.com/bawolf/breaking_vision_clip_cog/tree/main">here</a>.</p><h3>Results</h3><p>I ran multiple training trials for each dataset to see which hyperparameters worked best. Overall, almost all of the models were better. They ranged from bad to okay to <em>very good</em>. The parameters with the most obvious positive impact on training were:</p><ol><li><p><strong>Use the large checkpoint.</strong> CLIP has multiple checkpoints that you can start from: the smaller `clip-vit-base-patch32` and the larger `clip-vit-large-patch14`. Almost all the good models were fine-tuned from the larger checkpoint. It&#8217;s bigger in several ways. The large model has 24 transformer layers, while the base uses 12. Those layers are based on vectors with more dimensions (1024 vs. 768), and as a result, the large model has way more parameters overall.</p></li><li><p><strong>The best models unfroze 2-3 layers.</strong> You can unfreeze transformer layers from the top down when fine-tuning. The more you unfreeze the, the more malleable the model is to forget what it already knows and learn from the training data. Unfreezing one was too few, and the model wasn&#8217;t able to learn enough from the training data and got a lousy score in both training and validation, whereas unfreezing four allowed it to forget essential things about bodies and overfit to the training data, giving it good training scores but bad validation scores.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aSyY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aSyY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png 424w, https://substackcdn.com/image/fetch/$s_!aSyY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png 848w, https://substackcdn.com/image/fetch/$s_!aSyY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png 1272w, https://substackcdn.com/image/fetch/$s_!aSyY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aSyY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png" width="1456" height="725" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:725,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:244373,&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_!aSyY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png 424w, https://substackcdn.com/image/fetch/$s_!aSyY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png 848w, https://substackcdn.com/image/fetch/$s_!aSyY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.png 1272w, https://substackcdn.com/image/fetch/$s_!aSyY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F119814a8-a607-408a-8cf6-808a402d4aa9_3543x1764.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>Some of these scenarios play out in the accuracy and loss of different models trained on the Bryant-adjusted dataset. The confusion matrices show which moves the models learned more or less correctly. The best model is good at labeling windmills and swipes but mislabeled halos as windmills or swipes once. Still, it's pretty good! I would take any of the top three models over the simple model from before.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LLGR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LLGR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png 424w, https://substackcdn.com/image/fetch/$s_!LLGR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png 848w, https://substackcdn.com/image/fetch/$s_!LLGR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png 1272w, https://substackcdn.com/image/fetch/$s_!LLGR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LLGR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png" width="1456" height="1283" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1283,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:707630,&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_!LLGR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png 424w, https://substackcdn.com/image/fetch/$s_!LLGR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png 848w, https://substackcdn.com/image/fetch/$s_!LLGR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.png 1272w, https://substackcdn.com/image/fetch/$s_!LLGR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa181a390-3871-44d8-9c59-071c9787eb19_5687x5012.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 best models trained from each dataset were all very good, though the adjusted datasets were as good as or better than the random datasets.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mTiw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mTiw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 424w, https://substackcdn.com/image/fetch/$s_!mTiw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 848w, https://substackcdn.com/image/fetch/$s_!mTiw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 1272w, https://substackcdn.com/image/fetch/$s_!mTiw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mTiw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png" width="1456" height="719" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:719,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:273261,&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_!mTiw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 424w, https://substackcdn.com/image/fetch/$s_!mTiw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 848w, https://substackcdn.com/image/fetch/$s_!mTiw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 1272w, https://substackcdn.com/image/fetch/$s_!mTiw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf5f9427-b275-40d9-969f-dea2f2dd5f9b_3551x1753.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Most of them are pretty good, but which one is the best? YouTube-adjusted had a pretty good claim, but since the top couple were so good that they were only missing a single example, I decided to run them against all the labeled clips I had, including the ones I&#8217;d cut out to make the numbers even early on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IgMM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IgMM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png 424w, https://substackcdn.com/image/fetch/$s_!IgMM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png 848w, https://substackcdn.com/image/fetch/$s_!IgMM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png 1272w, https://substackcdn.com/image/fetch/$s_!IgMM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IgMM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png" width="1456" height="916" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:916,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:583740,&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_!IgMM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png 424w, https://substackcdn.com/image/fetch/$s_!IgMM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png 848w, https://substackcdn.com/image/fetch/$s_!IgMM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.png 1272w, https://substackcdn.com/image/fetch/$s_!IgMM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c048aa6-f9de-4f00-a6ed-f3faa8245e60_5687x3576.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 was floored that combined-adjusted only missed one!<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dmmp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dmmp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!Dmmp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!Dmmp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!Dmmp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dmmp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif" width="224" height="224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:224,&quot;width&quot;:224,&quot;resizeWidth&quot;:224,&quot;bytes&quot;:328447,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/gif&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_!Dmmp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 424w, https://substackcdn.com/image/fetch/$s_!Dmmp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 848w, https://substackcdn.com/image/fetch/$s_!Dmmp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 1272w, https://substackcdn.com/image/fetch/$s_!Dmmp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d1db8d9-1975-4a97-ae82-c60cec68b31a_224x224.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The stubborn holdout</figcaption></figure></div><p>The next closest model, our old winner, YouTube-adjusted, missed eleven. I declared combined-adjusted the winner.</p><p>If you break, I&#8217;m curious if it works for your clips, too! As a reminder, you can try it out <a href="https://breakingvision.bawolf.com/">here</a>.</p><h1>Conclusions</h1><p>To be honest, I&#8217;m really impressed. These results were way better than I thought they would be. I&#8217;m not surprised that the combined training data was better than Bryant or YouTube, but I was surprised at how much better the adjusted sets were. Taking small steps to prevent these models from cheating seems to have gone a long way.</p><p>There are some obvious limitations here. This model only trained on three classes. There are hundreds of interesting break moves, and I don&#8217;t even know if the results would scale if you doubled classes to six or again to twelve. I&#8217;d love to try, but I might need some help labeling.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a></p><p>This model has to label any input as a windmill, halo, or swipe. It would be interesting to train a model in a way that could say &#8220;none of the above&#8221; as an extra category and see how accuracy changed.</p><p>More than that, it would be better if this model had a sense of time. Feed it a longer video, and it labels the timestamps where moves occurred. The most interesting next step would be fine-tuning something like AdaTAD using <a href="https://github.com/sming256/OpenTAD">OpenTAD</a>. TAD stands for temporal action detection, the area of study around labeling what&#8217;s happening within videos.</p><p>All in all, this was really fun. It was empowering to see how far I could get on the shoulders of  all the giants building great vision model tooling, the giants who built the great language models, and my friends. Approaching some of these topics can seem overwhelming at first, but there&#8217;s a lot of information out there now, so it&#8217;s more accessible than ever. You definitely don&#8217;t need an ML degree to try this out.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.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 Bryant&#8217;s Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>To squeeze more out of each image in these small datasets, an image might be rotated or have its brightness, contrast, or hue adjusted in training to ensure the model doesn&#8217;t focus too hard on those details.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>It sounds like <a href="https://github.com/astral-sh/uv">UV</a> might give some hope here?</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Special thanks to Cinjon Resnik and Skyler Erickson! This might not have happened without you.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Explaining a transformer is outside the scope, but they&#8217;re the big breakthrough that powers language models. If you want to learn about them, I recommend this <a href="https://www.youtube.com/watch?v=aircAruvnKk&amp;list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi">YouTube series</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>You can kind of see how the last few frames might have influenced it to swing toward &#8220;halo.&#8221; There were fun experiences like this where it felt like you could &#8220;get&#8221; what the model was thinking intuitively.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>If you&#8217;re interested, shoot me a note at breakingvision@bawolf.com.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Software is more like a garden]]></title><description><![CDATA[When I started writing code professionally, I felt like a craftsman building a chair.]]></description><link>https://blog.bawolf.com/p/software-is-more-like-a-garden</link><guid isPermaLink="false">https://blog.bawolf.com/p/software-is-more-like-a-garden</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Mon, 15 Jul 2024 18:37:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hncI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I started writing code professionally, I felt like a craftsman building a chair. In the morning, I&#8217;d show up to a clean workspace and craft code in the right shape to serve a practical purpose. As I gain experience, writing code feels more like tending a garden. It&#8217;s more fragile and personal than I expected.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hncI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hncI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hncI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hncI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hncI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hncI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:821228,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&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_!hncI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hncI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hncI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hncI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F976ff066-53ab-415b-912a-d6e3b0d8a7e6_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The kind of code I write doesn&#8217;t exist in a vacuum. The ecosystem is always changing and adapting. Other people are constantly writing code: for operating systems; for cloud hosts like Google or Amazon; for open-source projects and frameworks. The benefit is that one person can produce an extraordinary amount, empowered by our collective effort. The downside is that code that is not nurtured and maintained stops running.</p><p>As a result, every software project needs someone to watch over it and water it now and again. Some codebases are more like succulents, and others are more like orchids, but they all have needs. Well-known computer security expert Moxie Marlinspike wrote about the growing burden of writing software in<a href="https://moxie.org/2022/01/07/web3-first-impressions.html"> a blog post</a>, saying, &#8220;<em>As long as software requires such concerted energy and so much highly specialized human focus, I think it will have the tendency to serve the interests of the people sitting in that room every day rather than what we may consider our broader goals.&#8221;</em> We&#8217;re increasingly wary of the motivations of the people who build our software because using software takes up more and more of our waking attention. It also meant that when I shut down down Rume, the app from my last startup, it would probably never run again.</p><p>Another difference between a chair and a garden is that most people intuitively understand how a chair is constructed and how to fix it if problems arise. Like plant-sitting for a friend&#8217;s garden, maintaining unfamiliar code is challenging. While best practices and standards exist, it&#8217;s not easy to be productive when parachuting into a codebase.</p><p>This makes the code I write more valuable to me than anyone else. We did a ton of great work at Rume, but now that we&#8217;re not building on it, the code&#8217;s value is depreciating. And we&#8217;re not the only ones. So much code, and thus human time, effort, and thought, is effectively trash instead of recycling.</p><p>While I&#8217;m still adjusting to the mental model, I think this is okay. Writing software might be the largest lever we have. A few people can genuinely impact millions or billions of others. WhatsApp,. as an extreme example, had fewer than 60 employees when Facebook bought it for $19 billion. Its Android app, which served over 1 billion people, was maintained by four people. And when they added end-to-end encryption, that billion people got it overnight. People can credibly do years or even months of work and create something that changes the world, so even if they have to throw away most of their projects, the net gain might be better for everyone.</p><p>I&#8217;ll probably always have some nostalgia for Rume, but maybe not all projects should be preserved. I bet I&#8217;m not the only one who was somewhat relieved when AOL finally<a href="https://www.theverge.com/2017/10/6/16435690/aim-shutting-down-after-20-years-aol-instant-messenger"> shut down their instant messaging service, AIM, in 2017</a>. No one needs to preserve the cringy conversations I had as a 13-year-old. Some things have outlived their time.</p><p><em>This lightly edited personal update from 2022 felt relevant to share more broadly.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.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! If you liked this and want to read more like it in the future. Subscribe to my newsletter.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Bring your whole self]]></title><description><![CDATA[So far this month, I've had to convey this message to two founders.]]></description><link>https://blog.bawolf.com/p/bring-your-whole-self</link><guid isPermaLink="false">https://blog.bawolf.com/p/bring-your-whole-self</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Tue, 04 Jun 2024 18:12:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wi8s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So far this month, I've had to convey this message to two founders. You may need to hear this, too. There was a time when I definitely did.</p><p>They want to work with you because they trust your judgment. If you work with them against your better judgment, you're not just playing yourself but also playing them. They have a lot of respect for you. Have enough respect for them to tell them the truth and work through the consequences.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wi8s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wi8s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!wi8s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!wi8s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!wi8s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wi8s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:534342,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&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_!wi8s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!wi8s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!wi8s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!wi8s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09c975d7-6fc7-4e77-979d-f7155c8a1d3d_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.bawolf.com/subscribe?"><span>Subscribe now</span></a></p><p>If they're making a go/no go decision and looking to you as the company leader for advice on whether they've done enough diligence, they're asking for your expertise, not just your praise.</p><p>If they're an engineer who thinks there's a market opportunity for a piece of technology they'd love to build and ask you to do it with them, they're asking for your judgment, not just your compliance.</p><p>Yes, they'd love for you to agree with them. They want to move forward on this with you. But they want you to agree with them because you're convinced, not because you feel social pressure.</p><p>I had to learn this one the hard way. It almost cost me a twenty-year relationship and burned me out. We're still repairing parts of it. I just wanted him to be happy, but it's a hard act to keep up.</p><p>The problem is that you can only keep following a path you don't believe in for so long. The dissonance will build, and you'll eventually have to tell them why you're acting funny. You might even admit you've had reservations for a long time. Suddenly, the floor falls out from under them.</p><p>They'll feel betrayed. They misunderstood their situation. They thought they were working with someone they deeply respected on a problem you both mutually believed was hard but worth a shot. But they've been alone, out on a limb this whole time.</p><p>You're their protection against feeling foolish, and instead, you'll become the cause of their embarrassment. You think you're doing them a favor. You see how good they feel working with you, and you're happy to see them happy. But they won't feel that way anymore.</p><p>Don't coddle them; they're an adult. Just tell them the truth. They can take it. Tell them how you feel. Even if they're sad now, they'll know they can trust you. They asked you because of who you are. So, be your whole self in the situation; be the person they know you to be.</p><p>After all, If they wanted anything less of you, you wouldn't want to work with them in the first place, would you?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gpLf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gpLf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!gpLf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!gpLf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!gpLf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gpLf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:361744,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&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_!gpLf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!gpLf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!gpLf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!gpLf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67dd9391-5beb-407c-8e31-b07ea6c80d78_1792x1024.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.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">I&#8217;m on a writing kick. Some posts are deep-in-the-weeds technology; others are more broadly about life. Subscribe if you want to hear more.</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[Inspiration for embedding based mechanics for games and apps]]></title><description><![CDATA[Recently, I wrote a piece about vector embeddings that resonated.]]></description><link>https://blog.bawolf.com/p/inspiration-for-embedding-based-mechanics</link><guid isPermaLink="false">https://blog.bawolf.com/p/inspiration-for-embedding-based-mechanics</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Tue, 14 May 2024 17:50:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!57DV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, I wrote <a href="https://bawolf.substack.com/p/embeddings-are-a-good-starting-point">a piece about vector embeddings</a> that resonated. I&#8217;m humbled and thankful for all of you who read it and helped it reach the top of Hacker News. It reminded me how important it is to build in public and energized me to share about a game I tried to make last year with some mechanics that might inspire you.</p><h3>Takeaways</h3><ul><li><p>Embeddings are lists of numbers in many-dimensional space that you can compare with trigonometry. Those numbers represent how similar things feel.</p></li><li><p>They&#8217;re great at mapping unbounded input to bounded output, specifically to records in your database.</p></li><li><p>Combining embedding ranking with odds makes a new category of game mechanics possible. I&#8217;ll show you some examples that I&#8217;ve built.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!57DV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!57DV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!57DV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!57DV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!57DV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!57DV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp" width="728" height="416" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:449724,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&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_!57DV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!57DV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!57DV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!57DV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfef4dd5-a312-44cd-81d0-214dc8ed153d_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>The Project</h1><p>Around this time last year, I was working on <a href="https://aimigo.xyz">Aimigo</a>, my exploration into a generative AI Tamagotchi. Tamagotchis only have a few features: They eat, poop, play, get sick, misbehave, and grow up. I set out to build new variations of these mechanics to make something players felt they had a relationship with that wasn&#8217;t a romance-based chatbot. I guessed that a character with its own taste that showed you how to care for it would be compelling.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.bawolf.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 Bryant&#8217;s Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Embeddings</h1><p>Vector embeddings are just lists of numbers, usually 0-1, representing coordinates in space. However, instead of 3-dimensional physical space, they often represent an idea space with thousands of dimensions. That can be difficult to conceptualize because the dimensions don&#8217;t represent tangible things like &#8220;brightness&#8221; or &#8220;mass.&#8221; While it&#8217;s frustrating that they&#8217;re a black box, close items semantically feel more similar, and far ones feel more different. Vector embedding distances are compared in a variety of ways. I used cosine distance because that&#8217;s what OpenAI embeddings were optimized for.  </p><p>I&#8217;m drawn to embeddings because of how well they handle tasks that look like search. They can take arbitrary text requests and convert them into bounded output. For example, the <a href="https://v0.app/search">icon search</a> from the last article takes any string and returns a list of appropriate icons from our database.</p><p>Generally, I&#8217;ve found embeddings more helpful in building game mechanics than language models. Comparatively, language models were slow, expensive, and unreliable. The more I used them for business logic, the harder it was to test and ultimately ship. I did get value out of them for small targeted tasks. However, I had better luck combining embedding ranking and weighted odds for most of the game engine.</p><h1>Feature 1: Choosing characters</h1><p>Players encounter the first embedding mechanic in Aimigo when they create a character. I bought a set of animal models from the creator <a href="https://www.omabuarts.com/">Omabuarts</a>, with over 150 species and a consistent set of animations.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> Then, I had players describe their character&#8217;s personality and used that to determine the species of their character.</p><p>Since the actual character creation is not very eventful, I built this <a href="https://aimigo.xyz/?p=characterChooser">character chooser</a> to make it more visual. You can try different descriptions for yourself.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;93d748e5-4262-4b29-b2da-18fdc17084e2&quot;,&quot;duration&quot;:null}"></div><h2>Ranking possible species</h2><p>I asked the player to describe their desired character and converted that into an embedding. I had already calculated the embeddings for each species, which were ordered by their distance from the description.</p><p>This app is written in Elixir, which I&#8217;ve grown to love. I recognize Elixir is not the most popular language. Hopefully, the examples are simple enough to grasp through syntax.</p><pre><code>characters = Repo.all(
&nbsp;&nbsp;from(c in Character,
&nbsp;&nbsp;&nbsp;&nbsp;order_by: [
      asc: cosine_distance(c.embedding, ^description_embedding)
    ],
&nbsp;&nbsp;)
)</code></pre><p>This worked pretty well. The description &#8220;<em>strong, brave, and heroic</em>&#8221; is closest to a lion, whereas &#8220;<em>brooding, goth, and dark</em>&#8221; is closest to a crow. However, after playing with it, I thought the determinism diminished the fun factor. I didn&#8217;t want players guaranteed a species just because they knew the words to get them, so I inserted a little weighted randomness.</p><h2>Odds for choosing a species</h2><p>I got a lot of mileage from choosing a random number from a normal distribution. In this instance, I took the absolute value of a normal distribution. I centered it around 0 so species with short cosine distances were more likely to be chosen. <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_mQt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_mQt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png 424w, https://substackcdn.com/image/fetch/$s_!_mQt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png 848w, https://substackcdn.com/image/fetch/$s_!_mQt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png 1272w, https://substackcdn.com/image/fetch/$s_!_mQt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_mQt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png" width="1000" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:17307,&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_!_mQt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png 424w, https://substackcdn.com/image/fetch/$s_!_mQt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png 848w, https://substackcdn.com/image/fetch/$s_!_mQt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.png 1272w, https://substackcdn.com/image/fetch/$s_!_mQt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F101563e0-2bd2-4a4d-a643-384465d809c4_1000x375.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><pre><code>number_of_characters = length(characters)
index = floor(abs(:rand.normal(0, Math.pow(number_of_characters/6, 2))))

character = Enum.at(characters, index, Enum.at(characters, 0))</code></pre><p>The second input for a normal curve is variance (&#963;<sup>2</sup>), the square of standard deviation (&#963;), representing how wide or narrow the curve&#8217;s tails are. By adjusting it, I can tweak the relative likelihood for a player to get a species towards the beginning or end of the list. I divided the characters into six buckets of rarity.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x_Af!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x_Af!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png 424w, https://substackcdn.com/image/fetch/$s_!x_Af!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png 848w, https://substackcdn.com/image/fetch/$s_!x_Af!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png 1272w, https://substackcdn.com/image/fetch/$s_!x_Af!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x_Af!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png" width="948" height="522" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:522,&quot;width&quot;:948,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30285,&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_!x_Af!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png 424w, https://substackcdn.com/image/fetch/$s_!x_Af!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png 848w, https://substackcdn.com/image/fetch/$s_!x_Af!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.png 1272w, https://substackcdn.com/image/fetch/$s_!x_Af!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb88369-af9b-4c4e-9c39-241adb7fb5df_948x522.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>This weighted randomness gave me two features. </p><ol><li><p>Players should feel like their description applies to the chosen species. Even if it&#8217;s not the top choice, all top options by proximity should be close to the right vibe.</p></li><li><p>If the species doesn&#8217;t match the description, that&#8217;s because something interesting happened, and that character is rare. A <em>brooding crow</em> will be much easier to get than a <em>gloomy narwhal</em>.</p></li></ol><p>I wondered if I could skip this whole thing and instead feed the description and the list of possible species to a language model. Overall, I found that to be slower, more expensive, and less reliable. Prompting something like <em>&#8220;Most of the time, give me the most intuitive species, but occasionally give me interesting unintuitive species&#8221;</em> was ineffective. The embedding method is more predictable, inspectable, testable, and fun.</p><p>From then on, the character descriptions are fed into the language model for flavor text. When a player pets a grumpy character, it should respond less gratefully than a warm and fuzzy one. This should make the gloomy narwhal even more unique!</p><h1>Feature 2: Feeding characters</h1><p>The next mechanic I built lets players feed their characters.</p><ol><li><p>The player offers their character a meal through a text input.</p></li><li><p>The character decides if they&#8217;ll accept it; if they do, they eat it and find out how much they like it.</p></li><li><p>The more they enjoy it, the happier it makes them.</p></li><li><p>Over time, they develop a taste for some foods over others.</p></li></ol><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;3e88fa91-2908-4575-89dd-42a62b9df702&quot;,&quot;duration&quot;:null}"></div><p>I implemented this with a more complex version of my ranking and odds approach. The memory system I built was heavily inspired by a paper that had just come out about 8-bit sprite agents interacting in a small town: &#8220;<a href="https://arxiv.org/abs/2304.03442">Generative Agents: Interactive Simulacra of Human Behavior</a>.&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a></p><h2>Ranking past experiences</h2><p>When a player offers a character a meal, the meal is converted into an embedding to find relevant memories. This embedding search algorithm has three parts.</p><h3>Cosine distance</h3><p>Sort by the cosine distance between the embedding of the meal the player offered and the character&#8217;s memories of past meals. When players offer their character a <em>calzone</em>, they recall <em>pizza</em> more strongly than <em>sushi</em>.</p><h3>Time decay</h3><p>The second part of the algorithm biases towards more recent memories to ensure the character can grow over time. The general function is called exponential decay.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O5dk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O5dk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png 424w, https://substackcdn.com/image/fetch/$s_!O5dk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png 848w, https://substackcdn.com/image/fetch/$s_!O5dk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png 1272w, https://substackcdn.com/image/fetch/$s_!O5dk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O5dk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png" width="648" height="468" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a149365-516a-4fdd-b447-afbd3161615d_648x468.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:468,&quot;width&quot;:648,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9592,&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_!O5dk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png 424w, https://substackcdn.com/image/fetch/$s_!O5dk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png 848w, https://substackcdn.com/image/fetch/$s_!O5dk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.png 1272w, https://substackcdn.com/image/fetch/$s_!O5dk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a149365-516a-4fdd-b447-afbd3161615d_648x468.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">decay = (1-decay-rate)<sup>time</sup></figcaption></figure></div><pre><code><code>def time_decay(datetime) do
  hours_ago =
&nbsp;&nbsp;  DateTime.utc_now()
 &nbsp;&nbsp; |&gt; Timex.diff(datetime, :hours)

  Math.pow(0.9995, hours_ago)
end</code></code></pre><p>I chose hours as the base unit. Then, I tweaked the rate of decay to see what felt right. I settled on a curve that flattened out at about a year.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a></p><h3>Subjective importance</h3><p>The last part of the memory score evaluates how impactful each memory is to the character. More important memories should affect more decisions. Here is a targeted place where language models were effective. I asked GPT-4 how impactful it believed the memories were on a scale of 1 - 10.</p><pre><code>message = """
On the scale of 1 to 10, where 1 is purely mundane
e.g., brushing teeth, making bed) and 10 is
extremely poignant (e.g., a break up, college
acceptance), rate the likely poignancy of the
following piece of memory.
Memory: #{memory.content}
"""</code></pre><p>The language model responded to adjectives and modifiers. For example, a character who likes <em>cornbread</em> is less enthusiastic about <em>stale cornbread</em>. If they enjoy <em>sushi,</em> they&#8217;re still weary of <em>day-old sushi</em>.  The model also reacted well to the character&#8217;s species. A lion liked <em>gazelle</em>, whereas the herbivores did not. </p><p>The food-based memories mostly scored low in subjective importance; however, occasionally, they did not. I once fed my lion <em>the bodies of my enemies,</em> and they <strong>loved </strong>it. 9/10 core memory. When I fed them other food later, they&#8217;d say, &#8220;<em>Meatloaf looks dull; I&#8217;m ready to feast on enemies!</em>&#8221; or &#8220;<em>Decent meal, but lacking the thrill of vanquished enemies.</em>&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a></p><h3>Combined score</h3><p>Cosine distance, time decay, and subjective importance are normalized to 0-1 and summed together to calculate the total retrieval score.</p><pre><code>def normalize(value, max, min) do
  (value - min) / (max - min)
end</code></pre><p>The normalization function isolates the differences between the memories in the set by normalizing them between zero and one. This does two valuable things:</p><ul><li><p>This makes scores with different ranges directly comparable. Otherwise, subjective importance with a rank of 1-10 would be so large that cosine distance would be irrelevant with a range of 0-1.</p></li><li><p>This isolates the differences between values. Even if cosine distance and time decay have possible ranges between 0 and 1, if the data for one are between 0.5 and 0.9 and the data for the other are between 0.3 and 0.5, the first might disproportionately influence the result.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kwqm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kwqm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png 424w, https://substackcdn.com/image/fetch/$s_!kwqm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png 848w, https://substackcdn.com/image/fetch/$s_!kwqm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png 1272w, https://substackcdn.com/image/fetch/$s_!kwqm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kwqm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png" width="1422" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:1422,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28983,&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_!kwqm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png 424w, https://substackcdn.com/image/fetch/$s_!kwqm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png 848w, https://substackcdn.com/image/fetch/$s_!kwqm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.png 1272w, https://substackcdn.com/image/fetch/$s_!kwqm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91a5c386-011f-49c1-84a6-cabf887b68ca_1422x540.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>Since there were only hundreds of memories per character, I fetched them from the database and scored them in the application code. It was easier to prototype, and the numbers were small.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a> Whenever I needed memories, I did the initial scoring in Postgres with pgvector, then normalized and combined the scores in a reducer function.</p><p>Once the memories were ranked and sorted, I fed the top 15 memories into a language model with a prompt like &#8220;<em>Given these experiences, how much do you expect to like tacos on a scale of 1-5?</em>&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a> This distilled the character&#8217;s expectation for a meal to a number I could put into the game engine to calculate the odds of getting different reactions from the character.</p><h2>Odds for eating a meal</h2><p>The odds mechanic also has two parts:</p><ul><li><p>Does the character accept the meal</p></li><li><p>If so, how much do they enjoy it? </p></li></ul><p>Both have similar mechanisms.</p><h3>Odds of accepting a meal</h3><pre><code>def meal_accepted?(score) do
  if :rand.normal(2, Math.pow(1.25, 2)) &lt; score do
&nbsp;&nbsp;  :accepted
  else
&nbsp;&nbsp;  :rejected
  end
end</code></pre><p>The app picks a random number on a normal curve centered at 2 with a standard deviation (&#963;) of 1.25. The character accepts the meal if the expected score exceeds the random number.</p><p>For example, when the character gives a meal an expected score of 1, they think they won&#8217;t like it. Most of the time, they&#8217;ll reject it without trying it. Conversely, if the character gives the meal an expected score of 5, they think they&#8217;ll like it a lot. They&#8217;ll rarely reject these. I centered the curve around two instead of three to bias characters towards trying things so players aren&#8217;t constantly rejected.</p><h3>Odds of enjoying a meal</h3><p>If the character accepts the meal, I calculate how much they liked it based on their original expected score.</p><pre><code>def meal_enjoyment_score(expected_score) do
  raw_score = :rand.normal(expected_score, Math.pow(1.25, 2))

  cond do
&nbsp;&nbsp; raw_score &lt; 1 -&gt; 1
&nbsp;&nbsp; raw_score &gt; 5 -&gt; 5
&nbsp;&nbsp; true -&gt; round(raw_score)
  end
end</code></pre><p>I pick a number from the same normal curve as the last one. This time, I center it around the expected score and clean up the output so it&#8217;s always an integer of 1-5.  A character is more likely to enjoy a meal if they thought they would. Their taste is influenced by past decisions but not determined by them.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;5d91f7fb-2116-4114-94df-5682d31df267&quot;,&quot;duration&quot;:null}"></div><p>Once that score is calculated, a few in-game things happen:</p><ol><li><p>Memories of this meal are created with embeddings for strings like <em>&#8220;Sparky thought they would like tacos&#8221;</em> and <em>&#8220;Sparky decided to eat tacos and loved it.&#8221;</em></p></li><li><p>The character&#8217;s happiness is updated based on how much they liked the meal</p></li><li><p>A flavor text response is created to communicate what happened to the player in a little speech bubble.</p></li><li><p>Create a record of how that meal was received. Players can see whether it was accepted or rejected, the actual vs expected score, and if you click into the meals, see what meals they were thinking about when they ate it.</p></li></ol><h1>Conclusion</h1><p>I had a bunch of vague ideas for where to go next. The characters&#8217; personalities could change based on how players treat them. If you left them starving, they wouldn&#8217;t be as friendly. Get some pseudo-nutrition information so they grow differently depending on whether they get protein or sugar.</p><p>None of these necessarily felt impactful enough to make players build a strong enough relationship with their character to want to care for them every day, the way people bonded with the original Tamagotchi. Ultimately, I lost steam. However, I hope these mechanics will inspire your projects. Aimigo was rough around the edges, but there&#8217;s a kernel of something exciting here.</p><p>I hope some of the work I did here inspires you. If it does, I&#8217;d love to see what you build. Send me a note or tweet at <a href="https://twitter.com/ba_wolf">@ba_wolf</a>.</p><p>Here is a summary of my implementation decisions and some sources for other options.</p><h3><strong>Vector database</strong></h3><p>I chose<a href="https://github.com/pgvector/pgvector"> pgvector</a>/Postgres, but there are plenty of<a href="https://lakefs.io/blog/12-vector-databases-2023/"> other choices</a>, including some for other standard databases like MongoDB.</p><h3><strong>Pgvector client</strong></h3><p>The<a href="https://github.com/pgvector/pgvector-elixir"> elixir library</a> for use with Ecto. You can find a library for your client of choice <a href="https://github.com/pgvector/pgvector/?tab=readme-ov-file#languages">here</a>.</p><h3><strong>Database host</strong></h3><p>This app is hosted by <a href="https://fly.io/">fly.io</a>, though their option wasn&#8217;t <em>really</em> a managed instance at the time. Now, they have a<a href="https://fly.io/docs/reference/supabase/"> managed solution</a> with Supabase. If you want to look up someone else, Pgvector has a clumsy list of hosts that support it in<a href="https://github.com/pgvector/pgvector/issues/54"> this git issue</a>.</p><h3><strong>Embedding model</strong></h3><p>Initially, I used OpenAI&#8217;s `text-embedding-ada-002`, but since writing this, I have upgraded them to OpenAI&#8217;s `text-embedding-3-small`. If you want to try something else, check out Huggingface&#8217;s<a href="https://huggingface.co/spaces/mteb/leaderboard"> leaderboard</a>.</p><h3><strong>Distance metric</strong></h3><p>I used cosine similarity as our distance function because that&#8217;s what OpenAI<a href="https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use"> recommends</a> for their embeddings. Other embeddings may be optimized for different strategies. Pgvector<a href="https://github.com/pgvector/pgvector?tab=readme-ov-file#distances"> supports</a> l2 distance, inner product, and cosine distance.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>At the time, creating characters on the fly and wiring them up wasn&#8217;t realistic, but it <a href="https://lumalabs.ai/">might</a> be <a href="https://anything.world/">now</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Since I don&#8217;t need negative numbers, I take the absolute value of the curve, making it effectively only a big hump with a long right tail. I take the floor since I want integers to represent indices in a list. You can see this visualized on the <a href="https://aimigo.xyz/?p=characterChooser">character chooser</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>If I got any value index the size of the list, I assigned it to the first item on the list</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Their code wasn&#8217;t open source then, but it is <a href="https://github.com/joonspk-research/generative_agents">now</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>This could easily be different, though. The simulacra agents&#8217; memories were dramatically shorter.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>I also asked a character to eat <em>broken glass</em> once, which registered a 9/10 when they ate it. They remembered that when being offered any other foods for a while, which, darkly, modeled trauma. <em>Yikes.</em></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>Down the road, I&#8217;d probably have wanted to revisit this. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>I would have loved to use an embedding-first approach, but I couldn&#8217;t think of something flexible enough to handle novel input. </p></div></div>]]></content:encoded></item><item><title><![CDATA[Embeddings are a good starting point for the AI curious app developer]]></title><description><![CDATA[Vector embeddings have been an Overton window shifting experience for me, not because they&#8217;re sufficiently advanced technology indistinguishable from magic, but the opposite.]]></description><link>https://blog.bawolf.com/p/embeddings-are-a-good-starting-point</link><guid isPermaLink="false">https://blog.bawolf.com/p/embeddings-are-a-good-starting-point</guid><dc:creator><![CDATA[Bryant]]></dc:creator><pubDate>Wed, 17 Apr 2024 16:59:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-6Sc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vector embeddings have been an Overton window shifting experience for me, not because they&#8217;re sufficiently advanced technology indistinguishable from magic, but the opposite. Once I started using them, it felt obvious that this was what the search experience was always supposed to be: less &#8220;How did you do that?&#8221; and more mundanely, &#8220;Why isn&#8217;t this everywhere?&#8221;</p><p>This feels like the right place to start if you&#8217;re an app developer looking for an excuse to dip your toes into this new AI world. Embeddings are just arrays of numbers, but they contain a compressed form of a considerable amount of human knowledge and shrink features that used to be substantial specialized projects into ones that individual product engineers can take on.</p><p>There are a ton of tooling options available to use embeddings. I&#8217;ll highlight our choices and note where you might want to make different ones for your situation. Here are some points I hope you take away:</p><ul><li><p>Vector embeddings work for search and recommendations because they&#8217;re good at measuring similarity to arbitrary input. This even works for different spoken languages like French or Japanese.</p></li><li><p><a href="https://github.com/pgvector/pgvector/">Pgvector</a> is a Postgres extension that stores and queries embeddings without adding a new service. It&#8217;s powerful because it can combine standard SQL logic with embedding operations.</p></li><li><p>Unlike LLMs, working with embeddings feels like regular deterministic code. </p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-6Sc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-6Sc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!-6Sc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!-6Sc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!-6Sc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-6Sc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2508240,&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_!-6Sc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!-6Sc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!-6Sc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!-6Sc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb972599-8305-4943-a8e6-689a7f30bae3_1792x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>The project</h2><p>My friend Charlie Yuan and I built this mini <a href="https://www.v0.app">icon app</a> to help people discover icons. It&#8217;s pretty short and sweet. We have icon sets you can query, bookmark, and add to your project.</p><h3>Pgvector</h3><p>There are a bunch of <a href="https://lakefs.io/blog/12-vector-databases-2023/">specialized vector databases</a> to choose from. Instead, we chose Postgres with <a href="https://github.com/pgvector/pgvector/">pgvector</a> to blend embedding search with business logic like filtering and scoring. While it&#8217;s not the fastest vector database, we didn&#8217;t want to have to compare results across multiple data sources. Pgvector probably already has <a href="https://github.com/pgvector/pgvector">a library for your favorite database client</a>. Our project was Typescript through and through, and we used <a href="https://github.com/pgvector/pgvector-node?tab=readme-ov-file#drizzle-orm">drizzle-orm</a>. The docs will be a more robust place for setup documentation, so I&#8217;m leaving out that part to focus on the features you can build.</p><h3>Creating embeddings</h3><p>Once set up with pgvector, we created a strategy for encoding our icon data into vector embeddings. Embeddings are points in many-dimensional space, up to thousands of dimensions. Unfortunately, the axes of that grid are not humanly grokable ideas like &#8220;size&#8221; or &#8220;brightness.&#8221; They&#8217;re a bit of a black box. Luckily, like any good abstraction, they&#8217;re a black box with a good API.</p><p>The best practice seems to be finding the details that best represent what people want to search for and creating a function that outputs that as a string. Our icons can be a part of many use-case-based &#8216;categories&#8217; and have many descriptive &#8216;tags&#8217; associated with them. We encoded that information along with the icon name because that best represents what the icon is. Whereas the name of the icon set the icon belongs to, or its dimensions aren&#8217;t relevant. The strings we generated looked basically like this:</p><pre><code>const createIconEmbeddingsString = (icon) =&gt; `icon: "${icon.name}", categories: [${categories}] tags: [${tags}]`;</code></pre><p>Next, we chose an embedding model. <a href="https://platform.openai.com/docs/guides/embeddings">OpenAI&#8217;s embedding models</a> will probably work just fine. We&#8217;re using their `text-embedding-3-small`. If you want to dive in, check out the <a href="https://huggingface.co/spaces/mteb/leaderboard">leaderboard</a> and pick the model that best meets your needs. Whether you use an embeddings API or self-host an open source option, the interface should be text in and embeddings out.</p><h2>Implementing search</h2><p>Many sites implement search, but most icon sites implement search by <a href="https://icon-sets.iconify.design/?query=woof">text</a> <a href="https://react-icons.github.io/react-icons/search/#q=woof">matching</a> or full-text search. If you&#8217;re looking for a dog icon, they search over the icon metadata for icons that have &#8216;dog&#8217; in them. If they want to get <a href="https://fontawesome.com/search?q=woof&amp;o=r">craftier</a>, they come up with a bag of words related to &#8216;dog,&#8217; like maybe &#8216;k9&#8217;, &#8216;puppy,&#8217; and &#8216;woof&#8217; to catch near misses. That&#8217;s pretty fragile. Someone has to choose tags for each icon; if they miss an important one, users won&#8217;t find what they&#8217;re looking for.</p><h3>Similarity search</h3><p>Our app gets relevant results when searching for &#8216;<a href="https://www.v0.app/search?g=popularity&amp;q=dog&amp;qid=nmezx8efde3pvydym2f2sk9n">dog</a>.&#8217; We also get solid results for &#8216;<a href="https://www.v0.app/search?g=popularity&amp;q=puppy&amp;qid=v27kjdebk8ex7n30qe4b5tfs">puppy</a>&#8217; without a bag of words by measuring the cosine similarity between the embeddings of your search query and each icon. There are multiple ways to measure how similar embeddings are to each other, but OpenAI&#8217;s embeddings are designed to work well with cosine distance. Cosine similarity is just the opposite of cosine distance. Order by cosine distance wherever you can to take advantage of <a href="https://github.com/pgvector/pgvector?tab=readme-ov-file#why-isnt-a-query-using-an-index">indexes</a>.</p><pre><code>cosine_similarity(x,y) = 1 - cosine distance(x,y)</code></pre><p>You can even try dog breeds like &#8216;<a href="https://www.v0.app/search?q=hound">hound</a>,&#8217; &#8216;<a href="https://www.v0.app/search?q=poodle">poodle</a>,&#8217; or my favorite &#8216;<a href="https://www.v0.app/search?q=samoyed">samoyed</a>.&#8217; It pretty much just works. But that&#8217;s not all; it also works for other languages. Try &#8216;<a href="https://www.v0.app/search?g=popularity&amp;q=chien&amp;qid=mcbp6rk9z3y8lb1emt1zblev">chien</a>&#8217; and even &#8216;<a href="https://www.v0.app/search?g=popularity&amp;q=%E7%8A%AC&amp;qid=hd8whx733f3rljhadasgfzb9">&#29356;</a>&#8217;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>! With pgvector, we can get these results with simple SQL queries.</p><pre><code>SELECT
  1 - cosine_distance (search_query.embedding,
    icon.embedding) as similarity,
  *
FROM
  icon
  join search_query on search_query.text = 'dog'
ORDER BY
  cosine_distance (search_query.embedding, icon.embedding) ASC
LIMIT 50;</code></pre><p>Since we&#8217;re ordering by distance, every search returns every result in the table in order of closeness. We cut off results by a fixed number to make this manageable, limiting the query to the top 50. Using an arbitrary distance cut-off is tempting, like querying for results with a cosine similarity of less than 0.8. Unfortunately, the absolute distance for one query to produce correct-feeling results might differ drastically from another. We limit by the number of results, not by a minimum value, whenever possible.</p><h3>Filtering</h3><p>If we only wanted similarity search, any vector database would be fine, but Postgres allowed us to layer more features on top. The initial search looks across <em>all icons</em> in <em>all  icon sets</em>, but our user&#8217;s style might only match some of the icon sets. We can filter by values like in any other Postgres query.</p><pre><code>SELECT
  1 - cosine_distance (search_query.embedding,
    icon.embedding) AS similarity,
  *
FROM
  icon
  JOIN search_query ON search_query.text = 'dog'
  JOIN icon_set ON icon_set.slug = icon.icon_set_slug
WHERE
  icon_set.slug in('lucide', 'mdi')
ORDER BY
  cosine_distance (search_query.embedding,
    icon.embedding) ASC
LIMIT 50;</code></pre><p>This is deterministic; everyone searching for a &#8216;dog&#8217; will get the same results. However, the inputs are still unbounded, so embedding search doesn&#8217;t guarantee that the best results will be produced for every input. We can try different embedding models or ways of encoding icons into embeddings to improve the system.</p><h3>A more complex algorithm</h3><p>The embedding search usually puts the correct icon on the page, but the correct icon isn&#8217;t always the first result. We could make a simple algorithm that adjusts to user feedback and improves over time. To do this, we&#8217;d count every time a user clicks on an icon for a particular search query. When ranking search results, we&#8217;d create a score for each icon that combines the embedding search with the click data.&nbsp;</p><p>Here&#8217;s a simple ranking algorithm. The details look messy because there&#8217;s some null checking and unit conversions<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, but here are the basics. </p><ol><li><p>Get the cosine similarity of the icon for the search query. It will be a number between 0 and 1. Multiply it by 0.5.</p></li><li><p>Divide the number of clicks for each icon by the icon with the most clicks for that query. This normalizes the most clicked icon to 1, and the least clicked to 0. Multiply by 0.5.</p></li><li><p>The final score is these two values added together for a range between 0-1.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p></li></ol><pre><code>SELECT
  (
    0.5 * COALESCE(      -- so nulls are turned into 0
     1 - cosine_distance (search_query.embedding, icon.embedding),
     0
    ) + 0.5 *     -- so clicks matter less than embeddings.
    COALESCE( 
      search_query_selection. "count"::decimal / 
        max(search_query_selection. "count") OVER (),
    0)
  ) AS score,
  icon.*
FROM
  icon
  LEFT JOIN search_query_selection
    ON icon.id = search_query_selection.icon_id
  LEFT JOIN search_query
    ON search_query.text = 'dog'
      AND search_query.id = search_query_selection.search_query_id
  ORDER BY score DESC
  LIMIT 50;</code></pre><p>Should vector embedding distance and clicks be equally weighted? Should the order of magnitude of clicks matter more than the raw number? The algorithm might need tuning, but this is just an example of how the database handles the calculation nicely.</p><p>With a separate vector database, we might have to get values for all icons from both databases before comparing them in application code or making tradeoffs like pulling 100 results from the vector db and filtering the Postgres query for click score to those results or vice versa. Instead, we simply query for results and display them.</p><h2>Similar recommendations</h2><p>Additionally, we include a content forward section of each <a href="https://www.v0.app/icon/lucide/arrow-up">icon page</a> with other icons in the same icon set and category. That way, you can see other &#8216;navigation&#8217; icons when looking at `arrow-up` in case you need those. Unfortunately, not all of our icon sets have categories. In these cases, we make a similar icons section using embeddings. Instead of getting an embedding from user input, we can compare the same cosine similarity measure against the selected icon&#8217;s embedding.</p><pre><code>WITH current_icon AS (
&nbsp;&nbsp;&nbsp;&nbsp;SELECT
&nbsp;&nbsp;&nbsp;   embedding,
&nbsp;&nbsp;&nbsp;   slug,
&nbsp;&nbsp;&nbsp;   icon_set_slug
&nbsp;&nbsp;&nbsp;&nbsp;FROM
&nbsp;&nbsp;&nbsp;   icon
&nbsp;&nbsp;&nbsp;&nbsp;WHERE
&nbsp;&nbsp;&nbsp;   icon_set_slug = 'lucide'
&nbsp;&nbsp;&nbsp;   AND slug = 'activity'
)
SELECT
&nbsp;&nbsp;&nbsp;&nbsp;*
FROM
&nbsp;&nbsp;&nbsp;&nbsp;icon
INNER JOIN current_icon ON
icon.icon_set_slug = current_icon.icon_set_slug
AND icon.slug != current_icon.slug
ORDER BY
&nbsp;&nbsp;&nbsp;&nbsp;1 - cosine_distance (
&nbsp;&nbsp;&nbsp; icon.embedding,
&nbsp;&nbsp;&nbsp; current_icon.embedding
)
LIMIT 50;</code></pre><h1>Conclusion</h1><p>I hope you have a good experience playing with our app and vector embeddings! We owe a big thanks to all the engineers who pushed the state of the art so far that we can stand on their shoulders. I hope this modest contribution helps make adding embedding features to your app approachable!</p><p>Here is a summary of our implementation decisions and some sources for other options.</p><h3>Vector database</h3><p>We chose <a href="https://github.com/pgvector/pgvector">pgvector</a>/Postgres, but there are plenty of <a href="https://lakefs.io/blog/12-vector-databases-2023/">other choices</a>, including some for other standard databases like MongoDB.</p><h3>Pgvector client</h3><p>We worked in Typescript and chose <a href="https://github.com/pgvector/pgvector-node?tab=readme-ov-file#drizzle-orm">drizzle-orm</a>. I&#8217;ve also worked in the Phoenix elixir ecosystem using the <a href="https://github.com/pgvector/pgvector-elixir">elixir library</a> with Ecto. You can find a library for your client of choice <a href="https://github.com/pgvector/pgvector/?tab=readme-ov-file#languages">here</a>.</p><h3>Database host</h3><p>Our app is hosted on <a href="https://neon.tech/">Neon</a>. I&#8217;ve also used <a href="https://fly.io/">fly.io</a>, though their option wasn&#8217;t <em>really</em> a managed instance at the time. Now, they have a <a href="https://fly.io/docs/reference/supabase/">managed solution</a> with Supabase. If you want to look up someone else, Pgvector has a clumsy list of hosts that support it in <a href="https://github.com/pgvector/pgvector/issues/54">this git issue</a>.</p><h3>Embedding model</h3><p>We chose OpenAI&#8217;s `text-embedding-3-small`. If you want to try something else, check out Huggingface&#8217;s <a href="https://huggingface.co/spaces/mteb/leaderboard">leaderboard</a>.</p><h3>Embedding string</h3><p>We embedded strings of key and value pairs for the attributes we thought best described our icons. It doesn&#8217;t seem like any of the major players are doing anything crazy here; the significant knobs appear to be whether or not to embed keys or just values and which attributes of your records are relevant. Other examples in OpenAI&#8217;s <a href="https://cookbook.openai.com/examples/vector_databases/readme">cookbook</a> show <a href="https://github.com/vercel/examples/blob/main/storage/postgres-pgvector/prisma/seed.ts#L35">other</a> <a href="https://github.com/neondatabase/yc-idea-matcher/blob/18eb9dd6ddd14eeeb2167d78088f092ab6882f42/generate-embeddings.ts#L51">choices</a>.</p><h3>Distance metric</h3><p>We used cosine similarity as our distance function because that&#8217;s what OpenAI <a href="https://platform.openai.com/docs/guides/embeddings/which-distance-function-should-i-use">recommends</a> for their embeddings. Other embeddings may be optimized for different strategies. Pgvector <a href="https://github.com/pgvector/pgvector?tab=readme-ov-file#distances">supports</a> l2 distance, inner product, and cosine distance.</p><h3>Search Size</h3><p>In these examples, we limited our queries to the top 50 results. You can also limit your search to be above or below a certain distance threshold. That doesn&#8217;t seem super reliable. Relative distances seem more meaningful than discrete amounts. If you&#8217;re set on using a threshold, I&#8217;d recommend keeping it pretty wide, like 0.1 or 0.05, and using it with a limit. You may get some mileage using a wide range to avoid returning irrelevant long-tail results.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Even when the results aren&#8217;t icons of dogs, they still feel relevant to the query, like how the &#8216;snowshoeing&#8217; or &#8216;snowman&#8217; icons rank highly for &#8216;samoyed,&#8217; a type of dog bred for sled pulling.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>COALESCE is just there, so null values become 0. `over ()` is a window function, so we can get the `max` of our desired subset of clicks without using `group by.` If you don&#8217;t cast the count to a decimal, the division will truncate, and 0.45 will be rounded to 0.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>This algorithm is similar to the one used to rank relevant memories in the <a href="https://arxiv.org/abs/2304.03442">Simulacra paper</a>, which describes a 0-player game in which AI agents take on the role of 8-bit characters in a simulated town.</p></div></div>]]></content:encoded></item></channel></rss>